]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EListLiteral.java
(refs #7375) Replaced collectVars method by a visitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EListLiteral.java
old mode 100755 (executable)
new mode 100644 (file)
index b7165e9..0f9ae5a
-package org.simantics.scl.compiler.elaboration.expressions;\r
-\r
-import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
-import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
-import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
-import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
-import org.simantics.scl.compiler.elaboration.java.Builtins;\r
-import org.simantics.scl.compiler.elaboration.java.ListConstructor;\r
-import org.simantics.scl.compiler.errors.Locations;\r
-import org.simantics.scl.compiler.internal.codegen.utils.Constants;\r
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
-import org.simantics.scl.compiler.internal.interpreted.IExpression;\r
-import org.simantics.scl.compiler.internal.interpreted.IListLiteral;\r
-import org.simantics.scl.compiler.top.ExpressionInterpretationContext;\r
-import org.simantics.scl.compiler.types.Type;\r
-import org.simantics.scl.compiler.types.Types;\r
-import org.simantics.scl.compiler.types.exceptions.MatchException;\r
-\r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
-public class EListLiteral extends SimplifiableExpression {\r
-\r
-    Expression[] components;\r
-    Type componentType;\r
-\r
-    public EListLiteral(Expression[] components) {\r
-        this.components = components;\r
-    }\r
-\r
-    private EListLiteral(Expression[] components, Type componentType) {\r
-        this.components = components;\r
-        this.componentType = componentType;\r
-    }\r
-\r
-    public Expression[] getComponents() {\r
-        return components;\r
-    }\r
-    \r
-    @Override\r
-    public void collectRefs(TObjectIntHashMap<Object> allRefs,\r
-            TIntHashSet refs) {\r
-        for(Expression component : components)\r
-            component.collectRefs(allRefs, refs);\r
-    }\r
-\r
-    @Override\r
-    public void collectVars(TObjectIntHashMap<Variable> allVars,\r
-            TIntHashSet vars) {\r
-        for(Expression component : components)\r
-            component.collectVars(allVars, vars);\r
-    }\r
-    \r
-    @Override\r
-    public void collectFreeVariables(THashSet<Variable> vars) {\r
-        for(Expression component : components)\r
-            component.collectFreeVariables(vars);\r
-    }\r
-    \r
-    @Override\r
-    public Expression simplify(SimplificationContext context) {\r
-        context.pushLocation(location);\r
-        try {\r
-            for(int i=0;i<components.length;++i)\r
-                components[i] = components[i].simplify(context);\r
-            \r
-            if(components.length <= Constants.MAX_LIST_LITERAL_LENGTH) {\r
-                Expression result = new EConstant(location, Builtins.LIST_CONSTRUCTORS[components.length], \r
-                        componentType);\r
-                if(components.length > 0)\r
-                    result = new EApply(location, result, components);\r
-                return result;\r
-            }\r
-            else {\r
-                Expression result = new EApplyType(new ELiteral(location, new ListConstructor(components.length)), componentType);\r
-                result = new EApply(location, result, components);\r
-                return result;\r
-            }\r
-        } finally {\r
-            context.popLocation();\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public Expression resolve(TranslationContext context) {\r
-        for(int i=0;i<components.length;++i)\r
-            components[i] = components[i].resolve(context);\r
-        return this;\r
-    }\r
-    \r
-    @Override\r
-    public Expression resolveAsPattern(TranslationContext context) {\r
-        for(int i=0;i<components.length;++i)\r
-            components[i] = components[i].resolveAsPattern(context);\r
-        return this;\r
-    }\r
-    \r
-    @Override\r
-    protected void updateType() throws MatchException {\r
-        setType(Types.list(componentType));\r
-    }\r
-    \r
-    @Override\r
-    public Expression checkBasicType(TypingContext context, Type requiredType) {\r
-        try {\r
-            componentType = Types.unifyApply(Types.LIST, requiredType);\r
-        } catch (MatchException e) {\r
-            context.getErrorLog().log(location, "Expected a value with type " + requiredType + " but got a list.");\r
-            return new EError(location);\r
-        }\r
-        for(int i=0;i<components.length;++i)\r
-            components[i] = components[i].checkType(context, componentType);\r
-        return this;\r
-    }\r
-\r
-    @Override\r
-    public Expression decorate(ExpressionDecorator decorator) {\r
-        for(int i=0;i<components.length;++i)\r
-            components[i] = components[i].decorate(decorator);\r
-        return decorator.decorate(this);\r
-    }\r
-\r
-    @Override\r
-    public void collectEffects(THashSet<Type> effects) {\r
-        for(Expression component : components)\r
-            component.collectEffects(effects);\r
-    }\r
-\r
-    @Override\r
-    public void setLocationDeep(long loc) {\r
-        if(location == Locations.NO_LOCATION) {\r
-            location = loc;\r
-            for(Expression component : components)\r
-                component.setLocationDeep(loc);\r
-        }\r
-    }\r
-    \r
-    @Override\r
-    public void accept(ExpressionVisitor visitor) {\r
-        visitor.visit(this);\r
-    }\r
-    \r
-    @Override\r
-    public IExpression toIExpression(ExpressionInterpretationContext target) {\r
-        IExpression[] componentExpressions = new IExpression[components.length];\r
-        for(int i=0;i<components.length;++i)\r
-            componentExpressions[i] = components[i].toIExpression(target);\r
-        return new IListLiteral(componentExpressions);\r
-    }\r
-\r
-    @Override\r
-    public void forVariables(VariableProcedure procedure) {\r
-        for(Expression component : components)\r
-            component.forVariables(procedure);\r
-    }\r
-    \r
-    @Override\r
-    public Expression replace(ReplaceContext context) {\r
-        Expression[] newComponents = new Expression[components.length];\r
-        for(int i=0;i<components.length;++i)\r
-            newComponents[i] = components[i].replace(context);\r
-        return new EListLiteral(newComponents, componentType.replace(context.tvarMap));\r
-    }\r
-    \r
-    @Override\r
-    public boolean isPattern(int arity) {\r
-        if(arity != 0)\r
-            return false;\r
-        for(Expression component : components)\r
-            if(!component.isPattern(0))\r
-                return false;\r
-        return true;\r
-    }\r
-    \r
-    @Override\r
-    public Expression accept(ExpressionTransformer transformer) {\r
-        return transformer.transform(this);\r
-    }\r
-\r
-}\r
+package org.simantics.scl.compiler.elaboration.expressions;
+
+import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
+import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
+import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
+import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
+import org.simantics.scl.compiler.elaboration.java.Builtins;
+import org.simantics.scl.compiler.elaboration.java.ListConstructor;
+import org.simantics.scl.compiler.errors.Locations;
+import org.simantics.scl.compiler.internal.codegen.utils.Constants;
+import org.simantics.scl.compiler.internal.interpreted.IExpression;
+import org.simantics.scl.compiler.internal.interpreted.IListLiteral;
+import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.exceptions.MatchException;
+
+public class EListLiteral extends SimplifiableExpression {
+
+    public Expression[] components;
+    Type componentType;
+
+    public EListLiteral(Expression[] components) {
+        this.components = components;
+    }
+
+    private EListLiteral(Expression[] components, Type componentType) {
+        this.components = components;
+        this.componentType = componentType;
+    }
+
+    public Expression[] getComponents() {
+        return components;
+    }
+    
+    @Override
+    public Expression simplify(SimplificationContext context) {
+        context.pushLocation(location);
+        try {
+            for(int i=0;i<components.length;++i)
+                components[i] = components[i].simplify(context);
+            
+            if(components.length <= Constants.MAX_LIST_LITERAL_LENGTH) {
+                Expression result = new EConstant(location, Builtins.LIST_CONSTRUCTORS[components.length], 
+                        componentType);
+                if(components.length > 0)
+                    result = new EApply(location, result, components);
+                return result;
+            }
+            else {
+                Expression result = new EApplyType(new ELiteral(location, new ListConstructor(components.length)), componentType);
+                result = new EApply(location, result, components);
+                return result;
+            }
+        } finally {
+            context.popLocation();
+        }
+    }
+
+    @Override
+    public Expression resolve(TranslationContext context) {
+        for(int i=0;i<components.length;++i)
+            components[i] = components[i].resolve(context);
+        return this;
+    }
+    
+    @Override
+    public Expression resolveAsPattern(TranslationContext context) {
+        for(int i=0;i<components.length;++i)
+            components[i] = components[i].resolveAsPattern(context);
+        return this;
+    }
+    
+    @Override
+    protected void updateType() throws MatchException {
+        setType(Types.list(componentType));
+    }
+    
+    @Override
+    public Expression checkBasicType(TypingContext context, Type requiredType) {
+        try {
+            componentType = Types.unifyApply(Types.LIST, requiredType);
+        } catch (MatchException e) {
+            context.getErrorLog().log(location, "Expected a value with type " + requiredType + " but got a list.");
+            return new EError(location);
+        }
+        for(int i=0;i<components.length;++i)
+            components[i] = components[i].checkType(context, componentType);
+        return this;
+    }
+
+    @Override
+    public void setLocationDeep(long loc) {
+        if(location == Locations.NO_LOCATION) {
+            location = loc;
+            for(Expression component : components)
+                component.setLocationDeep(loc);
+        }
+    }
+    
+    @Override
+    public void accept(ExpressionVisitor visitor) {
+        visitor.visit(this);
+    }
+    
+    @Override
+    public IExpression toIExpression(ExpressionInterpretationContext target) {
+        IExpression[] componentExpressions = new IExpression[components.length];
+        for(int i=0;i<components.length;++i)
+            componentExpressions[i] = components[i].toIExpression(target);
+        return new IListLiteral(componentExpressions);
+    }
+    
+    @Override
+    public Expression replace(ReplaceContext context) {
+        Expression[] newComponents = new Expression[components.length];
+        for(int i=0;i<components.length;++i)
+            newComponents[i] = components[i].replace(context);
+        return new EListLiteral(newComponents, componentType.replace(context.tvarMap));
+    }
+    
+    @Override
+    public boolean isPattern(int arity) {
+        if(arity != 0)
+            return false;
+        for(Expression component : components)
+            if(!component.isPattern(0))
+                return false;
+        return true;
+    }
+    
+    @Override
+    public Expression accept(ExpressionTransformer transformer) {
+        return transformer.transform(this);
+    }
+
+}