1 /*******************************************************************************
2 * Copyright (c) 2000, 2004 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package net.sourceforge.phpdt.internal.corext.template.php;
13 import java.util.ArrayList;
15 import net.sourceforge.phpdt.core.ToolFactory;
16 import net.sourceforge.phpdt.core.compiler.IScanner;
17 import net.sourceforge.phpdt.core.compiler.ITerminalSymbols;
18 import net.sourceforge.phpdt.core.compiler.ITerminalSymbols.TokenName;
19 import net.sourceforge.phpdt.core.compiler.InvalidInputException;
20 import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
22 import org.eclipse.jface.text.templates.ContextTypeRegistry;
23 import org.eclipse.jface.text.templates.GlobalTemplateVariables;
24 import org.eclipse.jface.text.templates.TemplateContext;
25 import org.eclipse.jface.text.templates.TemplateContextType;
26 import org.eclipse.jface.text.templates.TemplateException;
27 import org.eclipse.jface.text.templates.TemplateVariable;
28 import org.eclipse.jface.text.templates.TemplateVariableResolver;
32 public class CodeTemplateContextType extends TemplateContextType {
35 public static final String CATCHBLOCK_CONTEXTTYPE = "php_catchblock_context"; //$NON-NLS-1$
37 public static final String METHODBODY_CONTEXTTYPE = "php_methodbody_context"; //$NON-NLS-1$
39 public static final String CONSTRUCTORBODY_CONTEXTTYPE = "php_constructorbody_context"; //$NON-NLS-1$
41 public static final String GETTERBODY_CONTEXTTYPE = "php_getterbody_context"; //$NON-NLS-1$
43 public static final String SETTERBODY_CONTEXTTYPE = "php_setterbody_context"; //$NON-NLS-1$
45 public static final String NEWTYPE_CONTEXTTYPE = "php_newtype_context"; //$NON-NLS-1$
47 public static final String NEWHTML_CONTEXTTYPE = "php_newhtml_context"; //$NON-NLS-1$
49 public static final String TYPECOMMENT_CONTEXTTYPE = "php_typecomment_context"; //$NON-NLS-1$
51 public static final String FIELDCOMMENT_CONTEXTTYPE = "php_fieldcomment_context"; //$NON-NLS-1$
53 public static final String METHODCOMMENT_CONTEXTTYPE = "php_methodcomment_context"; //$NON-NLS-1$
55 public static final String CONSTRUCTORCOMMENT_CONTEXTTYPE = "php_constructorcomment_context"; //$NON-NLS-1$
57 public static final String OVERRIDECOMMENT_CONTEXTTYPE = "php_overridecomment_context"; //$NON-NLS-1$
59 public static final String GETTERCOMMENT_CONTEXTTYPE = "php_gettercomment_context"; //$NON-NLS-1$
61 public static final String SETTERCOMMENT_CONTEXTTYPE = "php_settercomment_context"; //$NON-NLS-1$
64 public static final String COMMENT_SUFFIX = "comment"; //$NON-NLS-1$
66 public static final String CATCHBLOCK = "catchblock"; //$NON-NLS-1$
68 public static final String METHODSTUB = "methodbody"; //$NON-NLS-1$
70 public static final String NEWTYPE = "newtype"; //$NON-NLS-1$
72 public static final String NEWHTML = "newhtml"; //$NON-NLS-1$
74 public static final String CONSTRUCTORSTUB = "constructorbody"; //$NON-NLS-1$
76 public static final String GETTERSTUB = "getterbody"; //$NON-NLS-1$
78 public static final String SETTERSTUB = "setterbody"; //$NON-NLS-1$
80 public static final String TYPECOMMENT = "type" + COMMENT_SUFFIX; //$NON-NLS-1$
82 public static final String FIELDCOMMENT = "field" + COMMENT_SUFFIX; //$NON-NLS-1$
84 public static final String METHODCOMMENT = "method" + COMMENT_SUFFIX; //$NON-NLS-1$
86 public static final String CONSTRUCTORCOMMENT = "constructor" + COMMENT_SUFFIX; //$NON-NLS-1$
88 public static final String OVERRIDECOMMENT = "override" + COMMENT_SUFFIX; //$NON-NLS-1$
90 public static final String GETTERCOMMENT = "getter" + COMMENT_SUFFIX; //$NON-NLS-1$
92 public static final String SETTERCOMMENT = "setter" + COMMENT_SUFFIX; //$NON-NLS-1$
95 public static final String EXCEPTION_TYPE = "exception_type"; //$NON-NLS-1$
97 public static final String EXCEPTION_VAR = "exception_var"; //$NON-NLS-1$
99 public static final String ENCLOSING_METHOD = "enclosing_method"; //$NON-NLS-1$
101 public static final String ENCLOSING_TYPE = "enclosing_type"; //$NON-NLS-1$
103 public static final String BODY_STATEMENT = "body_statement"; //$NON-NLS-1$
105 public static final String FIELD = "field"; //$NON-NLS-1$
107 public static final String FIELD_TYPE = "field_type"; //$NON-NLS-1$
109 public static final String BARE_FIELD_NAME = "bare_field_name"; //$NON-NLS-1$
111 public static final String PARAM = "param"; //$NON-NLS-1$
113 public static final String RETURN_TYPE = "return_type"; //$NON-NLS-1$
115 public static final String SEE_TAG = "see_to_overridden"; //$NON-NLS-1$
117 public static final String TAGS = "tags"; //$NON-NLS-1$
119 public static final String TYPENAME = "type_name"; //$NON-NLS-1$
121 public static final String FILENAME = "file_name"; //$NON-NLS-1$
123 public static final String PACKAGENAME = "package_name"; //$NON-NLS-1$
125 public static final String PROJECTNAME = "project_name"; //$NON-NLS-1$
127 public static final String PACKAGE_DECLARATION = "package_declaration"; //$NON-NLS-1$
129 public static final String TYPE_DECLARATION = "type_declaration"; //$NON-NLS-1$
131 public static final String TYPE_COMMENT = "typecomment"; //$NON-NLS-1$
134 * Resolver that resolves to the variable defined in the context.
136 public static class CodeTemplateVariableResolver extends
137 TemplateVariableResolver {
138 public CodeTemplateVariableResolver(String type, String description) {
139 super(type, description);
142 protected String resolve(TemplateContext context) {
143 return context.getVariable(getType());
148 * Resolver for javadoc tags.
150 public static class TagsVariableResolver extends TemplateVariableResolver {
151 public TagsVariableResolver() {
155 .getString("CodeTemplateContextType.variable.description.tags")); //$NON-NLS-1$
158 protected String resolve(TemplateContext context) {
159 return "@"; //$NON-NLS-1$
164 * Resolver for todo tags.
166 protected static class Todo extends TemplateVariableResolver {
170 "todo", JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.todo")); //$NON-NLS-1$ //$NON-NLS-2$
173 protected String resolve(TemplateContext context) {
174 String todoTaskTag = StubUtility
175 .getTodoTaskTag(((CodeTemplateContext) context)
177 if (todoTaskTag == null)
178 return "XXX"; //$NON-NLS-1$
184 private boolean fIsComment;
186 public CodeTemplateContextType(String contextName) {
192 addResolver(new GlobalTemplateVariables.Dollar());
193 addResolver(new GlobalTemplateVariables.Date());
194 addResolver(new GlobalTemplateVariables.Year());
195 addResolver(new GlobalTemplateVariables.Time());
196 addResolver(new GlobalTemplateVariables.User());
197 addResolver(new Todo());
199 if (CATCHBLOCK_CONTEXTTYPE.equals(contextName)) {
200 addResolver(new CodeTemplateVariableResolver(
203 .getString("CodeTemplateContextType.variable.description.exceptiontype"))); //$NON-NLS-1$
204 addResolver(new CodeTemplateVariableResolver(
207 .getString("CodeTemplateContextType.variable.description.exceptionvar"))); //$NON-NLS-1$
208 } else if (METHODBODY_CONTEXTTYPE.equals(contextName)) {
209 addResolver(new CodeTemplateVariableResolver(
212 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
213 addResolver(new CodeTemplateVariableResolver(
216 .getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
217 addResolver(new CodeTemplateVariableResolver(
220 .getString("CodeTemplateContextType.variable.description.bodystatement"))); //$NON-NLS-1$
221 } else if (CONSTRUCTORBODY_CONTEXTTYPE.equals(contextName)) {
222 addResolver(new CodeTemplateVariableResolver(
225 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
226 addResolver(new CodeTemplateVariableResolver(
229 .getString("CodeTemplateContextType.variable.description.bodystatement"))); //$NON-NLS-1$
230 } else if (GETTERBODY_CONTEXTTYPE.equals(contextName)) {
231 addResolver(new CodeTemplateVariableResolver(
234 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
235 addResolver(new CodeTemplateVariableResolver(
238 .getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
239 addResolver(new CodeTemplateVariableResolver(
242 .getString("CodeTemplateContextType.variable.description.getterfieldname"))); //$NON-NLS-1$
243 } else if (SETTERBODY_CONTEXTTYPE.equals(contextName)) {
244 addResolver(new CodeTemplateVariableResolver(
247 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
248 addResolver(new CodeTemplateVariableResolver(
251 .getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
252 addResolver(new CodeTemplateVariableResolver(
255 .getString("CodeTemplateContextType.variable.description.getterfieldname"))); //$NON-NLS-1$
256 addResolver(new CodeTemplateVariableResolver(
259 .getString("CodeTemplateContextType.variable.description.param"))); //$NON-NLS-1$
260 } else if (NEWTYPE_CONTEXTTYPE.equals(contextName)) {
261 addResolver(new CodeTemplateVariableResolver(
264 .getString("CodeTemplateContextType.variable.description.typename"))); //$NON-NLS-1$
265 addResolver(new CodeTemplateVariableResolver(
268 .getString("CodeTemplateContextType.variable.description.packdeclaration"))); //$NON-NLS-1$
269 addResolver(new CodeTemplateVariableResolver(
272 .getString("CodeTemplateContextType.variable.description.typedeclaration"))); //$NON-NLS-1$
273 addResolver(new CodeTemplateVariableResolver(
276 .getString("CodeTemplateContextType.variable.description.typecomment"))); //$NON-NLS-1$
277 addCompilationUnitVariables();
278 } else if (NEWHTML_CONTEXTTYPE.equals(contextName)) {
279 addResolver(new CodeTemplateVariableResolver(
282 .getString("CodeTemplateContextType.variable.description.typename"))); //$NON-NLS-1$
283 addResolver(new CodeTemplateVariableResolver(
286 .getString("CodeTemplateContextType.variable.description.packdeclaration"))); //$NON-NLS-1$
287 addResolver(new CodeTemplateVariableResolver(
290 .getString("CodeTemplateContextType.variable.description.typedeclaration"))); //$NON-NLS-1$
291 addResolver(new CodeTemplateVariableResolver(
294 .getString("CodeTemplateContextType.variable.description.typecomment"))); //$NON-NLS-1$
295 addCompilationUnitVariables();
296 } else if (TYPECOMMENT_CONTEXTTYPE.equals(contextName)) {
297 addResolver(new CodeTemplateVariableResolver(
300 .getString("CodeTemplateContextType.variable.description.typename"))); //$NON-NLS-1$
301 addResolver(new CodeTemplateVariableResolver(
304 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
305 addResolver(new TagsVariableResolver());
306 addCompilationUnitVariables();
308 } else if (FIELDCOMMENT_CONTEXTTYPE.equals(contextName)) {
309 addResolver(new CodeTemplateVariableResolver(
312 .getString("CodeTemplateContextType.variable.description.fieldtype"))); //$NON-NLS-1$
313 addResolver(new CodeTemplateVariableResolver(
316 .getString("CodeTemplateContextType.variable.description.fieldname"))); //$NON-NLS-1$
317 addCompilationUnitVariables();
319 } else if (METHODCOMMENT_CONTEXTTYPE.equals(contextName)) {
320 addResolver(new CodeTemplateVariableResolver(
323 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
324 addResolver(new CodeTemplateVariableResolver(
327 .getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
328 addResolver(new CodeTemplateVariableResolver(
331 .getString("CodeTemplateContextType.variable.description.returntype"))); //$NON-NLS-1$
332 addResolver(new TagsVariableResolver());
333 addCompilationUnitVariables();
335 } else if (OVERRIDECOMMENT_CONTEXTTYPE.equals(contextName)) {
336 addResolver(new CodeTemplateVariableResolver(
339 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
340 addResolver(new CodeTemplateVariableResolver(
343 .getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
344 addResolver(new CodeTemplateVariableResolver(
347 .getString("CodeTemplateContextType.variable.description.seetag"))); //$NON-NLS-1$
348 addResolver(new TagsVariableResolver());
349 addCompilationUnitVariables();
351 } else if (CONSTRUCTORCOMMENT_CONTEXTTYPE.equals(contextName)) {
352 addResolver(new CodeTemplateVariableResolver(
355 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
356 addResolver(new TagsVariableResolver());
357 addCompilationUnitVariables();
359 } else if (GETTERCOMMENT_CONTEXTTYPE.equals(contextName)) {
360 addResolver(new CodeTemplateVariableResolver(
363 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
364 addResolver(new CodeTemplateVariableResolver(
367 .getString("CodeTemplateContextType.variable.description.getterfieldtype"))); //$NON-NLS-1$
368 addResolver(new CodeTemplateVariableResolver(
371 .getString("CodeTemplateContextType.variable.description.getterfieldname"))); //$NON-NLS-1$
372 addResolver(new CodeTemplateVariableResolver(
375 .getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
376 addResolver(new CodeTemplateVariableResolver(
379 .getString("CodeTemplateContextType.variable.description.barefieldname"))); //$NON-NLS-1$
380 addCompilationUnitVariables();
382 } else if (SETTERCOMMENT_CONTEXTTYPE.equals(contextName)) {
383 addResolver(new CodeTemplateVariableResolver(
386 .getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
387 addResolver(new CodeTemplateVariableResolver(
390 .getString("CodeTemplateContextType.variable.description.getterfieldtype"))); //$NON-NLS-1$
391 addResolver(new CodeTemplateVariableResolver(
394 .getString("CodeTemplateContextType.variable.description.getterfieldname"))); //$NON-NLS-1$
395 addResolver(new CodeTemplateVariableResolver(
398 .getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
399 addResolver(new CodeTemplateVariableResolver(
402 .getString("CodeTemplateContextType.variable.description.param"))); //$NON-NLS-1$
403 addResolver(new CodeTemplateVariableResolver(
406 .getString("CodeTemplateContextType.variable.description.barefieldname"))); //$NON-NLS-1$
407 addCompilationUnitVariables();
412 private void addCompilationUnitVariables() {
413 addResolver(new CodeTemplateVariableResolver(
416 .getString("CodeTemplateContextType.variable.description.filename"))); //$NON-NLS-1$
417 addResolver(new CodeTemplateVariableResolver(
420 .getString("CodeTemplateContextType.variable.description.packagename"))); //$NON-NLS-1$
421 addResolver(new CodeTemplateVariableResolver(
424 .getString("CodeTemplateContextType.variable.description.projectname"))); //$NON-NLS-1$
428 * @see net.sourceforge.phpdt.internal.corext.template.ContextType#validateVariables(net.sourceforge.phpdt.internal.corext.template.TemplateVariable[])
430 protected void validateVariables(TemplateVariable[] variables)
431 throws TemplateException {
432 ArrayList required = new ArrayList(5);
433 //String contextName = getId();
434 // if (NEWTYPE_CONTEXTTYPE.equals(contextName)) {
435 // required.add(PACKAGE_DECLARATION);
436 // required.add(TYPE_DECLARATION);
438 for (int i = 0; i < variables.length; i++) {
439 String type = variables[i].getType();
440 if (getResolver(type) == null) {
441 throw new TemplateException(
444 "CodeTemplateContextType.validate.unknownvariable", type)); //$NON-NLS-1$
446 required.remove(type);
448 if (!required.isEmpty()) {
449 String missing = (String) required.get(0);
450 throw new TemplateException(
453 "CodeTemplateContextType.validate.missingvariable", missing)); //$NON-NLS-1$
455 super.validateVariables(variables);
461 * @see net.sourceforge.phpdt.internal.corext.template.ContextType#createContext()
463 // public TemplateContext createContext() {
467 public static void registerContextTypes(ContextTypeRegistry registry) {
468 registry.addContextType(new CodeTemplateContextType(
469 CodeTemplateContextType.CATCHBLOCK_CONTEXTTYPE));
470 registry.addContextType(new CodeTemplateContextType(
471 CodeTemplateContextType.METHODBODY_CONTEXTTYPE));
472 registry.addContextType(new CodeTemplateContextType(
473 CodeTemplateContextType.CONSTRUCTORBODY_CONTEXTTYPE));
474 registry.addContextType(new CodeTemplateContextType(
475 CodeTemplateContextType.GETTERBODY_CONTEXTTYPE));
476 registry.addContextType(new CodeTemplateContextType(
477 CodeTemplateContextType.SETTERBODY_CONTEXTTYPE));
478 registry.addContextType(new CodeTemplateContextType(
479 CodeTemplateContextType.NEWTYPE_CONTEXTTYPE));
480 registry.addContextType(new CodeTemplateContextType(
481 CodeTemplateContextType.NEWHTML_CONTEXTTYPE));
483 registry.addContextType(new CodeTemplateContextType(
484 CodeTemplateContextType.TYPECOMMENT_CONTEXTTYPE));
485 registry.addContextType(new CodeTemplateContextType(
486 CodeTemplateContextType.FIELDCOMMENT_CONTEXTTYPE));
487 registry.addContextType(new CodeTemplateContextType(
488 CodeTemplateContextType.METHODCOMMENT_CONTEXTTYPE));
489 registry.addContextType(new CodeTemplateContextType(
490 CodeTemplateContextType.CONSTRUCTORCOMMENT_CONTEXTTYPE));
491 registry.addContextType(new CodeTemplateContextType(
492 CodeTemplateContextType.OVERRIDECOMMENT_CONTEXTTYPE));
493 registry.addContextType(new CodeTemplateContextType(
494 CodeTemplateContextType.GETTERCOMMENT_CONTEXTTYPE));
495 registry.addContextType(new CodeTemplateContextType(
496 CodeTemplateContextType.SETTERCOMMENT_CONTEXTTYPE));
500 * @see net.sourceforge.phpdt.internal.corext.template.ContextType#validate(java.lang.String)
502 public void validate(String pattern) throws TemplateException {
503 super.validate(pattern);
505 if (!isValidComment(pattern)) {
506 throw new TemplateException(
508 .getString("CodeTemplateContextType.validate.invalidcomment")); //$NON-NLS-1$
513 private boolean isValidComment(String template) {
514 IScanner scanner = ToolFactory.createScanner(true, false, false, true);// false);
515 scanner.setSource(template.toCharArray());
517 TokenName next = scanner.getNextToken();
518 while (next == ITerminalSymbols.TokenName.COMMENT_LINE
519 || next == ITerminalSymbols.TokenName.COMMENT_PHPDOC
520 || next == ITerminalSymbols.TokenName.COMMENT_BLOCK) {
521 next = scanner.getNextToken();
523 return next == ITerminalSymbols.TokenName.EOF;
524 } catch (InvalidInputException e) {