package org.eclipse.jdt.internal.corext.template.java;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.templates.DocumentTemplateContext;
import org.eclipse.jface.text.templates.GlobalTemplateVariables;
import org.eclipse.jface.text.templates.TemplateContext;
import org.eclipse.jface.text.templates.TemplateVariable;
import org.eclipse.jface.text.templates.TemplateVariableResolver;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.internal.core.manipulation.StubUtility;
import org.eclipse.jdt.internal.corext.template.java.CompilationUnitCompletion.Variable;
import org.eclipse.jdt.internal.ui.text.template.contentassist.MultiVariable;
public abstract class AbstractJavaContextTypeCore extends CompilationUnitContextType {
protected static abstract class AbstractIterable extends TemplateVariableResolver {
public AbstractIterable(String type, String description) {
super(type, description);
}
@Override
protected String[] resolveAll(TemplateContext context) {
IJavaContext jc= (IJavaContext) context;
Variable[] iterables= getVariables(jc);
String[] names= new String[iterables.length];
for (int i= 0; i < iterables.length; i++)
names[i]= iterables[i].getName();
if (names.length > 0)
jc.markAsUsed(names[0]);
return names;
}
abstract protected Variable[] getVariables(IJavaContext jc);
@Override
public void resolve(TemplateVariable variable, TemplateContext context) {
if (variable instanceof MultiVariable) {
IJavaContext jc= (IJavaContext) context;
JavaVariable jv= (JavaVariable) variable;
Variable[] iterables= getVariables(jc);
if (iterables.length > 0) {
jv.setChoices(iterables);
jc.markAsUsed(iterables[0].getName());
if (iterables.length > 1)
variable.setUnambiguous(false);
else
variable.setUnambiguous(isUnambiguous(context));
return;
}
}
super.resolve(variable, context);
}
}
protected static class Array extends AbstractIterable {
public Array() {
super("array", JavaTemplateMessages.JavaContextType_variable_description_array);
}
@Override
protected Variable[] getVariables(IJavaContext jc) {
return jc.getArrays();
}
}
protected static class Iterable extends AbstractIterable {
public Iterable() {
super("iterable", JavaTemplateMessages.JavaContextType_variable_description_iterable);
}
@Override
protected Variable[] getVariables(IJavaContext jc) {
return jc.getIterables();
}
}
protected static abstract class AbstractIterableType extends TemplateVariableResolver {
private String fMasterName;
public AbstractIterableType(String type, String desc, String master) {
super(type, desc);
fMasterName= master;
}
@Override
protected String[] resolveAll(TemplateContext context) {
IJavaContext jc= (IJavaContext) context;
Variable[] iterables= getVariablesInContextScope(jc);
String[] types= new String[iterables.length];
for (int i= 0; i < iterables.length; i++)
types[i]= iterables[i].getMemberTypeNames()[0];
return types;
}
abstract protected Variable[] getVariablesInContextScope(IJavaContext jc);
@Override
public void resolve(TemplateVariable variable, TemplateContext context) {
if (variable instanceof MultiVariable) {
IJavaContext jc= (IJavaContext) context;
MultiVariable mv= (MultiVariable) variable;
Variable[] iterables= getVariablesInContextScope(jc);
if (iterables.length > 0) {
for (int i= 0; i < iterables.length; i++)
mv.setChoices(iterables[i], iterables[i].getMemberTypeNames());
TemplateVariable master= jc.getTemplateVariable(fMasterName);
if (master instanceof MultiVariable) {
final MultiVariable masterMv= (MultiVariable) master;
jc.addDependency(masterMv, mv);
mv.setKey(masterMv.getCurrentChoice());
}
if (iterables.length > 1 || iterables.length == 1 && mv.getChoices().length > 1)
variable.setUnambiguous(false);
else
variable.setUnambiguous(isUnambiguous(context));
return;
}
}
super.resolve(variable, context);
}
}
protected static class ArrayType extends AbstractIterableType {
public ArrayType() {
super("array_type", JavaTemplateMessages.JavaContextType_variable_description_array_type, "array");
}
@Override
protected Variable[] getVariablesInContextScope(IJavaContext jc) {
return jc.getArrays();
}
}
protected static class IterableType extends AbstractIterableType {
public IterableType() {
super("iterable_type", JavaTemplateMessages.JavaContextType_variable_description_iterable_type, "iterable");
}
@Override
protected Variable[] getVariablesInContextScope(IJavaContext jc) {
return jc.getIterables();
}
}
protected static abstract class AbstractIterableElement extends TemplateVariableResolver {
private String fMasterName;
public AbstractIterableElement(String type, String desc, String master) {
super(type, desc);
fMasterName= master;
}
@Override
protected String[] resolveAll(TemplateContext context) {
IJavaContext jc= (IJavaContext) context;
Variable[] iterables= getLocalVariables(jc);
String[] elements= new String[iterables.length];
for (int i= 0; i < iterables.length; i++) {
elements[i]= jc.suggestVariableNames(iterables[i].getMemberTypeNames()[0])[0];
if (i == 0)
jc.markAsUsed(elements[0]);
}
return elements;
}
abstract protected Variable[] getLocalVariables(IJavaContext jc);
@Override
public void resolve(TemplateVariable variable, TemplateContext context) {
if (variable instanceof MultiVariable) {
IJavaContext jc= (IJavaContext) context;
MultiVariable mv= (MultiVariable) variable;
Variable[] iterables= getLocalVariables(jc);
if (iterables.length > 0) {
for (int i= 0; i < iterables.length; i++) {
String[] elements= jc.suggestVariableNames(iterables[i].getMemberTypeNames()[0]);
mv.setChoices(iterables[i], elements);
}
TemplateVariable master= jc.getTemplateVariable(fMasterName);
if (master instanceof MultiVariable) {
final MultiVariable masterMv= (MultiVariable) master;
jc.addDependency(masterMv, mv);
mv.setKey(masterMv.getCurrentChoice());
}
jc.markAsUsed(mv.getDefaultValue());
if (iterables.length > 1 || iterables.length == 1 && mv.getChoices().length > 1)
variable.setUnambiguous(false);
else
variable.setUnambiguous(isUnambiguous(context));
return;
}
}
super.resolve(variable, context);
}
}
protected static class ArrayElement extends AbstractIterableElement {
public ArrayElement() {
super("array_element", JavaTemplateMessages.JavaContextType_variable_description_array_element, "array");
}
@Override
protected Variable[] getLocalVariables(IJavaContext jc) {
return jc.getArrays();
}
}
protected static class IterableElement extends AbstractIterableElement {
public IterableElement() {
super("iterable_element", JavaTemplateMessages.JavaContextType_variable_description_iterable_element, "iterable");
}
@Override
protected Variable[] getLocalVariables(IJavaContext jc) {
return jc.getIterables();
}
}
protected static class Index extends NameResolver {
public Index() {
super("int");
setType("index");
setDescription(JavaTemplateMessages.JavaContextType_variable_description_index);
}
}
protected static class Collection extends VarResolver {
public Collection() {
super("java.util.Collection");
setType("collection");
setDescription(JavaTemplateMessages.JavaContextType_variable_description_collection);
}
}
protected static class Iterator extends NameResolver {
public Iterator() {
super("java.util.Iterator");
setType("iterator");
setDescription(JavaTemplateMessages.JavaContextType_variable_description_iterator);
}
}
protected static class Todo extends TemplateVariableResolver {
public Todo() {
super("todo", JavaTemplateMessages.JavaContextType_variable_description_todo);
}
@Override
protected String resolve(TemplateContext context) {
IJavaContext javaContext= (IJavaContext) context;
ICompilationUnit compilationUnit= javaContext.getCompilationUnit();
if (compilationUnit == null)
return "XXX";
IJavaProject javaProject= compilationUnit.getJavaProject();
String todoTaskTag= StubUtility.getTodoTaskTag(javaProject);
if (todoTaskTag == null)
return "XXX";
return todoTaskTag;
}
}
public void initializeContextTypeResolvers() {
addResolver(new GlobalTemplateVariables.Cursor());
addResolver(new GlobalTemplateVariables.WordSelection());
addResolver(new GlobalTemplateVariables.Selection(GlobalTemplateVariables.LineSelection.NAME, JavaTemplateMessages.CompilationUnitContextType_variable_description_line_selection));
addResolver(new GlobalTemplateVariables.Dollar());
addResolver(new GlobalTemplateVariables.Date());
addResolver(new GlobalTemplateVariables.Year());
addResolver(new GlobalTemplateVariables.Time());
addResolver(new GlobalTemplateVariables.User());
addResolver(new File());
addResolver(new PrimaryTypeName());
addResolver(new ReturnType());
addResolver(new Method());
addResolver(new Type());
addResolver(new Package());
addResolver(new Project());
addResolver(new Arguments());
addResolver(new Array());
addResolver(new ArrayType());
addResolver(new ArrayElement());
addResolver(new Index());
addResolver(new Iterator());
addResolver(new Collection());
addResolver(new Iterable());
addResolver(new IterableType());
addResolver(new IterableElement());
addResolver(new Todo());
}
@Override
public DocumentTemplateContext createContext(IDocument document, int offset, int length, ICompilationUnit compilationUnit) {
JavaContextCore javaContext= new JavaContextCore(this, document, offset, length, compilationUnit);
initializeContext(javaContext);
return javaContext;
}
@Override
public DocumentTemplateContext createContext(IDocument document, Position completionPosition, ICompilationUnit compilationUnit) {
JavaContextCore javaContext= new JavaContextCore(this, document, completionPosition, compilationUnit);
initializeContext(javaContext);
return javaContext;
}
protected void initializeContext(IJavaContext context) {
}
}