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.InvalidInputException;
19 import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
21 import org.eclipse.jface.text.templates.ContextTypeRegistry;
22 import org.eclipse.jface.text.templates.GlobalTemplateVariables;
23 import org.eclipse.jface.text.templates.TemplateContext;
24 import org.eclipse.jface.text.templates.TemplateContextType;
25 import org.eclipse.jface.text.templates.TemplateException;
26 import org.eclipse.jface.text.templates.TemplateVariable;
27 import org.eclipse.jface.text.templates.TemplateVariableResolver;
31 public class CodeTemplateContextType extends TemplateContextType {
34 public static final String CATCHBLOCK_CONTEXTTYPE= "php_catchblock_context"; //$NON-NLS-1$
35 public static final String METHODBODY_CONTEXTTYPE= "php_methodbody_context"; //$NON-NLS-1$
36 public static final String CONSTRUCTORBODY_CONTEXTTYPE= "php_constructorbody_context"; //$NON-NLS-1$
37 public static final String GETTERBODY_CONTEXTTYPE= "php_getterbody_context"; //$NON-NLS-1$
38 public static final String SETTERBODY_CONTEXTTYPE= "php_setterbody_context"; //$NON-NLS-1$
39 public static final String NEWTYPE_CONTEXTTYPE= "php_newtype_context"; //$NON-NLS-1$
40 public static final String NEWHTML_CONTEXTTYPE= "php_newhtml_context"; //$NON-NLS-1$
41 public static final String TYPECOMMENT_CONTEXTTYPE= "php_typecomment_context"; //$NON-NLS-1$
42 public static final String FIELDCOMMENT_CONTEXTTYPE= "php_fieldcomment_context"; //$NON-NLS-1$
43 public static final String METHODCOMMENT_CONTEXTTYPE= "php_methodcomment_context"; //$NON-NLS-1$
44 public static final String CONSTRUCTORCOMMENT_CONTEXTTYPE= "php_constructorcomment_context"; //$NON-NLS-1$
45 public static final String OVERRIDECOMMENT_CONTEXTTYPE= "php_overridecomment_context"; //$NON-NLS-1$
46 public static final String GETTERCOMMENT_CONTEXTTYPE= "php_gettercomment_context"; //$NON-NLS-1$
47 public static final String SETTERCOMMENT_CONTEXTTYPE= "php_settercomment_context"; //$NON-NLS-1$
50 public static final String COMMENT_SUFFIX= "comment"; //$NON-NLS-1$
51 public static final String CATCHBLOCK= "catchblock"; //$NON-NLS-1$
52 public static final String METHODSTUB= "methodbody"; //$NON-NLS-1$
53 public static final String NEWTYPE= "newtype"; //$NON-NLS-1$
54 public static final String NEWHTML= "newhtml"; //$NON-NLS-1$
55 public static final String CONSTRUCTORSTUB= "constructorbody"; //$NON-NLS-1$
56 public static final String GETTERSTUB= "getterbody"; //$NON-NLS-1$
57 public static final String SETTERSTUB= "setterbody"; //$NON-NLS-1$
58 public static final String TYPECOMMENT= "type" + COMMENT_SUFFIX; //$NON-NLS-1$
59 public static final String FIELDCOMMENT= "field" + COMMENT_SUFFIX; //$NON-NLS-1$
60 public static final String METHODCOMMENT= "method" + COMMENT_SUFFIX; //$NON-NLS-1$
61 public static final String CONSTRUCTORCOMMENT= "constructor" + COMMENT_SUFFIX; //$NON-NLS-1$
62 public static final String OVERRIDECOMMENT= "override" + COMMENT_SUFFIX; //$NON-NLS-1$
63 public static final String GETTERCOMMENT= "getter" + COMMENT_SUFFIX; //$NON-NLS-1$
64 public static final String SETTERCOMMENT= "setter" + COMMENT_SUFFIX; //$NON-NLS-1$
67 public static final String EXCEPTION_TYPE= "exception_type"; //$NON-NLS-1$
68 public static final String EXCEPTION_VAR= "exception_var"; //$NON-NLS-1$
69 public static final String ENCLOSING_METHOD= "enclosing_method"; //$NON-NLS-1$
70 public static final String ENCLOSING_TYPE= "enclosing_type"; //$NON-NLS-1$
71 public static final String BODY_STATEMENT= "body_statement"; //$NON-NLS-1$
72 public static final String FIELD= "field"; //$NON-NLS-1$
73 public static final String FIELD_TYPE= "field_type"; //$NON-NLS-1$
74 public static final String BARE_FIELD_NAME= "bare_field_name"; //$NON-NLS-1$
76 public static final String PARAM= "param"; //$NON-NLS-1$
77 public static final String RETURN_TYPE= "return_type"; //$NON-NLS-1$
78 public static final String SEE_TAG= "see_to_overridden"; //$NON-NLS-1$
80 public static final String TAGS= "tags"; //$NON-NLS-1$
82 public static final String TYPENAME= "type_name"; //$NON-NLS-1$
83 public static final String FILENAME= "file_name"; //$NON-NLS-1$
84 public static final String PACKAGENAME= "package_name"; //$NON-NLS-1$
85 public static final String PROJECTNAME= "project_name"; //$NON-NLS-1$
87 public static final String PACKAGE_DECLARATION= "package_declaration"; //$NON-NLS-1$
88 public static final String TYPE_DECLARATION= "type_declaration"; //$NON-NLS-1$
89 public static final String TYPE_COMMENT= "typecomment"; //$NON-NLS-1$
93 * Resolver that resolves to the variable defined in the context.
95 public static class CodeTemplateVariableResolver extends TemplateVariableResolver {
96 public CodeTemplateVariableResolver(String type, String description) {
97 super(type, description);
100 protected String resolve(TemplateContext context) {
101 return context.getVariable(getType());
106 * Resolver for javadoc tags.
108 public static class TagsVariableResolver extends TemplateVariableResolver {
109 public TagsVariableResolver() {
110 super(TAGS, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.tags")); //$NON-NLS-1$
113 protected String resolve(TemplateContext context) {
114 return "@"; //$NON-NLS-1$
119 * Resolver for todo tags.
121 protected static class Todo extends TemplateVariableResolver {
124 super("todo", JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.todo")); //$NON-NLS-1$ //$NON-NLS-2$
127 protected String resolve(TemplateContext context) {
128 String todoTaskTag= StubUtility.getTodoTaskTag(((CodeTemplateContext) context).getJavaProject());
129 if (todoTaskTag == null)
130 return "XXX"; //$NON-NLS-1$
136 private boolean fIsComment;
138 public CodeTemplateContextType(String contextName) {
144 addResolver(new GlobalTemplateVariables.Dollar());
145 addResolver(new GlobalTemplateVariables.Date());
146 addResolver(new GlobalTemplateVariables.Year());
147 addResolver(new GlobalTemplateVariables.Time());
148 addResolver(new GlobalTemplateVariables.User());
149 addResolver(new Todo());
151 if (CATCHBLOCK_CONTEXTTYPE.equals(contextName)) {
152 addResolver(new CodeTemplateVariableResolver(EXCEPTION_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.exceptiontype"))); //$NON-NLS-1$
153 addResolver(new CodeTemplateVariableResolver(EXCEPTION_VAR, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.exceptionvar"))); //$NON-NLS-1$
154 } else if (METHODBODY_CONTEXTTYPE.equals(contextName)) {
155 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
156 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
157 addResolver(new CodeTemplateVariableResolver(BODY_STATEMENT, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.bodystatement"))); //$NON-NLS-1$
158 } else if (CONSTRUCTORBODY_CONTEXTTYPE.equals(contextName)) {
159 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
160 addResolver(new CodeTemplateVariableResolver(BODY_STATEMENT, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.bodystatement"))); //$NON-NLS-1$
161 } else if (GETTERBODY_CONTEXTTYPE.equals(contextName)) {
162 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
163 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
164 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.getterfieldname"))); //$NON-NLS-1$
165 } else if (SETTERBODY_CONTEXTTYPE.equals(contextName)) {
166 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
167 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
168 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.getterfieldname"))); //$NON-NLS-1$
169 addResolver(new CodeTemplateVariableResolver(PARAM, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.param"))); //$NON-NLS-1$
170 } else if (NEWTYPE_CONTEXTTYPE.equals(contextName)) {
171 addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.typename"))); //$NON-NLS-1$
172 addResolver(new CodeTemplateVariableResolver(PACKAGE_DECLARATION, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.packdeclaration"))); //$NON-NLS-1$
173 addResolver(new CodeTemplateVariableResolver(TYPE_DECLARATION, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.typedeclaration"))); //$NON-NLS-1$
174 addResolver(new CodeTemplateVariableResolver(TYPE_COMMENT, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.typecomment"))); //$NON-NLS-1$
175 addCompilationUnitVariables();
176 } else if (NEWHTML_CONTEXTTYPE.equals(contextName)) {
177 addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.typename"))); //$NON-NLS-1$
178 addResolver(new CodeTemplateVariableResolver(PACKAGE_DECLARATION, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.packdeclaration"))); //$NON-NLS-1$
179 addResolver(new CodeTemplateVariableResolver(TYPE_DECLARATION, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.typedeclaration"))); //$NON-NLS-1$
180 addResolver(new CodeTemplateVariableResolver(TYPE_COMMENT, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.typecomment"))); //$NON-NLS-1$
181 addCompilationUnitVariables();
182 }else if (TYPECOMMENT_CONTEXTTYPE.equals(contextName)) {
183 addResolver(new CodeTemplateVariableResolver(TYPENAME, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.typename"))); //$NON-NLS-1$
184 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
185 addResolver(new TagsVariableResolver());
186 addCompilationUnitVariables();
188 } else if (FIELDCOMMENT_CONTEXTTYPE.equals(contextName)) {
189 addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.fieldtype"))); //$NON-NLS-1$
190 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.fieldname"))); //$NON-NLS-1$
191 addCompilationUnitVariables();
193 } else if (METHODCOMMENT_CONTEXTTYPE.equals(contextName)) {
194 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
195 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
196 addResolver(new CodeTemplateVariableResolver(RETURN_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.returntype"))); //$NON-NLS-1$
197 addResolver(new TagsVariableResolver());
198 addCompilationUnitVariables();
200 } else if (OVERRIDECOMMENT_CONTEXTTYPE.equals(contextName)) {
201 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
202 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
203 addResolver(new CodeTemplateVariableResolver(SEE_TAG, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.seetag"))); //$NON-NLS-1$
204 addResolver(new TagsVariableResolver());
205 addCompilationUnitVariables();
207 } else if (CONSTRUCTORCOMMENT_CONTEXTTYPE.equals(contextName)) {
208 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
209 addResolver(new TagsVariableResolver());
210 addCompilationUnitVariables();
212 } else if (GETTERCOMMENT_CONTEXTTYPE.equals(contextName)) {
213 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
214 addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.getterfieldtype"))); //$NON-NLS-1$
215 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.getterfieldname"))); //$NON-NLS-1$
216 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
217 addResolver(new CodeTemplateVariableResolver(BARE_FIELD_NAME, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.barefieldname"))); //$NON-NLS-1$
218 addCompilationUnitVariables();
220 } else if (SETTERCOMMENT_CONTEXTTYPE.equals(contextName)) {
221 addResolver(new CodeTemplateVariableResolver(ENCLOSING_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingtype"))); //$NON-NLS-1$
222 addResolver(new CodeTemplateVariableResolver(FIELD_TYPE, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.getterfieldtype"))); //$NON-NLS-1$
223 addResolver(new CodeTemplateVariableResolver(FIELD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.getterfieldname"))); //$NON-NLS-1$
224 addResolver(new CodeTemplateVariableResolver(ENCLOSING_METHOD, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.enclosingmethod"))); //$NON-NLS-1$
225 addResolver(new CodeTemplateVariableResolver(PARAM, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.param"))); //$NON-NLS-1$
226 addResolver(new CodeTemplateVariableResolver(BARE_FIELD_NAME, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.barefieldname"))); //$NON-NLS-1$
227 addCompilationUnitVariables();
232 private void addCompilationUnitVariables() {
233 addResolver(new CodeTemplateVariableResolver(FILENAME, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.filename"))); //$NON-NLS-1$
234 addResolver(new CodeTemplateVariableResolver(PACKAGENAME, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.packagename"))); //$NON-NLS-1$
235 addResolver(new CodeTemplateVariableResolver(PROJECTNAME, JavaTemplateMessages.getString("CodeTemplateContextType.variable.description.projectname"))); //$NON-NLS-1$
239 * @see net.sourceforge.phpdt.internal.corext.template.ContextType#validateVariables(net.sourceforge.phpdt.internal.corext.template.TemplateVariable[])
241 protected void validateVariables(TemplateVariable[] variables) throws TemplateException {
242 ArrayList required= new ArrayList(5);
243 String contextName= getId();
244 // if (NEWTYPE_CONTEXTTYPE.equals(contextName)) {
245 // required.add(PACKAGE_DECLARATION);
246 // required.add(TYPE_DECLARATION);
248 for (int i= 0; i < variables.length; i++) {
249 String type= variables[i].getType();
250 if (getResolver(type) == null) {
251 throw new TemplateException(JavaTemplateMessages.getFormattedString("CodeTemplateContextType.validate.unknownvariable", type)); //$NON-NLS-1$
253 required.remove(type);
255 if (!required.isEmpty()) {
256 String missing= (String) required.get(0);
257 throw new TemplateException(JavaTemplateMessages.getFormattedString("CodeTemplateContextType.validate.missingvariable", missing)); //$NON-NLS-1$
259 super.validateVariables(variables);
265 * @see net.sourceforge.phpdt.internal.corext.template.ContextType#createContext()
267 public TemplateContext createContext() {
271 public static void registerContextTypes(ContextTypeRegistry registry) {
272 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CATCHBLOCK_CONTEXTTYPE));
273 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.METHODBODY_CONTEXTTYPE));
274 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CONSTRUCTORBODY_CONTEXTTYPE));
275 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.GETTERBODY_CONTEXTTYPE));
276 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.SETTERBODY_CONTEXTTYPE));
277 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.NEWTYPE_CONTEXTTYPE));
278 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.NEWHTML_CONTEXTTYPE));
280 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.TYPECOMMENT_CONTEXTTYPE));
281 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.FIELDCOMMENT_CONTEXTTYPE));
282 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.METHODCOMMENT_CONTEXTTYPE));
283 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.CONSTRUCTORCOMMENT_CONTEXTTYPE));
284 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.OVERRIDECOMMENT_CONTEXTTYPE));
285 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.GETTERCOMMENT_CONTEXTTYPE));
286 registry.addContextType(new CodeTemplateContextType(CodeTemplateContextType.SETTERCOMMENT_CONTEXTTYPE));
292 * @see net.sourceforge.phpdt.internal.corext.template.ContextType#validate(java.lang.String)
294 public void validate(String pattern) throws TemplateException {
295 super.validate(pattern);
297 if (!isValidComment(pattern)) {
298 throw new TemplateException(JavaTemplateMessages.getString("CodeTemplateContextType.validate.invalidcomment")); //$NON-NLS-1$
304 private boolean isValidComment(String template) {
305 IScanner scanner= ToolFactory.createScanner(true, false, false, true);// false);
306 scanner.setSource(template.toCharArray());
308 int next= scanner.getNextToken();
309 while (next == ITerminalSymbols.TokenNameCOMMENT_LINE || next == ITerminalSymbols.TokenNameCOMMENT_PHPDOC || next == ITerminalSymbols.TokenNameCOMMENT_BLOCK) {
310 next= scanner.getNextToken();
312 return next == ITerminalSymbols.TokenNameEOF;
313 } catch (InvalidInputException e) {