From: Hannu Niemistö Date: Mon, 15 Aug 2016 11:19:15 +0000 (+0300) Subject: Merge remote-tracking branch 'origin/svn' X-Git-Tag: v1.25.0~180 X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=commitdiff_plain;h=refs%2Fchanges%2F19%2F19%2F1;hp=56ff864efe846a96cbd4c4186eeeb77600d8bb1c Merge remote-tracking branch 'origin/svn' Change-Id: I478743179fe637965255b3ed1d7d03c0fc0c54ab --- diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependenciesRelation.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependenciesRelation.java index 965ca6ee4..d3c44903b 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependenciesRelation.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependenciesRelation.java @@ -405,10 +405,10 @@ public class DependenciesRelation extends UnsupportedRelation implements Generic if (parent != null) { _additions.add(new Object[] { ss.getRandomAccessId(parent), ss.getRandomAccessId(entry.component), name, types, id != null ? id.indexString() : "" }); } else { - System.err.println("resource " + entry.component + ": no parent for entry " + name + " " + types); + //System.err.println("resource " + entry.component + ": no parent for entry " + name + " " + types); } } else { - System.err.println("resource " + entry.component + ": " + name + " " + types); + //System.err.println("resource " + entry.component + ": " + name + " " + types); } } else if(_entry instanceof ComponentModification) { ComponentModification entry = (ComponentModification)_entry; diff --git a/bundles/org.simantics.scl.compiler/src/org/cojen/classfile/MethodDesc.java b/bundles/org.simantics.scl.compiler/src/org/cojen/classfile/MethodDesc.java index e95476992..6a751c5b5 100644 --- a/bundles/org.simantics.scl.compiler/src/org/cojen/classfile/MethodDesc.java +++ b/bundles/org.simantics.scl.compiler/src/org/cojen/classfile/MethodDesc.java @@ -16,15 +16,15 @@ package org.cojen.classfile; -import java.io.Serializable; import java.io.Externalizable; -import java.io.ObjectOutput; -import java.io.ObjectInput; import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; import java.io.ObjectStreamException; +import java.io.Serializable; import java.lang.reflect.Method; -import java.util.List; import java.util.ArrayList; +import java.util.List; import org.cojen.util.WeakCanonicalSet; diff --git a/bundles/org.simantics.scl.compiler/src/org/cojen/classfile/TypeDesc.java b/bundles/org.simantics.scl.compiler/src/org/cojen/classfile/TypeDesc.java index 084eb3dc8..cfc5a1deb 100644 --- a/bundles/org.simantics.scl.compiler/src/org/cojen/classfile/TypeDesc.java +++ b/bundles/org.simantics.scl.compiler/src/org/cojen/classfile/TypeDesc.java @@ -17,11 +17,6 @@ package org.cojen.classfile; import java.io.Serializable; -import java.io.Externalizable; -import java.io.ObjectOutput; -import java.io.ObjectInput; -import java.io.IOException; -import java.io.ObjectStreamException; import java.lang.ref.SoftReference; import java.lang.reflect.Array; import java.util.Collections; @@ -510,10 +505,6 @@ public abstract class TypeDesc extends Descriptor implements Serializable { return false; } - Object writeReplace() throws ObjectStreamException { - return new External(mDescriptor); - } - private static class PrimitiveType extends TypeDesc { private transient final int mCode; private transient TypeDesc mArrayType; @@ -895,27 +886,4 @@ public abstract class TypeDesc extends Descriptor implements Serializable { } } } - - private static class External implements Externalizable { - private String mDescriptor; - - public External() { - } - - public External(String desc) { - mDescriptor = desc; - } - - public void writeExternal(ObjectOutput out) throws IOException { - out.writeUTF(mDescriptor); - } - - public void readExternal(ObjectInput in) throws IOException { - mDescriptor = in.readUTF(); - } - - public Object readResolve() throws ObjectStreamException { - return forDescriptor(mDescriptor); - } - } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/CommandSession.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/CommandSession.java index 8ad47b0a0..e463a4e6a 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/CommandSession.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/CommandSession.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.commands; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectProcedure; -import gnu.trove.set.hash.THashSet; - import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -62,6 +58,10 @@ import org.simantics.scl.runtime.reporting.SCLReporting; import org.simantics.scl.runtime.reporting.SCLReportingHandler; import org.simantics.scl.runtime.tuple.Tuple0; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + public class CommandSession { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/ValueToStringConverter.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/ValueToStringConverter.java index 07ca39015..51d5c456f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/ValueToStringConverter.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/ValueToStringConverter.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.commands; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.runtime.RuntimeEnvironment; import org.simantics.scl.compiler.top.ExpressionEvaluator; import org.simantics.scl.compiler.top.SCLExpressionCompilationException; @@ -9,6 +7,8 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.runtime.function.Function1; +import gnu.trove.map.hash.THashMap; + public class ValueToStringConverter { final RuntimeEnvironment environment; final THashMap showInstances = new THashMap(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java index 912158862..0ad3627d8 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java @@ -1,9 +1,9 @@ package org.simantics.scl.compiler.compilation; -import gnu.trove.map.hash.TObjectLongHashMap; - import java.util.ArrayList; +import gnu.trove.map.hash.TObjectLongHashMap; + public class CompilationTimer { private long initialTime, previousTime; private ArrayList entries = new ArrayList(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/DocumentationGeneration.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/DocumentationGeneration.java index e4124d9b7..b24243180 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/DocumentationGeneration.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/DocumentationGeneration.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.compilation; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.elaboration.modules.SCLValue; @@ -13,6 +10,9 @@ import org.simantics.scl.compiler.internal.parsing.declarations.DDocumentationAs import org.simantics.scl.compiler.module.ConcreteModule; import org.simantics.scl.compiler.types.TCon; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public class DocumentationGeneration { THashMap valueDocumentation; THashMap typeDocumentation; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java index dc3bdc9e8..d331283fd 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java @@ -1,7 +1,6 @@ package org.simantics.scl.compiler.compilation; import java.util.ArrayList; -import java.util.Collections; import java.util.Iterator; import java.util.List; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NameExistenceChecks.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NameExistenceChecks.java index 8204b5f60..1f45c5f41 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NameExistenceChecks.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NameExistenceChecks.java @@ -5,22 +5,27 @@ import org.simantics.scl.compiler.elaboration.modules.TypeConstructor; import org.simantics.scl.compiler.environment.AmbiguousNameException; import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.errors.ErrorLog; +import org.simantics.scl.compiler.top.SCLCompilerConfiguration; public class NameExistenceChecks { public static void checkIfValueExists(ErrorLog errorLog, long location, Environment environment, String name) { - try { - SCLValue value = environment.getLocalNamespace().getValue(name); - if(value != null) + if(SCLCompilerConfiguration.ALLOW_OVERLOADING) + return; + else { + try { + SCLValue value = environment.getLocalNamespace().getValue(name); + if(value != null) + errorLog.log(location, + "Value " + name + " is already defined in the module " + + value.getName().module + + " that is imported to the default namespace."); + } catch(AmbiguousNameException e) { errorLog.log(location, - "Value " + name + " is already defined in the module " + - value.getName().module + - " that is imported to the default namespace."); - } catch(AmbiguousNameException e) { - errorLog.log(location, - "Value " + name + " is already defined in the modules " + - e.conflictingModules[0] + " and " + e.conflictingModules[1] + - " that are imported to the default namespace."); + "Value " + name + " is already defined in the modules " + + e.conflictingModules[0] + " and " + e.conflictingModules[1] + + " that are imported to the default namespace."); + } } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NamespaceOfModule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NamespaceOfModule.java index 7b2ee618f..8ade1602e 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NamespaceOfModule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NamespaceOfModule.java @@ -1,7 +1,6 @@ package org.simantics.scl.compiler.compilation; -import gnu.trove.procedure.TObjectProcedure; - +import java.util.Arrays; import java.util.function.Consumer; import org.simantics.scl.compiler.elaboration.modules.SCLValue; @@ -18,8 +17,11 @@ import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter; import org.simantics.scl.compiler.environment.filter.NamespaceFilter; import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor; import org.simantics.scl.compiler.module.Module; +import org.simantics.scl.compiler.top.SCLCompilerConfiguration; import org.simantics.scl.compiler.types.TCon; +import gnu.trove.procedure.TObjectProcedure; + public class NamespaceOfModule implements Namespace { private final Namespace base; private final Module module; @@ -37,9 +39,30 @@ public class NamespaceOfModule implements Namespace { @Override public SCLValue getValue(String name) throws AmbiguousNameException { SCLValue value = module.getValue(name); + if(SCLCompilerConfiguration.ALLOW_OVERLOADING) { + SCLValue value2; + try { + value2 = base.getValue(name); + } catch(AmbiguousNameException e) { + if(value != null) { + String[] conflictingModules = Arrays.copyOf(e.conflictingModules, e.conflictingModules.length+1); + conflictingModules[e.conflictingModules.length] = module.getName(); + throw new AmbiguousNameException(Arrays.asList(conflictingModules), e.name); + } + else + throw e; + } + if(value == null) + return value2; + if(value2 == null) + return value; + throw new AmbiguousNameException(Arrays.asList(value.getName().module, value2.getName().module), value.getName().name); + } + else { if(value != null) return value; return base.getValue(name); + } } @Override diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeChecking.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeChecking.java index 97266d6e9..554a36081 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeChecking.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeChecking.java @@ -5,16 +5,13 @@ import static org.simantics.scl.compiler.elaboration.expressions.Expressions.app import static org.simantics.scl.compiler.elaboration.expressions.Expressions.lambda; import static org.simantics.scl.compiler.elaboration.expressions.Expressions.loc; import static org.simantics.scl.compiler.elaboration.expressions.Expressions.vars; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; +import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous; import org.simantics.scl.compiler.elaboration.expressions.EPlaceholder; import org.simantics.scl.compiler.elaboration.expressions.ETransformation; import org.simantics.scl.compiler.elaboration.expressions.EVariable; @@ -42,6 +39,11 @@ import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.kinds.Kinds; import org.simantics.scl.compiler.types.util.Polarity; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class TypeChecking { final ErrorLog errorLog; final Environment environment; @@ -97,6 +99,8 @@ public class TypeChecking { context.pushEffectUpperBound(expression.location, Types.PROC); expression = expression.checkType(context, value.getType()); context.popEffectUpperBound(); + for(EAmbiguous overloaded : context.overloadedExpressions) + overloaded.assertResolved(errorLog); value.setExpression(expression); ArrayList constraintDemand = context.getConstraintDemand(); @@ -199,6 +203,7 @@ public class TypeChecking { @Override public void run() { Type type = value.getType(); + Expression expression = value.getExpression(); try { @@ -211,6 +216,8 @@ public class TypeChecking { context.pushEffectUpperBound(expression.location, Types.PROC); expression = expression.checkType(context, type); context.popEffectUpperBound(); + for(EAmbiguous overloaded : context.overloadedExpressions) + overloaded.assertResolved(errorLog); expression.getType().addPolarity(Polarity.POSITIVE); context.solveSubsumptions(expression.getLocation()); ArrayList demands = context.getConstraintDemand(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingOld.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingOld.java deleted file mode 100644 index c5ef57384..000000000 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingOld.java +++ /dev/null @@ -1,349 +0,0 @@ -package org.simantics.scl.compiler.compilation; - -import static org.simantics.scl.compiler.elaboration.expressions.Expressions.apply; -import static org.simantics.scl.compiler.elaboration.expressions.Expressions.applyTypes; -import static org.simantics.scl.compiler.elaboration.expressions.Expressions.lambda; -import static org.simantics.scl.compiler.elaboration.expressions.Expressions.loc; -import static org.simantics.scl.compiler.elaboration.expressions.Expressions.vars; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - -import java.util.ArrayList; - -import org.simantics.scl.compiler.elaboration.contexts.TypingContext; -import org.simantics.scl.compiler.elaboration.expressions.EPlaceholder; -import org.simantics.scl.compiler.elaboration.expressions.EVariable; -import org.simantics.scl.compiler.elaboration.expressions.Expression; -import org.simantics.scl.compiler.elaboration.expressions.Variable; -import org.simantics.scl.compiler.elaboration.modules.SCLValue; -import org.simantics.scl.compiler.elaboration.rules.MappingRelation; -import org.simantics.scl.compiler.elaboration.rules.TransformationRule; -import org.simantics.scl.compiler.environment.Environment; -import org.simantics.scl.compiler.errors.ErrorLog; -import org.simantics.scl.compiler.errors.Locations; -import org.simantics.scl.compiler.internal.elaboration.constraints.Constraint; -import org.simantics.scl.compiler.internal.elaboration.constraints.ConstraintEnvironment; -import org.simantics.scl.compiler.internal.elaboration.constraints.ConstraintSolver; -import org.simantics.scl.compiler.internal.elaboration.constraints.ExpressionAugmentation; -import org.simantics.scl.compiler.internal.elaboration.constraints.ReducedConstraints; -import org.simantics.scl.compiler.internal.elaboration.utils.StronglyConnectedComponents; -import org.simantics.scl.compiler.module.ConcreteModule; -import org.simantics.scl.compiler.types.TPred; -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; -import org.simantics.scl.compiler.types.util.Polarity; - -public class TypeCheckingOld { - public static final boolean PRINT_VALUES = false; - - ErrorLog errorLog; - Environment environment; - ConcreteModule module; - - ConstraintEnvironment ce; - ArrayList valuesWithoutTypeAnnotation = new ArrayList(); - ArrayList valuesWithTypeAnnotation = new ArrayList(); - - public TypeCheckingOld(ErrorLog errorLog, Environment environment, - ConcreteModule module) { - this.errorLog = errorLog; - this.environment = environment; - this.module = module; - } - - public void typeCheck() { - ce = new ConstraintEnvironment(environment); - groupValueDefinitionsByDependency(); - typeCheckValuesWithoutTypeAnnotations(); - typeCheckValuesWithTypeAnnotations(); - typeCheckRules(); - } - - private void groupValueDefinitionsByDependency() { - // Collect all untyped names - final ArrayList values = new ArrayList(); - for(SCLValue value : module.getValues()) { - if(value.getExpression() != null) { - if(value.getType() == null) - values.add(value); - else - valuesWithTypeAnnotation.add(value); - } - } - - // Create inverse - final TObjectIntHashMap allRefs = - new TObjectIntHashMap(values.size()*2, 0.5f, -1); - for(int i=0;i(); - for(SCLValue value : group) - context.recursiveValues.add(value); - - @SuppressWarnings("unchecked") - ArrayList[] constraintDemands = new ArrayList[group.length]; - - @SuppressWarnings("unchecked") - ArrayList[] recursiveReferences = new ArrayList[group.length]; - for(int i=0;i(); - - SCLValue value = group[i]; - Expression expression = value.getExpression(); - expression = expression.checkType(context, value.getType()); - value.setExpression(expression); - - ArrayList constraintDemand = context.getConstraintDemand(); - if(!constraintDemand.isEmpty()) { - constraintDemands[i] = constraintDemand; - context.resetConstraintDemand(); - } - - recursiveReferences[i] = context.recursiveReferences; - } - - for(Type type : Types.getTypes(group)) - type.addPolarity(Polarity.POSITIVE); - context.solveSubsumptions(group[0].getExpression().getLocation()); - ArrayList allUnsolvedConstraints = new ArrayList(); - - @SuppressWarnings("unchecked") - ArrayList[] freeEvidence = new ArrayList[group.length]; - for(int i=0;i(0), constraintDemands[i], - true /*!Types.isFunction(expression.getType())*/); - - expression = ExpressionAugmentation.augmentSolved( - red.solvedConstraints, - expression); - value.setExpression(expression); - value.setType(expression.getType()); - - for(Constraint c : red.unsolvedConstraints) - if(c.constraint.isGround()) { - errorLog.log(c.getDemandLocation(), "There is no instance for <"+c.constraint+">."); - } - - ArrayList fe = new ArrayList(red.unsolvedConstraints.size()); - for(Constraint c : red.unsolvedConstraints) { - allUnsolvedConstraints.add(c); - fe.add(c.evidence); - } - freeEvidence[i] = fe; - } - else { - group[i].setExpression(group[i].getExpression().decomposeMatching()); - freeEvidence[i] = new ArrayList(0); - } - } - - THashSet varSet = new THashSet(); - for(int i=0;i constraintSet = new THashSet(); - for(int i=0;i fe = freeEvidence[i]; - THashMap indexedEvidence = new THashMap(fe.size()); - for(Variable v : fe) - indexedEvidence.put((TPred)v.getType(), v); - fe.clear(); - for(TPred c : constraints) { - Variable var = indexedEvidence.get(c); - if(var == null) { - // These are variables that are not directly needed in - // this definition but in the definitions that are - // recursively called - var = new Variable("evX"); - var.setType(c); - fe.add(var); - } - fe.add(var); - } - - // Add evidence parameters to the functions - SCLValue value = group[i]; - value.setExpression(lambda(Types.NO_EFFECTS, fe, value.getExpression()) - .closure(vars)); - value.setType(Types.forAll(vars, - Types.constrained(constraints, value.getType()))); - - // Add evidence parameters to recursive calls - for(EPlaceholder ref : recursiveReferences[i]) { - ref.expression = loc(ref.expression.location, apply( - Types.NO_EFFECTS, - applyTypes(ref.expression, vars), - vars(fe))); - } - } - } - } - - private void typeCheckValuesWithTypeAnnotations() { - ArrayList givenConstraints = new ArrayList(); - for(SCLValue value : valuesWithTypeAnnotation) { - Type type = value.getType(); - if(type != null) { - if(PRINT_VALUES) { - System.out.println("---------------------------------------------"); - System.out.println("--- " + value.getName() + " :: " + type); - } - Expression expression = value.getExpression(); - ArrayList vars = new ArrayList(); - type = Types.removeForAll(type, vars); - type = Types.removePred(type, givenConstraints); - - /*System.out.println("---------------------------------------------"); - TypeUnparsingContext tuc = new TypeUnparsingContext(); - System.out.println("--- " + value.getName() + " :: " + type.toString(tuc)); - for(TPred t : givenConstraints) - System.out.println(">>> " + t.toString(tuc)); - */ - TypingContext context = new TypingContext(errorLog, environment); - //System.out.println(expression); - expression = expression.checkType(context, type); - //System.out.println(expression); - expression.getType().addPolarity(Polarity.POSITIVE); - context.solveSubsumptions(expression.getLocation()); - ArrayList demands = context.getConstraintDemand(); - if(!demands.isEmpty() || !givenConstraints.isEmpty()) { - ReducedConstraints red = - ConstraintSolver.solve(ce, givenConstraints, demands, true); - givenConstraints.clear(); - for(Constraint c : red.unsolvedConstraints) { - errorLog.log(c.getDemandLocation(), - "Constraint <"+c.constraint+"> is not given and cannot be derived."); - } - if(errorLog.isEmpty()) { // To prevent exceptions - expression = ExpressionAugmentation.augmentSolved( - red.solvedConstraints, - expression); - expression = ExpressionAugmentation.augmentUnsolved( - red.givenConstraints, - expression); - } - } - else { - if(errorLog.isEmpty()) // To prevent exceptions - expression = expression.decomposeMatching(); - } - expression = expression.closure(vars.toArray(new TVar[vars.size()])); - value.setExpression(expression); - } - } - } - - public void typeCheckRules() { - TypingContext context = new TypingContext(errorLog, environment); - for(TransformationRule rule : module.getRules()) { - context.pushEffectUpperBound(rule.location, Types.metaVar(Kinds.EFFECT)); - rule.checkType(context); - rule.setEffect(Types.canonical(context.popEffectUpperBound())); - } - context.solveSubsumptions(Locations.NO_LOCATION); - - ArrayList demands = context.getConstraintDemand(); - if(!demands.isEmpty()) { - ReducedConstraints red = - ConstraintSolver.solve(ce, new ArrayList(), demands, true); - for(Constraint c : red.unsolvedConstraints) { - errorLog.log(c.getDemandLocation(), - "Constraint <"+c.constraint+"> is not given and cannot be derived."); - } - } - - for(MappingRelation mappingRelation : module.getMappingRelations()) - for(Type parameterType : mappingRelation.parameterTypes) - if(!parameterType.isGround()) { - errorLog.log(mappingRelation.location, "Parameter types of the mapping relation are not completely determined."); - break; - } - - /*for(Rule rule : module.getRules()) { - System.out.println(rule.name); - for(Variable variable : rule.variables) - System.out.println(" " + variable.getName() + " :: " + variable.getType()); - }*/ - } -} diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingScheduler.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingScheduler.java index c3fb2dda7..cb6752527 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingScheduler.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingScheduler.java @@ -1,11 +1,5 @@ package org.simantics.scl.compiler.compilation; -import gnu.trove.impl.Constants; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -18,6 +12,12 @@ import org.simantics.scl.compiler.internal.elaboration.utils.StronglyConnectedCo import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.TVar; +import gnu.trove.impl.Constants; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + /** * Schedules the order of type checking. * diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeInferableDefinition.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeInferableDefinition.java index 34c6c1b85..17b165d7f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeInferableDefinition.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeInferableDefinition.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.compilation; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import java.util.Collection; @@ -13,6 +9,10 @@ import org.simantics.scl.compiler.internal.elaboration.constraints.Constraint; import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.TVar; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public interface TypeInferableDefinition { long getLocation(); Collection getDefinedObjects(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalBoxedArrayElementConstant.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalBoxedArrayElementConstant.java index a26ee9d75..b7114a441 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalBoxedArrayElementConstant.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalBoxedArrayElementConstant.java @@ -1,7 +1,7 @@ package org.simantics.scl.compiler.constants; -import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable; import org.cojen.classfile.TypeDesc; +import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder; import org.simantics.scl.compiler.types.Type; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalVariableConstant.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalVariableConstant.java index 782f34e39..7de438d15 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalVariableConstant.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalVariableConstant.java @@ -1,7 +1,7 @@ package org.simantics.scl.compiler.constants; -import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable; import org.cojen.classfile.TypeDesc; +import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder; import org.simantics.scl.compiler.types.Type; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/generic/ClassRef.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/generic/ClassRef.java index 5686d6340..2ff26cf2d 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/generic/ClassRef.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/generic/ClassRef.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.constants.generic; -import gnu.trove.map.hash.THashMap; - import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -20,6 +18,8 @@ import org.simantics.scl.compiler.constants.generic.MethodRef.StaticFieldRef; import org.simantics.scl.compiler.constants.generic.MethodRef.StaticMethodRef; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilderBase; +import gnu.trove.map.hash.THashMap; + /** * This class is a reference to a Java class that contains a map of MethodRef for each * method declared by the referenced class. diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/SimplificationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/SimplificationContext.java index e983e1277..90e93f3d0 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/SimplificationContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/SimplificationContext.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.elaboration.contexts; -import gnu.trove.list.array.TLongArrayList; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.common.names.Name; import org.simantics.scl.compiler.constants.Constant; @@ -30,6 +27,9 @@ import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.util.MultiFunction; +import gnu.trove.list.array.TLongArrayList; +import gnu.trove.map.hash.THashMap; + public class SimplificationContext implements EnvironmentalContext { Environment environment; ErrorLog errorLog; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java index 961fa902b..b5f9f93e9 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java @@ -1,10 +1,5 @@ package org.simantics.scl.compiler.elaboration.contexts; -import gnu.trove.list.array.TIntArrayList; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectProcedure; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import java.util.Arrays; @@ -12,6 +7,7 @@ import org.simantics.scl.compiler.common.names.Name; import org.simantics.scl.compiler.common.precedence.Associativity; import org.simantics.scl.compiler.common.precedence.Precedence; import org.simantics.scl.compiler.elaboration.expressions.Case; +import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous; import org.simantics.scl.compiler.elaboration.expressions.EConstant; import org.simantics.scl.compiler.elaboration.expressions.EEntityTypeAnnotation; import org.simantics.scl.compiler.elaboration.expressions.EError; @@ -36,6 +32,13 @@ import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter; import org.simantics.scl.compiler.errors.ErrorLog; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.parsing.declarations.DValueAst; +import org.simantics.scl.compiler.top.SCLCompilerConfiguration; +import org.simantics.scl.compiler.types.Type; + +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; public class TranslationContext extends TypeTranslationContext implements EnvironmentalContext { @@ -147,7 +150,45 @@ public class TranslationContext extends TypeTranslationContext implements Enviro } private Expression resolveIn(long location, Namespace namespace, String name) { - SCLValue value = resolveValueIn(location, namespace, name); + SCLValue value; + try { + value = resolveValueIn(location, namespace, name); + } catch (AmbiguousNameException e) { + if(SCLCompilerConfiguration.ALLOW_OVERLOADING) { + EAmbiguous.Alternative[] alternatives = new EAmbiguous.Alternative[e.conflictingModules.length]; + //System.out.println("Overloading:"); + for(int i=0;i recursiveValues; public ArrayList recursiveReferences; + // Overloading + public ArrayList overloadedExpressions = new ArrayList(); + //TypeUnparsingContext tuc = new TypeUnparsingContext(); Environment environment; @@ -258,7 +262,7 @@ public class TypingContext implements EnvironmentalContext { * Instantiates type abstractions and constraints from the value. */ public Expression instantiate(Expression expr) { - Type type = Types.weakCanonical(expr.getType()); + Type type = Types.canonical(expr.getType()); while(type instanceof TForAll) { TForAll forAll = (TForAll)type; TVar var = forAll.var; @@ -297,7 +301,7 @@ public class TypingContext implements EnvironmentalContext { * type applications, lambdas and effect subsumptions. */ public Expression subsume(Expression expr, Type b) { - b = Types.weakCanonical(b); + b = Types.canonical(b); /*if(b instanceof TForAll) { TForAll forAll = (TForAll)b; TVar var = forAll.var; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/equation/EqGuard.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/equation/EqGuard.java index c753924e6..8b2494347 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/equation/EqGuard.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/equation/EqGuard.java @@ -56,7 +56,7 @@ public class EqGuard extends Equation { @Override public void checkType(TypingContext context) { - guard = guard.inferType(context); + guard = guard.checkIgnoredType(context); } @Override diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ASTExpression.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ASTExpression.java index aeeb1ec1e..af0a43d08 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ASTExpression.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ASTExpression.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -11,6 +7,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.exceptions.MatchException; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public abstract class ASTExpression extends SimplifiableExpression { public ASTExpression() { } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Case.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Case.java index 219cce461..50eda1c13 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Case.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Case.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; @@ -13,6 +9,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator import org.simantics.scl.compiler.internal.parsing.Symbol; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class Case extends Symbol { public Expression[] patterns; public Expression value; @@ -99,6 +99,17 @@ public class Case extends Symbol { patterns[i] = patterns[i].checkTypeAsPattern(context, parameterTypes[i]); value = value.checkType(context, requiredType); } + + public void checkIgnoredType(TypingContext context, Type[] parameterTypes) { + if(patterns.length != parameterTypes.length) { + context.getErrorLog().log(location, "This case has different arity ("+patterns.length+ + ") than than the first case (+"+parameterTypes.length+"+)."); + return; + } + for(int i=0;i allRefs, + TIntHashSet refs) { + } + + @Override + public void collectVars(TObjectIntHashMap allVars, + TIntHashSet vars) { + } + + @Override + public void forVariables(VariableProcedure procedure) { + } + + @Override + protected void updateType() throws MatchException { + throw new InternalCompilerError(); + } + + private Type getCommonSkeleton() { + Type[] types = new Type[activeCount]; + for(int i=0,j=0;i unifications = new THashMap(); + Type requiredType = getType(); + if(DEBUG) + System.out.println("EAmbigious.filterActive with " + requiredType); + for(int i=0;i, but no alteratives match the type: "); + for(int i=0;i, but multiple values match the type: "); + for(int i=0;i vars) { + } + + @Override + public Expression resolve(TranslationContext context) { + throw new InternalCompilerError("EAmbiguousConstant should not exist in resolve phase."); + } + + @Override + public void setLocationDeep(long loc) { + if(location == Locations.NO_LOCATION) + location = loc; + } + + @Override + public Expression decorate(ExpressionDecorator decorator) { + return this; + } + + @Override + public void collectEffects(THashSet effects) { + // TODO Auto-generated method stub + } + + @Override + public void accept(ExpressionVisitor visitor) { + // TODO Auto-generated method stub + } + + @Override + public Expression simplify(SimplificationContext context) { + if(resolvedExpression != null) + return resolvedExpression; + else { + context.getErrorLog().log(location, getAmbiguousDescription(getType())); + return this; + } + } + + public void assertResolved(ErrorLog errorLog) { + if(resolvedExpression == null) + errorLog.log(location, getAmbiguousDescription(getType())); + } + + @Override + public Expression accept(ExpressionTransformer transformer) { + return transformer.transform(this); + } + +} diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApply.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApply.java index fb27b9198..8df327362 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApply.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApply.java @@ -1,12 +1,9 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.common.names.Name; +import org.simantics.scl.compiler.constants.NoRepConstant; import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; @@ -26,6 +23,8 @@ import org.simantics.scl.compiler.internal.interpreted.IApply; import org.simantics.scl.compiler.internal.interpreted.IExpression; import org.simantics.scl.compiler.internal.interpreted.IListLiteral; import org.simantics.scl.compiler.top.ExpressionInterpretationContext; +import org.simantics.scl.compiler.types.Skeletons; +import org.simantics.scl.compiler.types.TFun; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; @@ -33,6 +32,10 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException; import org.simantics.scl.compiler.types.kinds.Kinds; import org.simantics.scl.compiler.types.util.MultiFunction; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class EApply extends Expression { Expression function; Expression[] parameters; @@ -248,8 +251,7 @@ public class EApply extends Expression { return new IApply(function.toIExpression(target), parametersI); } - @Override - public Expression inferType(TypingContext context) { + private void inferType(TypingContext context, boolean ignoreResult) { function = function.inferType(context); function = context.instantiate(function); MultiFunction mfun; @@ -265,7 +267,12 @@ public class EApply extends Expression { setType(Types.metaVar(Kinds.STAR)); for(int i=0;i assignments; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EPreRuleset.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EPreRuleset.java index ff27eb03a..74f24ebb8 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EPreRuleset.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EPreRuleset.java @@ -1,13 +1,13 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.expressions.ERuleset.DatalogRule; import org.simantics.scl.compiler.elaboration.expressions.block.RuleStatement; import org.simantics.scl.compiler.elaboration.relations.LocalRelation; import org.simantics.scl.compiler.errors.Locations; +import gnu.trove.map.hash.THashMap; + public class EPreRuleset extends ASTExpression { RuleStatement[] statements; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERealLiteral.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERealLiteral.java index 644e31ab6..f2e17aa00 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERealLiteral.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERealLiteral.java @@ -1,10 +1,6 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.constants.DoubleConstant; import org.simantics.scl.compiler.constants.FloatConstant; @@ -19,6 +15,10 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ERealLiteral extends SimplifiableExpression { public String value; EVariable constraint; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java index cbb69a34b..32999dcb4 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java @@ -52,8 +52,29 @@ public class ERecord extends ASTExpression { return new EError(constructor.location); } THashMap recordMap = new THashMap(fields.length); - for(FieldAssignment field : fields) - recordMap.put(field.name, field); + for(FieldAssignment field : fields) { + if(field.value == null) { + String bestMatch = null; + int bestMatchLength = 0; + for(int i=0;i bestMatchLength) { + bestMatch = fieldName; + bestMatchLength = fieldName.length(); + } + } + if(bestMatch == null) { + context.getErrorLog().log(field.location, "Invalid shorthand field " + field.name + " is defined twice."); + return new EError(location); + } + field.value = new EVar(field.location, field.name); + field.name = bestMatch; + } + if(recordMap.put(field.name, field) != null) { + context.getErrorLog().log(field.location, "Field " + field.name + " is defined more than once."); + return new EError(location); + } + } Expression[] parameters = new Expression[fieldNames.length]; boolean error = false; for(int i=0;i vars) { for(DatalogRule rule : rules) { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESelect.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESelect.java index 9a0bb040d..1e9295233 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESelect.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESelect.java @@ -8,9 +8,6 @@ import static org.simantics.scl.compiler.elaboration.expressions.Expressions.new import static org.simantics.scl.compiler.elaboration.expressions.Expressions.seq; import static org.simantics.scl.compiler.elaboration.expressions.Expressions.tuple; import static org.simantics.scl.compiler.elaboration.expressions.Expressions.var; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.common.names.Name; @@ -30,6 +27,10 @@ import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.kinds.Kinds; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ESelect extends SimplifiableExpression { private final Type ARRAY_LIST = Types.con("ArrayList", "T"); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLambda.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLambda.java index 071588ab9..e1efb3045 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLambda.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLambda.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; @@ -27,6 +23,10 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException; import org.simantics.scl.compiler.types.kinds.Kinds; import org.simantics.scl.compiler.types.util.MultiFunction; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ESimpleLambda extends Expression { public Variable parameter; public Expression value; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLet.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLet.java index 53984840d..8e73b2392 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLet.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLet.java @@ -141,7 +141,7 @@ public class ESimpleLet extends Expression { private void checkBinding(TypingContext context) { if(variable == null) - value = value.inferType(context); + value = value.checkIgnoredType(context); else if(variable.getType() == null) { value = value.inferType(context); variable.setType(value.getType()); @@ -168,6 +168,13 @@ public class ESimpleLet extends Expression { in = in.checkType(context, requiredType); return this; } + + @Override + public Expression checkIgnoredType(TypingContext context) { + checkBinding(context); + in = in.checkIgnoredType(context); + return this; + } @Override public Expression decorate(ExpressionDecorator decorator) { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETransformation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETransformation.java index 63fee96ca..24584fe65 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETransformation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETransformation.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -20,6 +16,10 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ETransformation extends SimplifiableExpression { public static final Object TRANSFORMATION_RULES_TYPECHECKED = new Object(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETypeAnnotation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETypeAnnotation.java index 48969e77b..cfeab99f4 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETypeAnnotation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETypeAnnotation.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -13,6 +9,10 @@ import org.simantics.scl.compiler.internal.parsing.types.TypeAst; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.exceptions.MatchException; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ETypeAnnotation extends SimplifiableExpression { Expression value; Type type; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EVariable.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EVariable.java index 553677626..ca87d72c4 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EVariable.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EVariable.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; @@ -25,6 +21,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.kinds.Kinds; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class EVariable extends Expression { public static final EVariable[] EMPTY_ARRAY = new EVariable[0]; @@ -144,9 +144,12 @@ public class EVariable extends Expression { @Override public Expression inferType(TypingContext context) { - if(context.isInPattern()) + if(context.isInPattern()) { variable.setType(Types.metaVar(Kinds.STAR)); - return this; + return this; + } + else + return applyPUnit(context); } @Override diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EWhen.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EWhen.java index e7907f357..8021c407b 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EWhen.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EWhen.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; @@ -22,6 +18,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.exceptions.UnificationException; import org.simantics.scl.compiler.types.kinds.Kinds; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class EWhen extends SimplifiableExpression { public Query query; @@ -79,7 +79,7 @@ public class EWhen extends SimplifiableExpression { for(Variable variable : variables) variable.setType(Types.metaVar(Kinds.STAR)); query.checkType(context); - action.checkType(context, Types.UNIT); + action.checkIgnoredType(context); // Compile query return compile(context); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Expression.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Expression.java index 83d7ec4e7..edf93841b 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Expression.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Expression.java @@ -1,13 +1,11 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.common.precedence.Precedence; +import org.simantics.scl.compiler.constants.NoRepConstant; +import org.simantics.scl.compiler.elaboration.contexts.EnvironmentalContext; import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; @@ -36,6 +34,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.kinds.Kinds; import org.simantics.scl.compiler.types.util.Typed; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public abstract class Expression extends Symbol implements Typed { public static final Expression[] EMPTY_ARRAY = new Expression[0]; @@ -77,10 +79,30 @@ public abstract class Expression extends Symbol implements Typed { public Expression inferType(TypingContext context) { return checkBasicType(context, Types.metaVar(Kinds.STAR)); } - - public Expression checkBasicType(TypingContext context, Type requiredType) { - return context.subsume(inferType(context), requiredType); - } + + public Expression checkBasicType(TypingContext context, Type requiredType) { + return context.subsume(inferType(context), requiredType); + } + + protected Expression applyPUnit(EnvironmentalContext context) { + Type type = Types.canonical(getType()); + if(type instanceof TFun) { + TFun fun = (TFun)type; + if(fun.getCanonicalDomain() == Types.PUNIT) { + EApply result = new EApply(location, this, new ELiteral(NoRepConstant.PUNIT)); + result.effect = fun.getCanonicalEffect(); + return result; + } + } + return this; + } + + public Expression checkIgnoredType(TypingContext context) { + Expression expression = inferType(context); + if(Types.canonical(expression.getType()) != Types.UNIT) + expression = new ESimpleLet(location, null, expression, new ELiteral(NoRepConstant.PUNIT)); + return expression; + } /** * Checks the type of the expression against the given type. Adds type @@ -89,7 +111,7 @@ public abstract class Expression extends Symbol implements Typed { public final Expression checkType(TypingContext context, Type requiredType) { //System.out.println("checkType: " + this + " :: " + requiredType); if(!context.isInPattern()) { - requiredType = Types.weakCanonical(requiredType); + requiredType = Types.canonical(requiredType); if(requiredType instanceof TForAll) { TForAll forAll = (TForAll)requiredType; TVar var = forAll.var; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ExpressionTransformer.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ExpressionTransformer.java index 1bd50bb6a..baeedd0f0 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ExpressionTransformer.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ExpressionTransformer.java @@ -2,6 +2,7 @@ package org.simantics.scl.compiler.elaboration.expressions; public interface ExpressionTransformer { + Expression transform(EAmbiguous expression); Expression transform(EApply expression); Expression transform(EApplyType expression); Expression transform(EAsPattern expression); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/GuardedExpressionGroup.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/GuardedExpressionGroup.java index 9bec11512..48f72eeac 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/GuardedExpressionGroup.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/GuardedExpressionGroup.java @@ -1,10 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - -import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; @@ -13,12 +8,17 @@ import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.codegen.continuations.ICont; import org.simantics.scl.compiler.internal.codegen.references.IVal; +import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw; import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter; import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class GuardedExpressionGroup extends Expression { public GuardedExpression[] expressions; @@ -58,7 +58,7 @@ public class GuardedExpressionGroup extends Expression { CodeWriter failure = w.createBlock(); compile(env, w, success.getContinuation(), failure.getContinuation()); w.continueAs(success); - failure.throw_(location, "Matching failure at: " + toString()); + failure.throw_(location, Throw.MatchingException, "Matching failure at: " + toString()); return result; //throw new InternalCompilerError("GuardedExpressionGroup should be handled in match compilation."); } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/StandardExpressionTransformer.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/StandardExpressionTransformer.java index 17f13889d..1a2f451ee 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/StandardExpressionTransformer.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/StandardExpressionTransformer.java @@ -38,6 +38,11 @@ public class StandardExpressionTransformer implements ExpressionTransformer, QueryTransformer, ListQualifierTransformer, StatementVisitor, EquationVisitor { + @Override + public Expression transform(EAmbiguous expression) { + return expression; + } + @Override public Expression transform(EApply expression) { expression.function = expression.function.accept(this); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/ExpressionAccessor.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/ExpressionAccessor.java index 0d8da56d4..db1da2bd8 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/ExpressionAccessor.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/ExpressionAccessor.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions.accessor; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -14,6 +10,10 @@ import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ExpressionAccessor extends FieldAccessor { public Expression fieldName; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/FieldAccessor.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/FieldAccessor.java index 349623178..a6eeb3f55 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/FieldAccessor.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/FieldAccessor.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions.accessor; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -13,6 +9,10 @@ import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure; import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator; import org.simantics.scl.compiler.internal.parsing.Symbol; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public abstract class FieldAccessor extends Symbol { public char accessSeparator; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/block/GuardStatement.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/block/GuardStatement.java index 23733e9c1..59aa3ebe2 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/block/GuardStatement.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/block/GuardStatement.java @@ -19,11 +19,12 @@ public class GuardStatement extends Statement { @Override public Expression toExpression(EnvironmentalContext context, boolean monadic, Expression in) { - Variable var = new Variable("_"); - if(monadic) + if(monadic) { + Variable var = new Variable("_"); return new EBind(location, new EVariable(location, var), value, in); + } else - return new ESimpleLet(location, var, value, in); + return new ESimpleLet(location, null, value, in); } @Override diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListAssignment.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListAssignment.java index 5c82a5aea..5f042ff93 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListAssignment.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListAssignment.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions.list; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -16,6 +12,10 @@ import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ListAssignment extends ListQualifier { public Expression pattern; public Expression value; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGenerator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGenerator.java index 7b4cae6bd..622b53842 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGenerator.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGenerator.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions.list; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -19,6 +15,10 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.kinds.Kinds; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ListGenerator extends ListQualifier { public Expression pattern; public Expression value; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGuard.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGuard.java index d591652a2..0a47f04b1 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGuard.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGuard.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions.list; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -15,6 +11,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ListGuard extends ListQualifier { public Expression condition; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListQualifier.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListQualifier.java index e05501e1e..270c3ffc7 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListQualifier.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListQualifier.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions.list; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -13,6 +9,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator import org.simantics.scl.compiler.internal.parsing.Symbol; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public abstract class ListQualifier extends Symbol { public abstract void checkType(TypingContext context); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java index c5affbf96..84fa63e9c 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions.list; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -14,6 +10,10 @@ import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ListSeq extends ListQualifier { public ListQualifier a; public ListQualifier b; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListThen.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListThen.java index 5867a5cfe..c79714c4e 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListThen.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListThen.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.expressions.list; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -18,6 +14,10 @@ import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.UnificationException; import org.simantics.scl.compiler.types.kinds.Kinds; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class ListThen extends ListQualifier { public ListQualifier left; public Expression transformer; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/printing/ExpressionToStringVisitor.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/printing/ExpressionToStringVisitor.java index c5f8f3621..6cbdb6f6b 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/printing/ExpressionToStringVisitor.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/printing/ExpressionToStringVisitor.java @@ -9,6 +9,7 @@ import org.simantics.scl.compiler.elaboration.expressions.EApplyType; import org.simantics.scl.compiler.elaboration.expressions.EAsPattern; import org.simantics.scl.compiler.elaboration.expressions.EBind; import org.simantics.scl.compiler.elaboration.expressions.EConstant; +import org.simantics.scl.compiler.elaboration.expressions.ECoveringBranchPoint; import org.simantics.scl.compiler.elaboration.expressions.EEnforce; import org.simantics.scl.compiler.elaboration.expressions.EEquations; import org.simantics.scl.compiler.elaboration.expressions.EError; @@ -25,7 +26,6 @@ import org.simantics.scl.compiler.elaboration.expressions.EListLiteral; import org.simantics.scl.compiler.elaboration.expressions.ELiteral; import org.simantics.scl.compiler.elaboration.expressions.EMatch; import org.simantics.scl.compiler.elaboration.expressions.EPlaceholder; -import org.simantics.scl.compiler.elaboration.expressions.ECoveringBranchPoint; import org.simantics.scl.compiler.elaboration.expressions.ERealLiteral; import org.simantics.scl.compiler.elaboration.expressions.ERuleset; import org.simantics.scl.compiler.elaboration.expressions.ESelect; @@ -331,7 +331,7 @@ public class ExpressionToStringVisitor implements ExpressionVisitor, QueryVisito ESimpleLet let = (ESimpleLet)expression; Variable variable = let.getVariable(); Expression value = let.getValue(); - if("_".equals(variable.getName())) + if(variable == null || "_".equals(variable.getName())) printAsDo(value); else { newLine(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/MinigraphModule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/MinigraphModule.java index b9534f76b..6bdaaea7b 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/MinigraphModule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/MinigraphModule.java @@ -1,7 +1,10 @@ package org.simantics.scl.compiler.elaboration.java; -import static org.simantics.scl.compiler.elaboration.expressions.Expressions.*; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.apply; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.constant; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.string; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.var; import org.cojen.classfile.TypeDesc; import org.simantics.scl.compiler.constants.generic.CallJava; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/macros/StandardMacroRule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/macros/StandardMacroRule.java index 6319e58b2..a154dff23 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/macros/StandardMacroRule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/macros/StandardMacroRule.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.elaboration.macros; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.expressions.EApply; @@ -13,6 +11,8 @@ import org.simantics.scl.compiler.elaboration.expressions.Variable; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.THashMap; + /** * This is a macro rule that replaces an application with * the definition of the function. diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java index ef73ea6af..49301b151 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.elaboration.modules; -import gnu.trove.map.hash.THashMap; - import java.util.ArrayList; import org.cojen.classfile.TypeDesc; @@ -16,6 +14,8 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.kinds.Kinds; +import gnu.trove.map.hash.THashMap; + public class TypeClass extends TypeConstructor { public final TPred[] context; public final TCon name; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClassInstance.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClassInstance.java index c9bfa6fde..681c66972 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClassInstance.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClassInstance.java @@ -1,12 +1,12 @@ package org.simantics.scl.compiler.elaboration.modules; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.constants.Constant; import org.simantics.scl.compiler.elaboration.errors.ElabNode; import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.TVar; +import gnu.trove.map.hash.THashMap; + public class TypeClassInstance extends ElabNode { public final TypeClass typeClass; public final TPred[] context; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractCombiner.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractCombiner.java index 0fc36b6d7..53eb780fd 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractCombiner.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractCombiner.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.Arrays; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; @@ -16,7 +12,10 @@ import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure; import org.simantics.scl.compiler.elaboration.query.pre.QPreExists; import org.simantics.scl.compiler.elaboration.query.pre.QPreGuard; import org.simantics.scl.compiler.errors.Locations; -import org.simantics.scl.compiler.types.Type; + +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; public abstract class QAbstractCombiner extends Query { public Query[] queries; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractModifier.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractModifier.java index 1f05e4734..e04246e40 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractModifier.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractModifier.java @@ -1,15 +1,14 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; import org.simantics.scl.compiler.elaboration.expressions.Variable; import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure; import org.simantics.scl.compiler.errors.Locations; -import org.simantics.scl.compiler.types.Type; + +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; public abstract class QAbstractModifier extends Query { public Query query; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAtom.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAtom.java index 95760513b..fd7dacb79 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAtom.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAtom.java @@ -1,11 +1,5 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TIntObjectHashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import java.util.Set; @@ -31,16 +25,22 @@ import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class QAtom extends Query { public SCLRelation relation; public Type[] typeParameters; public Expression[] parameters; - + public QAtom(SCLRelation relation, Expression ... parameters) { this.relation = relation; this.parameters = parameters; } - + public QAtom(SCLRelation relation, Type[] typeParameters, Expression ... parameters) { this.relation = relation; this.typeParameters = typeParameters; @@ -52,7 +52,7 @@ public class QAtom extends Query { for(Expression parameter : parameters) parameter.collectFreeVariables(vars); } - + @Override public void checkType(TypingContext context) { // Type parameters @@ -60,7 +60,7 @@ public class QAtom extends Query { typeParameters = new Type[typeVariables.length]; for(int i=0;i= 0) allVariablesSet.add(v); - + context.addConstraint(new RelationConstraint(allVariablesSet.toArray(), varParameters, this, optionalVariableByParameter, procedure.requiredVariablesMask)); } catch(Exception e) { context.getQueryCompilationContext().getTypingContext().getErrorLog().log(location, e); } } - + private static void collectRefs(SCLRelation relation, TObjectIntHashMap allRefs, TIntHashSet refs) { if(relation instanceof CompositeRelation) { @@ -167,7 +167,7 @@ public class QAtom extends Query { for(Expression parameter : parameters) parameter.collectRefs(allRefs, refs); } - + @Override public void collectVars(TObjectIntHashMap allVars, TIntHashSet vars) { @@ -215,7 +215,7 @@ public class QAtom extends Query { return new Diff[] { new Diff(diffable.id, new QConjunction(eqs)) }; } } - + private static boolean containsReferenceTo( CompositeRelation relation, THashMap diffables) { @@ -235,7 +235,7 @@ public class QAtom extends Query { else return this; } - + @Override public void setLocationDeep(long loc) { if(location == Locations.NO_LOCATION) { @@ -244,7 +244,7 @@ public class QAtom extends Query { parameter.setLocationDeep(loc); } } - + @Override public void accept(QueryVisitor visitor) { visitor.visit(this); @@ -266,7 +266,7 @@ public class QAtom extends Query { } list.add(this); } - + @Override public Query accept(QueryTransformer transformer) { return transformer.transform(this); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QConjunction.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QConjunction.java index 95bb7b454..07a1f4556 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QConjunction.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QConjunction.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TIntObjectHashMap; - import java.util.ArrayList; import java.util.Collection; import java.util.Set; @@ -22,6 +19,9 @@ import org.simantics.scl.compiler.elaboration.relations.LocalRelation; import org.simantics.scl.compiler.elaboration.relations.SCLRelation; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; + public class QConjunction extends QAbstractCombiner { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QDisjunction.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QDisjunction.java index f27926414..fc1c769ff 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QDisjunction.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QDisjunction.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TLongObjectHashMap; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import java.util.Set; @@ -25,6 +21,10 @@ import org.simantics.scl.compiler.elaboration.relations.SCLRelation; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TLongObjectHashMap; +import gnu.trove.set.hash.TIntHashSet; + public class QDisjunction extends QAbstractCombiner { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QExists.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QExists.java index cdb0a5726..5356eccc2 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QExists.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QExists.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.Collection; import java.util.Set; @@ -20,6 +17,9 @@ import org.simantics.scl.compiler.elaboration.relations.SCLRelation; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.kinds.Kinds; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public class QExists extends QAbstractModifier { Variable[] variables; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java index fa0794fb4..ca9378c89 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -17,6 +13,10 @@ import org.simantics.scl.compiler.elaboration.rules.MappingRelation; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public class QMapping extends Query { public final MappingRelation mappingRelation; public final Expression[] parameters; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QNegation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QNegation.java index 20147c7df..373efa413 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QNegation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QNegation.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.TIntHashSet; - import org.simantics.scl.compiler.common.names.Name; import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.expressions.EApply; @@ -15,6 +12,9 @@ import org.simantics.scl.compiler.elaboration.query.compilation.UnsolvableQueryE import org.simantics.scl.compiler.elaboration.relations.LocalRelation; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.TIntHashSet; + public class QNegation extends QAbstractModifier { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/Query.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/Query.java index 5154495f5..0ac54e22e 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/Query.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/Query.java @@ -1,11 +1,5 @@ package org.simantics.scl.compiler.elaboration.query; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TIntObjectHashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import java.util.Set; @@ -32,6 +26,12 @@ import org.simantics.scl.compiler.elaboration.relations.LocalRelation; import org.simantics.scl.compiler.elaboration.relations.SCLRelation; import org.simantics.scl.compiler.internal.parsing.Symbol; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + public abstract class Query extends Symbol { public static final Query[] EMPTY_ARRAY = new Query[0]; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ConstraintCollectionContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ConstraintCollectionContext.java index 7b2bfc609..e77e52c8a 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ConstraintCollectionContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ConstraintCollectionContext.java @@ -1,12 +1,12 @@ package org.simantics.scl.compiler.elaboration.query.compilation; -import gnu.trove.impl.Constants; -import gnu.trove.map.hash.TObjectIntHashMap; - import java.util.ArrayList; import org.simantics.scl.compiler.elaboration.expressions.Variable; +import gnu.trove.impl.Constants; +import gnu.trove.map.hash.TObjectIntHashMap; + public class ConstraintCollectionContext { QueryCompilationContext context; ArrayList variables = new ArrayList(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/DynamicProgrammingOrdering.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/DynamicProgrammingOrdering.java index 0506f410c..d53e4d1f2 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/DynamicProgrammingOrdering.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/DynamicProgrammingOrdering.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.elaboration.query.compilation; -import gnu.trove.map.hash.TLongObjectHashMap; -import gnu.trove.procedure.TLongObjectProcedure; - import java.util.ArrayList; import java.util.Collections; +import gnu.trove.map.hash.TLongObjectHashMap; +import gnu.trove.procedure.TLongObjectProcedure; + public class DynamicProgrammingOrdering { final ConstraintCollectionContext collectionContext; int variableCount; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ExpressionConstraint.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ExpressionConstraint.java index 0c7c21e3d..c80d59f37 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ExpressionConstraint.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ExpressionConstraint.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.query.compilation; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectObjectProcedure; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; @@ -15,6 +11,10 @@ import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectObjectProcedure; +import gnu.trove.set.hash.TIntHashSet; + public class ExpressionConstraint extends QueryConstraint { Variable variable; Expression expression; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/pre/PreQuery.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/pre/PreQuery.java index 049625f6b..ee96433d3 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/pre/PreQuery.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/pre/PreQuery.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.elaboration.query.pre; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; @@ -16,7 +12,10 @@ import org.simantics.scl.compiler.elaboration.query.QExists; import org.simantics.scl.compiler.elaboration.query.Query; import org.simantics.scl.compiler.elaboration.query.QueryVisitor; import org.simantics.scl.compiler.elaboration.query.compilation.ConstraintCollectionContext; -import org.simantics.scl.compiler.types.Type; + +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; /** * Query classes that may exist before resolving diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/LocalRelation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/LocalRelation.java index 900c9627b..0a193d6c1 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/LocalRelation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/LocalRelation.java @@ -1,6 +1,10 @@ package org.simantics.scl.compiler.elaboration.relations; -import static org.simantics.scl.compiler.elaboration.expressions.Expressions.*; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.apply; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.newVar; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.tuple; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.var; +import static org.simantics.scl.compiler.elaboration.expressions.Expressions.vars; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.common.names.Name; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/SCLRelation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/SCLRelation.java index a14ddaf06..7b2f2a19e 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/SCLRelation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/SCLRelation.java @@ -4,7 +4,6 @@ import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.expressions.Variable; import org.simantics.scl.compiler.elaboration.query.compilation.EnforcingContext; import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationContext; -import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/TransitiveClosureRelation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/TransitiveClosureRelation.java index fb59470b3..26111e0b4 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/TransitiveClosureRelation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/TransitiveClosureRelation.java @@ -9,14 +9,11 @@ import static org.simantics.scl.compiler.elaboration.expressions.Expressions.tup import static org.simantics.scl.compiler.elaboration.expressions.Expressions.var; import org.simantics.scl.compiler.common.names.Name; -import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.expressions.EApply; import org.simantics.scl.compiler.elaboration.expressions.EVariable; import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.expressions.Variable; import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationContext; -import org.simantics.scl.compiler.errors.Locations; -import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/rules/TransformationRule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/rules/TransformationRule.java index d70bf785e..6bf0f781b 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/rules/TransformationRule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/rules/TransformationRule.java @@ -1,10 +1,5 @@ package org.simantics.scl.compiler.elaboration.rules; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectObjectProcedure; -import gnu.trove.procedure.TObjectProcedure; -import gnu.trove.set.hash.THashSet; - import org.simantics.scl.compiler.common.names.Name; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; import org.simantics.scl.compiler.elaboration.expressions.Variable; @@ -15,6 +10,11 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.kinds.Kinds; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectObjectProcedure; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + public class TransformationRule extends Symbol { public static final TransformationRule[] EMPTY_ARRAY = new TransformationRule[0]; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/AbstractLocalEnvironment.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/AbstractLocalEnvironment.java index 9b9647ee1..98e2467fa 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/AbstractLocalEnvironment.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/AbstractLocalEnvironment.java @@ -1,14 +1,13 @@ package org.simantics.scl.compiler.environment; -import gnu.trove.procedure.TObjectProcedure; - import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda; import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.expressions.Variable; import org.simantics.scl.compiler.types.Type; -import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.util.ProcedureType; +import gnu.trove.procedure.TObjectProcedure; + public abstract class AbstractLocalEnvironment implements LocalEnvironment { @Override diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/ConcreteEnvironment.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/ConcreteEnvironment.java index 2fb5e41d7..e3280daf6 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/ConcreteEnvironment.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/ConcreteEnvironment.java @@ -1,12 +1,12 @@ package org.simantics.scl.compiler.environment; -import gnu.trove.map.hash.THashMap; - import java.util.Collection; import org.simantics.scl.compiler.elaboration.rules.TransformationRule; import org.simantics.scl.compiler.module.Module; +import gnu.trove.map.hash.THashMap; + public class ConcreteEnvironment extends AbstractEnvironment { private final THashMap moduleMap; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/EmptyNamespace.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/EmptyNamespace.java index 9bffef06b..ed08b7b69 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/EmptyNamespace.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/EmptyNamespace.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.environment; -import gnu.trove.procedure.TObjectProcedure; - import java.util.function.Consumer; import org.simantics.scl.compiler.elaboration.modules.SCLValue; @@ -16,6 +14,8 @@ import org.simantics.scl.compiler.environment.filter.NamespaceFilter; import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor; import org.simantics.scl.compiler.types.TCon; +import gnu.trove.procedure.TObjectProcedure; + public enum EmptyNamespace implements Namespace { INSTANCE; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Environments.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Environments.java index 11bc2577d..5a55a6ca1 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Environments.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Environments.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.environment; -import gnu.trove.procedure.TObjectProcedure; - import java.io.StringReader; import java.util.ArrayList; import java.util.List; @@ -27,6 +25,8 @@ import org.simantics.scl.compiler.top.SCLExpressionCompilationException; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.Type; +import gnu.trove.procedure.TObjectProcedure; + public class Environments { /** * Get the SCLValue object representing an SCL value defined in a given environment. diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/LocalEnvironment.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/LocalEnvironment.java index 4ea77a0e2..b40bd9cdb 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/LocalEnvironment.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/LocalEnvironment.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.environment; -import gnu.trove.procedure.TObjectProcedure; - import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.util.ProcedureType; +import gnu.trove.procedure.TObjectProcedure; + /** * Provides local variable names for expressions * that do not need to defined in any module. diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Namespace.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Namespace.java index dc388a72c..921b9029d 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Namespace.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Namespace.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.environment; -import gnu.trove.procedure.TObjectProcedure; - import java.util.function.Consumer; import org.simantics.scl.compiler.elaboration.modules.SCLValue; @@ -16,6 +14,8 @@ import org.simantics.scl.compiler.environment.filter.NamespaceFilter; import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor; import org.simantics.scl.compiler.types.TCon; +import gnu.trove.procedure.TObjectProcedure; + public interface Namespace { /** * Find a sub-namespace with a given name diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceImpl.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceImpl.java index 9fd58989d..bb98f1aa5 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceImpl.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceImpl.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.environment; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectProcedure; - import java.util.ArrayList; import java.util.function.Consumer; @@ -20,6 +17,9 @@ import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor; import org.simantics.scl.compiler.module.Module; import org.simantics.scl.compiler.types.TCon; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; + public class NamespaceImpl implements Namespace { private final THashMap namespaceMap; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceSpec.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceSpec.java index 3739edb52..8d97123f2 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceSpec.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceSpec.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.environment; -import gnu.trove.map.hash.THashMap; - import java.util.Map; import org.simantics.scl.compiler.environment.NamespaceImpl.ModuleImport; +import gnu.trove.map.hash.THashMap; + public class NamespaceSpec { public final THashMap namespaceMap = new THashMap(); public final THashMap moduleMap = new THashMap(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/filter/NamespaceFilters.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/filter/NamespaceFilters.java index 57159b861..2749ae305 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/filter/NamespaceFilters.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/filter/NamespaceFilters.java @@ -1,10 +1,10 @@ package org.simantics.scl.compiler.environment.filter; -import gnu.trove.set.hash.THashSet; - import org.simantics.scl.compiler.elaboration.expressions.EVar; import org.simantics.scl.compiler.module.ImportDeclaration.ImportSpec; +import gnu.trove.set.hash.THashSet; + public class NamespaceFilters { public static NamespaceFilter createFromSpec(ImportSpec spec) { if(spec.hiding) { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/errors/CompilationErrorFormatter.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/errors/CompilationErrorFormatter.java index bd29b328b..d75417012 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/errors/CompilationErrorFormatter.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/errors/CompilationErrorFormatter.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.errors; -import gnu.trove.list.array.TIntArrayList; - import java.io.IOException; import java.io.Reader; import java.io.StringReader; +import gnu.trove.list.array.TIntArrayList; + public class CompilationErrorFormatter { public static int[] rows(Reader reader) throws IOException { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/LoopAnalysis.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/LoopAnalysis.java index 9d6a5645a..853f316ee 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/LoopAnalysis.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/LoopAnalysis.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.analysis; -import gnu.trove.set.hash.THashSet; - import org.simantics.scl.compiler.common.names.Name; import org.simantics.scl.compiler.constants.SCLConstant; import org.simantics.scl.compiler.internal.codegen.references.Val; @@ -11,6 +9,8 @@ import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder; import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply; +import gnu.trove.set.hash.THashSet; + public class LoopAnalysis { /** diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/StatementBrowser.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/StatementBrowser.java index 576089012..e580c7c79 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/StatementBrowser.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/StatementBrowser.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.analysis; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.common.names.Name; import org.simantics.scl.compiler.constants.SCLConstant; @@ -16,6 +13,9 @@ import org.simantics.scl.compiler.internal.codegen.ssa.SSAStatement; import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder; import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public abstract class StatementBrowser { THashSet visited; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/optimization/OptimizationMap.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/optimization/OptimizationMap.java index 0867b4b3f..75429d9ae 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/optimization/OptimizationMap.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/optimization/OptimizationMap.java @@ -1,9 +1,9 @@ package org.simantics.scl.compiler.internal.codegen.optimization; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.common.names.Name; +import gnu.trove.map.hash.THashMap; + public class OptimizationMap { public static final THashMap OPTIMIZATIONS = new THashMap(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/BoundVar.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/BoundVar.java index 803397ce6..1c88ba0aa 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/BoundVar.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/BoundVar.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.references; -import gnu.trove.map.hash.THashMap; - import org.cojen.classfile.TypeDesc; import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; import org.simantics.scl.compiler.internal.codegen.ssa.binders.BoundVarBinder; @@ -11,6 +9,8 @@ import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.THashMap; + public final class BoundVar extends Val { public BoundVarBinder parent; Type type; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/Val.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/Val.java index 392dfb2fe..9837fdb77 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/Val.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/Val.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.references; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.internal.codegen.types.BTypes; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; @@ -11,6 +9,8 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; +import gnu.trove.map.hash.THashMap; + public abstract class Val implements IVal { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/Throw.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/Throw.java index 3af6a0073..730463ab2 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/Throw.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/Throw.java @@ -10,21 +10,27 @@ import org.simantics.scl.compiler.internal.codegen.references.ValRef; import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock; import org.simantics.scl.compiler.internal.codegen.ssa.SSAExit; import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; +import org.simantics.scl.compiler.internal.codegen.utils.Constants; import org.simantics.scl.compiler.internal.codegen.utils.CopyContext; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext; import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.runtime.exceptions.MatchingException; public class Throw extends SSAExit { - private static final TypeDesc RuntimeException = + public static final TypeDesc RuntimeException = TypeDesc.forClass(RuntimeException.class); + public static final TypeDesc MatchingException = + TypeDesc.forClass(MatchingException.class); + TypeDesc exceptionClass; String description; - public Throw(String description) { + public Throw(TypeDesc exceptionClass, String description) { + this.exceptionClass = exceptionClass; this.description = description; } @@ -38,10 +44,14 @@ public class Throw extends SSAExit { public void generateCode(MethodBuilder mb) { //mb.push(exception.getBinding()); //cb.mapLineNumber(location); - mb.newObject(RuntimeException); + mb.newObject(exceptionClass); mb.dup(); - mb.loadConstant(description); - mb.invokeConstructor(RuntimeException, new TypeDesc[] {TypeDesc.STRING}); + if(description == null) + mb.invokeConstructor(exceptionClass, Constants.EMPTY_TYPEDESC_ARRAY); + else { + mb.loadConstant(description); + mb.invokeConstructor(exceptionClass, new TypeDesc[] {TypeDesc.STRING}); + } mb.throwObject(); } @@ -56,7 +66,7 @@ public class Throw extends SSAExit { @Override public SSAExit copy(CopyContext context) { - return new Throw(description); + return new Throw(exceptionClass, description); } @Override diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java index 8d5d24e3c..83b1e0cb6 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java @@ -28,7 +28,6 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.util.MultiFunction; -import org.simantics.scl.compiler.types.util.TypeUnparsingContext; public class LetApply extends LetStatement implements ValRefBinder { private ValRef function; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetFunctions.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetFunctions.java index 7b1db339f..25d9c2544 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetFunctions.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetFunctions.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.ssa.statements; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; @@ -21,6 +18,9 @@ import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public class LetFunctions extends SSAStatement implements FunctionBinder { long recursiveGroupLocation; SSAFunction firstFunction; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ClassBuilder.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ClassBuilder.java index c3db313ba..42df43181 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ClassBuilder.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ClassBuilder.java @@ -49,7 +49,7 @@ public class ClassBuilder { return new MethodBuilder(this, moduleBuilder, (access&Opcodes.ACC_STATIC) != 0, methodVisitor, params); } - private MethodVisitor augmentMethodVisitor(String methodName, MethodVisitor methodVisitor) { + private MethodVisitor augmentMethodVisitor(final String methodName, MethodVisitor methodVisitor) { if(SCLCompilerConfiguration.TRACE_MAX_METHOD_SIZE && moduleBuilder != null) { methodVisitor = new CodeSizeEvaluator(methodVisitor) { @Override diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/CopyContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/CopyContext.java index 2383c2051..e5fb40a8a 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/CopyContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/CopyContext.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.utils; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.internal.codegen.continuations.Cont; import org.simantics.scl.compiler.internal.codegen.continuations.ContRef; @@ -13,6 +11,8 @@ import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.THashMap; + public class CopyContext { THashMap valMap = new THashMap(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/PrintingContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/PrintingContext.java index 4a8969f14..88556fdb7 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/PrintingContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/PrintingContext.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.utils; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayDeque; import java.util.ArrayList; @@ -18,6 +15,9 @@ import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public class PrintingContext { THashMap names = new THashMap(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SCLContextPreparationStep.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SCLContextPreparationStep.java index bf2143c9c..8dd7a2875 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SCLContextPreparationStep.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SCLContextPreparationStep.java @@ -1,6 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.utils; -import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable; import org.cojen.classfile.TypeDesc; import org.simantics.scl.runtime.SCLContext; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SSAValidationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SSAValidationContext.java index d58d2dd7a..923acdba2 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SSAValidationContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SSAValidationContext.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.utils; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.procedure.TObjectIntProcedure; -import gnu.trove.set.hash.THashSet; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.constants.Constant; import org.simantics.scl.compiler.constants.SCLConstant; @@ -17,6 +13,10 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.procedure.TObjectIntProcedure; +import gnu.trove.set.hash.THashSet; + public class SSAValidationContext { public THashSet validBoundVariables = new THashSet(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/CodeWriter.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/CodeWriter.java index f11babe06..6bed9f066 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/CodeWriter.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/CodeWriter.java @@ -1,146 +1,147 @@ -package org.simantics.scl.compiler.internal.codegen.writer; - -import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; -import org.simantics.scl.compiler.internal.codegen.continuations.Branch; -import org.simantics.scl.compiler.internal.codegen.continuations.BranchRef; -import org.simantics.scl.compiler.internal.codegen.continuations.ICont; -import org.simantics.scl.compiler.internal.codegen.references.BoundVar; -import org.simantics.scl.compiler.internal.codegen.references.IVal; -import org.simantics.scl.compiler.internal.codegen.references.ValRef; -import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock; -import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; -import org.simantics.scl.compiler.internal.codegen.ssa.exits.If; -import org.simantics.scl.compiler.internal.codegen.ssa.exits.Jump; -import org.simantics.scl.compiler.internal.codegen.ssa.exits.Switch; -import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw; -import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply; -import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetFunctions; -import org.simantics.scl.compiler.top.SCLCompilerConfiguration; -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.exceptions.MatchException; -import org.simantics.scl.compiler.types.util.MultiFunction; - -public class CodeWriter { - - ModuleWriter moduleWriter; - SSABlock block; - - CodeWriter(ModuleWriter moduleWriter, SSABlock block) { - this.moduleWriter = moduleWriter; - this.block = block; - } - - public IVal apply(int lineNumber, IVal function, IVal ... parameters) { - try { - MultiFunction mfun = Types.matchFunction(function.getType(), parameters.length); - return applyWithEffect(lineNumber, - mfun.effect, - mfun.returnType, - function, parameters); - } catch (MatchException e) { - throw new InternalCompilerError(e); - } - } - - public IVal applyWithEffectChecked(int lineNumber, Type effect, Type returnType, IVal function, IVal ... parameters) { - try { - MultiFunction mfun = Types.matchFunction(function.getType(), parameters.length); - if(!Types.equals(effect, mfun.effect)) - throw new InternalCompilerError(); - if(!Types.equals(returnType, mfun.returnType)) - throw new InternalCompilerError(); - } catch (MatchException e) { - throw new InternalCompilerError(e); - } - return applyWithEffect(lineNumber, effect, returnType, function, parameters); - } - - public IVal applyWithEffect(long location, Type effect, Type returnType, IVal function, IVal ... parameters) { - BoundVar var = new BoundVar(returnType); - LetApply apply = new LetApply(var, - effect, - function.createOccurrence(), - ValRef.createOccurrences(parameters)); - apply.location = location; - block.addStatement(apply); - return var; - } - - public CodeWriter createBlock(Type ... parameterTypes) { - SSABlock newBlock = new SSABlock(parameterTypes); - block.getParent().addBlock(newBlock); - return new CodeWriter(moduleWriter, newBlock); - } - - public CodeWriter createFunction(TVar[] typeParameters, Type effect, Type returnType, Type[] parameterTypes) { - if(SCLCompilerConfiguration.DEBUG) - if(effect == null) - throw new InternalCompilerError(); - SSAFunction function = new SSAFunction(typeParameters, effect, returnType); - SSABlock block = new SSABlock(parameterTypes); - function.addBlock(block); - BoundVar target = new BoundVar(function.getType()); - function.setTarget(target); - - this.block.addStatement(new LetFunctions(function)); - return new CodeWriter(moduleWriter, block); - } - - public RecursiveDefinitionWriter createRecursiveDefinition() { - LetFunctions let = new LetFunctions(); - block.addStatement(let); - return new RecursiveDefinitionWriter(moduleWriter, let); - } - - public void continueAs(CodeWriter codeWriter) { - this.block = codeWriter.block; - codeWriter.block = null; - } - - public IVal[] getParameters() { - return block.getParameters(); - } - - public ICont getContinuation() { - return block; - } - - public void jump(ICont cont, IVal ... parameters) { - block.setExit(new Jump(cont.createOccurrence(), - ValRef.createOccurrences(parameters))); - block = null; - } - - public void if_(IVal condition, ICont thenTarget, ICont elseTarget) { - block.setExit(new If(condition.createOccurrence(), - thenTarget.createOccurrence(), - elseTarget.createOccurrence())); - block = null; - } - - public void return_(IVal val) { - jump(block.getParent().getReturnCont(), val); - } - - public void switch_(IVal val, Branch[] branches) { - block.setExit(new Switch(val.createOccurrence(), BranchRef.toBranchRefs(branches))); - block = null; - } - - public void throw_(long location, String description) { - Throw exit = new Throw(description); - exit.location = location; - block.setExit(exit); - block = null; - } - - public ModuleWriter getModuleWriter() { - return moduleWriter; - } - - public SSAFunction getFunction() { - return block.getParent(); - } -} +package org.simantics.scl.compiler.internal.codegen.writer; + +import org.cojen.classfile.TypeDesc; +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +import org.simantics.scl.compiler.internal.codegen.continuations.Branch; +import org.simantics.scl.compiler.internal.codegen.continuations.BranchRef; +import org.simantics.scl.compiler.internal.codegen.continuations.ICont; +import org.simantics.scl.compiler.internal.codegen.references.BoundVar; +import org.simantics.scl.compiler.internal.codegen.references.IVal; +import org.simantics.scl.compiler.internal.codegen.references.ValRef; +import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock; +import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; +import org.simantics.scl.compiler.internal.codegen.ssa.exits.If; +import org.simantics.scl.compiler.internal.codegen.ssa.exits.Jump; +import org.simantics.scl.compiler.internal.codegen.ssa.exits.Switch; +import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw; +import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply; +import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetFunctions; +import org.simantics.scl.compiler.top.SCLCompilerConfiguration; +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.exceptions.MatchException; +import org.simantics.scl.compiler.types.util.MultiFunction; + +public class CodeWriter { + + ModuleWriter moduleWriter; + SSABlock block; + + CodeWriter(ModuleWriter moduleWriter, SSABlock block) { + this.moduleWriter = moduleWriter; + this.block = block; + } + + public IVal apply(int lineNumber, IVal function, IVal ... parameters) { + try { + MultiFunction mfun = Types.matchFunction(function.getType(), parameters.length); + return applyWithEffect(lineNumber, + mfun.effect, + mfun.returnType, + function, parameters); + } catch (MatchException e) { + throw new InternalCompilerError(e); + } + } + + public IVal applyWithEffectChecked(int lineNumber, Type effect, Type returnType, IVal function, IVal ... parameters) { + try { + MultiFunction mfun = Types.matchFunction(function.getType(), parameters.length); + if(!Types.equals(effect, mfun.effect)) + throw new InternalCompilerError(); + if(!Types.equals(returnType, mfun.returnType)) + throw new InternalCompilerError(); + } catch (MatchException e) { + throw new InternalCompilerError(e); + } + return applyWithEffect(lineNumber, effect, returnType, function, parameters); + } + + public IVal applyWithEffect(long location, Type effect, Type returnType, IVal function, IVal ... parameters) { + BoundVar var = new BoundVar(returnType); + LetApply apply = new LetApply(var, + effect, + function.createOccurrence(), + ValRef.createOccurrences(parameters)); + apply.location = location; + block.addStatement(apply); + return var; + } + + public CodeWriter createBlock(Type ... parameterTypes) { + SSABlock newBlock = new SSABlock(parameterTypes); + block.getParent().addBlock(newBlock); + return new CodeWriter(moduleWriter, newBlock); + } + + public CodeWriter createFunction(TVar[] typeParameters, Type effect, Type returnType, Type[] parameterTypes) { + if(SCLCompilerConfiguration.DEBUG) + if(effect == null) + throw new InternalCompilerError(); + SSAFunction function = new SSAFunction(typeParameters, effect, returnType); + SSABlock block = new SSABlock(parameterTypes); + function.addBlock(block); + BoundVar target = new BoundVar(function.getType()); + function.setTarget(target); + + this.block.addStatement(new LetFunctions(function)); + return new CodeWriter(moduleWriter, block); + } + + public RecursiveDefinitionWriter createRecursiveDefinition() { + LetFunctions let = new LetFunctions(); + block.addStatement(let); + return new RecursiveDefinitionWriter(moduleWriter, let); + } + + public void continueAs(CodeWriter codeWriter) { + this.block = codeWriter.block; + codeWriter.block = null; + } + + public IVal[] getParameters() { + return block.getParameters(); + } + + public ICont getContinuation() { + return block; + } + + public void jump(ICont cont, IVal ... parameters) { + block.setExit(new Jump(cont.createOccurrence(), + ValRef.createOccurrences(parameters))); + block = null; + } + + public void if_(IVal condition, ICont thenTarget, ICont elseTarget) { + block.setExit(new If(condition.createOccurrence(), + thenTarget.createOccurrence(), + elseTarget.createOccurrence())); + block = null; + } + + public void return_(IVal val) { + jump(block.getParent().getReturnCont(), val); + } + + public void switch_(IVal val, Branch[] branches) { + block.setExit(new Switch(val.createOccurrence(), BranchRef.toBranchRefs(branches))); + block = null; + } + + public void throw_(long location, TypeDesc exceptionClass, String description) { + Throw exit = new Throw(exceptionClass, description); + exit.location = location; + block.setExit(exit); + block = null; + } + + public ModuleWriter getModuleWriter() { + return moduleWriter; + } + + public SSAFunction getFunction() { + return block.getParent(); + } +} diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java index 714f66b95..a04841765 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.codegen.writer; -import gnu.trove.map.hash.THashMap; - import java.util.Map; import org.simantics.scl.compiler.common.names.Name; @@ -15,6 +13,8 @@ import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.runtime.tuple.Tuple2; +import gnu.trove.map.hash.THashMap; + public class ModuleWriter { SSAModule module; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/deriving/InstanceDerivers.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/deriving/InstanceDerivers.java index b24894660..026769254 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/deriving/InstanceDerivers.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/deriving/InstanceDerivers.java @@ -1,10 +1,10 @@ package org.simantics.scl.compiler.internal.deriving; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.THashMap; + public class InstanceDerivers { private static final THashMap MAP = new THashMap(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java index d19dfeec1..82df90007 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.constraints; -import gnu.trove.map.hash.THashMap; - import org.cojen.classfile.TypeDesc; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.constants.ClassConstant; @@ -26,6 +24,8 @@ import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.THashMap; + public class ConstraintEnvironment { Environment environment; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSet.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSet.java index 1473ab9c4..4b516a734 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSet.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSet.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.constraints; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.elaboration.expressions.ELiteral; @@ -13,6 +10,9 @@ import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + class ConstraintSet { private static int id = 0; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSolver.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSolver.java index dfff76475..dd91efb70 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSolver.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSolver.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.constraints; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -20,6 +17,9 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException; import org.simantics.scl.compiler.types.util.TConComparator; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public class ConstraintSolver { public static THashSet DEFAULTS_IGNORE = new THashSet(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/InstanceTree.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/InstanceTree.java index 3b0447394..871fc0125 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/InstanceTree.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/InstanceTree.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.constraints; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectObjectProcedure; - import java.util.ArrayList; import org.simantics.scl.compiler.types.TApply; @@ -11,6 +8,9 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.util.MultiApply; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectObjectProcedure; + public class InstanceTree { Node root; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintSolver.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintSolver.java index 652bc00b4..4bd7532b4 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintSolver.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintSolver.java @@ -1,13 +1,13 @@ package org.simantics.scl.compiler.internal.elaboration.constraints2; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectObjectProcedure; - import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectObjectProcedure; + public class ConstraintSolver { final Environment environment; private final THashMap constraintStores = diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintStore.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintStore.java index b4f2dcfa3..34973ab45 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintStore.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintStore.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.constraints2; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectProcedure; - import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; @@ -14,6 +11,9 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; + class ConstraintStore { private final ConstraintSolver solver; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java index 1ca1e7c30..7f200a11c 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.matching; -import gnu.trove.map.hash.THashMap; - import java.util.ArrayList; import java.util.List; @@ -27,6 +25,8 @@ import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; +import gnu.trove.map.hash.THashMap; + public class PatternMatchingCompiler { private static class ExpressionMatrix { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/profiling/BranchPointInjector.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/profiling/BranchPointInjector.java index 930dfe14b..dff462221 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/profiling/BranchPointInjector.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/profiling/BranchPointInjector.java @@ -3,6 +3,7 @@ package org.simantics.scl.compiler.internal.elaboration.profiling; import java.util.ArrayList; import org.simantics.scl.compiler.elaboration.expressions.Case; +import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous; import org.simantics.scl.compiler.elaboration.expressions.EApply; import org.simantics.scl.compiler.elaboration.expressions.EApplyType; import org.simantics.scl.compiler.elaboration.expressions.EAsPattern; @@ -159,6 +160,12 @@ public class BranchPointInjector extends StandardExpressionTransformer { return expression; } + @Override + public Expression transform(EAmbiguous expression) { + ++codeCounter; + return super.transform(expression); + } + @Override public Expression transform(EApply expression) { ++codeCounter; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/subsumption/SubSolver.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/subsumption/SubSolver.java index 34b34ecce..70adf524b 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/subsumption/SubSolver.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/subsumption/SubSolver.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.subsumption; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayDeque; import java.util.ArrayList; @@ -16,6 +13,9 @@ import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.util.Polarity; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public class SubSolver { public static final boolean DEBUG = false; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/DecomposedRule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/DecomposedRule.java index bfffd2c6e..28ea97dfb 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/DecomposedRule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/DecomposedRule.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.transformations; -import gnu.trove.procedure.TObjectObjectProcedure; - import java.util.ArrayList; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -11,6 +9,8 @@ import org.simantics.scl.compiler.elaboration.relations.LocalRelation; import org.simantics.scl.compiler.elaboration.rules.SectionName; import org.simantics.scl.compiler.elaboration.rules.TransformationRule; +import gnu.trove.procedure.TObjectObjectProcedure; + public class DecomposedRule { final TransformationRule rule; final ArrayList sourceQueries = new ArrayList(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/TransformationBuilder.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/TransformationBuilder.java index 0beb90f83..dcb212488 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/TransformationBuilder.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/TransformationBuilder.java @@ -1,10 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.transformations; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TIntObjectHashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -38,11 +33,15 @@ import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.codegen.references.IVal; import org.simantics.scl.compiler.internal.elaboration.utils.ForcedClosure; import org.simantics.scl.compiler.top.SCLCompilerConfiguration; -import org.simantics.scl.compiler.top.SCLExpressionCompilationException; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; + public class TransformationBuilder { private static final TCon UMap = Types.con("Unification", "UMap"); private static final Name createUMap = Name.create("Unification", "createUMap"); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/UnifiableFactory.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/UnifiableFactory.java index 0daeb02ae..7b3face61 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/UnifiableFactory.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/UnifiableFactory.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.internal.elaboration.transformations; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; @@ -25,7 +22,7 @@ import org.simantics.scl.compiler.elaboration.expressions.block.Statement; import org.simantics.scl.compiler.elaboration.modules.SCLValue; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.codegen.references.IVal; -import org.simantics.scl.compiler.internal.types.TypeHashCodeContext; +import org.simantics.scl.compiler.internal.types.HashCodeUtils; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; @@ -33,6 +30,9 @@ import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.util.MultiApply; import org.simantics.scl.compiler.types.util.MultiFunction; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public class UnifiableFactory { private static final TCon Unifiable = Types.con("Unification", "Unifiable"); private static final Name uVar = Name.create("Unification", "uVar"); @@ -245,11 +245,11 @@ public class UnifiableFactory { @Override public int hashCode() { if(hashCode == 0) { - TypeHashCodeContext hcContext = new TypeHashCodeContext(); - hcContext.append(function.hashCode()); + int hash = HashCodeUtils.SEED; + hash = HashCodeUtils.update(hash, function.hashCode()); for(Type typeParameter : typeParameters) - typeParameter.updateHashCode(hcContext); - hashCode = hcContext.getResult(); + hash = typeParameter.hashCode(hash); + hashCode = hash; } return hashCode; } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/declarations/DRuleAst.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/declarations/DRuleAst.java index e44a18879..5d7e9172c 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/declarations/DRuleAst.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/declarations/DRuleAst.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.internal.parsing.declarations; -import gnu.trove.map.hash.THashMap; - import java.util.ArrayList; import org.simantics.scl.compiler.elaboration.query.Query; +import gnu.trove.map.hash.THashMap; + public class DRuleAst extends DeclarationAst { public final boolean isAbstract; public final String name; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/translation/RelationRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/translation/RelationRepository.java index d94d6c123..a0ac1cc4f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/translation/RelationRepository.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/translation/RelationRepository.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.parsing.translation; -import gnu.trove.map.hash.THashMap; - import java.util.ArrayList; import java.util.Collection; @@ -9,6 +7,8 @@ import org.simantics.scl.compiler.elaboration.errors.NotPatternException; import org.simantics.scl.compiler.internal.parsing.declarations.DAnnotationAst; import org.simantics.scl.compiler.internal.parsing.declarations.DRelationAst; +import gnu.trove.map.hash.THashMap; + public class RelationRepository { THashMap> relations = new THashMap>(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeElaborationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeElaborationContext.java index bd563120b..bfde46773 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeElaborationContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeElaborationContext.java @@ -1,13 +1,13 @@ package org.simantics.scl.compiler.internal.types; -import gnu.trove.map.hash.THashMap; - 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; import org.simantics.scl.compiler.types.util.ITypeEnvironment; +import gnu.trove.map.hash.THashMap; + public class TypeElaborationContext { THashMap vars; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeHashCodeContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeHashCodeContext.java index 5e7aec1a0..742325caa 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeHashCodeContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeHashCodeContext.java @@ -1,9 +1,9 @@ package org.simantics.scl.compiler.internal.types; -import gnu.trove.map.hash.TObjectIntHashMap; - import org.simantics.scl.compiler.types.TVar; +import gnu.trove.map.hash.TObjectIntHashMap; + public class TypeHashCodeContext { public static final int APPLY = 0x12345678; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/effects/EffectIdMap.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/effects/EffectIdMap.java index 149e139bd..4168fff93 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/effects/EffectIdMap.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/effects/EffectIdMap.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.internal.types.effects; -import gnu.trove.map.hash.TObjectIntHashMap; - import java.util.ArrayList; import java.util.Collection; @@ -11,6 +9,8 @@ import org.simantics.scl.compiler.types.TUnion; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.TObjectIntHashMap; + public class EffectIdMap { public static final int MIN = 0; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HierarchicalDocumentationRef.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HierarchicalDocumentationRef.java index f39901c3b..93c8c8d2f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HierarchicalDocumentationRef.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HierarchicalDocumentationRef.java @@ -1,15 +1,15 @@ package org.simantics.scl.compiler.markdown.html; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectProcedure; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.simantics.scl.compiler.source.repository.ModuleSourceRepository; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + public class HierarchicalDocumentationRef implements Comparable { final String name; final ArrayList children = new ArrayList(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/SCLDocumentationExtensionNodeHandler.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/SCLDocumentationExtensionNodeHandler.java index 6a505fabb..d971f7d0f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/SCLDocumentationExtensionNodeHandler.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/SCLDocumentationExtensionNodeHandler.java @@ -1,9 +1,5 @@ package org.simantics.scl.compiler.markdown.html; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectProcedure; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import java.util.Collections; @@ -27,6 +23,10 @@ import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + public class SCLDocumentationExtensionNodeHandler implements ExtensionNodeHandler { final ModuleRepository moduleRepository; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Entities.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Entities.java index f2d8917b8..9be7ca24b 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Entities.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Entities.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.markdown.inlines; -import gnu.trove.map.hash.THashMap; - import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.Charset; +import gnu.trove.map.hash.THashMap; + public class Entities { public static final THashMap ENTITY_MAP = new THashMap(); public static int MAX_ENTITY_LENGTH; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Subject.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Subject.java index 163d70708..a6a3abdae 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Subject.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Subject.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.markdown.inlines; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.markdown.internal.Scanner; import org.simantics.scl.compiler.markdown.nodes.AutolinkNode; import org.simantics.scl.compiler.markdown.nodes.CodeNode; @@ -14,6 +12,8 @@ import org.simantics.scl.compiler.markdown.nodes.Node; import org.simantics.scl.compiler.markdown.nodes.Reference; import org.simantics.scl.compiler.markdown.nodes.TextNode; +import gnu.trove.map.hash.THashMap; + public class Subject { THashMap referenceMap; StringBuilder input; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/HtmlEscape.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/HtmlEscape.java index a31c70655..bd2ba47b8 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/HtmlEscape.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/HtmlEscape.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.markdown.internal; -import gnu.trove.map.hash.TCharObjectHashMap; - import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; +import gnu.trove.map.hash.TCharObjectHashMap; + public class HtmlEscape { private static final Charset UTF8 = Charset.forName("UTF-8"); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/MarkdownParser.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/MarkdownParser.java index 7d30856c8..eb4626f66 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/MarkdownParser.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/MarkdownParser.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.markdown.internal; -import gnu.trove.map.hash.THashMap; - import java.io.IOException; import java.io.Reader; import java.io.StringReader; @@ -20,6 +18,8 @@ import org.simantics.scl.compiler.markdown.nodes.Node; import org.simantics.scl.compiler.markdown.nodes.ParagraphNode; import org.simantics.scl.compiler.markdown.nodes.Reference; +import gnu.trove.map.hash.THashMap; + public class MarkdownParser { public static final boolean DEBUG = false; public static final int CODE_INDENT = 4; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/Scanner.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/Scanner.java index 437d80c11..0254e8e59 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/Scanner.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/Scanner.java @@ -1,9 +1,9 @@ package org.simantics.scl.compiler.markdown.internal; -import gnu.trove.set.hash.THashSet; - import org.simantics.scl.compiler.markdown.inlines.Subject; +import gnu.trove.set.hash.THashSet; + public class Scanner { public int level; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/LazyModule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/LazyModule.java index 54914dd42..a5399e88f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/LazyModule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/LazyModule.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.module; -import gnu.trove.map.hash.THashMap; - import java.util.Collection; import java.util.Collections; @@ -20,6 +18,8 @@ import org.simantics.scl.compiler.top.ModuleInitializer; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.runtime.profiling.BranchPoint; +import gnu.trove.map.hash.THashMap; + public abstract class LazyModule implements Module { String moduleName; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepositories.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepositories.java index 3a39c4e0e..13157f9fb 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepositories.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepositories.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.module.repository; -import gnu.trove.procedure.TObjectProcedure; - import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; @@ -11,6 +9,8 @@ import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter; import org.simantics.scl.compiler.errors.Failable; import org.simantics.scl.compiler.module.Module; +import gnu.trove.procedure.TObjectProcedure; + public class ModuleRepositories { public static List allValuesMatching(final ModuleRepository repository, String pattern) { final Pattern compiledPattern = pattern == null ? null diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/ExpressionClassLoader.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/ExpressionClassLoader.java index bb2e5efc0..c91daab91 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/ExpressionClassLoader.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/ExpressionClassLoader.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.runtime; -import gnu.trove.map.hash.THashMap; - import java.util.Map; import org.simantics.scl.compiler.constants.Constant; +import gnu.trove.map.hash.THashMap; + public class ExpressionClassLoader extends ClassLoader implements MutableClassLoader { public static final boolean VALIDATE_CLASS_NAMES = true; public static final boolean TRACE_CLASS_CREATION = false; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/MutableClassLoader.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/MutableClassLoader.java index 8fd9a7a0b..adf36f8af 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/MutableClassLoader.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/MutableClassLoader.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.runtime; -import gnu.trove.map.hash.THashMap; - import java.util.Map; import org.simantics.scl.compiler.constants.Constant; +import gnu.trove.map.hash.THashMap; + public interface MutableClassLoader { public static final String SCL_PACKAGE_PREFIX = "scl."; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeEnvironmentImpl.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeEnvironmentImpl.java index cbac0c85a..8d7080394 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeEnvironmentImpl.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeEnvironmentImpl.java @@ -1,9 +1,9 @@ package org.simantics.scl.compiler.runtime; -import gnu.trove.map.hash.THashMap; - import org.simantics.scl.compiler.environment.Environment; +import gnu.trove.map.hash.THashMap; + public class RuntimeEnvironmentImpl implements RuntimeEnvironment { private final Environment environment; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModuleMap.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModuleMap.java index d1d897174..80db43ef0 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModuleMap.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModuleMap.java @@ -1,9 +1,9 @@ package org.simantics.scl.compiler.runtime; -import gnu.trove.map.hash.THashMap; - import java.util.Collection; +import gnu.trove.map.hash.THashMap; + public class RuntimeModuleMap { THashMap moduleMap = new THashMap(); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/ClassModuleSource.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/ClassModuleSource.java index efdc63000..1316ee5d7 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/ClassModuleSource.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/ClassModuleSource.java @@ -2,7 +2,6 @@ package org.simantics.scl.compiler.source; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.Charset; import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidator; import org.simantics.scl.compiler.internal.codegen.types.RuntimeJavaReferenceValidator; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ClassModuleSourceRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ClassModuleSourceRepository.java index 310472cdc..873859a2d 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ClassModuleSourceRepository.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ClassModuleSourceRepository.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.source.repository; -import gnu.trove.procedure.TObjectProcedure; -import gnu.trove.set.hash.THashSet; - import java.io.IOException; import java.net.URL; @@ -11,6 +8,9 @@ import org.simantics.scl.compiler.module.repository.UpdateListener; import org.simantics.scl.compiler.source.ClassModuleSource; import org.simantics.scl.compiler.source.ModuleSource; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + public class ClassModuleSourceRepository extends AbstractModuleSourceRepository { private final Class clazz; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java index ce3f775ce..82bb0bcf9 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java @@ -1,10 +1,10 @@ package org.simantics.scl.compiler.source.repository; -import gnu.trove.procedure.TObjectProcedure; - import org.simantics.scl.compiler.module.repository.UpdateListener; import org.simantics.scl.compiler.source.ModuleSource; +import gnu.trove.procedure.TObjectProcedure; + public class CompositeModuleSourceRepository implements ModuleSourceRepository { public final ModuleSourceRepository[] children; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/FileModuleSourceRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/FileModuleSourceRepository.java index 5a4e93ce5..805dd77f4 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/FileModuleSourceRepository.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/FileModuleSourceRepository.java @@ -1,8 +1,5 @@ package org.simantics.scl.compiler.source.repository; -import gnu.trove.procedure.TObjectProcedure; -import gnu.trove.set.hash.THashSet; - import java.io.File; import java.io.IOException; @@ -12,6 +9,9 @@ import org.simantics.scl.compiler.source.ClassModuleSource; import org.simantics.scl.compiler.source.FileModuleSource; import org.simantics.scl.compiler.source.ModuleSource; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + public class FileModuleSourceRepository extends AbstractModuleSourceRepository { private final File path; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/MapModuleSourceRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/MapModuleSourceRepository.java index 6cbf03aef..9872451c3 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/MapModuleSourceRepository.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/MapModuleSourceRepository.java @@ -1,13 +1,13 @@ package org.simantics.scl.compiler.source.repository; -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectProcedure; - import org.simantics.scl.compiler.module.Module; import org.simantics.scl.compiler.module.repository.UpdateListener; import org.simantics.scl.compiler.source.ModuleSource; import org.simantics.scl.compiler.source.PrecompiledModuleSource; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; + /** * An implementation of {@link ModuleSourceRepository} as a finite map. * This implementation does not support listening module changes, diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ModuleSourceRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ModuleSourceRepository.java index 71e08dcd6..76698f5be 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ModuleSourceRepository.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ModuleSourceRepository.java @@ -1,11 +1,11 @@ package org.simantics.scl.compiler.source.repository; -import gnu.trove.procedure.TObjectProcedure; - import org.simantics.scl.compiler.module.repository.ModuleRepository; import org.simantics.scl.compiler.module.repository.UpdateListener; import org.simantics.scl.compiler.source.ModuleSource; +import gnu.trove.procedure.TObjectProcedure; + /** * An interface for locating modules descriptors and listening if they change. * An instance of this interface is used to create a {@link ModuleRepository}. diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java index 6cb68b673..5c8f59bb2 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java @@ -1,7 +1,5 @@ package org.simantics.scl.compiler.top; -import gnu.trove.set.hash.THashSet; - import java.io.StringReader; import java.lang.reflect.Method; import java.util.ArrayList; @@ -59,6 +57,8 @@ import org.simantics.scl.compiler.types.util.ProcedureType; import org.simantics.scl.runtime.function.FunctionImpl1; import org.simantics.scl.runtime.tuple.Tuple0; +import gnu.trove.set.hash.THashSet; + public class ExpressionEvaluator { public static final boolean TRACE_INTERPRETATION_VS_COMPILATION = false; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionInterpretationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionInterpretationContext.java index e80883969..8b788c2ff 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionInterpretationContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionInterpretationContext.java @@ -1,13 +1,13 @@ package org.simantics.scl.compiler.top; -import gnu.trove.impl.Constants; -import gnu.trove.map.hash.TObjectIntHashMap; - import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.elaboration.expressions.Variable; import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder; import org.simantics.scl.compiler.runtime.RuntimeEnvironment; +import gnu.trove.impl.Constants; +import gnu.trove.map.hash.TObjectIntHashMap; + public class ExpressionInterpretationContext { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/SCLCompilerConfiguration.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/SCLCompilerConfiguration.java index 799a1495a..d7b896a98 100755 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/SCLCompilerConfiguration.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/SCLCompilerConfiguration.java @@ -33,4 +33,6 @@ public interface SCLCompilerConfiguration { public static final boolean EVERY_RULE_ENFORCEMENT_IN_SEPARATE_METHOD = true; public static final boolean EVERY_DATALOG_STRATUM_IN_SEPARATE_METHOD = true; + public static final boolean ALLOW_OVERLOADING = false; + } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Skeletons.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Skeletons.java new file mode 100644 index 000000000..81dec2403 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Skeletons.java @@ -0,0 +1,292 @@ +package org.simantics.scl.compiler.types; + +import org.simantics.scl.compiler.environment.Environment; +import org.simantics.scl.compiler.internal.types.HashCodeUtils; +import org.simantics.scl.compiler.types.exceptions.KindUnificationException; +import org.simantics.scl.compiler.types.exceptions.UnificationException; +import org.simantics.scl.compiler.types.kinds.Kinds; + +import gnu.trove.map.hash.THashMap; + +public class Skeletons { + + public static Type canonicalSkeleton(Type type) { + while(type instanceof TMetaVar) { + TMetaVar metaVar = (TMetaVar)type; + if(metaVar.ref != null) + type = metaVar.ref; + else if(metaVar.skeletonRef != null) + type = metaVar.skeletonRef; + else + return metaVar; + } + return type; + } + + public static Type canonicalSkeleton(THashMap unifications, Type type) { + while(type instanceof TMetaVar) { + TMetaVar metaVar = (TMetaVar)type; + if(metaVar.ref != null) + type = metaVar.ref; + else if(metaVar.skeletonRef != null) + type = metaVar.skeletonRef; + else { + Type temp = unifications.get(metaVar); + if(temp == null) + return metaVar; + else + type = temp; + } + } + return type; + } + + public static boolean doesSkeletonContain(THashMap unifications, Type type, TMetaVar metaVar) { + type = canonicalSkeleton(unifications, type); + if(type == metaVar) + return true; + if(type instanceof TFun) { + TFun fun = (TFun)type; + return doesSkeletonContain(unifications, fun.domain, metaVar) + || doesSkeletonContain(unifications, fun.range, metaVar); + } + if(type instanceof TApply) { + TApply apply = (TApply)type; + return doesSkeletonContain(unifications, apply.function, metaVar) + || doesSkeletonContain(unifications, apply.parameter, metaVar); + } + if(type instanceof TForAll) { + TForAll forAll = (TForAll)type; + return doesSkeletonContain(unifications, forAll.type, metaVar); + } + if(type instanceof TPred) { + TPred pred = (TPred)type; + for(Type param : pred.parameters) + if(doesSkeletonContain(unifications, param, metaVar)) + return true; + return false; + } + else + return false; + } + + /** + * Returns true, if unification of the skeletons of the types would succeed. + */ + public static boolean areSkeletonsCompatible(THashMap unifications, Type a, Type b) { + a = canonicalSkeleton(unifications, a); + b = canonicalSkeleton(unifications, b); + if(a == b) + return true; + Class ca = a.getClass(); + Class cb = b.getClass(); + + if(ca == TMetaVar.class) { + TMetaVar ma = (TMetaVar)a; + if(doesSkeletonContain(unifications, b, ma)) + return false; + unifications.put(ma, b); + return true; + } + if(cb == TMetaVar.class) { + TMetaVar mb = (TMetaVar)b; + if(doesSkeletonContain(unifications, a, mb)) + return false; + unifications.put(mb, a); + return true; + } + if(ca != cb) + return false; + if(ca == TFun.class) { + TFun funA = (TFun)a; + TFun funB = (TFun)b; + return areSkeletonsCompatible(unifications, funA.domain, funB.domain) + && areSkeletonsCompatible(unifications, funA.range, funB.range); + } + if(ca == TApply.class) { + TApply applyA = (TApply)a; + TApply applyB = (TApply)b; + return areSkeletonsCompatible(unifications, applyA.function, applyB.function) + && areSkeletonsCompatible(unifications, applyA.parameter, applyB.parameter); + } + if(ca == TPred.class) { + TPred predA = (TPred)a; + TPred predB = (TPred)b; + if(predA.typeClass != predB.typeClass) + return false; + for(int i=0;i ca = a.getClass(); + Class cb = b.getClass(); + if(ca != cb) { + throw new UnificationException(a, b); + } + if(ca == TApply.class) + //unifySkeletons((TApply)a, (TApply)b); + Types.unify(a, b); + else if(ca == TFun.class) + unifySkeletons((TFun)a, (TFun)b); + else if(ca == TForAll.class) + unifySkeletons((TForAll)a, (TForAll)b); + else if(ca == TPred.class) + //unifySkeletons((TPred)a, (TPred)b); + Types.unify(a, b); + else if(ca == TUnion.class) + unifySkeletons((TUnion)a, (TUnion)b); + else // ca == TCon.class || ca = TVar.class + throw new UnificationException(a, b); + } + + public static void unifySkeletons(TFun a, TFun b) throws UnificationException { + unifySkeletons(a.domain, b.domain); + unifySkeletons(a.range, b.range); + } + + public static void unifySkeletons(TApply a, TApply b) throws UnificationException { + unifySkeletons(a.function, b.function); + unifySkeletons(a.parameter, b.parameter); + } + + public static void unifySkeletons(TForAll a, TForAll b) throws UnificationException { + try { + Kinds.unify(a.var.getKind(), b.var.getKind()); + } catch (KindUnificationException e) { + throw new UnificationException(a, b); + } + TVar newVar = Types.var(a.var.getKind()); + unifySkeletons(a.type.replace(a.var, newVar), b.type.replace(b.var, newVar)); + } + + public static void unifySkeletons(TPred a, TPred b) throws UnificationException { + if(a.typeClass != b.typeClass + || a.parameters.length != b.parameters.length) + throw new UnificationException(a, b); + for(int i=0;i metaVarMap = new THashMap() { + @Override + protected boolean equals(Object a, Object b) { + return Types.equals((Type[])a, (Type[])b); + } + @Override + protected int hash(Object a) { + Type[] types = (Type[])a; + int hash = HashCodeUtils.SEED; + for(Type type : types) + hash = type.hashCode(hash); + return hash; + } + }; + return commonSkeleton(context, metaVarMap, types); + } + + private static TMetaVar metaVarFor(Environment context, THashMap metaVarMap, Type[] types) { + TMetaVar result = metaVarMap.get(types); + if(result == null) { + try { + result = Types.metaVar(types[0].inferKind(context)); + } catch (KindUnificationException e) { + result = Types.metaVar(Kinds.STAR); + } + metaVarMap.put(types, result); + } + return result; + } + + /** + * Finds the most specific type that can be unified with the all the types + * given as a parameter. + */ + private static Type commonSkeleton(Environment context, THashMap metaVarMap, Type[] types) { + for(int i=0;i clazz = first.getClass(); + for(int i=1;i metaVarMap) { return this; } + + @Override + public int hashCode(int hash) { + return HashCodeUtils.update(hash, System.identityHashCode(this)); + } + + @Override + public int hashCode(int hash, TVar[] boundVars) { + return HashCodeUtils.update(hash, System.identityHashCode(this)); + } + + @Override + public boolean equalsCanonical(Type other) { + return this == other; + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TForAll.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TForAll.java index a22a4b244..98b4578af 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TForAll.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TForAll.java @@ -1,12 +1,10 @@ package org.simantics.scl.compiler.types; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; +import java.util.Arrays; import org.simantics.scl.compiler.environment.Environment; +import org.simantics.scl.compiler.internal.types.HashCodeUtils; import org.simantics.scl.compiler.internal.types.TypeHashCodeContext; import org.simantics.scl.compiler.internal.types.ast.TForAllAst; import org.simantics.scl.compiler.internal.types.ast.TypeAst; @@ -16,10 +14,14 @@ import org.simantics.scl.compiler.types.kinds.Kinds; import org.simantics.scl.compiler.types.util.Polarity; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; + public class TForAll extends Type { public final TVar var; - public final Type type; + public Type type; TForAll(TVar var, Type type) { if(NULL_CHECKS) { @@ -150,4 +152,76 @@ public class TForAll extends Type { // Should never get here return new TMetaVar(Kinds.STAR); } + + @Override + public int hashCode(int hash) { + int count=1; + { + Type t = Types.canonical(type); + while(t instanceof TForAll) { + t = Types.canonical( ((TForAll)t).type ); + ++count; + } + } + TVar[] boundVars = new TVar[count]; + boundVars[0] = var; + TForAll t = this; + { + for(int i=1;i " + type); + if(ref != null) + throw new InternalCompilerError("Method setRef should be called only for unbound meta variables."); + if(type.contains(this)) + throw new UnificationException(this, type); + ref = type; if(polarity != Polarity.NO_POLARITY) - a.addPolarity(polarity); + type.addPolarity(polarity); + if(skeletonRef != null) { + Type skeleton = skeletonRef; + skeletonRef = null; + Skeletons.unifySkeletons(skeleton, type); + } + fireNotifyAboutChange(); } public Type getRef() { @@ -130,10 +165,12 @@ public class TMetaVar extends Type { @Override public boolean contains(TMetaVar other) { - if(ref == null) - return this == other; - else + if(ref != null) return ref.contains(other); + else if(skeletonRef != null) + return skeletonRef.contains(other); + else + return this == other; } @Override @@ -231,4 +268,79 @@ public class TMetaVar extends Type { return result; } } + + public void setSkeletonRef(Type type) throws UnificationException { + if(DEBUG) + System.out.println("setSkeletonRef " + System.identityHashCode(this) + " -> " + type); + if(ref != null || skeletonRef != null) + throw new InternalCompilerError("Method setRef should be called only for unbound meta variables."); + if(type.contains(this)) + throw new UnificationException(this, type); + this.skeletonRef = type; + fireNotifyAboutChange(); + } + + @Override + public int hashCode(int hash) { + if(ref == null) + return HashCodeUtils.update(hash, System.identityHashCode(this)); + else + return ref.hashCode(hash); + } + + @Override + public int hashCode(int hash, TVar[] boundVars) { + if(ref == null) + return HashCodeUtils.update(hash, System.identityHashCode(this)); + else + return ref.hashCode(hash, boundVars); + } + + @Override + public boolean equalsCanonical(Type other) { + return this == other; + } + + @Override + public Type canonical() { + if(ref == null) + return this; + else + return ref = ref.canonical(); + } + + public void addListener(TMetaVarListener newListener) { + if(DEBUG) + System.out.println("addListener " + System.identityHashCode(this)); + newListener.next = listener; + newListener.prev = this; + if(listener != null) + listener.prev = newListener; + listener = newListener; + } + + private void fireNotifyAboutChange() { + if(DEBUG) + System.out.println("fireNotifyAboutChange " + System.identityHashCode(this) + " " + ref); + TMetaVarListener cur = listener; + listener = null; + while(cur != null) { + if(DEBUG) + System.out.println(" call listener"); + cur.prev = null; // This prevents TMetaVarListener.remove from doing anything + cur.notifyAboutChange(); + TMetaVarListener next = cur.next; + cur.next = null; + cur = next; + } + } + + public TMetaVarListener getLatestListener() { + return listener; + } + + @Override + public Kind getKind(Environment context) { + return kind; + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TPred.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TPred.java index d9fd79f91..e8a0469c5 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TPred.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TPred.java @@ -1,11 +1,9 @@ package org.simantics.scl.compiler.types; -import gnu.trove.map.hash.THashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.environment.Environment; +import org.simantics.scl.compiler.internal.types.HashCodeUtils; import org.simantics.scl.compiler.internal.types.TypeHashCodeContext; import org.simantics.scl.compiler.internal.types.ast.TApplyAst; import org.simantics.scl.compiler.internal.types.ast.TypeAst; @@ -15,6 +13,9 @@ import org.simantics.scl.compiler.types.kinds.Kinds; import org.simantics.scl.compiler.types.util.Polarity; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + public class TPred extends Type { @@ -172,4 +173,42 @@ public class TPred extends Type { newParameters[i] = parameters[i].copySkeleton(metaVarMap); return new TPred(typeClass, parameters); } + + @Override + public int hashCode(int hash) { + hash = HashCodeUtils.updateWithPreprocessedValue(hash, PRED_HASH); + hash = typeClass.hashCode(hash); + for(Type parameter : parameters) + hash = parameter.hashCode(hash); + return hash; + } + + @Override + public int hashCode(int hash, TVar[] boundVars) { + hash = HashCodeUtils.updateWithPreprocessedValue(hash, PRED_HASH); + hash = typeClass.hashCode(hash, boundVars); + for(Type parameter : parameters) + hash = parameter.hashCode(hash, boundVars); + return hash; + } + + @Override + public boolean equalsCanonical(Type other) { + if(this == other) + return true; + if(!other.getClass().equals(TPred.class)) + return false; + TPred pred = (TPred)other; + if(typeClass != pred.typeClass || parameters.length != pred.parameters.length) + return false; + for(int i=0;i metaVarMap) { return Types.NO_EFFECTS; } + + @Override + public int hashCode(int hash) { + int sum = UNION_HASH; + for(Type effect : effects) + sum += effect.hashCode(HashCodeUtils.SEED); + return HashCodeUtils.updateWithPreprocessedValue(hash, sum); + } + + @Override + public int hashCode(int hash, TVar[] boundVars) { + int sum = UNION_HASH; + for(Type effect : effects) + sum += effect.hashCode(HashCodeUtils.SEED, boundVars); + return HashCodeUtils.updateWithPreprocessedValue(hash, sum); + } + + @Override + public boolean equalsCanonical(Type other) { + if(this == other) + return true; + if(!other.getClass().equals(TUnion.class)) + return false; + TUnion union = (TUnion)other; + int length = effects.length; + if(length != union.effects.length) + return false; + if(length == 0) + return true; + for(int i=0;i i) { + effect = union.effects[i]; + union.effects[i] = union.effects[j]; + union.effects[j] = effect; + } + continue loop; + } + return false; + } + return true; + } + + @Override + public Kind getKind(Environment context) { + return Kinds.EFFECT; + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TVar.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TVar.java index 1fca6c59a..aeb971145 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TVar.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TVar.java @@ -1,12 +1,9 @@ package org.simantics.scl.compiler.types; -import gnu.trove.map.hash.THashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import org.simantics.scl.compiler.environment.Environment; +import org.simantics.scl.compiler.internal.types.HashCodeUtils; import org.simantics.scl.compiler.internal.types.TypeHashCodeContext; import org.simantics.scl.compiler.internal.types.ast.TVarAst; import org.simantics.scl.compiler.internal.types.ast.TypeAst; @@ -17,8 +14,12 @@ import org.simantics.scl.compiler.types.kinds.Kinds; import org.simantics.scl.compiler.types.util.Polarity; import org.simantics.scl.compiler.types.util.TypeUnparsingContext; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; + -public class TVar extends Type { +public final class TVar extends Type { public static final TVar[] EMPTY_ARRAY = new TVar[0]; private Kind kind; @@ -139,4 +140,29 @@ public class TVar extends Type { public Type copySkeleton(THashMap metaVarMap) { return this; } + + @Override + public int hashCode(int hash) { + return HashCodeUtils.update(hash, System.identityHashCode(this)); + } + + @Override + public int hashCode(int hash, TVar[] boundVars) { + for(int i=0;i vars); @@ -160,5 +166,13 @@ public abstract class Type { * Creates an independent copy of the type, but replaces all effects by metavars */ public abstract Type copySkeleton(THashMap metaVarMap); + + public abstract boolean equalsCanonical(Type other); + + public Type canonical() { + return this; + } + + public abstract Kind getKind(Environment context); } \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Types.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Types.java index a706e2b8f..f0c9dbddf 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Types.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Types.java @@ -147,29 +147,9 @@ public class Types { function = apply(function, parameter); return function; } - - /** - * Get the concrete type or alias type pointed to by a chain of type meta-variables, - * or the last metavariable in the link, if it is not linked to an actual type. - * Unlike {@link #canonical(Type)}, this method does not resolve type aliases. - */ - public static Type weakCanonical(Type type) { - while(true) { - if(type instanceof TMetaVar) { - TMetaVar metaVar = (TMetaVar)type; - if(metaVar.ref == null) - return type; - else - type = metaVar.ref; - } - else - return type; - } - } /** - * Get the concrete type pointed to by a chain of type meta-variables. Unlike {@link #weakCanonical(Type)} - * this method also resolves type aliases. + * Get the concrete type pointed to by a chain of type meta-variables. */ public static Type canonical(Type type) { while(type instanceof TMetaVar) { @@ -795,8 +775,8 @@ public class Types { } public static void unify(Type a, Type b) throws UnificationException { - a = weakCanonical(a); - b = weakCanonical(b); + a = canonical(a); + b = canonical(b); if(a == b) return; if(a instanceof TMetaVar) { @@ -1137,4 +1117,30 @@ public class Types { e.getMessage())); } } + + public static Type instantiateAndStrip(Type type) { + while(true) { + if(type instanceof TForAll) { + TForAll forAll = (TForAll)type; + type = forAll.type.replace(forAll.var, metaVar(forAll.var.getKind())); + } + else if(type instanceof TFun) { + TFun fun = (TFun)type; + if(fun.domain instanceof TPred || fun.domain == Types.PUNIT) + type = fun.range; + else + return type; + } + else if(type instanceof TMetaVar) { + TMetaVar metaVar = (TMetaVar)type; + if(metaVar.ref == null) + return type; + else + type = metaVar.ref; + } + else + return type; + } + } + } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java index edf63df74..4707110f8 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java @@ -1,5 +1,6 @@ package org.simantics.scl.compiler.types.kinds; +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.types.exceptions.KindUnificationException; public class Kinds { @@ -77,5 +78,24 @@ public class Kinds { public static boolean equals(Kind a, Kind b) { return equalsCanonical(canonical(a), canonical(b)); + } + + public static Kind rangeOfArrow(Kind kind) { + kind = canonical(kind); + if(kind instanceof KArrow) + return ((KArrow)kind).range; + else if(kind instanceof KMetaVar) { + Kind domain = Kinds.metaVar(); + Kind range = Kinds.metaVar(); + try { + ((KMetaVar)kind).setRef(arrow(domain, range)); + } catch (KindUnificationException e) { + // Should not fail because kind is canonical + e.printStackTrace(); + } + return range; + } + else + throw new InternalCompilerError("Assumed arrow kind but encountered " + kind + "."); } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeListener.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeListener.java new file mode 100644 index 000000000..04c9e169e --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeListener.java @@ -0,0 +1,63 @@ +package org.simantics.scl.compiler.types.util; + +import java.util.ArrayList; + +import org.simantics.scl.compiler.types.Skeletons; +import org.simantics.scl.compiler.types.TApply; +import org.simantics.scl.compiler.types.TForAll; +import org.simantics.scl.compiler.types.TFun; +import org.simantics.scl.compiler.types.TMetaVar; +import org.simantics.scl.compiler.types.TMetaVar.TMetaVarListener; +import org.simantics.scl.compiler.types.TPred; +import org.simantics.scl.compiler.types.Type; + +public abstract class TypeListener { + private ArrayList metaVarListeners = new ArrayList(2); + public abstract void notifyAboutChange(); + + private static class SubListener extends TMetaVarListener { + private final TypeListener parent; + public SubListener(TypeListener parent) { + this.parent = parent; + } @Override + public void notifyAboutChange() { + for(TMetaVarListener otherListeners : parent.metaVarListeners) + otherListeners.remove(); + parent.notifyAboutChange(); + } + }; + + public void listenSkeleton(Type type) { + type = Skeletons.canonicalSkeleton(type); + if(type instanceof TMetaVar) { + TMetaVar metaVar = (TMetaVar)type; + TMetaVarListener latestListener = metaVar.getLatestListener(); + if(latestListener instanceof SubListener && + ((SubListener)latestListener).parent == this) + return; + + SubListener subListener = new SubListener(this); + metaVarListeners.add(subListener); + metaVar.addListener(subListener); + } + else if(type instanceof TApply) { + TApply apply = (TApply)type; + listenSkeleton(apply.function); + listenSkeleton(apply.parameter); + } + else if(type instanceof TFun) { + TFun fun = (TFun)type; + listenSkeleton(fun.domain); + listenSkeleton(fun.range); + } + else if(type instanceof TForAll) { + TForAll forAll = (TForAll)type; + listenSkeleton(forAll.type); + } + else if(type instanceof TPred) { + TPred pred = (TPred)type; + for(Type parameter : pred.parameters) + listenSkeleton(parameter); + } + } +} diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeTree.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeTree.java new file mode 100644 index 000000000..b41dba8cf --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeTree.java @@ -0,0 +1,70 @@ +package org.simantics.scl.compiler.types.util; + +import org.simantics.scl.compiler.types.Skeletons; +import org.simantics.scl.compiler.types.TMetaVar; +import org.simantics.scl.compiler.types.Type; + +public class TypeTree { + + public static class Case { + public Type[] types; + public T result; + } + + private static class Node { + Case[] cases; + Branch[] branches; + + public Node(Case[] cases) { + this.cases = cases; + this.branches = new Branch[cases[0].types.length]; + } + + Branch getBranch(int i) { + // TODO + return null; + } + } + + private static class Branch { + + public void improve(Iterator iterator) { + // TODO Auto-generated method stub + + } + + } + + public static class Iterator { + Node node; + Type[] scrutinee; + + public Iterator(Node node, Type[] scrutinee) { + this.node = node; + this.scrutinee = scrutinee; + } + + public void improve() { + for(int i=0;i branch = node.getBranch(i); + if(branch != null) { + branch.improve(this); + --i; + } + } + } + } + } + + Node root; + + public TypeTree(Case[] cases) { + this.root = new Node(cases); + } + + public Iterator iterator(Type ... scrutinee) { + return new Iterator(root, scrutinee); + } +} diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/ActiveTests.java b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/ActiveTests.java index b80577e53..0b7b52e29 100644 --- a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/ActiveTests.java +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/ActiveTests.java @@ -8,15 +8,12 @@ public class ActiveTests extends TestBase { public ActiveTests() { super("scl"); } @Test public void Equations1() { test(); } - @Test public void Equality() { test(); } - @Test public void ModuleInitialization() { test(); } - - @Test public void ImportJavaConstructor() { test(); } - @Test public void MarketModel() { test(); } @Test public void MarketModel2() { test(); } - @Ignore + @Test public void Overloading2() { test(); } + @Test public void Overloading3() { test(); } + //@Ignore @Test public void PatternError() { test(); } - @Test public void TypeAliasRefsToTypeAlias() { test(); } + @Test public void Serialization() { test(); } @Ignore @Test public void TypeClass2() { test(); } @Test public void TypeClassBug2() { test(); } diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FindAllowedChars.java b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FindAllowedChars.java new file mode 100644 index 000000000..1e4078670 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FindAllowedChars.java @@ -0,0 +1,66 @@ +package org.simantics.scl.compiler.tests; + +import java.lang.reflect.Method; + +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +public class FindAllowedChars { + public static class MyClassLoader extends ClassLoader { + final String className; + final byte[] classBytes; + + public MyClassLoader(ClassLoader parent, String className, byte[] classBytes) { + super(parent); + this.className = className; + this.classBytes = classBytes; + } + + public MyClassLoader(String className, byte[] classBytes) { + this.className = className; + this.classBytes = classBytes; + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + if(name.equals(name)) + return defineClass(name, classBytes, 0, classBytes.length); + else + return super.findClass(name); + } + } + + public static void test(String className, String methodName) throws Exception { + ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); + classWriter.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null); + + MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, methodName, "()V", null, null); + /*methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); + methodVisitor.visitLdcInsn("Hello world!"); + methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);*/ + methodVisitor.visitInsn(Opcodes.RETURN); + methodVisitor.visitMaxs(0, 0); + methodVisitor.visitEnd(); + classWriter.visitEnd(); + + ClassLoader loader = new MyClassLoader(className, classWriter.toByteArray()); + Class clazz = loader.loadClass(className); + Method method = clazz.getMethod(methodName); + method.invoke(null); + } + + public static void main(String[] args) throws Exception { + for(int a=Character.MIN_VALUE;a maybeModule = PRELUDE_MODULE_REPOSITORY.getModule("Prelude"); + if(!maybeModule.didSucceed()) + return; + Module module = maybeModule.getResult(); + ModuleCoverage coverage = CoverageUtils.getCoverage(module); + if(coverage == null) + return; + coverage.print(System.out); + printCoverageTree(module.getBranchPoints().get("lookup"), 0); + } + + private static void printCoverageTree(BranchPoint[] branchPoints, int ind) { + for(BranchPoint bp : branchPoints) { + for(int i=0;i auxModuleNameList = new ArrayList(); + while(j < testParts.length) { + String part = testParts[j]; + if(part.startsWith("// module ")) + auxModuleNameList.add(part.substring(10).split("\\n", 2)[0].trim()); + else + break; + ++j; + } + int mainId = j; + String[] moduleNames = new String[mainId+1]; + String[] moduleTexts = new String[mainId+1]; + for(int i=0;i result = testEnvironment.getModule(testModuleName); + new MapModuleSourceRepository(moduleSources)); + int lastId = moduleNames.length-1; + Failable result = testEnvironment.getModule(moduleNames[lastId]); if(!result.didSucceed()) - return ((Failure)result).toString(input); + return ((Failure)result).toString(moduleTexts[lastId]); else { - Object main = testEnvironment.getRuntimeModule(testModuleName).getResult().getValue("main"); + Object main = testEnvironment.getRuntimeModule(moduleNames[lastId]).getResult().getValue("main"); return String.valueOf(main); } } @@ -97,9 +128,11 @@ public class TestBase { } String text = new String(buffer, 0, pos, UTF8); String[] result = TEST_SEPARATOR.split(text); - if(result.length % 2 == 1) { - result = Arrays.copyOf(result, result.length+2); - result[result.length-1] = ""; + for(int i=1;i 0 + then 1 + else "asd" + +bar n = n + where + do + c = n+1 + if c > 0 + then 1 + else "asd" + +main = foo 3 + bar 3 +-- +6 \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Formula.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Formula.scl new file mode 100644 index 000000000..10eafb061 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Formula.scl @@ -0,0 +1,131 @@ +import "Prelude" + +data Formula a = TrueF + | FalseF + | XorF (Formula a) (Formula a) + | AndF (Formula a) (Formula a) + | ConditionF a + | NextF (Formula a) + | UntilF (Formula a) (Formula a) + +deriving instance (Ord a) => Ord (Formula a) + +instance (Show a) => Show (Formula a) where + sb <+ TrueF = sb << "true" + sb <+ FalseF = sb << "false" + sb <+ XorF a b = sb << "(" <+ a << " `XorF` " <+ b << ")" + sb <+ AndF a b = sb << "(" <+ a << " &&& " <+ b << ")" + sb <+ ConditionF c = sb <+ c + sb <+ NextF a = sb << "(next " <+ a << ")" + sb <+ UntilF a b = sb << "(" <+ a << " `UntilF` " <+ b << ")" + +xorF FalseF f2 = f2 +xorF f1 FalseF = f1 +xorF f1@(XorF h1 t1) f2@(XorF h2 t2) = + let cmp = compare h1 h2 + in if cmp < 0 + then XorF h1 (xorF t1 f2) + else if cmp > 0 + then XorF h2 (xorF f1 t2) + else xorF t1 t2 +xorF f1@(XorF h1 t1) f2 = + let cmp = compare h1 f2 + in if cmp < 0 + then XorF h1 (xorF t1 f2) + else if cmp > 0 + then XorF f2 f1 + else t1 +xorF f1 f2@(XorF h2 t2) = + let cmp = compare f1 h2 + in if cmp < 0 + then XorF f1 f2 + else if cmp > 0 + then XorF h2 (xorF f1 t2) + else t2 +xorF f1 f2 = + let cmp = compare f1 f2 + in if cmp < 0 + then XorF f1 f2 + else if cmp > 0 + then XorF f2 f1 + else TrueF + +notF f = xorF TrueF f + +TrueF &&& f2 = f2 +f1 &&& TrueF = f1 +FalseF &&& _ = FalseF +_ &&& FalseF = FalseF +XorF h1 t1 &&& f2 = xorF (h1 &&& f2) (t1 &&& f2) +f1 &&& XorF h2 t2 = xorF (f1 &&& h2) (f1 &&& t2) +f1@(AndF h1 t1) &&& f2@(AndF h2 t2) = + let cmp = compare h1 h2 + in if cmp < 0 + then AndF h1 (t1 &&& f2) + else if cmp > 0 + then AndF h2 (f1 &&& t2) + else AndF h1 (t1 &&& t2) +f1@(AndF h1 t1) &&& f2 = + let cmp = compare h1 f2 + in if cmp < 0 + then AndF h1 (t1 &&& f2) + else if cmp > 0 + then AndF f2 f1 + else f1 +f1 &&& f2@(AndF h2 t2) = + let cmp = compare f1 h2 + in if cmp < 0 + then AndF f1 f2 + else if cmp > 0 + then AndF h2 (f1 &&& t2) + else f2 +f1 &&& f2 = + let cmp = compare f1 f2 + in if cmp < 0 + then AndF f1 f2 + else if cmp > 0 + then AndF f2 f1 + else f1 + +f1 ||| f2 = xorF (xorF f1 f2) (f1 &&& f2) + +eval :: Ord a => (a -> Boolean) -> Formula a -> Formula a +eval s TrueF = TrueF +eval s FalseF = FalseF +eval s (XorF f1 f2) = xorF (eval s f1) (eval s f2) +eval s (AndF f1 f2) = eval s f1 &&& eval s f2 +eval s (ConditionF c) = if s c then TrueF else FalseF +eval s (NextF f) = f +eval s (UntilF f1 f2) = eval s f2 ||| (eval s f1 &&& UntilF f1 f2) + +// Concrete conditions + +data V = V String (Ref Boolean) + +instance Ord V where + compare (V a _) (V b _) = compare a b +instance Show V where + sb <+ V a _ = sb <+ a + +cond :: String -> Ref Boolean -> Formula V +cond name ref = ConditionF (V name ref) + +// Testing + +x = ref True +y = ref False + +f = cond "x" x `UntilF` cond "y" y + +evalV = eval (\(V _ c) -> getRef c) + +main = do + print (evalV f) + x := False + print (evalV f) + y = ref True + print (evalV f) + x := True + print (evalV f) +-- +() \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable1.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable1.scl deleted file mode 100644 index dc72fb05c..000000000 --- a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable1.scl +++ /dev/null @@ -1,7 +0,0 @@ -import "Prelude" - -l :: [Integer] -l = [1,2,3,4,5] -main = hash l - foldl (\c x -> 31*c + x) 0 l --- --1625180697 \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable2.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable2.scl deleted file mode 100644 index ce3c5b72f..000000000 --- a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable2.scl +++ /dev/null @@ -1,7 +0,0 @@ -import "Prelude" - -l :: [Double] -l = [1,2,3,4,5] -main = hash l --- -849277455 \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/InvalidLambda.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/InvalidLambda.scl index 723a017d3..8897d43dd 100644 --- a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/InvalidLambda.scl +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/InvalidLambda.scl @@ -1,4 +1,4 @@ main = \ /* no parameters */ -> 3 -- -2:30-2:32: Unexpected token '->' (ARROW). Expected one of ATTACHED_HASH, BEGIN_STRING, BLANK, CHAR, DO, ENFORCE, ESCAPED_SYMBOL, FLOAT, ID, IF, INTEGER, LAMBDA, LBRACKET, LET, LPAREN, MATCH, MDO, SELECT, SELECT_DISTINCT, SELECT_FIRST, TRANSFORMATION, WHEN. +2:30-2:32: Unexpected token '->' (ARROW). Expected one of ATTACHED_HASH, BEGIN_STRING, BLANK, CHAR, DO, ENFORCE, EQ, ESCAPED_SYMBOL, FLOAT, ID, IF, INTEGER, LAMBDA, LBRACKET, LET, LPAREN, MATCH, MDO, SELECT, SELECT_DISTINCT, SELECT_FIRST, TRANSFORMATION, WHEN. diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Matching3b.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Matching3b.scl new file mode 100644 index 000000000..486434583 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Matching3b.scl @@ -0,0 +1,8 @@ +import "StandardLibrary" + +foo 1 = "one" +foo 2 = "two" + +main = if True then foo (2 :: Long) else foo (1 :: Integer) +-- +two \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/MatchingWithMissingParameter.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/MatchingWithMissingParameter.scl new file mode 100644 index 000000000..33a681fd3 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/MatchingWithMissingParameter.scl @@ -0,0 +1,10 @@ +data Foo = Foo Integer Integer + | Bar + +isFoo (Foo _) = True +isFoo _ = False + +main = "Hello world!" +-- +4:7-4:14: The function is applied with too few parameters. + diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading1.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading1.scl new file mode 100644 index 000000000..dfb607934 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading1.scl @@ -0,0 +1,19 @@ +// module Foo1 +import "Prelude" + +foo :: Integer -> Boolean +foo i = i == 5 +-- +// module Foo2 +import "Prelude" + +foo :: Integer -> Integer -> Boolean +foo i j = i == j +-- +import "Prelude" +import "Foo1" +import "Foo2" + +main = foo 5 && foo 5 4 +-- +false \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading2.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading2.scl new file mode 100644 index 000000000..e7a28de00 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading2.scl @@ -0,0 +1,20 @@ +// module Max1 +import "Prelude" + +myMax :: Ord a => a -> a -> a +myMax = max +-- +// module Max2 +import "Prelude" + +myMax :: Ord a => a -> a -> a -> a +myMax a b c = max a (max b c) +-- +import "Prelude" +import "Max1" +import "Max2" + +main = myMax (1 :: Integer) 2 3 + myMax (3 :: Integer) 2 1 + myMax 4 2 :: Integer +-- +10 + diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading3.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading3.scl new file mode 100644 index 000000000..9385ce7bc --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading3.scl @@ -0,0 +1,23 @@ +// module M1 +import "Prelude" + +foo :: Ring a => Boolean -> a -> a +foo True v = v+1 +foo False v = v+1 +-- +// module M2 +import "Prelude" + +foo :: Ring a => String -> a -> a +foo cond v = if cond=="true" + then v+1 + else v-1 +-- +import "Prelude" +import "M1" +import "M2" + +main = foo False (foo "True" 10) :: Integer +-- +10 + diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/RecordShorthand.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/RecordShorthand.scl new file mode 100644 index 000000000..d3af73e02 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/RecordShorthand.scl @@ -0,0 +1,11 @@ +import "Prelude" + +data Vec = Vec { x :: Double, y :: Double } +deriving instance Show Vec + +createVec x y = Vec {x, y} +sumVec Vec { x1, y1 } Vec { x2, y2 } = Vec { x = x1+x2, y = y1 + y2 } + +main = sumVec (createVec 1 2) (createVec 3 4) +-- +(Vec 4.0 6.0) \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Seq.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Seq.scl deleted file mode 100644 index 4b60e5298..000000000 --- a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Seq.scl +++ /dev/null @@ -1,19 +0,0 @@ -import "Prelude" -import "JavaBuiltin" as Java - -class Seq seq el where - myLength :: seq -> Integer - myGet :: seq -> Integer -> el - -instance (b ~ Character) => Seq String b where - myLength = Java.method "length" - myGet = Java.method "charAt" - -instance (b ~ a) => Seq [a] b where - myLength = Java.method "size" - myGet = Java.method "get" - -//main :: (Character, String) -main = (myGet "abc" 1, myGet ["a", "b", "c"] 1) --- -(b,b) \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/StringEscape.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/StringEscape.scl new file mode 100644 index 000000000..51a75d3cb --- /dev/null +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/StringEscape.scl @@ -0,0 +1,12 @@ +main = "a\nb\"c\'d" +-- +a +b"c'd +-- +main = "a\u0053" +-- +aS +-- +main = "a\xb" +-- +1:8-1:10: Illegal string escape character. diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/UnexpectedToken.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/UnexpectedToken.scl index 891815259..270d5751b 100644 --- a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/UnexpectedToken.scl +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/UnexpectedToken.scl @@ -1,4 +1,4 @@ -a = = -b = 4 --- -1:5-1:6: Unexpected token '=' (EQUALS). Expected one of ATTACHED_HASH, BEGIN_STRING, BLANK, CHAR, DO, ENFORCE, ESCAPED_SYMBOL, FLOAT, ID, IF, INTEGER, LAMBDA, LBRACKET, LET, LPAREN, MATCH, MDO, MINUS, SELECT, SELECT_DISTINCT, SELECT_FIRST, TRANSFORMATION, WHEN. +a = = +b = 4 +-- +1:5-1:6: Unexpected token '=' (EQUALS). Expected one of ATTACHED_HASH, BEGIN_STRING, BLANK, CHAR, DO, ENFORCE, EQ, ESCAPED_SYMBOL, FLOAT, ID, IF, INTEGER, LAMBDA, LBRACKET, LET, LPAREN, MATCH, MDO, MINUS, SELECT, SELECT_DISTINCT, SELECT_FIRST, TRANSFORMATION, WHEN. \ No newline at end of file diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/unit/TestNamespaceFilter.java b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/unit/TestNamespaceFilter.java index 5fbc73cf9..fa3bd9f65 100644 --- a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/unit/TestNamespaceFilter.java +++ b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/unit/TestNamespaceFilter.java @@ -1,11 +1,7 @@ package org.simantics.scl.compiler.tests.unit; -import gnu.trove.set.hash.THashSet; - import java.util.Collection; -import junit.framework.Assert; - import org.junit.Test; import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter; import org.simantics.scl.compiler.environment.filter.NamespaceFilter; @@ -13,6 +9,9 @@ import org.simantics.scl.compiler.environment.filter.NamespaceFilters; import org.simantics.scl.compiler.environment.filter.NegativeNamespaceFilter; import org.simantics.scl.compiler.environment.filter.PositiveNamespaceFilter; +import gnu.trove.set.hash.THashSet; +import junit.framework.Assert; + public class TestNamespaceFilter { private void testBooleanOperations(Collection all, NamespaceFilter a, NamespaceFilter b) { diff --git a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java index 66431fe50..975dd57fd 100644 --- a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java +++ b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java @@ -105,7 +105,6 @@ public class BundleModuleSource extends EncodedTextualModuleSource { } public void checkUpdates() { - System.out.println(url + " checkUpdates"); if(digest != null && listeners != null) { byte[] newDigest = computeDigest(); if(!Arrays.equals(digest, newDigest)) { @@ -137,7 +136,6 @@ public class BundleModuleSource extends EncodedTextualModuleSource { @Override public void update(String newSourceText) { - System.out.println(url + " update"); try { Path path = getPath(); Files.write(path, newSourceText.getBytes(Charset.forName("UTF-8"))); diff --git a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleTestScriptRunnable.java b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleTestScriptRunnable.java index 2a5d56d7e..c064bd79c 100644 --- a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleTestScriptRunnable.java +++ b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleTestScriptRunnable.java @@ -43,9 +43,6 @@ public class BundleTestScriptRunnable implements TestRunnable { try { CommandSession session = new CommandSession(SCLOsgi.MODULE_REPOSITORY, handler); new TestScriptExecutor(session, reader, handler).execute(); - } catch(Throwable e) { - CommandSession.formatException(handler, e); - throw e; } finally { reader.close(); } diff --git a/bundles/org.simantics.scl.runtime/META-INF/MANIFEST.MF b/bundles/org.simantics.scl.runtime/META-INF/MANIFEST.MF index ea449d36c..64d5ac63d 100755 --- a/bundles/org.simantics.scl.runtime/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.scl.runtime/META-INF/MANIFEST.MF @@ -6,7 +6,7 @@ Bundle-Version: 0.4.0.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Export-Package: org.simantics.scl.runtime, org.simantics.scl.runtime.collection, - org.simantics.scl.runtime.equations, + org.simantics.scl.runtime.exceptions, org.simantics.scl.runtime.function, org.simantics.scl.runtime.io, org.simantics.scl.runtime.lazy, diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/Lists.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/Lists.java index 50376a61b..7149fc63e 100755 --- a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/Lists.java +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/Lists.java @@ -1,9 +1,5 @@ package org.simantics.scl.runtime; -import gnu.trove.map.hash.TCustomHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.strategy.HashingStrategy; - import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -15,6 +11,10 @@ import org.simantics.scl.runtime.function.FunctionImpl1; import org.simantics.scl.runtime.function.FunctionImpl2; import org.simantics.scl.runtime.tuple.Tuple2; +import gnu.trove.map.hash.TCustomHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.strategy.HashingStrategy; + @SuppressWarnings({"rawtypes", "unchecked"}) public class Lists { diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/SCLContext.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/SCLContext.java index 63fa2f1e2..9b3da5232 100644 --- a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/SCLContext.java +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/SCLContext.java @@ -2,8 +2,6 @@ package org.simantics.scl.runtime; import gnu.trove.map.hash.THashMap; -import java.util.Map; - public class SCLContext extends THashMap { private static ThreadLocal CONTEXT = new ThreadLocal(); private static ThreadLocal OLD_CONTEXT = new ThreadLocal(); diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/equations/TestEquationContext.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/equations/TestEquationContext.java index 8b1c71ef9..856ef2870 100644 --- a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/equations/TestEquationContext.java +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/equations/TestEquationContext.java @@ -2,7 +2,6 @@ package org.simantics.scl.runtime.equations; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.List; import org.simantics.scl.runtime.SCLContext; diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/exceptions/MatchingException.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/exceptions/MatchingException.java new file mode 100644 index 000000000..9bca8d80f --- /dev/null +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/exceptions/MatchingException.java @@ -0,0 +1,13 @@ +package org.simantics.scl.runtime.exceptions; + +public class MatchingException extends RuntimeException { + private static final long serialVersionUID = -3364111368224089448L; + + public MatchingException() { + super(); + } + + public MatchingException(String message) { + super(message); + } +} diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/io/SclIO.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/io/SclIO.java index 5b515c262..69cfa77be 100644 --- a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/io/SclIO.java +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/io/SclIO.java @@ -1,13 +1,13 @@ package org.simantics.scl.runtime.io; -import gnu.trove.list.array.TByteArrayList; - import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.Charset; +import gnu.trove.list.array.TByteArrayList; + public class SclIO { private static final Charset UTF8 = Charset.forName("UTF-8"); diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/minigraph/Minigraph.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/minigraph/Minigraph.java index 0a5b99dc6..4294ee96a 100644 --- a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/minigraph/Minigraph.java +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/minigraph/Minigraph.java @@ -1,12 +1,5 @@ package org.simantics.scl.runtime.minigraph; -import gnu.trove.impl.Constants; -import gnu.trove.map.hash.TIntObjectHashMap; -import gnu.trove.map.hash.TLongObjectHashMap; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.procedure.TIntProcedure; -import gnu.trove.set.hash.TIntHashSet; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -15,6 +8,13 @@ import org.simantics.scl.runtime.SCLContext; import org.simantics.scl.runtime.function.Function; import org.simantics.scl.runtime.tuple.Tuple0; +import gnu.trove.impl.Constants; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.map.hash.TLongObjectHashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.procedure.TIntProcedure; +import gnu.trove.set.hash.TIntHashSet; + public class Minigraph { private static final int[] EMPTY_INT_ARRAY = new int[0]; diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/unification/UMapUtils.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/unification/UMapUtils.java index 8bc899370..4b4657323 100644 --- a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/unification/UMapUtils.java +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/unification/UMapUtils.java @@ -1,12 +1,12 @@ package org.simantics.scl.runtime.unification; -import gnu.trove.map.hash.THashMap; - import java.util.Map; import org.simantics.scl.runtime.function.Function; import org.simantics.scl.runtime.tuple.Tuple0; +import gnu.trove.map.hash.THashMap; + public class UMapUtils { public static void put(Map map, Object key, Object value) { if(map.containsKey(key)) diff --git a/bundles/winterwell.markdown/.project b/bundles/winterwell.markdown/.project index a9e498d9e..16de67173 100644 --- a/bundles/winterwell.markdown/.project +++ b/bundles/winterwell.markdown/.project @@ -20,14 +20,8 @@ - - org.eclipse.m2e.core.maven2Builder - - - - org.eclipse.m2e.core.maven2Nature org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature