]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/types/TApplyAst.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / types / TApplyAst.java
index c1b2d43723e744f780983627d7d1f3480db55897..1aeba20713063dc70728bf443b907fdbb491b951 100644 (file)
@@ -4,6 +4,7 @@ import java.util.Arrays;
 
 import org.simantics.scl.compiler.elaboration.contexts.TypeTranslationContext;
 import org.simantics.scl.compiler.elaboration.modules.TypeAlias;
+import org.simantics.scl.compiler.elaboration.modules.TypeDescriptor;
 import org.simantics.scl.compiler.environment.AmbiguousNameException;
 import org.simantics.scl.compiler.environment.Environments;
 import org.simantics.scl.compiler.internal.types.TypeElaborationContext;
@@ -38,23 +39,29 @@ public class TApplyAst extends TypeAst {
     public Type toType(TypeTranslationContext context, Kind expectedKind) {
         if(function instanceof TVarAst) {
             String name = ((TVarAst)function).name;
-            TypeAlias alias;
+            TypeAlias alias = null;
             try {
-                alias = Environments.getTypeAlias(context.getEnvironment(), name);
+                TypeDescriptor tdesc = Environments.getTypeDescriptor(context.getEnvironment(), name);
+                if(tdesc instanceof TypeAlias)
+                    alias = (TypeAlias)tdesc;
             } catch (AmbiguousNameException e) {
                 context.getErrorLog().log(location, e.getMessage());
                 return Types.metaVar(Kinds.STAR);
             }
             if(alias != null) {
-                if(parameters.length != alias.getArity()) {
+                int arity = alias.getArity();
+                if(parameters.length < arity) {
                     context.getErrorLog().log(location, "Wrong number of parameters are given to the type alias. Expected " +
-                            alias.getArity() + " parameters, got " + parameters.length + " parameters.");
+                            arity + " parameters, got " + parameters.length + " parameters.");
                     return Types.metaVar(Kinds.metaVar());
                 }
-                Type[] parameterTypes = new Type[parameters.length];
-                for(int i=0;i<parameters.length;++i)
+                Type[] parameterTypes = new Type[arity];
+                for(int i=0;i<arity;++i)
                     parameterTypes[i] = parameters[i].toType(context, Kinds.metaVar());
-                return alias.body.replace(alias.parameters, parameterTypes);
+                Type result = alias.body.replace(alias.parameters, parameterTypes);
+                for(int i=arity;i<parameters.length;++i)
+                    result = Types.apply(result, parameters[i].toType(context, Kinds.metaVar()));
+                return result;
             }
         }