package org.eclipse.jdt.internal.core.manipulation;
import java.util.ArrayList;
import org.eclipse.text.templates.ContextTypeRegistry;
import org.eclipse.jface.text.templates.GlobalTemplateVariables;
import org.eclipse.jface.text.templates.TemplateContext;
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.text.templates.TemplateException;
import org.eclipse.jface.text.templates.TemplateVariable;
import org.eclipse.jface.text.templates.TemplateVariableResolver;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.compiler.IScanner;
import org.eclipse.jdt.core.compiler.ITerminalSymbols;
import org.eclipse.jdt.core.compiler.InvalidInputException;
import org.eclipse.jdt.internal.corext.dom.TokenScanner;
import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
public class CodeTemplateContextType extends TemplateContextType {
public static final String CATCHBLOCK_CONTEXTTYPE= "catchblock_context";
public static final String METHODBODY_CONTEXTTYPE= "methodbody_context";
public static final String CONSTRUCTORBODY_CONTEXTTYPE= "constructorbody_context";
public static final String GETTERBODY_CONTEXTTYPE= "getterbody_context";
public static final String SETTERBODY_CONTEXTTYPE= "setterbody_context";
public static final String NEWTYPE_CONTEXTTYPE= "newtype_context";
public static final String CLASSBODY_CONTEXTTYPE= "classbody_context";
public static final String INTERFACEBODY_CONTEXTTYPE= "interfacebody_context";
public static final String ENUMBODY_CONTEXTTYPE= "enumbody_context";
public static final String ANNOTATIONBODY_CONTEXTTYPE= "annotationbody_context";
public static final String = "filecomment_context";
public static final String = "typecomment_context";
public static final String = "fieldcomment_context";
public static final String = "methodcomment_context";
public static final String = "constructorcomment_context";
public static final String = "overridecomment_context";
public static final String = "delegatecomment_context";
public static final String = "gettercomment_context";
public static final String = "settercomment_context";
public static final String = "modulecomment_context";
private static final String CODETEMPLATES_PREFIX= "org.eclipse.jdt.ui.text.codetemplates.";
public static final String = "comment";
public static final String CATCHBLOCK_ID= CODETEMPLATES_PREFIX + "catchblock";
public static final String METHODSTUB_ID= CODETEMPLATES_PREFIX + "methodbody";
public static final String NEWTYPE_ID= CODETEMPLATES_PREFIX + "newtype";
public static final String CONSTRUCTORSTUB_ID= CODETEMPLATES_PREFIX + "constructorbody";
public static final String GETTERSTUB_ID= CODETEMPLATES_PREFIX + "getterbody";
public static final String SETTERSTUB_ID= CODETEMPLATES_PREFIX + "setterbody";
public static final String = CODETEMPLATES_PREFIX + "file" + COMMENT_SUFFIX;
public static final String = CODETEMPLATES_PREFIX + "type" + COMMENT_SUFFIX;
public static final String CLASSBODY_ID= CODETEMPLATES_PREFIX + "classbody";
public static final String INTERFACEBODY_ID= CODETEMPLATES_PREFIX + "interfacebody";
public static final String ENUMBODY_ID= CODETEMPLATES_PREFIX + "enumbody";
public static final String ANNOTATIONBODY_ID= CODETEMPLATES_PREFIX + "annotationbody";
public static final String = CODETEMPLATES_PREFIX + "field" + COMMENT_SUFFIX;
public static final String = CODETEMPLATES_PREFIX + "method" + COMMENT_SUFFIX;
public static final String = CODETEMPLATES_PREFIX + "constructor" + COMMENT_SUFFIX;
public static final String = CODETEMPLATES_PREFIX + "override" + COMMENT_SUFFIX;
public static final String = CODETEMPLATES_PREFIX + "delegate" + COMMENT_SUFFIX;
public static final String = CODETEMPLATES_PREFIX + "getter" + COMMENT_SUFFIX;
public static final String = CODETEMPLATES_PREFIX + "setter" + COMMENT_SUFFIX;
public static final String = CODETEMPLATES_PREFIX + "module" + COMMENT_SUFFIX;
public static final String EXCEPTION_TYPE= "exception_type";
public static final String EXCEPTION_VAR= "exception_var";
public static final String ENCLOSING_METHOD= "enclosing_method";
public static final String ENCLOSING_MODULE= "enclosing_module";
public static final String ENCLOSING_TYPE= "enclosing_type";
public static final String BODY_STATEMENT= "body_statement";
public static final String FIELD= "field";
public static final String FIELD_TYPE= "field_type";
public static final String BARE_FIELD_NAME= "bare_field_name";
public static final String PARAM= "param";
public static final String RETURN_TYPE= "return_type";
public static final String SEE_TO_OVERRIDDEN_TAG= "see_to_overridden";
public static final String SEE_TO_TARGET_TAG= "see_to_target";
public static final String TAGS= "tags";
public static final String TYPENAME= "type_name";
public static final String FILENAME= "file_name";
public static final String PACKAGENAME= "package_name";
public static final String PROJECTNAME= "project_name";
public static final String PACKAGE_DECLARATION= "package_declaration";
public static final String TYPE_DECLARATION= "type_declaration";
public static final String CLASS_BODY= "classbody";
public static final String INTERFACE_BODY= "interfacebody";
public static final String ENUM_BODY= "enumbody";
public static final String ANNOTATION_BODY= "annotationbody";
public static final String = "typecomment";
public static final String = "filecomment";
public static class CodeTemplateVariableResolver extends TemplateVariableResolver {
public CodeTemplateVariableResolver(String type, String description) {
super(type, description);
}
@Override
protected String resolve(TemplateContext context) {
return context.getVariable(getType());
}
}
public static class TagsVariableResolver extends TemplateVariableResolver {
public TagsVariableResolver() {
super(TAGS, JavaManipulationMessages.CodeTemplateContextType_variable_description_tags);
}
@Override
protected String resolve(TemplateContext context) {
return "@";
}
}
protected static class Todo extends TemplateVariableResolver {
public Todo() {
super("todo", JavaManipulationMessages.CodeTemplateContextType_variable_description_todo);
}
@Override
protected String resolve(TemplateContext context) {
String todoTaskTag= StubUtility.getTodoTaskTag(((CodeTemplateContext) context).getJavaProject());
if (todoTaskTag == null)
return "XXX";
return todoTaskTag;
}
}
private boolean ;
public CodeTemplateContextType(String contextName) {
super(contextName);
fIsComment= false;
addResolver(new GlobalTemplateVariables.Dollar());
addResolver(new GlobalTemplateVariables.Date());
addResolver(new GlobalTemplateVariables.Year());
addResolver(new GlobalTemplateVariables.Time());
addResolver(new GlobalTemplateVariables.User());
addResolver(new Todo());
if (CATCHBLOCK_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(EXCEPTION_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_exceptiontype));
addResolver(new CodeTemplateVariableResolver(EXCEPTION_VAR, JavaManipulationMessages.CodeTemplateContextType_variable_description_exceptionvar));
} else if (METHODBODY_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(BODY_STATEMENT, JavaManipulationMessages.CodeTemplateContextType_variable_description_bodystatement));
} else if (CONSTRUCTORBODY_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(BODY_STATEMENT, JavaManipulationMessages.CodeTemplateContextType_variable_description_bodystatement));
} else if (GETTERBODY_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(FIELD, JavaManipulationMessages.CodeTemplateContextType_variable_description_getterfieldname));
} else if (SETTERBODY_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(FIELD, JavaManipulationMessages.CodeTemplateContextType_variable_description_getterfieldname));
addResolver(new CodeTemplateVariableResolver(PARAM, JavaManipulationMessages.CodeTemplateContextType_variable_description_param));
} else if (NEWTYPE_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_typename));
addResolver(new CodeTemplateVariableResolver(PACKAGE_DECLARATION, JavaManipulationMessages.CodeTemplateContextType_variable_description_packdeclaration));
addResolver(new CodeTemplateVariableResolver(TYPE_DECLARATION, JavaManipulationMessages.CodeTemplateContextType_variable_description_typedeclaration));
addResolver(new CodeTemplateVariableResolver(TYPE_COMMENT, JavaManipulationMessages.CodeTemplateContextType_variable_description_typecomment));
addResolver(new CodeTemplateVariableResolver(FILE_COMMENT, JavaManipulationMessages.CodeTemplateContextType_variable_description_filecomment));
addCompilationUnitVariables();
} else if (CLASSBODY_CONTEXTTYPE.equals(contextName) ||
INTERFACEBODY_CONTEXTTYPE.equals(contextName) ||
ENUMBODY_CONTEXTTYPE.equals(contextName) ||
ANNOTATIONBODY_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_typename));
addCompilationUnitVariables();
} else if (TYPECOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_typename));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new TagsVariableResolver());
addCompilationUnitVariables();
fIsComment= true;
} else if (FILECOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_typename));
addCompilationUnitVariables();
fIsComment= true;
} else if (FIELDCOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_fieldtype));
addResolver(new CodeTemplateVariableResolver(FIELD, JavaManipulationMessages.CodeTemplateContextType_variable_description_fieldname));
addCompilationUnitVariables();
fIsComment= true;
} else if (METHODCOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(RETURN_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_returntype));
addResolver(new TagsVariableResolver());
addCompilationUnitVariables();
fIsComment= true;
} else if (MODULECOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_MODULE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmodule));
addResolver(new TagsVariableResolver());
addCompilationUnitVariables();
fIsComment= true;
} else if (OVERRIDECOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(SEE_TO_OVERRIDDEN_TAG, JavaManipulationMessages.CodeTemplateContextType_variable_description_see_overridden_tag));
addResolver(new TagsVariableResolver());
addCompilationUnitVariables();
fIsComment= true;
} else if (DELEGATECOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(SEE_TO_TARGET_TAG, JavaManipulationMessages.CodeTemplateContextType_variable_description_see_target_tag));
addResolver(new TagsVariableResolver());
addCompilationUnitVariables();
fIsComment= true;
} else if (CONSTRUCTORCOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new TagsVariableResolver());
addCompilationUnitVariables();
fIsComment= true;
} else if (GETTERCOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_getterfieldtype));
addResolver(new CodeTemplateVariableResolver(FIELD, JavaManipulationMessages.CodeTemplateContextType_variable_description_getterfieldname));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(BARE_FIELD_NAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_barefieldname));
addCompilationUnitVariables();
fIsComment= true;
} else if (SETTERCOMMENT_CONTEXTTYPE.equals(contextName)) {
addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingtype));
addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaManipulationMessages.CodeTemplateContextType_variable_description_getterfieldtype));
addResolver(new CodeTemplateVariableResolver(FIELD, JavaManipulationMessages.CodeTemplateContextType_variable_description_getterfieldname));
addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaManipulationMessages.CodeTemplateContextType_variable_description_enclosingmethod));
addResolver(new CodeTemplateVariableResolver(PARAM, JavaManipulationMessages.CodeTemplateContextType_variable_description_param));
addResolver(new CodeTemplateVariableResolver(BARE_FIELD_NAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_barefieldname));
addCompilationUnitVariables();
fIsComment= true;
}
}
private void addCompilationUnitVariables() {
addResolver(new CodeTemplateVariableResolver(FILENAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_filename));
addResolver(new CodeTemplateVariableResolver(PACKAGENAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_packagename));
addResolver(new CodeTemplateVariableResolver(PROJECTNAME, JavaManipulationMessages.CodeTemplateContextType_variable_description_projectname));
}
@Override
protected void validateVariables(TemplateVariable[] variables) throws TemplateException {
ArrayList<String> required= new ArrayList<>(5);
String contextName= getId();
if (NEWTYPE_CONTEXTTYPE.equals(contextName)) {
required.add(PACKAGE_DECLARATION);
required.add(TYPE_DECLARATION);
}
for (int i= 0; i < variables.length; i++) {
String type= variables[i].getType();
if (getResolver(type) == null) {
String unknown= BasicElementLabels.getJavaElementName(type);
throw new TemplateException(Messages.format(JavaManipulationMessages.CodeTemplateContextType_validate_unknownvariable, unknown));
}
required.remove(type);
}
if (!required.isEmpty()) {
String missing= BasicElementLabels.getJavaElementName(required.get(0));
throw new TemplateException(Messages.format(JavaManipulationMessages.CodeTemplateContextType_validate_missingvariable, missing));
}
super.validateVariables(variables);
}
public TemplateContext createContext() {
return null;
}
public static void registerContextTypes(ContextTypeRegistry registry) {
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CATCHBLOCK_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.METHODBODY_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CONSTRUCTORBODY_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.GETTERBODY_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.SETTERBODY_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.NEWTYPE_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CLASSBODY_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.INTERFACEBODY_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.ENUMBODY_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.ANNOTATIONBODY_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.FILECOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.TYPECOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.FIELDCOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.METHODCOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.MODULECOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CONSTRUCTORCOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.OVERRIDECOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.DELEGATECOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.GETTERCOMMENT_CONTEXTTYPE));
registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.SETTERCOMMENT_CONTEXTTYPE));
}
@Override
public void validate(String pattern) throws TemplateException {
super.validate(pattern);
if (fIsComment) {
if (!isValidComment(pattern)) {
throw new TemplateException(JavaManipulationMessages.CodeTemplateContextType_validate_invalidcomment);
}
}
}
private boolean (String template) {
IScanner scanner= ToolFactory.createScanner(true, false, false, false);
scanner.setSource(template.toCharArray());
try {
int next= scanner.getNextToken();
while (TokenScanner.isComment(next)) {
next= scanner.getNextToken();
}
return next == ITerminalSymbols.TokenNameEOF;
} catch (InvalidInputException e) {
}
return false;
}
}