]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java
(refs #7316) Improved error locations for invalid field access
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / contexts / TranslationContext.java
index 0331f9a50b86a7715405afc9bb37da2441d8b5b2..ac9299d77f968a3a7623c5974005eacd5502f87c 100644 (file)
@@ -157,13 +157,16 @@ public class TranslationContext extends TypeTranslationContext implements Enviro
             return existentialFrames.get(size-1);
     }
     
-    private Expression resolveFieldAccess(Expression base, int pos, String name) {
+    private Expression resolveFieldAccess(long location, Expression base, int pos, String name) {
         while(pos != -1) {
             int p = findSeparator(name, pos+1);
+            int endPos = p==-1 ? name.length() : p;
             FieldAccessor accessor = new IdAccessor(
                     name.charAt(pos),
-                    name.substring(pos+1, p==-1 ? name.length() : p-1));
+                    name.substring(pos+1, endPos));
+            accessor.location = Locations.sublocation(location, pos+1, endPos);
             base = new EFieldAccess(base, accessor);
+            base.location = Locations.sublocation(location, 0, endPos);
             pos = p;
         }
         return base;
@@ -235,7 +238,7 @@ public class TranslationContext extends TypeTranslationContext implements Enviro
         if(begin == 0) {
             Expression result = resolveLocalVariable(location, part);
             if(result != null)
-                return end == -1 ? result : resolveFieldAccess(result, end, name);
+                return end == -1 ? result : resolveFieldAccess(location, result, end, name);
             
             // FIXME.. support for records
             if(localEnvironment != null) {
@@ -266,7 +269,7 @@ public class TranslationContext extends TypeTranslationContext implements Enviro
             if(result == null)
                 result = resolveValue(location, namespace, part);
             if(result != null)
-                return end == -1 ? result : resolveFieldAccess(result, end, name);
+                return end == -1 ? result : resolveFieldAccess(location, result, end, name);
         }
         reportResolveFailure(location, namespace, part);
         return new EError(location);