diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/QueryService.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/QueryService.java index b49b0c813..341713bfa 100644 --- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/QueryService.java +++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/QueryService.java @@ -20,11 +20,9 @@ import org.eclipse.acceleo.Query; import org.eclipse.acceleo.Variable; import org.eclipse.acceleo.aql.completion.proposals.QueryServiceCompletionProposal; -import org.eclipse.acceleo.query.ast.Call; import org.eclipse.acceleo.query.parser.AstValidator; import org.eclipse.acceleo.query.runtime.ICompletionProposal; import org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment; -import org.eclipse.acceleo.query.runtime.IValidationResult; import org.eclipse.acceleo.query.runtime.impl.ValidationServices; import org.eclipse.acceleo.query.runtime.namespace.IQualifiedNameLookupEngine; import org.eclipse.acceleo.query.validation.type.IType; @@ -64,7 +62,7 @@ public String getName() { } @Override - public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { + public List computeParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { List result = new ArrayList(); final AstValidator validator = new AstValidator(new ValidationServices(queryEnvironment)); for (Variable var : getOrigin().getParameters()) { @@ -82,19 +80,7 @@ public int getNumberOfParameters() { } @Override - public Set getType(Call call, ValidationServices services, IValidationResult validationResult, - IReadOnlyQueryEnvironment queryEnvironment, List argTypes) { - final AstValidator validator = new AstValidator(services); - - final Set result = validator.getDeclarationTypes(queryEnvironment, validator.validate( - Collections.emptyMap(), getOrigin().getType()).getPossibleTypes(getOrigin().getType() - .getAst())); - - return result; - } - - @Override - public Set getType(IReadOnlyQueryEnvironment queryEnvironment) { + public Set computeType(IReadOnlyQueryEnvironment queryEnvironment) { final AstValidator validator = new AstValidator(new ValidationServices(queryEnvironment)); final Set result = validator.getDeclarationTypes(queryEnvironment, validator.validate( diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/TemplateService.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/TemplateService.java index 9dd523ab5..c23e1bcda 100644 --- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/TemplateService.java +++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/evaluation/TemplateService.java @@ -64,7 +64,7 @@ public String getName() { } @Override - public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { + public List computeParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { final List result = new ArrayList(); final AstValidator validator = new AstValidator(new ValidationServices(queryEnvironment)); for (Variable var : getOrigin().getParameters()) { @@ -82,7 +82,7 @@ public int getNumberOfParameters() { } @Override - public Set getType(IReadOnlyQueryEnvironment queryEnvironment) { + public Set computeType(IReadOnlyQueryEnvironment queryEnvironment) { Set result = new LinkedHashSet(); result.add(new ClassType(queryEnvironment, String.class)); diff --git a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/parser/AcceleoAstSerializer.java b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/parser/AcceleoAstSerializer.java index 7cf4badd3..03902894a 100644 --- a/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/parser/AcceleoAstSerializer.java +++ b/plugins/org.eclipse.acceleo.aql/src/org/eclipse/acceleo/aql/parser/AcceleoAstSerializer.java @@ -39,6 +39,7 @@ import org.eclipse.acceleo.Template; import org.eclipse.acceleo.TextStatement; import org.eclipse.acceleo.Variable; +import org.eclipse.acceleo.query.parser.AstBuilder; import org.eclipse.acceleo.query.parser.AstSerializer; import org.eclipse.acceleo.util.AcceleoSwitch; @@ -113,7 +114,8 @@ public String serialize(AcceleoASTNode node) { @Override public Object caseBinding(Binding binding) { - builder.append(binding.getName()); + final String bindingName = AstBuilder.protectWithUnderscore(binding.getName()); + builder.append(bindingName); if (binding.getType() != null) { builder.append(" : "); builder.append(querySerializer.serialize(binding.getType().getAst())); @@ -567,7 +569,8 @@ public Object caseTextStatement(TextStatement textStatement) { @Override public Object caseVariable(Variable variable) { - builder.append(variable.getName()); + final String variableName = AstBuilder.protectWithUnderscore(variable.getName()); + builder.append(variableName); builder.append(SPACE); builder.append(AcceleoParser.COLON); builder.append(SPACE); diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstSerializer.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstSerializer.java index 3fae9f80c..5d5b2e6a6 100644 --- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstSerializer.java +++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstSerializer.java @@ -147,7 +147,8 @@ private static Map initOperatorPrecedence() { @Override public Object caseBinding(Binding binding) { - builder.append(binding.getName()); + final String bindingName = AstBuilder.protectWithUnderscore(binding.getName()); + builder.append(bindingName); if (binding.getType() != null) { builder.append(SPACE).append(':').append(SPACE); builder.append(doSwitch(binding.getType())); @@ -932,7 +933,8 @@ public Object caseEClassifierTypeLiteral(EClassifierTypeLiteral object) { @Override public Object caseVariableDeclaration(VariableDeclaration variableDeclaration) { - builder.append(variableDeclaration.getName()); + final String variableName = AstBuilder.protectWithUnderscore(variableDeclaration.getName()); + builder.append(variableName); if (variableDeclaration.getType() != null) { builder.append(SPACE).append(':').append(SPACE); doSwitch(variableDeclaration.getType()); @@ -942,7 +944,8 @@ public Object caseVariableDeclaration(VariableDeclaration variableDeclaration) { @Override public Object caseVarRef(VarRef varRef) { - builder.append(varRef.getVariableName()); + final String variableName = AstBuilder.protectWithUnderscore(varRef.getVariableName()); + builder.append(variableName); return DUMMY; } diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/AbstractService.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/AbstractService.java index 04adb8952..995acb27e 100644 --- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/AbstractService.java +++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/AbstractService.java @@ -40,6 +40,22 @@ public abstract class AbstractService implements IService { */ private final O origin; + /** + * Known {@link IReadOnlyQueryEnvironment} to invalidate cached {@link #returnTypes} and + * {@link #res}. + */ + private IReadOnlyQueryEnvironment knwonEnvironment; + + /** + * Return {@link IType} cache. + */ + private Set returnTypes; + + /** + * Parameters {@link IType} cache. + */ + private List res; + /** * Constructor with an {@link Object origin}. * @@ -60,6 +76,44 @@ public O getOrigin() { return this.origin; } + @Override + public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { + if (knwonEnvironment != queryEnvironment || returnTypes == null) { + knwonEnvironment = queryEnvironment; + res = computeParameterTypes(queryEnvironment); + } + + return res; + } + + /** + * Computes the {@link #getParameterTypes(IReadOnlyQueryEnvironment)}. + * + * @param queryEnvironment + * the {@link IReadOnlyQueryEnvironment} + * @return the {@link #getParameterTypes(IReadOnlyQueryEnvironment)} + */ + protected abstract List computeParameterTypes(IReadOnlyQueryEnvironment queryEnvironment); + + @Override + public Set getType(IReadOnlyQueryEnvironment queryEnvironment) { + if (knwonEnvironment != queryEnvironment || returnTypes == null) { + knwonEnvironment = queryEnvironment; + returnTypes = computeType(queryEnvironment); + } + + return returnTypes; + } + + /** + * Computes the {@link #getType(IReadOnlyQueryEnvironment)}. + * + * @param queryEnvironment + * the {@link IReadOnlyQueryEnvironment} + * @return the {@link #getType(IReadOnlyQueryEnvironment)} + */ + protected abstract Set computeType(IReadOnlyQueryEnvironment queryEnvironment); + /** * {@inheritDoc} * diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/EOperationService.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/EOperationService.java index acdaf5828..b66425a23 100644 --- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/EOperationService.java +++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/EOperationService.java @@ -111,23 +111,13 @@ private Method lookupMethod(EOperation operation) { return result; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getName() - */ @Override public String getName() { return getOrigin().getName(); } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getParameterTypes(org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment) - */ @Override - public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { + public List computeParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { final List result = new ArrayList(); result.add(new EClassifierType(queryEnvironment, getOrigin().getEContainingClass())); @@ -143,21 +133,11 @@ public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) return result; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getNumberOfParameters() - */ @Override public int getNumberOfParameters() { return getOrigin().getEParameters().size() + 1; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.impl.AbstractService#internalInvoke(java.lang.Object[]) - */ @Override protected Object internalInvoke(Object[] arguments) throws Exception { final Object result; @@ -242,18 +222,13 @@ private Object eOperationJavaInvoke(Method eInvokeMethod, final Object receiver, } } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getPriority() - */ @Override public int getPriority() { return PRIORITY; } @Override - public Set getType(IReadOnlyQueryEnvironment queryEnvironment) { + public Set computeType(IReadOnlyQueryEnvironment queryEnvironment) { final Set result = new LinkedHashSet(); final IType eClassifierType = new EClassifierType(queryEnvironment, getOrigin().getEType()); @@ -266,12 +241,6 @@ public Set getType(IReadOnlyQueryEnvironment queryEnvironment) { return result; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.impl.AbstractService#matches(org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment, - * org.eclipse.acceleo.query.validation.type.IType[]) - */ @Override public boolean matches(IReadOnlyQueryEnvironment queryEnvironment, IType[] argumentTypes) { final List> eClassifierTypes = new ArrayList>(argumentTypes.length); @@ -335,11 +304,6 @@ public boolean matches(IReadOnlyQueryEnvironment queryEnvironment, IType[] argum return canMatch; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getShortSignature() - */ @Override public String getShortSignature() { final List parameterTypes = getParameterTypes(null); @@ -348,11 +312,6 @@ public String getShortSignature() { return serviceShortSignature(argumentTypes); } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getLongSignature() - */ @Override public String getLongSignature() { final String ePkgNsURI; @@ -375,21 +334,11 @@ public String getLongSignature() { return ePkgNsURI + " " + eCLassName + " " + getShortSignature(); } - /** - * {@inheritDoc} - * - * @see java.lang.Object#equals(java.lang.Object) - */ @Override public boolean equals(Object obj) { return obj instanceof EOperationService && ((EOperationService)obj).getOrigin().equals(getOrigin()); } - /** - * {@inheritDoc} - * - * @see java.lang.Object#hashCode() - */ @Override public int hashCode() { return getOrigin().hashCode(); diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/JavaMethodService.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/JavaMethodService.java index 92ca2cf02..4ec4cc771 100644 --- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/JavaMethodService.java +++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/JavaMethodService.java @@ -92,14 +92,14 @@ public String getName() { } @Override - public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { - final List result = new ArrayList(); + public List computeParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { + final List res = new ArrayList(); for (Class cls : getOrigin().getParameterTypes()) { - result.add(getClassType(queryEnvironment, cls)); + res.add(getClassType(queryEnvironment, cls)); } - return result; + return res; } /** @@ -180,15 +180,13 @@ public int getPriority() { } @Override - public Set getType(IReadOnlyQueryEnvironment queryEnvironment) { - if (knwonEnvironment != queryEnvironment || returnTypes == null) { - knwonEnvironment = queryEnvironment; - returnTypes = new LinkedHashSet(); - Type returnType = getOrigin().getGenericReturnType(); - returnTypes.addAll(getIType(queryEnvironment, returnType)); - } + public Set computeType(IReadOnlyQueryEnvironment queryEnvironment) { + final Set res = new LinkedHashSet(); + + Type returnType = getOrigin().getGenericReturnType(); + res.addAll(getIType(queryEnvironment, returnType)); - return returnTypes; + return res; } /** diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/tests/runtime/lookup/basic/TestServiceProvider.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/tests/runtime/lookup/basic/TestServiceProvider.java index f39b91b91..b4050b69e 100644 --- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/tests/runtime/lookup/basic/TestServiceProvider.java +++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/tests/runtime/lookup/basic/TestServiceProvider.java @@ -14,13 +14,10 @@ import java.util.List; import java.util.Set; -import org.eclipse.acceleo.query.ast.Call; import org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment; import org.eclipse.acceleo.query.runtime.IService; import org.eclipse.acceleo.query.runtime.IServiceProvider; -import org.eclipse.acceleo.query.runtime.IValidationResult; import org.eclipse.acceleo.query.runtime.impl.AbstractService; -import org.eclipse.acceleo.query.runtime.impl.ValidationServices; import org.eclipse.acceleo.query.validation.type.ClassType; import org.eclipse.acceleo.query.validation.type.IType; @@ -42,43 +39,23 @@ protected Service1(Object serviceOrigin) { super(serviceOrigin); } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getName() - */ @Override public String getName() { return SERVICE_NAME; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getShortSignature() - */ @Override public String getShortSignature() { return SERVICE_NAME; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getLongSignature() - */ @Override public String getLongSignature() { return SERVICE_NAME; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getParameterTypes(org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment) - */ @Override - public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { + public List computeParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { final List result = new ArrayList(); result.add(new ClassType(queryEnvironment, type1)); @@ -86,50 +63,21 @@ public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) return result; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getNumberOfParameters() - */ @Override public int getNumberOfParameters() { return 1; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getPriority() - */ @Override public int getPriority() { return priority1; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getType(org.eclipse.acceleo.query.ast.Call, - * org.eclipse.acceleo.query.runtime.impl.ValidationServices, - * org.eclipse.acceleo.query.runtime.IValidationResult, - * org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment, java.util.List) - */ - @Override - public Set getType(Call call, ValidationServices services, IValidationResult validationResult, - IReadOnlyQueryEnvironment queryEnvironment, List argTypes) { - return null; - } - @Override - public Set getType(IReadOnlyQueryEnvironment queryEnvironment) { + public Set computeType(IReadOnlyQueryEnvironment queryEnvironment) { return null; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.impl.AbstractService#internalInvoke(java.lang.Object[]) - */ @Override protected Object internalInvoke(Object[] arguments) throws Exception { return null; @@ -146,43 +94,23 @@ protected Service2(Object serviceOrigin) { super(serviceOrigin); } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getName() - */ @Override public String getName() { return SERVICE_NAME; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getShortSignature() - */ @Override public String getShortSignature() { return SERVICE_NAME; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getLongSignature() - */ @Override public String getLongSignature() { return SERVICE_NAME; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getParameterTypes(org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment) - */ @Override - public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { + public List computeParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) { final List result = new ArrayList(); result.add(new ClassType(queryEnvironment, type2)); @@ -190,50 +118,21 @@ public List getParameterTypes(IReadOnlyQueryEnvironment queryEnvironment) return result; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getNumberOfParameters() - */ @Override public int getNumberOfParameters() { return 1; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getPriority() - */ @Override public int getPriority() { return priority2; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.IService#getType(org.eclipse.acceleo.query.ast.Call, - * org.eclipse.acceleo.query.runtime.impl.ValidationServices, - * org.eclipse.acceleo.query.runtime.IValidationResult, - * org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment, java.util.List) - */ - @Override - public Set getType(Call call, ValidationServices services, IValidationResult validationResult, - IReadOnlyQueryEnvironment queryEnvironment, List argTypes) { - return null; - } - @Override - public Set getType(IReadOnlyQueryEnvironment queryEnvironment) { + public Set computeType(IReadOnlyQueryEnvironment queryEnvironment) { return null; } - /** - * {@inheritDoc} - * - * @see org.eclipse.acceleo.query.runtime.impl.AbstractService#internalInvoke(java.lang.Object[]) - */ @Override protected Object internalInvoke(Object[] arguments) throws Exception { return null;