]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java
Fixed record constructor resolving from namespaces
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / contexts / TranslationContext.java
index 757aca8b5e272880e7c6526048f1b20837709f82..d8346f41f5e889fbc66437a1f9be10a1a3ad803c 100644 (file)
@@ -192,16 +192,23 @@ public class TranslationContext extends TypeTranslationContext implements Enviro
         return -1;
     }
     
+    public SCLValue resolveSCLValue(long location, Namespace namespace, String name) throws AmbiguousNameException {
+        SCLValue value = namespace.getValue(name);
+        if(value == null)
+            return null;
+        String deprecatedDescription = value.isDeprecated();
+        if(deprecatedDescription != null)
+            errorLog.logWarning(location, "Deprecated value " + value.getName().name + "." + (deprecatedDescription.isEmpty() ? "" : " " + deprecatedDescription));
+        if(moduleDebugInfo != null)
+            moduleDebugInfo.symbolReferences.add(new SymbolReference(value.getName(), Name.create(compilationContext.module.getName(), definitionName), location));
+        return value;
+    }
+    
     public Expression resolveValue(long location, Namespace namespace, String name) {
         try {
-            SCLValue value = namespace.getValue(name);
+            SCLValue value = resolveSCLValue(location, namespace, name);
             if(value == null)
                 return null;
-            String deprecatedDescription = value.isDeprecated();
-            if(deprecatedDescription != null)
-                errorLog.logWarning(location, "Deprecated value " + value.getName().name + "." + (deprecatedDescription.isEmpty() ? "" : " " + deprecatedDescription));
-            if(moduleDebugInfo != null)
-                moduleDebugInfo.symbolReferences.add(new SymbolReference(value.getName(), Name.create(compilationContext.module.getName(), definitionName), location));
             return new EConstant(location, value);
         } catch (AmbiguousNameException e) {
             if(SCLCompilerConfiguration.ALLOW_OVERLOADING)
@@ -288,6 +295,25 @@ public class TranslationContext extends TypeTranslationContext implements Enviro
         return new EError(location);
     }
     
+    public SCLValue resolveRecordConstructor(long location, String name) throws AmbiguousNameException {
+        return resolveRecordConstructor(location, getEnvironment().getLocalNamespace(), name, 0);
+    }
+    
+    public SCLValue resolveRecordConstructor(long location, Namespace namespace, String name, int begin) throws AmbiguousNameException {
+        int end = findSeparator(name, begin);
+        String part = end == -1 ? (begin == 0 ? name : name.substring(begin)) : name.substring(begin, end);
+
+        if(end != -1 && name.charAt(end) == '.') {
+            Namespace childNamespace = namespace.getNamespace(part);
+            if(childNamespace == null)
+                return null;
+            else
+                return resolveRecordConstructor(location, childNamespace, name, end+1);
+        }
+        else
+            return resolveSCLValue(location, namespace, part);
+    }
+    
     private void reportResolveFailure(long location, Namespace namespace, String name) {
         StringBuilder message = new StringBuilder();
         message.append("Couldn't resolve ").append(name).append(".");