]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.server/src/org/simantics/document/server/request/ServerSCLValueRequest.java
Change universal type variables to existential in requested value types
[simantics/platform.git] / bundles / org.simantics.document.server / src / org / simantics / document / server / request / ServerSCLValueRequest.java
index 25afd86893fd17a83475aa11f4ec9b2ea148ffb3..e6cdf6ff5b43712b098594d172a91b7595de63cb 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.document.server.request;
 
+import java.util.ArrayList;
 import java.util.Map;
 
 import org.simantics.databoard.Bindings;
@@ -24,8 +25,12 @@ import org.simantics.scl.compiler.elaboration.expressions.EVariable;
 import org.simantics.scl.compiler.elaboration.expressions.Expression;
 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
 import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.environment.Environments;
 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;
 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
+import org.simantics.scl.compiler.top.SCLExpressionCompilationException;
+import org.simantics.scl.compiler.types.TMetaVar;
+import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.kinds.Kinds;
@@ -35,11 +40,16 @@ import org.simantics.structural2.scl.ComponentTypeProperty;
 import org.simantics.structural2.scl.FindPossibleComponentTypeRequest;
 import org.simantics.structural2.scl.ReadComponentTypeInterfaceRequest;
 import org.simantics.utils.datastructures.Pair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ServerSCLValueRequest extends AbstractExpressionCompilationRequest<CompilationContext, Variable> {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(ServerSCLValueRequest.class);
+    
        private final Pair<Resource,Resource> componentTypeAndRoot;
        private final Resource literal;
+    protected String possibleExpectedValueType;
 
        public static class CompilationContext extends AbstractExpressionCompilationContext {
                public final Map<String, ComponentTypeProperty> propertyMap;
@@ -51,14 +61,15 @@ public class ServerSCLValueRequest extends AbstractExpressionCompilationRequest<
                }
        }
 
-       private ServerSCLValueRequest(Pair<Resource,Resource> componentTypeAndRoot, Resource literal) {
+       private ServerSCLValueRequest(Pair<Resource,Resource> componentTypeAndRoot, Resource literal, String possibleExpectedValueType) {
                assert(literal != null);
                this.literal = literal;
                this.componentTypeAndRoot = componentTypeAndRoot;
+               this.possibleExpectedValueType = possibleExpectedValueType;
        }
 
        public ServerSCLValueRequest(ReadGraph graph, Variable context) throws DatabaseException {
-               this(getComponentTypeAndRoot(graph, context), context.getRepresents(graph));
+               this(getComponentTypeAndRoot(graph, context), context.getRepresents(graph), resolveExpectedValueType(graph, context));
        }
 
        private static Pair<Resource,Resource> getComponentTypeAndRoot(ReadGraph graph, Variable property)  throws DatabaseException {
@@ -192,6 +203,21 @@ public class ServerSCLValueRequest extends AbstractExpressionCompilationRequest<
                else
                        return null;
        }
+       
+    @Override
+    protected Type getExpectedType(ReadGraph graph, CompilationContext context) throws DatabaseException {
+        if(possibleExpectedValueType != null) {
+            try {
+                Type type = Environments.getType(context.runtimeEnvironment.getEnvironment(), possibleExpectedValueType);
+                type = Types.instantiate(Types.forAll(Types.freeVars(type).toArray(new TVar[0]), type), new ArrayList<TMetaVar>());
+                return type;
+            } catch (SCLExpressionCompilationException e) {
+                LOGGER.error("Could not get type for " + String.valueOf(possibleExpectedValueType), e);
+            }
+        }
+        return super.getExpectedType(graph, context);
+    }
+
 
        @Override
        public int hashCode() {