diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java @ 19289:62c43fcf5be2

Truffle-DSL: implement @Cached and fixes for the new guard expression syntax.
author Christian Humer <christian.humer@gmail.com>
date Tue, 03 Feb 2015 15:07:07 +0100
parents 08aa0372dad4
children b31b2f289e7d
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java	Mon Dec 29 18:32:03 2014 +0100
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java	Tue Feb 03 15:07:07 2015 +0100
@@ -45,29 +45,42 @@
     private static final List<String> IDENTITY_OPERATORS = Arrays.asList("==", "!=");
     private static final String CONSTRUCTOR_KEYWORD = "new";
 
-    private List<VariableElement> variables;
-    private List<ExecutableElement> methods;
+    private final List<VariableElement> variables = new ArrayList<>();
+    private final List<ExecutableElement> methods = new ArrayList<>();
     private final ProcessorContext context;
 
+    private DSLExpressionResolver(ProcessorContext context) {
+        this.context = context;
+    }
+
     public DSLExpressionResolver(ProcessorContext context, List<? extends Element> lookupElements) {
-        this.context = context;
-        this.variables = variablesIn(lookupElements, false);
-        this.methods = methodsIn(lookupElements);
+        this(context);
+        lookup(lookupElements);
     }
 
-    private static List<ExecutableElement> methodsIn(List<? extends Element> lookupElements) {
-        List<ExecutableElement> methods = new ArrayList<>();
+    public DSLExpressionResolver copy(List<? extends Element> prefixElements) {
+        DSLExpressionResolver resolver = new DSLExpressionResolver(context);
+        lookup(prefixElements);
+        resolver.variables.addAll(variables);
+        resolver.methods.addAll(methods);
+        return resolver;
+    }
+
+    private void lookup(List<? extends Element> lookupElements) {
+        variablesIn(variables, lookupElements, false);
+        methodsIn(lookupElements);
+    }
+
+    private void methodsIn(List<? extends Element> lookupElements) {
         for (Element variable : lookupElements) {
             ElementKind kind = variable.getKind();
             if (kind == ElementKind.METHOD || kind == ElementKind.CONSTRUCTOR) {
                 methods.add((ExecutableElement) variable);
             }
         }
-        return methods;
     }
 
-    private static List<VariableElement> variablesIn(List<? extends Element> lookupElements, boolean publicOnly) {
-        List<VariableElement> variables = new ArrayList<>();
+    private static void variablesIn(List<VariableElement> variables, List<? extends Element> lookupElements, boolean publicOnly) {
         for (Element variable : lookupElements) {
             ElementKind kind = variable.getKind();
             if (kind == ElementKind.LOCAL_VARIABLE || kind == ElementKind.PARAMETER || kind == ElementKind.FIELD || kind == ElementKind.ENUM_CONSTANT) {
@@ -77,7 +90,6 @@
                 }
             }
         }
-        return variables;
     }
 
     private static String getMethodName(ExecutableElement method) {
@@ -189,7 +201,8 @@
             TypeMirror type = receiver.getResolvedType();
             if (type.getKind() == TypeKind.DECLARED) {
                 type = context.reloadType(type); // ensure ECJ has the type loaded
-                lookupVariables = variablesIn(context.getEnvironment().getElementUtils().getAllMembers((TypeElement) ((DeclaredType) type).asElement()), true);
+                lookupVariables = new ArrayList<>();
+                variablesIn(lookupVariables, context.getEnvironment().getElementUtils().getAllMembers((TypeElement) ((DeclaredType) type).asElement()), true);
             } else if (type.getKind() == TypeKind.ARRAY) {
                 lookupVariables = Arrays.<VariableElement> asList(new CodeVariableElement(context.getType(int.class), "length"));
             } else {