]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
Merge "Define ConnectionRelationType to make searching of instances possible"
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Thu, 13 Jun 2019 11:44:44 +0000 (11:44 +0000)
committerGerrit Code Review <gerrit2@simantics>
Thu, 13 Jun 2019 11:44:44 +0000 (11:44 +0000)
bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromConfigurationAdapter.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApply.java
tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/ModuleRegressionTests.java
tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/TypeInferenceBug4.scl [new file with mode: 0644]

index 8c052561e2340ed051d5989836742d0684083e0f..0ca3b1b04406861467b845013717710ff5c45788 100644 (file)
@@ -13,6 +13,8 @@ package org.simantics.modeling.ui.diagramEditor;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.eclipse.ui.PlatformUI;
 import org.simantics.Simantics;
@@ -103,16 +105,21 @@ public class OpenDiagramFromConfigurationAdapter extends AbstractResourceEditorA
         Resource diagram = ComponentUtils.getPossibleCompositeDiagram(graph, r);
         if(diagram != null) return diagram;
         
-        if(selectedObjects.size() == 1) {
-               Object o = selectedObjects.iterator().next();
-               if(o instanceof Resource) {
-                       Resource res = (Resource)o;
-                       if(graph.isInstanceOf(res, DIA.Element)) {
-                               return graph.getPossibleObject(res, L0.PartOf);
-                       }
-               }
+        // TODO: what if the selected objects are from different diagrams?
+        if (selectedObjects.size() > 0) {
+            Set<Resource> diagrams = new HashSet<>();
+            for (Object o : selectedObjects) {
+                if (o instanceof Resource) {
+                    Resource res = (Resource)o;
+                    if (graph.isInstanceOf(res, DIA.Element)) {
+                        diagrams.add(graph.getPossibleObject(res, L0.PartOf));
+                    }
+                }
+            }
+            if (diagrams.size() == 1) {
+                return diagrams.iterator().next();
+            }
         }
-        
         return null;
 
     }
index 7f50d730b9f0d536fc91f6dfa439f8ccebc43fcd..06ff05c18bf4aec3cb60325734daa382e2544a92 100644 (file)
@@ -249,6 +249,12 @@ public class EApply extends Expression {
             current.setType(mfun.returnType);
 
             if(marity < current.parameters.length) {
+                if (marity == 0) {
+                    // Cannot eat away any more parameters
+                    context.getErrorLog().log(location, "Application of non-function");
+                    return current;
+                }
+                
                 Expression[] missingParameters = Arrays.copyOfRange(current.parameters, marity, current.parameters.length);
                 functionType = mfun.returnType;
                 current.parameters = Arrays.copyOf(current.parameters, marity);
index 6a416687d1ba7d280a93f1a7c30976f1ba957b9f..f577ad37d1b9c03b3cd564b88481ed3a381275f5 100644 (file)
@@ -291,6 +291,7 @@ public class ModuleRegressionTests extends TestBase {
     @Test public void TypeClassBug1() { test(); }
     @Test(timeout=1000L) public void TypeInferenceBug2() { test(); }
     @Test public void TypeInferenceBug3() { test(); }
+    @Test(timeout=100L) public void TypeInferenceBug4() { test(); }
     @Test public void TypeOf1() { test(); }
     @Test public void TypingBug1() { test(); }
     @Test public void TypingError1() { test(); }
diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/TypeInferenceBug4.scl b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/TypeInferenceBug4.scl
new file mode 100644 (file)
index 0000000..9331fa3
--- /dev/null
@@ -0,0 +1,14 @@
+import "Prelude"
+
+// See gitlab #303
+
+test :: () -> Integer
+test _ = let
+    f = id :: Integer -> Integer
+    in min f 1 f 2
+    
+main = test ()
+--
+8:8-8:11: Constraint <Ord (Integer -> Integer)> is not given and cannot be derived.
+8:8-8:19: Application of non-function
+8:16-8:17: Expected <Integer> got <Integer -> Integer>.