(refs #7316) Improved error locations for invalid field access 37/637/1
authorHannu Niemistö <hannu.niemisto@semantum.fi>
Sun, 18 Jun 2017 17:58:11 +0000 (20:58 +0300)
committerHannu Niemistö <hannu.niemisto@semantum.fi>
Sun, 18 Jun 2017 17:58:11 +0000 (20:58 +0300)
Change-Id: Ie901cd59e0cf45ece1c99932d44ac1863da97565

bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EFieldAccess.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/errors/Locations.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);
index 0d3e2eeaf3600e32aa1ca5206293f40d4182006d..a8d117f5df94d93d265c140355ebc8ea417fd65e 100644 (file)
@@ -67,7 +67,7 @@ public class EFieldAccess extends SimplifiableExpression {
             return null;
         List<Constant> accessors = context.getEnvironment().getFieldAccessors(idAccessor.fieldName);
         if(accessors == null) {
-            context.getErrorLog().log("Couldn't resolve accessor ." + idAccessor.fieldName + ".");
+            context.getErrorLog().log(idAccessor.location, "Couldn't resolve accessor ." + idAccessor.fieldName + ".");
             return new EError(location);
         }
         Expression accessorExpression;
@@ -86,6 +86,10 @@ public class EFieldAccess extends SimplifiableExpression {
                     public Type getType() {
                         return accessors.get(index).getType();
                     }
+                    @Override
+                    public String toString() {
+                        return accessors.get(index).toString();
+                    }
                 };
             }
             accessorExpression = new EAmbiguous(alternatives);
index 49c5b03d4740d1d2650e4d8c378b71beafe910d9..3a77cf3250d7c1f58bd17c2e2fcbd8ac164bb9db 100644 (file)
@@ -40,4 +40,12 @@ public class Locations {
         int end = endOf(location);
         return formula.substring(0, begin) + annotationBegin + formula.substring(begin, end) + annotationEnd + formula.substring(end);
     }
+    
+    public static long sublocation(long location, int localBegin, int localEnd) {
+        int begin = beginOf(location);
+        int end = endOf(location);
+        if(localEnd > end-begin)
+            localEnd = begin-end;
+        return location(begin+localBegin, begin+localEnd);
+    }
 }