]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListThen.java
(refs #7375) Replaced collectVars method by a visitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / list / ListThen.java
old mode 100755 (executable)
new mode 100644 (file)
index c79714c..df1d1f2
-package org.simantics.scl.compiler.elaboration.expressions.list;\r
-\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.expressions.Expression;\r
-import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
-import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;\r
-import org.simantics.scl.compiler.errors.Locations;\r
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
-import org.simantics.scl.compiler.types.TMetaVar;\r
-import org.simantics.scl.compiler.types.Type;\r
-import org.simantics.scl.compiler.types.Types;\r
-import org.simantics.scl.compiler.types.exceptions.UnificationException;\r
-import org.simantics.scl.compiler.types.kinds.Kinds;\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 ListThen extends ListQualifier {\r
-    public ListQualifier left;\r
-    public Expression transformer;\r
-    public Expression by; // optional\r
-    TMetaVar cType;\r
-    \r
-    public ListThen(Expression transformer, Expression by) {\r
-        this.transformer = transformer;\r
-        this.by = by;\r
-    }\r
-    \r
-    public void setLeft(ListQualifier inner) {\r
-        this.left = inner;\r
-    }\r
-    \r
-    @Override\r
-    public void checkType(TypingContext context) {\r
-        left.checkType(context);\r
-        \r
-        cType = Types.metaVar(Kinds.STAR);\r
-        Type transformerType = Types.function(Types.list(cType), Types.list(cType));\r
-        if(by != null) {\r
-            by = by.checkType(context, Types.metaVar(Kinds.STAR));\r
-            transformerType = Types.function(Types.function(cType, by.getType()), transformerType);\r
-        }\r
-        transformer = transformer.checkType(context, transformerType);\r
-        if(!(Types.canonical(cType) instanceof TMetaVar)) {\r
-            context.getErrorLog().log(location, "Transformation function must be generic on list elements.");\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void collectRefs(TObjectIntHashMap<Object> allRefs,\r
-            TIntHashSet refs) {\r
-        left.collectRefs(allRefs, refs);\r
-        transformer.collectRefs(allRefs, refs);\r
-        if(by != null)\r
-            by.collectRefs(allRefs, refs);\r
-    }\r
-\r
-    @Override\r
-    public void collectVars(TObjectIntHashMap<Variable> allVars,\r
-            TIntHashSet vars) {\r
-        left.collectVars(allVars, vars);\r
-        transformer.collectVars(allVars, vars);\r
-        if(by != null)\r
-            by.collectVars(allVars, vars);\r
-    }\r
-\r
-    @Override\r
-    public void collectFreeVariables(THashSet<Variable> vars) {\r
-        left.collectFreeVariables(vars);\r
-        transformer.collectFreeVariables(vars);\r
-        if(by != null)\r
-            by.collectFreeVariables(vars);\r
-    }\r
-\r
-    @Override\r
-    public CompiledQualifier compile(SimplificationContext context) {\r
-        CompiledQualifier q = left.compile(context);\r
-        \r
-        try {\r
-            Types.unify(cType, q.pattern.getType());\r
-        } catch (UnificationException e) {\r
-            context.getErrorLog().log(location, "Transformation function must be generic on list elements.");\r
-        }\r
-        \r
-        if(by == null)\r
-            q.value = context.apply(transformer, q.value);\r
-        else\r
-            q.value = context.apply(transformer, context.lambda(q.pattern.copy(), by), q.value);\r
-        return q;\r
-    }\r
-\r
-    @Override\r
-    public void resolve(TranslationContext context) {\r
-        transformer = transformer.resolve(context);\r
-        left.resolve(context);\r
-        if(by != null)\r
-            by = by.resolve(context);\r
-    }\r
-\r
-    @Override\r
-    public void decorate(ExpressionDecorator decorator) {\r
-        transformer = transformer.decorate(decorator);\r
-        if(by != null)\r
-            by = by.decorate(decorator);\r
-        left.decorate(decorator);\r
-    }\r
-\r
-    @Override\r
-    public void collectEffects(THashSet<Type> effects) {\r
-        left.collectEffects(effects);\r
-        transformer.collectEffects(effects);\r
-        if(by != null)\r
-            by.collectEffects(effects);\r
-    }\r
-    \r
-    @Override\r
-    public void setLocationDeep(long loc) {\r
-        if(location == Locations.NO_LOCATION) {\r
-            location = loc;\r
-            left.setLocationDeep(loc);\r
-            transformer.setLocationDeep(loc);\r
-            if(by != null)\r
-                by.setLocationDeep(loc);\r
-        }\r
-    }\r
-    \r
-    @Override\r
-    public void accept(ListQualifierVisitor visitor) {\r
-        visitor.visit(this);\r
-    }\r
-\r
-    @Override\r
-    public void forVariables(VariableProcedure procedure) {\r
-        left.forVariables(procedure);\r
-        transformer.forVariables(procedure);\r
-        if(by != null)\r
-            by.forVariables(procedure);\r
-    }\r
-    \r
-    @Override\r
-    public ListQualifier accept(ListQualifierTransformer transformer) {\r
-        return transformer.transform(this);\r
-    }\r
-}\r
+package org.simantics.scl.compiler.elaboration.expressions.list;
+
+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.expressions.Expression;
+import org.simantics.scl.compiler.errors.Locations;
+import org.simantics.scl.compiler.types.TMetaVar;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.exceptions.UnificationException;
+import org.simantics.scl.compiler.types.kinds.Kinds;
+
+public class ListThen extends ListQualifier {
+    public ListQualifier left;
+    public Expression transformer;
+    public Expression by; // optional
+    TMetaVar cType;
+    
+    public ListThen(Expression transformer, Expression by) {
+        this.transformer = transformer;
+        this.by = by;
+    }
+    
+    public void setLeft(ListQualifier inner) {
+        this.left = inner;
+    }
+    
+    @Override
+    public void checkType(TypingContext context) {
+        left.checkType(context);
+        
+        cType = Types.metaVar(Kinds.STAR);
+        Type transformerType = Types.function(Types.list(cType), Types.list(cType));
+        if(by != null) {
+            by = by.checkType(context, Types.metaVar(Kinds.STAR));
+            transformerType = Types.function(Types.function(cType, by.getType()), transformerType);
+        }
+        transformer = transformer.checkType(context, transformerType);
+        if(!(Types.canonical(cType) instanceof TMetaVar)) {
+            context.getErrorLog().log(location, "Transformation function must be generic on list elements.");
+        }
+    }
+
+    @Override
+    public CompiledQualifier compile(SimplificationContext context) {
+        CompiledQualifier q = left.compile(context);
+        
+        try {
+            Types.unify(cType, q.pattern.getType());
+        } catch (UnificationException e) {
+            context.getErrorLog().log(location, "Transformation function must be generic on list elements.");
+        }
+        
+        if(by == null)
+            q.value = context.apply(transformer, q.value);
+        else
+            q.value = context.apply(transformer, context.lambda(q.pattern.copy(), by), q.value);
+        return q;
+    }
+
+    @Override
+    public void resolve(TranslationContext context) {
+        transformer = transformer.resolve(context);
+        left.resolve(context);
+        if(by != null)
+            by = by.resolve(context);
+    }
+
+    @Override
+    public void setLocationDeep(long loc) {
+        if(location == Locations.NO_LOCATION) {
+            location = loc;
+            left.setLocationDeep(loc);
+            transformer.setLocationDeep(loc);
+            if(by != null)
+                by.setLocationDeep(loc);
+        }
+    }
+    
+    @Override
+    public void accept(ListQualifierVisitor visitor) {
+        visitor.visit(this);
+    }
+    
+    @Override
+    public ListQualifier accept(ListQualifierTransformer transformer) {
+        return transformer.transform(this);
+    }
+}