1 12 package org.eclipse.jdt.internal.corext.template.java; 13 14 import java.util.ArrayList ; 15 16 import org.eclipse.jface.text.templates.ContextTypeRegistry; 17 import org.eclipse.jface.text.templates.GlobalTemplateVariables; 18 import org.eclipse.jface.text.templates.TemplateContext; 19 import org.eclipse.jface.text.templates.TemplateContextType; 20 import org.eclipse.jface.text.templates.TemplateException; 21 import org.eclipse.jface.text.templates.TemplateVariable; 22 import org.eclipse.jface.text.templates.TemplateVariableResolver; 23 24 import org.eclipse.jdt.core.ToolFactory; 25 import org.eclipse.jdt.core.compiler.IScanner; 26 import org.eclipse.jdt.core.compiler.ITerminalSymbols; 27 import org.eclipse.jdt.core.compiler.InvalidInputException; 28 29 import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility; 30 import org.eclipse.jdt.internal.corext.dom.TokenScanner; 31 import org.eclipse.jdt.internal.corext.util.Messages; 32 33 35 public class CodeTemplateContextType extends TemplateContextType { 36 37 38 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_CONTEXTTYPE= "filecomment_context"; public static final String TYPECOMMENT_CONTEXTTYPE= "typecomment_context"; public static final String FIELDCOMMENT_CONTEXTTYPE= "fieldcomment_context"; public static final String METHODCOMMENT_CONTEXTTYPE= "methodcomment_context"; public static final String CONSTRUCTORCOMMENT_CONTEXTTYPE= "constructorcomment_context"; public static final String OVERRIDECOMMENT_CONTEXTTYPE= "overridecomment_context"; public static final String DELEGATECOMMENT_CONTEXTTYPE= "delegatecomment_context"; public static final String GETTERCOMMENT_CONTEXTTYPE= "gettercomment_context"; public static final String SETTERCOMMENT_CONTEXTTYPE= "settercomment_context"; 58 59 60 private static final String CODETEMPLATES_PREFIX= "org.eclipse.jdt.ui.text.codetemplates."; public static final String COMMENT_SUFFIX= "comment"; 63 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 FILECOMMENT_ID= CODETEMPLATES_PREFIX + "file" + COMMENT_SUFFIX; public static final String TYPECOMMENT_ID= 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 FIELDCOMMENT_ID= CODETEMPLATES_PREFIX + "field" + COMMENT_SUFFIX; public static final String METHODCOMMENT_ID= CODETEMPLATES_PREFIX + "method" + COMMENT_SUFFIX; public static final String CONSTRUCTORCOMMENT_ID= CODETEMPLATES_PREFIX + "constructor" + COMMENT_SUFFIX; public static final String OVERRIDECOMMENT_ID= CODETEMPLATES_PREFIX + "override" + COMMENT_SUFFIX; public static final String DELEGATECOMMENT_ID= CODETEMPLATES_PREFIX + "delegate" + COMMENT_SUFFIX; public static final String GETTERCOMMENT_ID= CODETEMPLATES_PREFIX + "getter" + COMMENT_SUFFIX; public static final String SETTERCOMMENT_ID= CODETEMPLATES_PREFIX + "setter" + COMMENT_SUFFIX; 83 84 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_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"; 93 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"; 98 public static final String TAGS= "tags"; 100 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"; 105 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 TYPE_COMMENT= "typecomment"; public static final String FILE_COMMENT= "filecomment"; 114 115 118 public static class CodeTemplateVariableResolver extends TemplateVariableResolver { 119 public CodeTemplateVariableResolver(String type, String description) { 120 super(type, description); 121 } 122 123 protected String resolve(TemplateContext context) { 124 return context.getVariable(getType()); 125 } 126 } 127 128 131 public static class TagsVariableResolver extends TemplateVariableResolver { 132 public TagsVariableResolver() { 133 super(TAGS, JavaTemplateMessages.CodeTemplateContextType_variable_description_tags); 134 } 135 136 protected String resolve(TemplateContext context) { 137 return "@"; } 139 } 140 141 144 protected static class Todo extends TemplateVariableResolver { 145 146 public Todo() { 147 super("todo", JavaTemplateMessages.CodeTemplateContextType_variable_description_todo); } 149 150 protected String resolve(TemplateContext context) { 151 String todoTaskTag= StubUtility.getTodoTaskTag(((CodeTemplateContext) context).getJavaProject()); 152 if (todoTaskTag == null) 153 return "XXX"; 155 return todoTaskTag; 156 } 157 } 158 159 private boolean fIsComment; 160 161 public CodeTemplateContextType(String contextName) { 162 super(contextName); 163 164 fIsComment= false; 165 166 addResolver(new GlobalTemplateVariables.Dollar()); 168 addResolver(new GlobalTemplateVariables.Date()); 169 addResolver(new GlobalTemplateVariables.Year()); 170 addResolver(new GlobalTemplateVariables.Time()); 171 addResolver(new GlobalTemplateVariables.User()); 172 addResolver(new Todo()); 173 174 if (CATCHBLOCK_CONTEXTTYPE.equals(contextName)) { 175 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 176 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 177 178 addResolver(new CodeTemplateVariableResolver(EXCEPTION_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_exceptiontype)); 179 addResolver(new CodeTemplateVariableResolver(EXCEPTION_VAR, JavaTemplateMessages.CodeTemplateContextType_variable_description_exceptionvar)); 180 } else if (METHODBODY_CONTEXTTYPE.equals(contextName)) { 181 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 182 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 183 addResolver(new CodeTemplateVariableResolver(BODY_STATEMENT, JavaTemplateMessages.CodeTemplateContextType_variable_description_bodystatement)); 184 } else if (CONSTRUCTORBODY_CONTEXTTYPE.equals(contextName)) { 185 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 186 addResolver(new CodeTemplateVariableResolver(BODY_STATEMENT, JavaTemplateMessages.CodeTemplateContextType_variable_description_bodystatement)); 187 } else if (GETTERBODY_CONTEXTTYPE.equals(contextName)) { 188 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 189 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 190 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.CodeTemplateContextType_variable_description_getterfieldname)); 191 } else if (SETTERBODY_CONTEXTTYPE.equals(contextName)) { 192 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 193 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 194 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.CodeTemplateContextType_variable_description_getterfieldname)); 195 addResolver(new CodeTemplateVariableResolver(PARAM, JavaTemplateMessages.CodeTemplateContextType_variable_description_param)); 196 } else if (NEWTYPE_CONTEXTTYPE.equals(contextName)) { 197 addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_typename)); 198 addResolver(new CodeTemplateVariableResolver(PACKAGE_DECLARATION, JavaTemplateMessages.CodeTemplateContextType_variable_description_packdeclaration)); 199 addResolver(new CodeTemplateVariableResolver(TYPE_DECLARATION, JavaTemplateMessages.CodeTemplateContextType_variable_description_typedeclaration)); 200 addResolver(new CodeTemplateVariableResolver(TYPE_COMMENT, JavaTemplateMessages.CodeTemplateContextType_variable_description_typecomment)); 201 addResolver(new CodeTemplateVariableResolver(FILE_COMMENT, JavaTemplateMessages.CodeTemplateContextType_variable_description_filecomment)); 202 addCompilationUnitVariables(); 203 } else if (CLASSBODY_CONTEXTTYPE.equals(contextName) || 204 INTERFACEBODY_CONTEXTTYPE.equals(contextName) || 205 ENUMBODY_CONTEXTTYPE.equals(contextName) || 206 ANNOTATIONBODY_CONTEXTTYPE.equals(contextName)) { 207 addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_typename)); 208 addCompilationUnitVariables(); 209 } else if (TYPECOMMENT_CONTEXTTYPE.equals(contextName)) { 210 addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_typename)); 211 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 212 addResolver(new TagsVariableResolver()); 213 addCompilationUnitVariables(); 214 fIsComment= true; 215 } else if (FILECOMMENT_CONTEXTTYPE.equals(contextName)) { 216 addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_typename)); 217 addCompilationUnitVariables(); 218 fIsComment= true; 219 } else if (FIELDCOMMENT_CONTEXTTYPE.equals(contextName)) { 220 addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_fieldtype)); 221 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.CodeTemplateContextType_variable_description_fieldname)); 222 addCompilationUnitVariables(); 223 fIsComment= true; 224 } else if (METHODCOMMENT_CONTEXTTYPE.equals(contextName)) { 225 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 226 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 227 addResolver(new CodeTemplateVariableResolver(RETURN_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_returntype)); 228 addResolver(new TagsVariableResolver()); 229 addCompilationUnitVariables(); 230 fIsComment= true; 231 } else if (OVERRIDECOMMENT_CONTEXTTYPE.equals(contextName)) { 232 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 233 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 234 addResolver(new CodeTemplateVariableResolver(SEE_TO_OVERRIDDEN_TAG, JavaTemplateMessages.CodeTemplateContextType_variable_description_see_overridden_tag)); 235 addResolver(new TagsVariableResolver()); 236 addCompilationUnitVariables(); 237 fIsComment= true; 238 } else if (DELEGATECOMMENT_CONTEXTTYPE.equals(contextName)) { 239 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 240 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 241 addResolver(new CodeTemplateVariableResolver(SEE_TO_TARGET_TAG, JavaTemplateMessages.CodeTemplateContextType_variable_description_see_target_tag)); 242 addResolver(new TagsVariableResolver()); 243 addCompilationUnitVariables(); 244 fIsComment= true; 245 } else if (CONSTRUCTORCOMMENT_CONTEXTTYPE.equals(contextName)) { 246 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 247 addResolver(new TagsVariableResolver()); 248 addCompilationUnitVariables(); 249 fIsComment= true; 250 } else if (GETTERCOMMENT_CONTEXTTYPE.equals(contextName)) { 251 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 252 addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_getterfieldtype)); 253 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.CodeTemplateContextType_variable_description_getterfieldname)); 254 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 255 addResolver(new CodeTemplateVariableResolver(BARE_FIELD_NAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_barefieldname)); 256 addCompilationUnitVariables(); 257 fIsComment= true; 258 } else if (SETTERCOMMENT_CONTEXTTYPE.equals(contextName)) { 259 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingtype)); 260 addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaTemplateMessages.CodeTemplateContextType_variable_description_getterfieldtype)); 261 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.CodeTemplateContextType_variable_description_getterfieldname)); 262 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.CodeTemplateContextType_variable_description_enclosingmethod)); 263 addResolver(new CodeTemplateVariableResolver(PARAM, JavaTemplateMessages.CodeTemplateContextType_variable_description_param)); 264 addResolver(new CodeTemplateVariableResolver(BARE_FIELD_NAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_barefieldname)); 265 addCompilationUnitVariables(); 266 fIsComment= true; 267 } 268 } 269 270 private void addCompilationUnitVariables() { 271 addResolver(new CodeTemplateVariableResolver(FILENAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_filename)); 272 addResolver(new CodeTemplateVariableResolver(PACKAGENAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_packagename)); 273 addResolver(new CodeTemplateVariableResolver(PROJECTNAME, JavaTemplateMessages.CodeTemplateContextType_variable_description_projectname)); 274 } 275 276 279 protected void validateVariables(TemplateVariable[] variables) throws TemplateException { 280 ArrayList required= new ArrayList (5); 281 String contextName= getId(); 282 if (NEWTYPE_CONTEXTTYPE.equals(contextName)) { 283 required.add(PACKAGE_DECLARATION); 284 required.add(TYPE_DECLARATION); 285 } 286 for (int i= 0; i < variables.length; i++) { 287 String type= variables[i].getType(); 288 if (getResolver(type) == null) { 289 throw new TemplateException(Messages.format(JavaTemplateMessages.CodeTemplateContextType_validate_unknownvariable, type)); 290 } 291 required.remove(type); 292 } 293 if (!required.isEmpty()) { 294 String missing= (String ) required.get(0); 295 throw new TemplateException(Messages.format(JavaTemplateMessages.CodeTemplateContextType_validate_missingvariable, missing)); 296 } 297 super.validateVariables(variables); 298 } 299 300 303 public TemplateContext createContext() { 304 return null; 305 } 306 307 public static void registerContextTypes(ContextTypeRegistry registry) { 308 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CATCHBLOCK_CONTEXTTYPE)); 309 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.METHODBODY_CONTEXTTYPE)); 310 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CONSTRUCTORBODY_CONTEXTTYPE)); 311 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.GETTERBODY_CONTEXTTYPE)); 312 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.SETTERBODY_CONTEXTTYPE)); 313 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.NEWTYPE_CONTEXTTYPE)); 314 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CLASSBODY_CONTEXTTYPE)); 315 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.INTERFACEBODY_CONTEXTTYPE)); 316 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.ENUMBODY_CONTEXTTYPE)); 317 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.ANNOTATIONBODY_CONTEXTTYPE)); 318 319 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.FILECOMMENT_CONTEXTTYPE)); 320 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.TYPECOMMENT_CONTEXTTYPE)); 321 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.FIELDCOMMENT_CONTEXTTYPE)); 322 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.METHODCOMMENT_CONTEXTTYPE)); 323 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CONSTRUCTORCOMMENT_CONTEXTTYPE)); 324 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.OVERRIDECOMMENT_CONTEXTTYPE)); 325 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.DELEGATECOMMENT_CONTEXTTYPE)); 326 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.GETTERCOMMENT_CONTEXTTYPE)); 327 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.SETTERCOMMENT_CONTEXTTYPE)); 328 } 329 330 333 public void validate(String pattern) throws TemplateException { 334 super.validate(pattern); 335 if (fIsComment) { 336 if (!isValidComment(pattern)) { 337 throw new TemplateException(JavaTemplateMessages.CodeTemplateContextType_validate_invalidcomment); 338 } 339 } 340 } 341 342 343 private boolean isValidComment(String template) { 344 IScanner scanner= ToolFactory.createScanner(true, false, false, false); 345 scanner.setSource(template.toCharArray()); 346 try { 347 int next= scanner.getNextToken(); 348 while (TokenScanner.isComment(next)) { 349 next= scanner.getNextToken(); 350 } 351 return next == ITerminalSymbols.TokenNameEOF; 352 } catch (InvalidInputException e) { 353 } 354 return false; 355 } 356 357 } 358 | Popular Tags |