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

Bug 235586 - Code templates: Include guard not unique

Patch by Jens Elementhaler
This commit is contained in:
Anton Leherbauer 2008-11-05 10:33:45 +00:00
parent 415ff10013
commit 01968f4ebd
2 changed files with 162 additions and 38 deletions

View file

@ -8,6 +8,7 @@
* Contributors:
* Rational Software - initial implementation
* Anton Leherbauer (Wind River Systems)
* Jens Elmenthaler (Verigy) - http://bugs.eclipse.org/235586
*******************************************************************************/
package org.eclipse.cdt.internal.corext.codemanipulation;
@ -15,6 +16,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@ -44,6 +46,7 @@ import org.eclipse.text.edits.MultiTextEdit;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CCorePreferenceConstants;
import org.eclipse.cdt.core.model.CModelException;
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;
@ -89,7 +92,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());
String includeGuardSymbol= generateIncludeGuardSymbol(tu.getElementName(), project);
context.setVariable(CodeTemplateContextType.INCLUDE_GUARD_SYMBOL, includeGuardSymbol != null ? includeGuardSymbol : ""); //$NON-NLS-1$
String[] fullLine= { CodeTemplateContextType.FILE_COMMENT, CodeTemplateContextType.TYPE_COMMENT, CodeTemplateContextType.DECLARATIONS };
@ -127,7 +130,8 @@ public class StubUtility {
FileTemplateContext context= new FileTemplateContext(template.getContextTypeId(), lineDelimiter);
String fileComment= getFileComment(file, lineDelimiter);
context.setVariable(CodeTemplateContextType.FILE_COMMENT, fileComment != null ? fileComment : ""); //$NON-NLS-1$
String includeGuardSymbol= generateIncludeGuardSymbol(file.getName());
ICProject cproject = CoreModel.getDefault().create(file.getProject());
String includeGuardSymbol= generateIncludeGuardSymbol(file.getName(), cproject);
context.setVariable(CodeTemplateContextType.INCLUDE_GUARD_SYMBOL, includeGuardSymbol != null ? includeGuardSymbol : ""); //$NON-NLS-1$
context.setResourceVariables(file);
String[] fullLine= { CodeTemplateContextType.FILE_COMMENT };
@ -475,7 +479,7 @@ public class StubUtility {
}
public static boolean doAddComments(ICProject project) {
return Boolean.valueOf(PreferenceConstants.getPreference(PreferenceConstants.CODEGEN_ADD_COMMENTS, project)).booleanValue();
return PreferenceConstants.getPreference(PreferenceConstants.CODEGEN_ADD_COMMENTS, project, false);
}
private static Template getDefaultFileTemplate(ITranslationUnit tu) {
@ -513,30 +517,78 @@ public class StubUtility {
return projectStore.findTemplateById(id);
}
private static String generateIncludeGuardSymbol(String fileName) {
//TODO eventually make this a prefs option - filename pattern or
// unique id/incremental value
String name = fileName;
if (name != null) {
//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 discourage by the std.
//buf.append('_');
for (int i = 0; i < name.length(); ++i) {
char ch = name.charAt(i);
if (Character.isLetterOrDigit(ch)) {
buf.append(Character.toUpperCase(ch));
} else if (ch == '.' || ch == '_') {
buf.append('_');
}
}
buf.append('_');
return buf.toString();
}
return null;
private static int getIncludeGuardScheme(ICProject cproject) {
return 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 {
return null;
}
case PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_UUID:
return generateIncludeGuardSymbolFromUUID();
default:
CUIPlugin.log("Unknown preference value " + preferenceValue + "for include guard scheme", null); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
}
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);
if (Character.isLetterOrDigit(ch)) {
buf.append(Character.toUpperCase(ch));
} else if (ch == '.' || ch == '_') {
buf.append('_');
}
}
buf.append('_');
return buf.toString();
}
private static String generateIncludeGuardSymbolFromUUID() {
String uuid = UUID.randomUUID().toString();
// 1) Make sure the guard always starts with a letter.
// 2) Convert to upper case and remove invalid characters
//
// e.g. convert
// 067e6162-3b6f-4ae2-a171-2470b63dff00 to
// H067E6162-3b6F-4AE2-A171-2470B63DFF00
StringBuffer buf = new StringBuffer();
buf.append('H');
for (int i = 0; i < uuid.length(); ++i) {
char ch = uuid.charAt(i);
if (Character.isLetterOrDigit(ch)) {
buf.append(Character.toUpperCase(ch));
} else {
buf.append('_');
}
}
return buf.toString();
}
/**
* Get a set of file templates for the given content types.
*

View file

@ -11,6 +11,7 @@
* Anton Leherbauer (Wind River Systems)
* Sergey Prigogin (Google)
* Elazar Leibovich (IDF) - Code folding of compound statements (bug 174597)
* Jens Elmenthaler (Verigy) - http://bugs.eclipse.org/235586
*******************************************************************************/
package org.eclipse.cdt.ui;
@ -18,6 +19,7 @@ import java.util.Locale;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.preference.IPreferenceStore;
@ -1380,6 +1382,32 @@ public class PreferenceConstants {
*/
public static final String SCALABILITY_CONTENT_ASSIST_AUTO_ACTIVATION = "scalability.contentAssistAutoActivation"; //$NON-NLS-1$
/**
* A named preference that controls how an include guard symbol is created.
* <p>
* Value is of type <code>Integer</code>.
* </p>
*
* @since 5.1
*/
public static final String CODE_TEMPLATES_INCLUDE_GUARD_SCHEME = "codetemplates.includeGuardGenerationScheme"; //$NON-NLS-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 name.
*
* @since 5.1
*/
public static final int CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_NAME = 0;
/**
* The value of <code>CODE_TEMPLATES_INCLUDE_GUARD_GENERATION_SCHEME</code>
* specifying that the include guard symbol is to be derived from a UUID.
*
* @since 5.1
*/
public static final int CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_UUID = 1;
/**
* Returns the CDT-UI preference store.
@ -1572,11 +1600,39 @@ public class PreferenceConstants {
store.setDefault(PreferenceConstants.SCALABILITY_SEMANTIC_HIGHLIGHT, false);
store.setDefault(PreferenceConstants.SCALABILITY_PARSER_BASED_CONTENT_ASSIST, false);
store.setDefault(PreferenceConstants.SCALABILITY_CONTENT_ASSIST_AUTO_ACTIVATION, false);
//Code Templates
store.setDefault(PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME,
CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_NAME);
}
/**
* Returns the node in the preference in the given context.
* @param key The preference key.
* @param project The current context or <code>null</code> if no context is available and the
* workspace setting should be taken. Note that passing <code>null</code> should
* be avoided.
* @return Returns the node matching the given context.
*/
private static IEclipsePreferences getPreferenceNode(String key, ICProject project) {
IEclipsePreferences node = null;
if (project != null) {
node = new ProjectScope(project.getProject()).getNode(CUIPlugin.PLUGIN_ID);
if (node.get(key, null) != null) {
return node;
}
}
node = new InstanceScope().getNode(CUIPlugin.PLUGIN_ID);
if (node.get(key, null) != null) {
return node;
}
return new DefaultScope().getNode(CUIPlugin.PLUGIN_ID);
}
/**
* Returns the value for the given key in the given context.
* Returns the string value for the given key in the given context.
* @param key The preference key
* @param project The current context or <code>null</code> if no context is available and the
* workspace setting should be taken. Note that passing <code>null</code> should
@ -1585,20 +1641,36 @@ public class PreferenceConstants {
* @since 5.0
*/
public static String getPreference(String key, ICProject project) {
String val;
if (project != null) {
val= new ProjectScope(project.getProject()).getNode(CUIPlugin.PLUGIN_ID).get(key, null);
if (val != null) {
return val;
}
}
val= new InstanceScope().getNode(CUIPlugin.PLUGIN_ID).get(key, null);
if (val != null) {
return val;
}
return new DefaultScope().getNode(CUIPlugin.PLUGIN_ID).get(key, null);
return getPreferenceNode(key, project).get(key, null);
}
/**
* Returns the integer value for the given key in the given context.
* @param key The preference key
* @param project The current context or <code>null</code> if no context is available and the
* workspace setting should be taken. Note that passing <code>null</code> should
* be avoided.
* @param defaultValue The default value if not specified in the preferences.
* @return Returns the current value for the string.
* @since 5.1
*/
public static int getPreference(String key, ICProject project, int defaultValue) {
return getPreferenceNode(key, project).getInt(key, defaultValue);
}
/**
* Returns the boolean value for the given key in the given context.
* @param key The preference key
* @param project The current context or <code>null</code> if no context is available and the
* workspace setting should be taken. Note that passing <code>null</code> should
* be avoided.
* @param defaultValue The default value if not specified in the preferences.
* @return Returns the current value for the string.
* @since 5.1
*/
public static boolean getPreference(String key, ICProject project, boolean defaultValue) {
return getPreferenceNode(key, project).getBoolean(key, defaultValue);
}
/**
* Sets the default value and fires a property