blob: 0d471bfda193f787739cb654a947456c47a37ac2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.corext.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.formatter.CodeFormatter;
import org.eclipse.jdt.core.manipulation.CodeGeneration;
import org.eclipse.jdt.internal.core.manipulation.StubUtility;
import org.eclipse.jdt.internal.ui.preferences.formatter.FormatterProfileManager;
public class InfoFilesUtil {
/**
* Creates a compilation unit in the given package fragment with the specified file name. The
* compilation unit is formatted and contains the given contents with file and type comments
* prepended to it.
*
* @param fileName the name of the compilation unit
* @param fileContent the contents of the compilation unit
* @param pack the package fragment to create the compilation unit in
* @param addComments whether to add comments
* @param monitor the progress monitor
* @throws CoreException when there is a problem while creating the compilation unit
*/
public static void createInfoJavaFile(String fileName, String fileContent, IPackageFragment pack, boolean addComments, IProgressMonitor monitor) throws CoreException {
String lineDelimiter= StubUtility.getLineDelimiterUsed(pack.getJavaProject());
StringBuilder content= new StringBuilder();
String fileComment= addComments ? getFileComment(fileName, pack, lineDelimiter) : null;
String typeComment= addComments ?
(JavaModelUtil.MODULE_INFO_JAVA.equals(fileName) ? getModuleComment(fileName, pack, fileContent, lineDelimiter) : getTypeComment(fileName, pack, lineDelimiter))
: null;
if (fileComment != null) {
content.append(fileComment);
content.append(lineDelimiter);
}
if (typeComment != null) {
content.append(typeComment);
content.append(lineDelimiter);
} else if (fileComment != null) {
// insert an empty file comment to avoid that the file comment becomes the type comment
content.append("/**"); //$NON-NLS-1$
content.append(lineDelimiter);
content.append(" *"); //$NON-NLS-1$
content.append(lineDelimiter);
content.append(" */"); //$NON-NLS-1$
content.append(lineDelimiter);
}
content.append(fileContent);
ICompilationUnit compilationUnit= pack.createCompilationUnit(fileName, content.toString(), true, monitor);
JavaModelUtil.reconcile(compilationUnit);
compilationUnit.becomeWorkingCopy(monitor);
try {
IBuffer buffer= compilationUnit.getBuffer();
ISourceRange sourceRange= compilationUnit.getSourceRange();
String originalContent= buffer.getText(sourceRange.getOffset(), sourceRange.getLength());
int kind= CodeFormatter.K_COMPILATION_UNIT;
if (JavaModelUtil.MODULE_INFO_JAVA.equals(fileName)) {
kind= CodeFormatter.K_MODULE_INFO;
}
String formattedContent= CodeFormatterUtil.format(kind, originalContent, 0, lineDelimiter, FormatterProfileManager.getProjectSettings(pack.getJavaProject()));
formattedContent= org.eclipse.jdt.internal.core.manipulation.util.Strings.trimLeadingTabsAndSpaces(formattedContent);
buffer.replace(sourceRange.getOffset(), sourceRange.getLength(), formattedContent);
compilationUnit.commitWorkingCopy(true, new SubProgressMonitor(monitor, 1));
} finally {
compilationUnit.discardWorkingCopy();
}
}
public static String getFileComment(String fileName, IPackageFragment pack, String lineDelimiterUsed) throws CoreException {
ICompilationUnit cu= pack.getCompilationUnit(fileName);
return CodeGeneration.getFileComment(cu, lineDelimiterUsed);
}
public static String getTypeComment(String fileName, IPackageFragment pack, String lineDelimiterUsed) throws CoreException {
ICompilationUnit cu= pack.getCompilationUnit(fileName);
String typeName= fileName.substring(0, fileName.length() - JavaModelUtil.DEFAULT_CU_SUFFIX.length());
return CodeGeneration.getTypeComment(cu, typeName, lineDelimiterUsed);
}
public static String getModuleComment(String fileName, IPackageFragment pack, String fileContent, String lineDelimiterUsed) throws CoreException {
ICompilationUnit cu= pack.getCompilationUnit(fileName);
Pattern p= Pattern.compile("\\s*module\\s*(\\w*).*"); //$NON-NLS-1$
Matcher m= p.matcher(fileContent);
String moduleName= ""; //$NON-NLS-1$
if (m.matches()) {
moduleName= m.group(1);
}
return CodeGeneration.getModuleComment(cu, moduleName, new String[0], new String[0], lineDelimiterUsed);
}
private InfoFilesUtil() {
}
}