diff --git a/src/analysis/typepal/Collector.rsc b/src/analysis/typepal/Collector.rsc index 36af9a5..6861ec8 100644 --- a/src/analysis/typepal/Collector.rsc +++ b/src/analysis/typepal/Collector.rsc @@ -376,17 +376,18 @@ Collector newCollector(str modelName, map[str,Tree] namedTrees, TypePalConfig co } } - AType(Solver) makeGetTypeInType(Tree container, Tree selector, set[IdRole] idRolesSel, loc scope){ + AType(Solver) makeGetTypeInType(loc containerLoc, Tree selector, set[IdRole] idRolesSel, loc scope){ return AType(Solver s) { - return s.getTypeInType(s.getType(container), selector, idRolesSel, scope); + return s.getTypeInType(s.getType(containerLoc), selector, idRolesSel, scope); }; } void collector_useViaType(Tree container, Tree selector, set[IdRole] idRolesSel){ if(building){ name = normalizeName(""); - sloc = getLoc(selector); - calculators += calc("useViaType `` in ", sloc, [getLoc(container)], makeGetTypeInType(container, selector, idRolesSel, currentScope)); + selectorLoc = getLogicalLoc(selector); + containerLoc = getLogicalLoc(container); + calculators += calc("useViaType `` in ", selectorLoc, [containerLoc], makeGetTypeInType(containerLoc, selector, idRolesSel, toLogicalLocs(currentScope))); } else { throw TypePalUsage("Cannot call `useViaType` on Collector after `run`"); } diff --git a/src/analysis/typepal/Solver.rsc b/src/analysis/typepal/Solver.rsc index da101e3..4aefd41 100644 --- a/src/analysis/typepal/Solver.rsc +++ b/src/analysis/typepal/Solver.rsc @@ -668,7 +668,6 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ AType solver_getTypeInType(AType containerType, Tree selector, set[IdRole] idRolesSel, loc scope){ selectorLoc = getLogicalLoc(getLoc(selector)); - scope = getLogicalLoc(scope); selectorOrgName = ""; selectorName = normalizeName(selectorOrgName); @@ -684,13 +683,15 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ } if(isEmpty(valid_overloads)){ solver_report(error(selector, "Cannot access field on overloaded type %t", containerType)); - } else if({} := valid_overloads){ - addUse({key}, selectorUse); + } else if({} := valid_overloads){ + if(idr in idRolesSel) addUse({key}, selectorUse); addFact(selectorLoc, tp); return tp; } else { + for( <- valid_overloads){ + if(idr in idRolesSel) addUse({key}, selectorUse); + } tp2 = overloadedAType(valid_overloads); - addUse(valid_overloads<0>, selectorUse); addFact(selectorLoc, tp2); return tp2; @@ -731,13 +732,15 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ else solver_report(error(selector, "No definition for type %t is available here", containerType)); } - } else if({} := valid_overloads){ - addUse({key}, selectorUse); + } else if({} := valid_overloads){ + if(idr in idRolesSel) addUse({key}, selectorUse); addFact(selectorLoc, tp); return tp; } else { + for( <- valid_overloads){ + if(idr in idRolesSel) addUse({key}, selectorUse); + } tp2 = overloadedAType(valid_overloads); - addUse(valid_overloads<0>, selectorUse); addFact(selectorLoc, tp2); return tp2; }