X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Ftransformations%2FUnifiableFactory.java;h=06da2356294d80dd89e3803e940c71bb37953a74;hb=refs%2Fchanges%2F50%2F750%2F1;hp=0daeb02aea051953e3ab53b4de5b6f0f486bdb7f;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git 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..06da23562 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,12 +1,9 @@ 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; -import org.simantics.scl.compiler.common.names.Name; +import org.simantics.scl.compiler.common.names.Names; import org.simantics.scl.compiler.constants.Constant; import org.simantics.scl.compiler.constants.StringConstant; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; @@ -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,27 +30,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.util.MultiApply; import org.simantics.scl.compiler.types.util.MultiFunction; -public class UnifiableFactory { - private static final TCon Unifiable = Types.con("Unification", "Unifiable"); - private static final Name uVar = Name.create("Unification", "uVar"); - private static final Name uCons = Name.create("Unification", "uCons"); - private static final Name uId = Name.create("Unification", "uId"); - private static final Name uPending = Name.create("Unification", "uPending"); - private static final TCon UTag = Types.con("Unification", "UTag"); - private static final Name uTag = Name.create("Unification", "uTag"); - private static final Name extractWithDefault = Name.create("Unification", "extractWithDefault"); - - private static final Name putUMap = Name.create("Unification", "putUMap"); - private static final Name putUMapC = Name.create("Unification", "putUMapC"); - private static final Name getUMapWithDefault = Name.create("Unification", "getUMapWithDefault"); - - private static final Name fail = Name.create("Builtin", "fail"); - private static final Name unsafeCoerce = Name.create("JavaBuiltin", "unsafeCoerce"); - private static final Name newResource = Name.create("Simantics/DB", "newResource"); - private static final Name createElement = Name.create("Data/XML", "createElement"); +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; - private static final Type XML_ELEMENT = Types.con("Data/XML", "Element"); - +public class UnifiableFactory { private final TypingContext context; /** * The factory generates here the statements initializing the variables needed in unification. @@ -93,7 +73,7 @@ public class UnifiableFactory { } @Override public Expression toExpression() { - return Expressions.apply(context, Types.NO_EFFECTS, uId, + return Expressions.apply(context.getCompilationContext(), Types.NO_EFFECTS, Names.Unifiable_uId, constant.getType(), constant); } } @@ -116,7 +96,7 @@ public class UnifiableFactory { variable, extract(variable.getType(), Expressions.var(uniVariableMap.get(variable))), expression); - return Expressions.apply(context, Types.NO_EFFECTS, uPending, + return Expressions.apply(context.getCompilationContext(), Types.NO_EFFECTS, Names.Unifiable_uPending, value.getType(), Expressions.computation(Types.PROC, expression)); } } @@ -148,7 +128,7 @@ public class UnifiableFactory { if(uniVariable != null) return new UniRep(new EVariable(uniVariable)); else - return new UniRep(Expressions.apply(context, Types.PROC, uVar, variable.getType(), Expressions.punit())); + return new UniRep(Expressions.apply(context.getCompilationContext(), Types.PROC, Names.Unifiable_uVar, variable.getType(), Expressions.punit())); } apply: if(expression instanceof EApply) { @@ -189,7 +169,7 @@ public class UnifiableFactory { for(int i=0;i dependences = new THashSet(); - expression.forVariables(new VariableProcedure() { + expression.forVariableUses(new VariableProcedure() { @Override public void execute(long location, Variable variable) { @@ -245,11 +225,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; } @@ -276,14 +256,14 @@ public class UnifiableFactory { Type[] uniParameterTypes = new Type[arity]; for(int i=0;i variableSet, THashMap uniVariableMap, Expression umap, Expression key, Expression value) { - return Expressions.apply(context, Types.PROC, - putUMap, + return Expressions.apply(context.getCompilationContext(), Types.PROC, + Names.Unifiable_putUMap, key.getType(), value.getType(), umap, @@ -400,8 +380,8 @@ public class UnifiableFactory { } public Expression putToUMapConstant(Variable umap, Expression key, Expression value) { - return Expressions.apply(context, Types.PROC, - putUMapC, + return Expressions.apply(context.getCompilationContext(), Types.PROC, + Names.Unifiable_putUMapC, key.getType(), value.getType(), Expressions.var(umap), key, value);