]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching2/PatternMatchingCompiler2.java
(refs #7278, refs #7279) Small fixes to InternalCompilerExceptions
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / elaboration / matching2 / PatternMatchingCompiler2.java
index bd904cf28ef52bbc5e7ddc058a1a9fe28978a672..8ca51b275f900a439d5b7a5025ab3d2e96444588 100644 (file)
@@ -5,6 +5,7 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
+import org.simantics.scl.compiler.compilation.CompilationContext;
 import org.simantics.scl.compiler.constants.Constant;
 import org.simantics.scl.compiler.elaboration.expressions.EApply;
 import org.simantics.scl.compiler.elaboration.expressions.EApplyType;
@@ -17,7 +18,6 @@ import org.simantics.scl.compiler.elaboration.expressions.EViewPattern;
 import org.simantics.scl.compiler.elaboration.expressions.Expression;
 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
 import org.simantics.scl.compiler.elaboration.modules.TypeConstructor;
-import org.simantics.scl.compiler.environment.Environment;
 import org.simantics.scl.compiler.internal.codegen.continuations.Branch;
 import org.simantics.scl.compiler.internal.codegen.continuations.ICont;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
@@ -53,7 +53,7 @@ public class PatternMatchingCompiler2 {
         return newVals;
     }
 
-    private static void splitByConstructors(CodeWriter w, final Environment env, IVal[] scrutinee, ICont failure, List<Row2> rows, int columnId) {
+    private static void splitByConstructors(CodeWriter w, final CompilationContext context, IVal[] scrutinee, ICont failure, List<Row2> rows, int columnId) {
         THashMap<Object, ExpressionMatrix> matrixMap = new THashMap<Object, ExpressionMatrix>();
         ArrayList<Branch> branches = new ArrayList<Branch>();
         ArrayList<ExpressionMatrix> matrices = new ArrayList<ExpressionMatrix>();
@@ -166,7 +166,7 @@ public class PatternMatchingCompiler2 {
             CodeWriter newW = w.createBlock();
             ICont cont = newW.getContinuation();
             branches.add(new Branch(null, cont));
-            split(newW, env, scrutinee, failure, rows.subList(i, rows.size()));
+            split(newW, context, scrutinee, failure, rows.subList(i, rows.size()));
             failure = cont;
         }
         else {
@@ -176,7 +176,7 @@ public class PatternMatchingCompiler2 {
             } catch (MatchException e) {
                 throw new InternalCompilerError(e);
             }
-            TypeConstructor cons = (TypeConstructor)env.getTypeDescriptor(con);
+            TypeConstructor cons = (TypeConstructor)context.environment.getTypeDescriptor(con);
             int maxBranchCount = cons.isOpen ? Integer.MAX_VALUE 
                     : cons.constructors.length;
             if(branches.size() < maxBranchCount)
@@ -184,11 +184,11 @@ public class PatternMatchingCompiler2 {
         }
 
         for(ExpressionMatrix mx : matrices)
-            split(mx.w, env, mx.scrutinee, failure, mx.rows);
+            split(mx.w, context, mx.scrutinee, failure, mx.rows);
         w.switch_(scrutinee[columnId], branches.toArray(new Branch[branches.size()]));
     }
 
-    private static void splitByViewPattern(CodeWriter w, Environment env, IVal[] scrutinee, ICont failure, List<Row2> rows, int viewPatternColumn) {
+    private static void splitByViewPattern(CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont failure, List<Row2> rows, int viewPatternColumn) {
         Row2 firstRow = rows.get(0);
         EViewPattern firstViewPattern = (EViewPattern)firstRow.patterns[viewPatternColumn];
         firstRow.patterns[viewPatternColumn] = firstViewPattern.pattern;
@@ -219,19 +219,19 @@ public class PatternMatchingCompiler2 {
         IVal[] newScrutinee = Arrays.copyOf(scrutinee, scrutinee.length);
         newScrutinee[viewPatternColumn] =
                 w.apply(firstViewPattern.location,
-                        firstViewPattern.expression.toVal(env, w),
+                        firstViewPattern.expression.toVal(context, w),
                         scrutinee[viewPatternColumn]);
         if(i == rows.size()) {
-            split(w, env, newScrutinee, failure, rows);
+            split(w, context, newScrutinee, failure, rows);
         }
         else {
             CodeWriter cont = w.createBlock();
-            split(w, env, newScrutinee, cont.getContinuation(), rows.subList(0, i));
-            split(cont, env, scrutinee, failure, rows.subList(i, rows.size()));
+            split(w, context, newScrutinee, cont.getContinuation(), rows.subList(0, i));
+            split(cont, context, scrutinee, failure, rows.subList(i, rows.size()));
         }
     }
 
-    public static void split(CodeWriter w, Environment env, IVal[] scrutinee, ICont failure, List<Row2> rows) {
+    public static void split(CodeWriter w, CompilationContext context, IVal[] scrutinee, ICont failure, List<Row2> rows) {
         Row2 firstRow = rows.get(0);
         Expression[] patterns = firstRow.patterns;
         if(scrutinee.length != patterns.length)
@@ -246,13 +246,13 @@ public class PatternMatchingCompiler2 {
                     viewPatternColumn = i;
             }
             else if(!(pattern instanceof EVariable)) {
-                splitByConstructors(w, env, scrutinee, failure, rows, i);
+                splitByConstructors(w, context, scrutinee, failure, rows, i);
                 return;
             }
         }
         
         if(viewPatternColumn >= 0) {
-            splitByViewPattern(w, env, scrutinee, failure, rows, viewPatternColumn);
+            splitByViewPattern(w, context, scrutinee, failure, rows, viewPatternColumn);
             return;
         }