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;
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) {
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);
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;
public Type getType() {
return accessors.get(index).getType();
}
+ @Override
+ public String toString() {
+ return accessors.get(index).toString();
+ }
};
}
accessorExpression = new EAmbiguous(alternatives);
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);
+ }
}