You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When doing a transforming visit on a parse tree, rewriting a nested element, the enclosing tree (trees?) don't get their source locations back. Strangely enough, adding a dummy case for the enclosing nonterminal fixes the problem.
NB: the exception says "Undeclared" but it is physically not there.
NB: there is no difference between insert and =>
Reproduce:
module Bug
import IO;
import Node;
extend lang::std::Layout;
extend lang::std::Id;
syntax Stmt
= "if" Expr cond "{" Stmt body "}"
| Id x "=" Id y
;
lexical Expr = [a-z];
void bug() {
Stmt stmt = (Stmt)`if a { x = y }`;
stmt2 = visit (stmt) {
case (Expr)`a`: insert (Expr)`b`;
}
// original statement has a source location
println(stmt.src);
// prints empty map
println(getKeywordParameters(stmt2));
// throws exception Undeclared field: src for Tree = appl(Production prod,list[Tree] args)
println(stmt2.src);
// However: the following does work... (commenting out previous statement)
stmt3 = visit (stmt) {
case (Expr)`a`: insert (Expr)`b`;
case Stmt _: ;
}
// prints map with src entry
println(getKeywordParameters(stmt3));
// prints correct loc
println(stmt3.src);
}
The text was updated successfully, but these errors were encountered:
When doing a transforming visit on a parse tree, rewriting a nested element, the enclosing tree (trees?) don't get their source locations back. Strangely enough, adding a dummy case for the enclosing nonterminal fixes the problem.
NB: the exception says "Undeclared" but it is physically not there.
NB: there is no difference between
insert
and=>
Reproduce:
The text was updated successfully, but these errors were encountered: