1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

Include guard generation option based on file path relative to the source folder. Bug 235586.

This commit is contained in:
Sergey Prigogin 2010-05-09 00:24:41 +00:00
parent 66e0db829f
commit 0bb3286605
2 changed files with 50 additions and 42 deletions

View file

@ -20,8 +20,10 @@ import java.util.UUID;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
@ -50,9 +52,11 @@ import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.IBuffer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.utils.PathUtil;
import org.eclipse.cdt.internal.corext.template.c.CodeTemplateContext;
import org.eclipse.cdt.internal.corext.template.c.CodeTemplateContextType;
@ -63,7 +67,6 @@ import org.eclipse.cdt.internal.corext.util.Strings;
import org.eclipse.cdt.internal.ui.viewsupport.ProjectTemplateStore;
public class StubUtility {
private static final String[] EMPTY= new String[0];
private StubUtility() {
@ -92,7 +95,7 @@ public class StubUtility {
context.setVariable(CodeTemplateContextType.FILE_COMMENT, fileComment != null ? fileComment : ""); //$NON-NLS-1$
context.setVariable(CodeTemplateContextType.DECLARATIONS, declarations != null ? declarations : ""); //$NON-NLS-1$
context.setVariable(CodeTemplateContextType.TYPENAME, new Path(tu.getElementName()).removeFileExtension().toString());
String includeGuardSymbol= generateIncludeGuardSymbol(tu.getElementName(), project);
String includeGuardSymbol= generateIncludeGuardSymbol(tu.getResource(), project);
context.setVariable(CodeTemplateContextType.INCLUDE_GUARD_SYMBOL, includeGuardSymbol != null ? includeGuardSymbol : ""); //$NON-NLS-1$
String[] fullLine= { CodeTemplateContextType.FILE_COMMENT, CodeTemplateContextType.TYPE_COMMENT, CodeTemplateContextType.DECLARATIONS };
@ -131,7 +134,7 @@ public class StubUtility {
String fileComment= getFileComment(file, lineDelimiter);
context.setVariable(CodeTemplateContextType.FILE_COMMENT, fileComment != null ? fileComment : ""); //$NON-NLS-1$
ICProject cproject = CoreModel.getDefault().create(file.getProject());
String includeGuardSymbol= generateIncludeGuardSymbol(file.getName(), cproject);
String includeGuardSymbol= generateIncludeGuardSymbol(file, cproject);
context.setVariable(CodeTemplateContextType.INCLUDE_GUARD_SYMBOL, includeGuardSymbol != null ? includeGuardSymbol : ""); //$NON-NLS-1$
context.setResourceVariables(file);
String[] fullLine= { CodeTemplateContextType.FILE_COMMENT };
@ -249,7 +252,7 @@ public class StubUtility {
*/
public static String getDestructorComment(ITranslationUnit tu, String typeName, String[] excTypeSig, String lineDelimiter) throws CoreException {
String templateId= CodeTemplateContextType.DESTRUCTORCOMMENT_ID;
return getMethodComment(templateId, tu, typeName, "~"+typeName, EMPTY, excTypeSig, null, lineDelimiter); //$NON-NLS-1$
return getMethodComment(templateId, tu, typeName, "~" + typeName, EMPTY, excTypeSig, null, lineDelimiter); //$NON-NLS-1$
}
/*
@ -318,7 +321,7 @@ public class StubUtility {
edit.addChild(new InsertEdit(lineOffset, prefix));
}
}
} catch (BadLocationException exc) {
} catch (BadLocationException e) {
break;
}
}
@ -341,7 +344,6 @@ public class StubUtility {
return doc.get();
}
private static TemplateVariable findVariable(TemplateBuffer buffer, String variable) {
TemplateVariable[] positions= buffer.getVariables();
for (int i= 0; i < positions.length; i++) {
@ -453,7 +455,6 @@ public class StubUtility {
return getProjectLineDelimiter(elem.getCProject());
}
/**
* Get the default task tag for the given project.
*
@ -505,6 +506,7 @@ public class StubUtility {
private static Template getCodeTemplate(String id, ICProject cProject) {
return getCodeTemplate(id, cProject != null ? cProject.getProject() : null);
}
private static Template getCodeTemplate(String id, IProject project) {
if (project == null)
return CUIPlugin.getDefault().getCodeTemplateStore().findTemplateById(id);
@ -517,46 +519,44 @@ public class StubUtility {
return projectStore.findTemplateById(id);
}
private static int getIncludeGuardScheme(ICProject cproject) {
return PreferenceConstants.getPreference(
PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME,
cproject,
private static String generateIncludeGuardSymbol(IResource file, ICProject cproject) {
int scheme = PreferenceConstants.getPreference(
PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME, cproject,
PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_NAME);
}
private static String generateIncludeGuardSymbol(String fileName, ICProject cproject) {
int preferenceValue = getIncludeGuardScheme(cproject);
switch (preferenceValue) {
case PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_NAME:
if (fileName != null) {
return generateIncludeGuardSymbolFromFileName(fileName);
} else {
switch (scheme) {
case PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_PATH:
if (file == null)
return null;
IPath path = file.getFullPath();
ISourceRoot root = cproject.findSourceRoot(file);
if (root != null) {
path = PathUtil.makeRelativePath(path, root.getPath());
}
case PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_UUID:
return generateIncludeGuardSymbolFromUUID();
return generateIncludeGuardSymbolFromFilePath(path.toString());
default:
CUIPlugin.log("Unknown preference value " + preferenceValue + "for include guard scheme", null); //$NON-NLS-1$ //$NON-NLS-2$
return null;
CUIPlugin.log("Unknown preference value " + scheme + " for include guard scheme.", null); //$NON-NLS-1$ //$NON-NLS-2$
//$FALL-THROUGH$
case PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_NAME:
if (file == null)
return null;
return generateIncludeGuardSymbolFromFilePath(file.getName());
case PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_UUID:
return generateIncludeGuardSymbolFromUUID();
}
}
private static String generateIncludeGuardSymbolFromFileName(String fileName) {
String name = fileName;
//convert to upper case and remove invalid characters
//eg convert foo.h --> FOO_H_
StringBuffer buf = new StringBuffer();
// Do not do this, leading underscores are discouraged by the std.
//buf.append('_');
for (int i = 0; i < name.length(); ++i) {
char ch = name.charAt(i);
private static String generateIncludeGuardSymbolFromFilePath(String filename) {
// Convert to upper case and replace invalid characters with underscores,
// e.g. convert some/directory/foo-bar.h to SOME_DIRECTORY_FOO_BAR_H_
StringBuilder buf = new StringBuilder(filename.length() + 1);
for (int i = 0; i < filename.length(); ++i) {
char ch = filename.charAt(i);
if (Character.isLetterOrDigit(ch)) {
buf.append(Character.toUpperCase(ch));
} else if (ch == '.' || ch == '_') {
} else if (buf.length() > 0){
buf.append('_');
}
}
@ -573,7 +573,7 @@ public class StubUtility {
// e.g. convert
// 067e6162-3b6f-4ae2-a171-2470b63dff00 to
// H067E6162-3b6F-4AE2-A171-2470B63DFF00
StringBuffer buf = new StringBuffer();
StringBuilder buf = new StringBuilder();
buf.append('H');
@ -624,5 +624,4 @@ public class StubUtility {
}
return result.toArray(new Template[result.size()]);
}
}

View file

@ -1433,8 +1433,8 @@ public class PreferenceConstants {
/**
* The value of <code>CODE_TEMPLATES_INCLUDE_GUARD_GENERATION_SCHEME</code>
* specifying that the include guard symbol is to be derived from the
* include file's name.
* specifying that the include guard symbol is to be derived from
* the include file's name.
*
* @since 5.1
*/
@ -1448,6 +1448,15 @@ public class PreferenceConstants {
*/
public static final int CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_UUID = 1;
/**
* The value of <code>CODE_TEMPLATES_INCLUDE_GUARD_GENERATION_SCHEME</code>
* specifying that the include guard symbol is to be derived from
* the include file's path relative to the source folder.
*
* @since 5.2
*/
public static final int CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_PATH = 2;
/**
* Returns the CDT-UI preference store.
*
@ -1631,7 +1640,7 @@ public class PreferenceConstants {
store.setDefault(PreferenceConstants.EDITOR_MARK_OCCURRENCES, true);
store.setDefault(PreferenceConstants.EDITOR_STICKY_OCCURRENCES, true);
//Scalability
// Scalability
store.setDefault(PreferenceConstants.SCALABILITY_ALERT, true);
store.setDefault(PreferenceConstants.SCALABILITY_NUMBER_OF_LINES, 5000);
store.setDefault(PreferenceConstants.SCALABILITY_ENABLE_ALL, false);
@ -1641,7 +1650,7 @@ public class PreferenceConstants {
store.setDefault(PreferenceConstants.SCALABILITY_PARSER_BASED_CONTENT_ASSIST, false);
store.setDefault(PreferenceConstants.SCALABILITY_CONTENT_ASSIST_AUTO_ACTIVATION, false);
//Code Templates
// Code Templates
store.setDefault(PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME,
CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_NAME);
}