X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fcontexts%2FTranslationContext.java;h=41f807592b7ad1de8c0b28d20183a3d4c80a3948;hp=961fa902b9db552469b998f2e30e8255f806dcc1;hb=1b4d8b692f40d946deb5db8280eb4ca5b36a75a7;hpb=969bd23cab98a79ca9101af33334000879fb60c5 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..41f807592 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,17 +1,16 @@ 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; import org.simantics.scl.compiler.common.names.Name; +import org.simantics.scl.compiler.common.names.Names; import org.simantics.scl.compiler.common.precedence.Associativity; import org.simantics.scl.compiler.common.precedence.Precedence; +import org.simantics.scl.compiler.compilation.CompilationContext; +import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint; 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; @@ -28,14 +27,19 @@ import org.simantics.scl.compiler.elaboration.modules.SCLValue; import org.simantics.scl.compiler.elaboration.query.pre.PreQuery; import org.simantics.scl.compiler.elaboration.relations.SCLRelation; import org.simantics.scl.compiler.environment.AmbiguousNameException; -import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.environment.Environments; import org.simantics.scl.compiler.environment.LocalEnvironment; import org.simantics.scl.compiler.environment.Namespace; 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 { @@ -55,6 +59,10 @@ public class TranslationContext extends TypeTranslationContext implements Enviro TIntArrayList relationFrames = new TIntArrayList(); ArrayList relationEntries = new ArrayList(); + THashMap chrConstraints = new THashMap(); + TIntArrayList chrConstraintFrames = new TIntArrayList(); + ArrayList chrConstraintEntries = new ArrayList(); + static class Entry { String name; Variable variable; @@ -73,14 +81,23 @@ public class TranslationContext extends TypeTranslationContext implements Enviro } } - public TranslationContext(ErrorLog errorLog, - Environment environment, LocalEnvironment localEnvironment) { - super(errorLog, environment); + static class CHRConstraintEntry { + String name; + CHRConstraint constraint; + public CHRConstraintEntry(String name, CHRConstraint constraint) { + this.name = name; + this.constraint = constraint; + } + } + + public TranslationContext(CompilationContext compilationContext, LocalEnvironment localEnvironment) { + super(compilationContext); this.localEnvironment = localEnvironment; } public static boolean isConstructorName(String name) { - char firstChar = name.charAt(0); + int p = name.lastIndexOf('.'); + char firstChar = name.charAt(p<0 ? 0 : p+1); return Character.isUpperCase(firstChar); } @@ -147,7 +164,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 constraints) { + int frame = chrConstraintFrames.removeAt(chrConstraintFrames.size()-1); + int i = chrConstraintEntries.size(); + while(i > frame) { + --i; + CHRConstraintEntry entry = chrConstraintEntries.remove(i); + CHRConstraint newConstraint; + if(entry.constraint == null) + newConstraint = chrConstraints.remove(entry.name); + else + newConstraint = chrConstraints.put(entry.name, entry.constraint); + if(newConstraint.implicitlyDeclared) + constraints.add(newConstraint); + } + } + public void pushExistentialFrame() { pushFrame(); existentialFrames.add(new THashSet()); @@ -331,6 +406,11 @@ public class TranslationContext extends TypeTranslationContext implements Enviro SCLRelation oldRelation = relations.put(name, relation); relationEntries.add(new RelationEntry(name, oldRelation)); } + + public void newCHRConstraint(String name, CHRConstraint constraint) { + CHRConstraint oldConstraint = chrConstraints.put(name, constraint); + chrConstraintEntries.add(new CHRConstraintEntry(name, oldConstraint)); + } public Precedence getPrecedence(Name op) { Precedence prec = environment.getValue(op).getPrecedence(); @@ -340,61 +420,56 @@ public class TranslationContext extends TypeTranslationContext implements Enviro return prec; } - private SCLValue resolveValueIn(long location, Namespace namespace, final String name) { - try { - SCLValue value = namespace.getValue(name); - if(value == null) { - StringBuilder message = new StringBuilder(); - message.append("Couldn't resolve variable ").append(name).append("."); - - final THashSet candidateNames = new THashSet(4); - namespace.findValuesForPrefix("", AcceptAllNamespaceFilter.INSTANCE, - new TObjectProcedure() { - @Override - public boolean execute(SCLValue value) { - if(value == null) { - new Exception().printStackTrace(); - return true; - } - String valueName = value.getName().name; - if(name.equalsIgnoreCase(valueName)) - candidateNames.add(valueName); - return true; - } - }); - if(localEnvironment != null) - localEnvironment.forNames(new TObjectProcedure() { - @Override - public boolean execute(String valueName) { - if(name.equalsIgnoreCase(valueName)) - candidateNames.add(valueName); - return true; - } - }); - - if(candidateNames.size() > 0) { - message.append(" Did you mean "); - String[] ns = candidateNames.toArray(new String[candidateNames.size()]); - Arrays.sort(ns); - for(int i=0;i 0) { - message.append(", "); - if(i == ns.length-1) - message.append("or "); - } - message.append(ns[i]); + private SCLValue resolveValueIn(long location, Namespace namespace, final String name) throws AmbiguousNameException { + SCLValue value = namespace.getValue(name); + if(value == null) { + StringBuilder message = new StringBuilder(); + message.append("Couldn't resolve variable ").append(name).append("."); + + final THashSet candidateNames = new THashSet(4); + namespace.findValuesForPrefix("", AcceptAllNamespaceFilter.INSTANCE, + new TObjectProcedure() { + @Override + public boolean execute(SCLValue value) { + if(value == null) { + new Exception().printStackTrace(); + return true; } - message.append('?'); + String valueName = value.getName().name; + if(name.equalsIgnoreCase(valueName)) + candidateNames.add(valueName); + return true; } - - errorLog.log(location, message.toString()); - return null; + }); + if(localEnvironment != null) + localEnvironment.forNames(new TObjectProcedure() { + @Override + public boolean execute(String valueName) { + if(name.equalsIgnoreCase(valueName)) + candidateNames.add(valueName); + return true; + } + }); + + if(candidateNames.size() > 0) { + message.append(" Did you mean "); + String[] ns = candidateNames.toArray(new String[candidateNames.size()]); + Arrays.sort(ns); + for(int i=0;i 0) { + message.append(", "); + if(i == ns.length-1) + message.append("or "); + } + message.append(ns[i]); + } + message.append('?'); } - return value; - } catch (AmbiguousNameException e) { - errorLog.log(location, e.getMessage()); + + errorLog.log(location, message.toString()); return null; } + return value; } public Case translateCase(Expression lhs, Expression rhs) { @@ -460,11 +535,9 @@ public class TranslationContext extends TypeTranslationContext implements Enviro cases); } - private static final Name BIND = Name.create("Prelude", ">>="); - public SCLValue getBindFunction() { if(bindFunction == null) { - bindFunction = getEnvironment().getValue(BIND); + bindFunction = getEnvironment().getValue(Names.Prelude_bind); } return bindFunction; } @@ -486,6 +559,10 @@ public class TranslationContext extends TypeTranslationContext implements Enviro return null; } } + + public CHRConstraint resolveCHRConstraint(String name) { + return chrConstraints.get(name); + } @Override public SCLValue getValue(Name name) {