]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EFieldAccess.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EFieldAccess.java
index faadca33e0f10ccbf0f5059ed7c4742d904e4c42..4ebd0248d5f799d1fdfe2023cee77f93d0db7f31 100644 (file)
-package org.simantics.scl.compiler.elaboration.expressions;\r
-\r
-import org.simantics.scl.compiler.common.names.Names;\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.accessor.FieldAccessor;\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.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 EFieldAccess extends SimplifiableExpression {\r
-\r
-    private static final Type VARIABLE = Types.con("Simantics/Variables", "Variable");\r
-    \r
-    Expression parent;\r
-    FieldAccessor[] accessors;\r
-\r
-    public EFieldAccess(Expression parent, FieldAccessor[] accessors) {\r
-        if(parent instanceof EFieldAccess) {\r
-            EFieldAccess parentAccess = (EFieldAccess)parent;\r
-            parent = parentAccess.parent;\r
-            accessors = concat(parentAccess.accessors, accessors);\r
-        }\r
-        this.parent = parent;\r
-        this.accessors = accessors;\r
-    }\r
-\r
-    @Override\r
-    public void collectRefs(TObjectIntHashMap<Object> allRefs,\r
-            TIntHashSet refs) {\r
-        parent.collectRefs(allRefs, refs);\r
-        for(FieldAccessor accessor : accessors)\r
-            accessor.collectRefs(allRefs, refs);\r
-    }\r
-\r
-    @Override\r
-    public void collectVars(TObjectIntHashMap<Variable> allVars,\r
-            TIntHashSet vars) {\r
-        parent.collectVars(allVars, vars);\r
-        for(FieldAccessor accessor : accessors)\r
-            accessor.collectVars(allVars, vars);\r
-    }\r
-\r
-    private boolean returnsValue() {\r
-        FieldAccessor lastAccessor = accessors[accessors.length-1];\r
-        return lastAccessor.accessSeparator=='#' && !lastAccessor.isVariableId();\r
-    }\r
-\r
-    @Override\r
-    protected void updateType() throws MatchException {\r
-        // Type is already updated in checkBasicType\r
-    }\r
-    \r
-    @Override\r
-    public Expression checkBasicType(TypingContext context, Type requiredType) {\r
-        if(returnsValue())\r
-            setType(requiredType);\r
-        else {\r
-            setType(VARIABLE);\r
-            context.subsume(this, requiredType);\r
-        }\r
-        parent = parent.checkType(context, VARIABLE);\r
-        for(FieldAccessor accessor : accessors)\r
-            accessor.checkType(context);\r
-        context.declareEffect(getLocation(), Types.READ_GRAPH);\r
-        return this;\r
-    }\r
-\r
-    @Override\r
-    public void collectFreeVariables(THashSet<Variable> vars) {\r
-        parent.collectFreeVariables(vars);\r
-        for(FieldAccessor accessor : accessors)\r
-            accessor.collectFreeVariables(vars);\r
-    }\r
-\r
-    @Override\r
-    public Expression simplify(SimplificationContext context) {\r
-        // Simplify subexpressions\r
-        parent = parent.simplify(context);\r
-        for(FieldAccessor accessor : accessors)\r
-            accessor.simplify(context);\r
-        \r
-        // ...\r
-        Expression result = parent;\r
-        for(int i=0;i<accessors.length;++i) {\r
-            FieldAccessor accessor = accessors[i];\r
-            if(accessor.accessSeparator == '.')\r
-                result = new EApply(\r
-                        getLocation(),\r
-                        Types.READ_GRAPH,\r
-                        context.getConstant(Names.Simantics_Variables_child_),\r
-                        result,\r
-                        accessor.asExpression()\r
-                        );\r
-            else if(i < accessors.length-1)\r
-                result = new EApply(\r
-                        getLocation(),\r
-                        Types.READ_GRAPH,\r
-                        context.getConstant(Names.Simantics_Variables_property),\r
-                        result,\r
-                        accessor.asExpression()\r
-                        );\r
-            else if(accessor.isVariableId())\r
-                ;\r
-            else\r
-                result = new EApply(\r
-                        getLocation(),\r
-                        Types.READ_GRAPH,\r
-                        context.getConstant(Names.Simantics_Variables_untypedPropertyValue, getType()),\r
-                        result,\r
-                        accessor.asExpression()\r
-                        );\r
-        }\r
-        return result;\r
-    }\r
-\r
-    private static FieldAccessor[] concat(FieldAccessor[] accessors1,\r
-            FieldAccessor[] accessors2) {\r
-        FieldAccessor[] result = new FieldAccessor[accessors1.length + accessors2.length];\r
-        System.arraycopy(accessors1, 0, result, 0, accessors1.length);\r
-        System.arraycopy(accessors2, 0, result, accessors1.length, accessors2.length);\r
-        return result;\r
-    }\r
-\r
-    @Override\r
-    public Expression resolve(TranslationContext context) {\r
-        parent = parent.resolve(context);\r
-        for(FieldAccessor accessor : accessors)\r
-            accessor.resolve(context);\r
-        return this;\r
-    }\r
-\r
-    @Override\r
-    public Expression decorate(ExpressionDecorator decorator) {\r
-        return decorator.decorate(this);\r
-    }\r
-\r
-    @Override\r
-    public void collectEffects(THashSet<Type> effects) {\r
-        // FIXME\r
-        effects.add(Types.READ_GRAPH);\r
-    }\r
-    \r
-    @Override\r
-    public void setLocationDeep(long loc) {\r
-        if(location == Locations.NO_LOCATION) {\r
-            location = loc;\r
-            parent.setLocationDeep(loc);\r
-            for(FieldAccessor accessor : accessors)\r
-                accessor.setLocationDeep(loc);\r
-        }\r
-    }\r
-    \r
-    @Override\r
-    public void accept(ExpressionVisitor visitor) {\r
-        visitor.visit(this);\r
-    }\r
-\r
-    @Override\r
-    public void forVariables(VariableProcedure procedure) {\r
-        parent.forVariables(procedure);\r
-        for(FieldAccessor accessor : accessors)\r
-            accessor.forVariables(procedure);\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.common.names.Names;
+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.accessor.FieldAccessor;
+import org.simantics.scl.compiler.errors.Locations;
+import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.exceptions.MatchException;
+
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
+public class EFieldAccess extends SimplifiableExpression {
+
+    private static final Type VARIABLE = Types.con("Simantics/Variables", "Variable");
+    
+    Expression parent;
+    FieldAccessor[] accessors;
+
+    public EFieldAccess(Expression parent, FieldAccessor[] accessors) {
+        if(parent instanceof EFieldAccess) {
+            EFieldAccess parentAccess = (EFieldAccess)parent;
+            parent = parentAccess.parent;
+            accessors = concat(parentAccess.accessors, accessors);
+        }
+        this.parent = parent;
+        this.accessors = accessors;
+    }
+
+    @Override
+    public void collectRefs(TObjectIntHashMap<Object> allRefs,
+            TIntHashSet refs) {
+        parent.collectRefs(allRefs, refs);
+        for(FieldAccessor accessor : accessors)
+            accessor.collectRefs(allRefs, refs);
+    }
+
+    @Override
+    public void collectVars(TObjectIntHashMap<Variable> allVars,
+            TIntHashSet vars) {
+        parent.collectVars(allVars, vars);
+        for(FieldAccessor accessor : accessors)
+            accessor.collectVars(allVars, vars);
+    }
+
+    private boolean returnsValue() {
+        FieldAccessor lastAccessor = accessors[accessors.length-1];
+        return lastAccessor.accessSeparator=='#' && !lastAccessor.isVariableId();
+    }
+
+    @Override
+    protected void updateType() throws MatchException {
+        // Type is already updated in checkBasicType
+    }
+    
+    @Override
+    public Expression checkBasicType(TypingContext context, Type requiredType) {
+        if(returnsValue())
+            setType(requiredType);
+        else {
+            setType(VARIABLE);
+            context.subsume(this, requiredType);
+        }
+        parent = parent.checkType(context, VARIABLE);
+        for(FieldAccessor accessor : accessors)
+            accessor.checkType(context);
+        context.declareEffect(getLocation(), Types.READ_GRAPH);
+        return this;
+    }
+
+    @Override
+    public void collectFreeVariables(THashSet<Variable> vars) {
+        parent.collectFreeVariables(vars);
+        for(FieldAccessor accessor : accessors)
+            accessor.collectFreeVariables(vars);
+    }
+
+    @Override
+    public Expression simplify(SimplificationContext context) {
+        // Simplify subexpressions
+        parent = parent.simplify(context);
+        for(FieldAccessor accessor : accessors)
+            accessor.simplify(context);
+        
+        // ...
+        Expression result = parent;
+        for(int i=0;i<accessors.length;++i) {
+            FieldAccessor accessor = accessors[i];
+            if(accessor.accessSeparator == '.')
+                result = new EApply(
+                        getLocation(),
+                        Types.READ_GRAPH,
+                        context.getConstant(Names.Simantics_Variables_child_),
+                        result,
+                        accessor.asExpression()
+                        );
+            else if(i < accessors.length-1)
+                result = new EApply(
+                        getLocation(),
+                        Types.READ_GRAPH,
+                        context.getConstant(Names.Simantics_Variables_property),
+                        result,
+                        accessor.asExpression()
+                        );
+            else if(accessor.isVariableId())
+                ;
+            else
+                result = new EApply(
+                        getLocation(),
+                        Types.READ_GRAPH,
+                        context.getConstant(Names.Simantics_Variables_untypedPropertyValue, getType()),
+                        result,
+                        accessor.asExpression()
+                        );
+        }
+        return result;
+    }
+
+    private static FieldAccessor[] concat(FieldAccessor[] accessors1,
+            FieldAccessor[] accessors2) {
+        FieldAccessor[] result = new FieldAccessor[accessors1.length + accessors2.length];
+        System.arraycopy(accessors1, 0, result, 0, accessors1.length);
+        System.arraycopy(accessors2, 0, result, accessors1.length, accessors2.length);
+        return result;
+    }
+
+    @Override
+    public Expression resolve(TranslationContext context) {
+        parent = parent.resolve(context);
+        for(FieldAccessor accessor : accessors)
+            accessor.resolve(context);
+        return this;
+    }
+
+    @Override
+    public Expression decorate(ExpressionDecorator decorator) {
+        return decorator.decorate(this);
+    }
+
+    @Override
+    public void collectEffects(THashSet<Type> effects) {
+        // FIXME
+        effects.add(Types.READ_GRAPH);
+    }
+    
+    @Override
+    public void setLocationDeep(long loc) {
+        if(location == Locations.NO_LOCATION) {
+            location = loc;
+            parent.setLocationDeep(loc);
+            for(FieldAccessor accessor : accessors)
+                accessor.setLocationDeep(loc);
+        }
+    }
+    
+    @Override
+    public void accept(ExpressionVisitor visitor) {
+        visitor.visit(this);
+    }
+
+    @Override
+    public void forVariables(VariableProcedure procedure) {
+        parent.forVariables(procedure);
+        for(FieldAccessor accessor : accessors)
+            accessor.forVariables(procedure);
+    }
+    
+    @Override
+    public Expression accept(ExpressionTransformer transformer) {
+        return transformer.transform(this);
+    }
+
+}