Copyright (c) 2007, 2019 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
Microsoft Corporation - moved template related code to jdt.core.manipulation - https://bugs.eclipse.org/549989
/*******************************************************************************
* Copyright (c) 2007, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Microsoft Corporation - moved template related code to jdt.core.manipulation - https://bugs.eclipse.org/549989
*******************************************************************************/
package org.eclipse.jdt.internal.corext.template.java;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
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.internal.corext.template.java.CompilationUnitCompletion.Variable;
Resolves template variables to variables which are assignment-compatible with the variable
instance class parameters.
Since: 3.4
/**
* Resolves template variables to variables which are assignment-compatible with the variable
* instance class parameters.
*
* @since 3.4
*/
public abstract class AbstractVariableResolver extends TemplateVariableResolver {
protected final String fDefaultType;
private Variable[] fVariables;
Create a variable resolver resolving to
defaultType
if no types specified
as parameter
Params: - defaultType – the default type to resolve to
/**
* Create a variable resolver resolving to
* <code>defaultType</code> if no types specified
* as parameter
* @param defaultType the default type to resolve to
*/
protected AbstractVariableResolver(String defaultType) {
fDefaultType= defaultType;
}
Returns a set of variables of type
visible in
the given context
.
Params: - type – the type name to search variables for
- context – context within to search for variables
Returns: the visible variables of type
in context
, empty array if no visible variables
/**
* Returns a set of variables of <code>type</code> visible in
* the given <code>context</code>.
*
* @param type the type name to search variables for
* @param context context within to search for variables
* @return the visible variables of <code>type</code> in <code>context</code>, empty array if no visible variables
*/
protected abstract Variable[] getVisibleVariables(String type, IJavaContext context);
@Override
public void resolve(TemplateVariable variable, TemplateContext context) {
if (variable instanceof JavaVariable) {
IJavaContext jc= (IJavaContext) context;
JavaVariable jv= (JavaVariable) variable;
List<String> params= variable.getVariableType().getParams();
if (params.size() == 0) {
fVariables= getVisibleVariables(fDefaultType, jc);
jv.setParamType(fDefaultType);
} else if (params.size() == 1) {
String type= params.get(0);
fVariables= getVisibleVariables(type, jc);
jv.setParamType(type);
} else {
ArrayList<Variable> variables= new ArrayList<>();
for (Iterator<String> iterator= params.iterator(); iterator.hasNext();) {
variables.addAll(Arrays.asList(getVisibleVariables(iterator.next(), jc)));
}
fVariables= variables.toArray(new Variable[variables.size()]);
//set to default type, a template which references to the type
//of _the_ parameter will not correctly work anyway
jv.setParamType(fDefaultType);
}
if (fVariables.length > 0) {
jv.setChoices(fVariables);
jc.markAsUsed(jv.getDefaultValue());
} else {
super.resolve(variable, context);
return;
}
if (fVariables.length > 1)
variable.setUnambiguous(false);
else
variable.setUnambiguous(isUnambiguous(context));
} else
super.resolve(variable, context);
}
@Override
protected String[] resolveAll(TemplateContext context) {
String[] names= new String[fVariables.length];
for (int i= 0; i < fVariables.length; i++)
names[i]= fVariables[i].getName();
if (names.length > 0)
((IJavaContext)context).markAsUsed(names[0]);
return names;
}
}