From 513e9542fe6803fef428c76a3e4a603c048a4880 Mon Sep 17 00:00:00 2001 From: paulklint Date: Wed, 20 May 2026 11:48:41 +0200 Subject: [PATCH 1/7] Added tests for selecting src from field of nonterminal --- .../check/tests/SyntaxDeclarationTCTests.rsc | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/org/rascalmpl/compiler/lang/rascalcore/check/tests/SyntaxDeclarationTCTests.rsc b/src/org/rascalmpl/compiler/lang/rascalcore/check/tests/SyntaxDeclarationTCTests.rsc index 132e18b9318..2397c13323d 100644 --- a/src/org/rascalmpl/compiler/lang/rascalcore/check/tests/SyntaxDeclarationTCTests.rsc +++ b/src/org/rascalmpl/compiler/lang/rascalcore/check/tests/SyntaxDeclarationTCTests.rsc @@ -629,4 +629,26 @@ test bool Issue1353() { import MC; value main() = hello(); "); +} + +test bool srcFromExpressionFieldsOK(){ + return checkModuleOK(" + module SrcFromExpressionFieldsOK + import lang::rascal::\\syntax::Rascal; + loc lhsFetch(Expression e){ + return e.lhs.src; + } + + void lhsReplace(Expression e){ + e.lhs.src = |unknown:///|; + } + + loc rhsFetch(Expression e){ + return e.rhs.src; + } + + void rhsReplace(Expression e){ + e.rhs.src = |unknown:///|; + } + "); } \ No newline at end of file From 05fd0e48748f254c57da30e4e84e6a9bd0c5e993 Mon Sep 17 00:00:00 2001 From: paulklint Date: Wed, 20 May 2026 11:50:06 +0200 Subject: [PATCH 2/7] Fixed field selection when field is overloaded --- .../rascalcore/check/CollectExpression.rsc | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc b/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc index 97b16d0a75a..99e87ea2154 100644 --- a/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc +++ b/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc @@ -1056,8 +1056,16 @@ void collect(current: (Expression) ` [ void collect(current: (Expression) ` . `, Collector c){ c.useViaType(expression, field, {fieldId(), keywordFieldId(), annoId()}); // DURING TRANSITION: allow annoIds - c.require("non void or overloaded", expression, [], makeNonVoidNonOverloadedRequirement(expression, "Base expression of field selection")); - c.fact(current, field); + c.require("non void", expression, [], makeNonVoidRequirement(expression, "Base expression of field selection")); + c.calculate("field access", current, [expression, field], + AType(Solver s){ + fieldType = s.getType(field); + if(overloadedAType(rel[loc, IdRole, AType] overloads) := fieldType){ + return ( avoid() | alub(it, tp) | tp <- overloads<2>); + } + return fieldType; + }); + collect(expression, c); } @@ -1068,7 +1076,8 @@ void collect(current:(Expression) ` [ = `", current, [expression, repl], AType(Solver s){ - fieldType = computeFieldTypeWithADT(s.getType(expression), field, scope, s); + expType = s.getType(expression); + fieldType = computeFieldTypeWithADT(expType, field, scope, s); replType = s.getType(repl); bindings = (); @@ -1091,7 +1100,7 @@ void collect(current:(Expression) ` [ = ; } catch checkFailed(list[FailMessage] _): /* continue with next overload */; catch NoBinding(): /* continue with next overload */; -//>>> catch e: /* continue with next overload */; } if(isEmpty(projection_overloads)) s.report(error(current, "Illegal projection %t", base)); return overloadedAType(projection_overloads); From 20bc1633eb28c2bb96568abaf0c4841b40f576ec Mon Sep 17 00:00:00 2001 From: paulklint Date: Thu, 21 May 2026 11:53:54 +0200 Subject: [PATCH 3/7] Removed no longer used function --- .../compiler/lang/rascalcore/check/ComputeType.rsc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/org/rascalmpl/compiler/lang/rascalcore/check/ComputeType.rsc b/src/org/rascalmpl/compiler/lang/rascalcore/check/ComputeType.rsc index b873af3163f..5085e2877de 100644 --- a/src/org/rascalmpl/compiler/lang/rascalcore/check/ComputeType.rsc +++ b/src/org/rascalmpl/compiler/lang/rascalcore/check/ComputeType.rsc @@ -139,11 +139,11 @@ void(Solver) makeVarInitRequirement(Variable var) void(Solver) makeNonVoidRequirement(Tree t, str msg) = void(Solver s) { checkNonVoid(t, s, msg ); }; -void(Solver) makeNonVoidNonOverloadedRequirement(Tree t, str msg) - = void(Solver s) { - checkNonVoid(t, s, msg ); - if(isOverloadedAType(s.getType(t))) s.report(error(t, msg + " is ambiguous and should be resolved")); - }; +// void(Solver) makeNonVoidNonOverloadedRequirement(Tree t, str msg) +// = void(Solver s) { +// checkNonVoid(t, s, msg ); +// if(isOverloadedAType(s.getType(t))) s.report(error(t, msg + " is ambiguous and should be resolved")); +// }; AType unaryOp(str op, AType(Tree, AType, Solver) computeType, Tree current, AType t1, Solver s, bool maybeVoid=false){ From bc88a4d5f13f6de1d6634f62493e4d5c6375f2eb Mon Sep 17 00:00:00 2001 From: paulklint Date: Thu, 21 May 2026 14:03:16 +0200 Subject: [PATCH 4/7] Changed error message --- .../compiler/lang/rascalcore/check/tests/StaticTestingUtils.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/rascalmpl/compiler/lang/rascalcore/check/tests/StaticTestingUtils.rsc b/src/org/rascalmpl/compiler/lang/rascalcore/check/tests/StaticTestingUtils.rsc index df71ace585e..c46e2b90593 100644 --- a/src/org/rascalmpl/compiler/lang/rascalcore/check/tests/StaticTestingUtils.rsc +++ b/src/org/rascalmpl/compiler/lang/rascalcore/check/tests/StaticTestingUtils.rsc @@ -324,7 +324,7 @@ list[str] unexpectedTypeMsgs = [ "Expected a binary relation, found _", "Constructor _ is overloaded", "Expression _ is overloaded", - "Base expression of field selection is ambiguous and should be resolved" + "Base expression _ of field selection should have a unique type" ]; bool unexpectedTypeInModule(str moduleText, PathConfig pathConfig = getDefaultTestingPathConfig()) From ef757a49f5149093502a977583487dca6ba08668 Mon Sep 17 00:00:00 2001 From: paulklint Date: Thu, 21 May 2026 14:03:38 +0200 Subject: [PATCH 5/7] Refined check on field selection --- .../lang/rascalcore/check/CollectExpression.rsc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc b/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc index 99e87ea2154..33fa36770ec 100644 --- a/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc +++ b/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc @@ -1056,13 +1056,19 @@ void collect(current: (Expression) ` [ void collect(current: (Expression) ` . `, Collector c){ c.useViaType(expression, field, {fieldId(), keywordFieldId(), annoId()}); // DURING TRANSITION: allow annoIds - c.require("non void", expression, [], makeNonVoidRequirement(expression, "Base expression of field selection")); c.calculate("field access", current, [expression, field], AType(Solver s){ + expType = s.getType(expression); fieldType = s.getType(field); - if(overloadedAType(rel[loc, IdRole, AType] overloads) := fieldType){ - return ( avoid() | alub(it, tp) | tp <- overloads<2>); + + if(isVoidAType(expType)) s.report(error(e, "Base expression of field selection should not have type `void`")); + if(overloadedAType(rel[loc, IdRole, AType] overloads) := expType){ + ovls = overloads<2>; + if(any(ov1 <- ovls, ov2 <- ovls, ov1 != ov2, !comparable(ov1, ov2))){ + s.report(error(expression, "Base expression `%s` of field selection should have a unique type, found %v", expression, ovls)); + } } + return fieldType; }); From fef64dbe664162a24da0b45513bb4cb203cdfe0b Mon Sep 17 00:00:00 2001 From: paulklint Date: Thu, 21 May 2026 19:13:25 +0200 Subject: [PATCH 6/7] Fixed type error --- .../compiler/lang/rascalcore/check/CollectExpression.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc b/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc index 33fa36770ec..963a088e16e 100644 --- a/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc +++ b/src/org/rascalmpl/compiler/lang/rascalcore/check/CollectExpression.rsc @@ -1061,7 +1061,7 @@ void collect(current: (Expression) ` . `, Col expType = s.getType(expression); fieldType = s.getType(field); - if(isVoidAType(expType)) s.report(error(e, "Base expression of field selection should not have type `void`")); + if(isVoidAType(expType)) s.report(error(expression, "Base expression of field selection should not have type `void`")); if(overloadedAType(rel[loc, IdRole, AType] overloads) := expType){ ovls = overloads<2>; if(any(ov1 <- ovls, ov2 <- ovls, ov1 != ov2, !comparable(ov1, ov2))){ From 5854b08f4e38d841989153b0668847348ee5b274 Mon Sep 17 00:00:00 2001 From: paulklint Date: Thu, 21 May 2026 23:39:28 +0200 Subject: [PATCH 7/7] Removed commented code --- .../compiler/lang/rascalcore/check/ComputeType.rsc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/org/rascalmpl/compiler/lang/rascalcore/check/ComputeType.rsc b/src/org/rascalmpl/compiler/lang/rascalcore/check/ComputeType.rsc index 5085e2877de..653003a1e75 100644 --- a/src/org/rascalmpl/compiler/lang/rascalcore/check/ComputeType.rsc +++ b/src/org/rascalmpl/compiler/lang/rascalcore/check/ComputeType.rsc @@ -139,12 +139,6 @@ void(Solver) makeVarInitRequirement(Variable var) void(Solver) makeNonVoidRequirement(Tree t, str msg) = void(Solver s) { checkNonVoid(t, s, msg ); }; -// void(Solver) makeNonVoidNonOverloadedRequirement(Tree t, str msg) -// = void(Solver s) { -// checkNonVoid(t, s, msg ); -// if(isOverloadedAType(s.getType(t))) s.report(error(t, msg + " is ambiguous and should be resolved")); -// }; - AType unaryOp(str op, AType(Tree, AType, Solver) computeType, Tree current, AType t1, Solver s, bool maybeVoid=false){ requireFullyInstantiated(s, t1);