1 12 package org.eclipse.jdt.internal.corext.template.java; 13 14 import org.eclipse.jface.text.IDocument; 15 import org.eclipse.jface.text.Position; 16 import org.eclipse.jface.text.templates.GlobalTemplateVariables; 17 import org.eclipse.jface.text.templates.TemplateContext; 18 import org.eclipse.jface.text.templates.TemplateVariable; 19 import org.eclipse.jface.text.templates.TemplateVariableResolver; 20 21 import org.eclipse.jdt.core.ICompilationUnit; 22 import org.eclipse.jdt.core.IJavaProject; 23 24 import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility; 25 import org.eclipse.jdt.internal.corext.template.java.CompilationUnitCompletion.Variable; 26 27 import org.eclipse.jdt.internal.ui.text.template.contentassist.MultiVariable; 28 29 32 public class JavaContextType extends CompilationUnitContextType { 33 34 public static final String NAME= "java"; 36 protected static abstract class AbstractIterable extends TemplateVariableResolver { 37 public AbstractIterable(String type, String description) { 38 super(type, description); 39 } 40 41 protected String [] resolveAll(TemplateContext context) { 42 JavaContext jc= (JavaContext) context; 43 Variable[] iterables= getLocalVariables(jc); 44 String [] names= new String [iterables.length]; 45 for (int i= 0; i < iterables.length; i++) 46 names[i]= iterables[i].getName(); 47 if (names.length > 0) 48 jc.markAsUsed(names[0]); 49 return names; 50 } 51 52 abstract protected Variable[] getLocalVariables(JavaContext jc); 53 54 57 public void resolve(TemplateVariable variable, TemplateContext context) { 58 if (variable instanceof MultiVariable) { 59 JavaContext jc= (JavaContext) context; 60 JavaVariable jv= (JavaVariable) variable; 61 Variable[] iterables= getLocalVariables(jc); 62 if (iterables.length > 0) { 63 jv.setChoices(iterables); 64 jc.markAsUsed(iterables[0].getName()); 65 66 if (iterables.length > 1) 67 variable.setUnambiguous(false); 68 else 69 variable.setUnambiguous(isUnambiguous(context)); 70 71 return; 72 } 73 } 74 75 super.resolve(variable, context); 76 } 77 } 78 79 protected static class Array extends AbstractIterable { 80 public Array() { 81 super("array", JavaTemplateMessages.JavaContextType_variable_description_array); } 83 84 protected Variable[] getLocalVariables(JavaContext jc) { 85 return jc.getArrays(); 86 } 87 } 88 89 protected static class Iterable extends AbstractIterable { 90 public Iterable() { 91 super("iterable", JavaTemplateMessages.JavaContextType_variable_description_iterable); } 93 94 protected Variable[] getLocalVariables(JavaContext jc) { 95 return jc.getIterables(); 96 } 97 } 98 99 protected static abstract class AbstractIterableType extends TemplateVariableResolver { 100 private String fMasterName; 101 102 public AbstractIterableType(String type, String desc, String master) { 103 super(type, desc); 104 fMasterName= master; 105 } 106 protected String [] resolveAll(TemplateContext context) { 107 JavaContext jc= (JavaContext) context; 108 Variable[] iterables= getLocalVariables(jc); 109 String [] types= new String [iterables.length]; 110 for (int i= 0; i < iterables.length; i++) 111 types[i]= iterables[i].getMemberTypeNames()[0]; 112 return types; 113 } 114 115 abstract protected Variable[] getLocalVariables(JavaContext jc); 116 117 120 public void resolve(TemplateVariable variable, TemplateContext context) { 121 if (variable instanceof MultiVariable) { 122 JavaContext jc= (JavaContext) context; 123 MultiVariable mv= (MultiVariable) variable; 124 125 Variable[] iterables= getLocalVariables(jc); 126 if (iterables.length > 0) { 127 128 for (int i= 0; i < iterables.length; i++) 129 mv.setChoices(iterables[i], iterables[i].getMemberTypeNames()); 130 131 TemplateVariable master= jc.getTemplateVariable(fMasterName); 132 if (master instanceof MultiVariable) { 133 final MultiVariable masterMv= (MultiVariable) master; 134 jc.addDependency(masterMv, mv); 135 mv.setKey(masterMv.getCurrentChoice()); 136 } 137 138 if (iterables.length > 1 || iterables.length == 1 && mv.getChoices().length > 1) 139 variable.setUnambiguous(false); 140 else 141 variable.setUnambiguous(isUnambiguous(context)); 142 143 return; 144 } 145 146 } 147 148 super.resolve(variable, context); 149 } 150 } 151 152 protected static class ArrayType extends AbstractIterableType { 153 public ArrayType() { 154 super("array_type", JavaTemplateMessages.JavaContextType_variable_description_array_type, "array"); } 156 protected Variable[] getLocalVariables(JavaContext jc) { 157 return jc.getArrays(); 158 } 159 } 160 161 protected static class IterableType extends AbstractIterableType { 162 public IterableType() { 163 super("iterable_type", JavaTemplateMessages.JavaContextType_variable_description_iterable_type, "iterable"); } 165 protected Variable[] getLocalVariables(JavaContext jc) { 166 return jc.getIterables(); 167 } 168 } 169 170 protected static abstract class AbstractIterableElement extends TemplateVariableResolver { 171 private String fMasterName; 172 173 public AbstractIterableElement(String type, String desc, String master) { 174 super(type, desc); 175 fMasterName= master; 176 } 177 178 protected String [] resolveAll(TemplateContext context) { 179 JavaContext jc= (JavaContext) context; 180 Variable[] iterables= getLocalVariables(jc); 181 String [] elements= new String [iterables.length]; 182 for (int i= 0; i < iterables.length; i++) { 183 elements[i]= jc.suggestVariableNames(iterables[i].getMemberTypeNames()[0])[0]; 184 if (i == 0) 185 jc.markAsUsed(elements[0]); 186 } 187 188 return elements; 189 } 190 191 abstract protected Variable[] getLocalVariables(JavaContext jc); 192 193 196 public void resolve(TemplateVariable variable, TemplateContext context) { 197 if (variable instanceof MultiVariable) { 198 JavaContext jc= (JavaContext) context; 199 MultiVariable mv= (MultiVariable) variable; 200 201 Variable[] iterables= getLocalVariables(jc); 202 if (iterables.length > 0) { 203 for (int i= 0; i < iterables.length; i++) { 204 String [] elements= jc.suggestVariableNames(iterables[i].getMemberTypeNames()[0]); 205 mv.setChoices(iterables[i], elements); 206 } 207 208 209 TemplateVariable master= jc.getTemplateVariable(fMasterName); 210 if (master instanceof MultiVariable) { 211 final MultiVariable masterMv= (MultiVariable) master; 212 jc.addDependency(masterMv, mv); 213 mv.setKey(masterMv.getCurrentChoice()); 214 } 215 jc.markAsUsed(mv.getDefaultValue()); 216 217 if (iterables.length > 1 || iterables.length == 1 && mv.getChoices().length > 1) 218 variable.setUnambiguous(false); 219 else 220 variable.setUnambiguous(isUnambiguous(context)); 221 222 return; 223 } 224 225 } 226 super.resolve(variable, context); 227 } 228 } 229 230 protected static class ArrayElement extends AbstractIterableElement { 231 public ArrayElement() { 232 super("array_element", JavaTemplateMessages.JavaContextType_variable_description_array_element, "array"); } 234 protected Variable[] getLocalVariables(JavaContext jc) { 235 return jc.getArrays(); 236 } 237 } 238 239 protected static class IterableElement extends AbstractIterableElement { 240 public IterableElement() { 241 super("iterable_element", JavaTemplateMessages.JavaContextType_variable_description_iterable_element, "iterable"); } 243 protected Variable[] getLocalVariables(JavaContext jc) { 244 return jc.getIterables(); 245 } 246 } 247 248 protected static class Index extends NameResolver { 249 public Index() { 250 super("int"); setType("index"); setDescription(JavaTemplateMessages.JavaContextType_variable_description_index); 253 } 254 } 255 256 protected static class Collection extends LocalVarResolver { 257 public Collection() { 258 super("java.util.Collection"); setType("collection"); setDescription(JavaTemplateMessages.JavaContextType_variable_description_collection); 261 } 262 } 263 264 protected static class Iterator extends NameResolver { 265 public Iterator() { 266 super("java.util.Iterator"); setType("iterator"); setDescription(JavaTemplateMessages.JavaContextType_variable_description_iterator); 269 } 270 } 271 272 protected static class Todo extends TemplateVariableResolver { 273 274 public Todo() { 275 super("todo", JavaTemplateMessages.JavaContextType_variable_description_todo); } 277 protected String resolve(TemplateContext context) { 278 JavaContext javaContext= (JavaContext) context; 279 ICompilationUnit compilationUnit= javaContext.getCompilationUnit(); 280 if (compilationUnit == null) 281 return "XXX"; 283 IJavaProject javaProject= compilationUnit.getJavaProject(); 284 String todoTaskTag= StubUtility.getTodoTaskTag(javaProject); 285 if (todoTaskTag == null) 286 return "XXX"; 288 return todoTaskTag; 289 } 290 } 291 298 299 300 303 public JavaContextType() { 304 super(NAME); 305 306 addResolver(new GlobalTemplateVariables.Cursor()); 308 addResolver(new GlobalTemplateVariables.WordSelection()); 309 addResolver(new GlobalTemplateVariables.LineSelection()); 310 addResolver(new GlobalTemplateVariables.Dollar()); 311 addResolver(new GlobalTemplateVariables.Date()); 312 addResolver(new GlobalTemplateVariables.Year()); 313 addResolver(new GlobalTemplateVariables.Time()); 314 addResolver(new GlobalTemplateVariables.User()); 315 316 addResolver(new File()); 318 addResolver(new PrimaryTypeName()); 319 addResolver(new ReturnType()); 320 addResolver(new Method()); 321 addResolver(new Type()); 322 addResolver(new Package ()); 323 addResolver(new Project()); 324 addResolver(new Arguments()); 325 326 addResolver(new Array()); 328 addResolver(new ArrayType()); 329 addResolver(new ArrayElement()); 330 addResolver(new Index()); 331 addResolver(new Iterator()); 332 addResolver(new Collection()); 333 addResolver(new Iterable ()); 334 addResolver(new IterableType()); 335 addResolver(new IterableElement()); 336 addResolver(new Todo()); 337 } 338 339 340 343 public CompilationUnitContext createContext(IDocument document, int offset, int length, ICompilationUnit compilationUnit) { 344 return new JavaContext(this, document, offset, length, compilationUnit); 345 } 346 347 350 public CompilationUnitContext createContext(IDocument document, Position completionPosition, ICompilationUnit compilationUnit) { 351 return new JavaContext(this, document, completionPosition, compilationUnit); 352 } 353 } 354 | Popular Tags |