package org.simantics.scl.compiler.elaboration.expressions; import java.util.List; import org.simantics.scl.compiler.common.names.Names; import org.simantics.scl.compiler.constants.Constant; 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.EAmbiguous.Alternative; import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessor; import org.simantics.scl.compiler.elaboration.expressions.accessor.IdAccessor; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.header.ModuleHeader; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; public class EFieldAccess extends SimplifiableExpression { private static final Type VARIABLE = Types.con("Simantics/Variables", "Variable"); public Expression parent; public FieldAccessor accessor; boolean lastAccessor = true; public EFieldAccess(Expression parent, FieldAccessor accessor) { this.parent = parent; this.accessor = accessor; if(parent instanceof EFieldAccess) ((EFieldAccess)parent).lastAccessor = false; } private boolean returnsValue() { return accessor.accessSeparator == '#' && !accessor.isVariableId(); } @Override protected void updateType() throws MatchException { // Type is already updated in checkBasicType } private Expression resolveAccessor(TypingContext context, Type requiredType) { if(!(accessor instanceof IdAccessor)) return null; IdAccessor idAccessor = (IdAccessor)accessor; if(idAccessor.accessSeparator != '.') return null; List accessors = context.getEnvironment().getFieldAccessors(idAccessor.fieldName); if(accessors == null) { context.getErrorLog().log(idAccessor.location, "Couldn't resolve accessor ." + idAccessor.fieldName + "."); return new EError(location); } Expression accessorExpression; if(accessors.size() == 1) accessorExpression = new ELiteral(accessors.get(0)); else { Alternative[] alternatives = new Alternative[accessors.size()]; for(int i=0;i