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;
-import org.simantics.scl.compiler.elaboration.modules.TypeAlias;
import org.simantics.scl.compiler.elaboration.modules.TypeClass;
-import org.simantics.scl.compiler.elaboration.modules.TypeConstructor;
+import org.simantics.scl.compiler.elaboration.modules.TypeDescriptor;
import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;
import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
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;
@Override
public SCLValue getValue(String name) throws AmbiguousNameException {
SCLValue value = module.getValue(name);
- if(value != null)
- return value;
- return base.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
public SCLRelation getRelation(String name) throws AmbiguousNameException {
SCLRelation relation = module.getRelation(name);
}
@Override
- public TypeConstructor getTypeConstructor(String name)
+ public TypeDescriptor getTypeDescriptor(String name)
throws AmbiguousNameException {
- TypeConstructor typeConstructor = module.getTypeConstructor(name);
- if(typeConstructor != null)
- return typeConstructor;
- return base.getTypeConstructor(name);
+ TypeDescriptor typeDescriptor = module.getTypeDescriptor(name);
+ if(typeDescriptor != null)
+ return typeDescriptor;
+ return base.getTypeDescriptor(name);
}
@Override
return typeClass;
return base.getTypeClass(name);
}
-
- @Override
- public TypeAlias getTypeAlias(String name) throws AmbiguousNameException {
- TypeAlias typeAlias = module.getTypeAlias(name);
- if(typeAlias != null)
- return typeAlias;
- return base.getTypeAlias(name);
- }
@Override
public MappingRelation getMappingRelation(String name)