diff --git a/M2/Macaulay2/d/convertr.d b/M2/Macaulay2/d/convertr.d index 42c594de80..eb93cc9492 100644 --- a/M2/Macaulay2/d/convertr.d +++ b/M2/Macaulay2/d/convertr.d @@ -33,10 +33,6 @@ combinePositionR(L:Position, R:Position):Position := Position( combinePositionC(L:Position, R:Position, C:Position):Position := Position( L.filename, L.lineL, L.columnL, R.lineR, R.columnR, C.lineF, C.columnF, L.loadDepth); --- combine two positions belonging to adjacent tokens (focus is on endpoint of the first one) -combinePositionAdjacent(L:Position, R:Position):Position := Position( - L.filename, L.lineL, L.columnL, R.lineR, R.columnR, L.lineR, L.columnR, L.loadDepth); - convert0(e:ParseTree):Code; convert(e:ParseTree):Code; unseq(c:Code):Code; @@ -217,7 +213,7 @@ export convert0(e:ParseTree):Code := ( else Code(localMemoryReferenceCode(nestingDepth(var.frameID,token.dictionary),var.frameindex,token.position)) ) ) - is a:Adjacent do Code(adjacentCode(unseq(c:=convert0(a.lhs)), unseq(cc:=convert0(a.rhs)), combinePositionAdjacent(codePosition(c), codePosition(cc)))) + is a:Adjacent do Code(adjacentCode(convert(a.lhs), convert(a.rhs), treePosition(e))) is p:EmptyParentheses do ( pp := combinePositionL(p.left.position, p.right.position); if p.left.word == leftparen then Code(sequenceCode(CodeSequence(),pp)) diff --git a/M2/Macaulay2/d/parser.d b/M2/Macaulay2/d/parser.d index de7a926093..c1db9ffe45 100644 --- a/M2/Macaulay2/d/parser.d +++ b/M2/Macaulay2/d/parser.d @@ -514,7 +514,11 @@ export unarynew(newToken:Token, file:TokenFile, prec:int, obeylines:bool):ParseT export treePosition(e:ParseTree):Position := ( when e - is a:Adjacent do treePosition(a.lhs) + is a:Adjacent do ( + L := treePosition(a.lhs); + R := treePosition(a.rhs); + -- combine the two positions with focus on endpoint of lhs + Position(L.filename, L.lineL, L.columnL, R.lineR, R.columnR, L.lineR, L.columnR, L.loadDepth)) is p:Parentheses do p.left.position is p:EmptyParentheses do p.left.position is o:Arrow do o.Operator.position diff --git a/M2/Macaulay2/tests/normal/locate.m2 b/M2/Macaulay2/tests/normal/locate.m2 index e8e899e3ed..77c102163e 100644 --- a/M2/Macaulay2/tests/normal/locate.m2 +++ b/M2/Macaulay2/tests/normal/locate.m2 @@ -9,6 +9,26 @@ assert( (drop(toSequence locate C, 1)) === (1,10,1,54,1,43) ); assert( (drop(toSequence locate C_0, 1)) === (1,15,1,19,1,15) ); assert( (drop(toSequence locate C_1, 1)) === (1,29,1,35,1,29) ); assert( (drop(toSequence locate C_2, 1)) === (1,45,1,52,1,45) ); +f = () -> A B C D +assert( ((C = pseudocode functionBody f;)) === null ); +assert( (drop(toSequence locate f, 1)) === (1,4,1,17,1,7) ); +assert( (drop(toSequence locate C, 1)) === (1,10,1,17,1,11) ); +assert( (drop(toSequence locate C_0, 1)) === (1,10,1,11,1,10) ); +assert( (drop(toSequence locate C_1, 1)) === (1,12,1,17,1,13) ); +assert( (drop(toSequence locate C_1_0, 1)) === (1,12,1,13,1,12) ); +assert( (drop(toSequence locate C_1_1, 1)) === (1,14,1,17,1,15) ); +assert( (drop(toSequence locate C_1_1_0, 1)) === (1,14,1,15,1,14) ); +assert( (drop(toSequence locate C_1_1_1, 1)) === (1,16,1,17,1,16) ); +f = () -> ((A B) C) D +assert( ((C = pseudocode functionBody f;)) === null ); +assert( (drop(toSequence locate f, 1)) === (1,4,1,21,1,7) ); +assert( (drop(toSequence locate C, 1)) === (1,10,1,21,1,11) ); +assert( (drop(toSequence locate C_0, 1)) === (1,11,1,18,1,12) ); +assert( (drop(toSequence locate C_1, 1)) === (1,20,1,21,1,20) ); +assert( (drop(toSequence locate C_0_0, 1)) === (1,12,1,15,1,13) ); +assert( (drop(toSequence locate C_0_1, 1)) === (1,17,1,18,1,17) ); +assert( (drop(toSequence locate C_0_0_0, 1)) === (1,12,1,13,1,12) ); +assert( (drop(toSequence locate C_0_0_1, 1)) === (1,14,1,15,1,14) ); end-- -* -- to update this file simply run these lines: @@ -30,4 +50,26 @@ drop(toSequence locate C_0, 1) drop(toSequence locate C_1, 1) drop(toSequence locate C_2, 1) +-- Adjacent +-- 1 1 1 +-- 4 7 0 2 4 +f = () -> A B C +(C = pseudocode functionBody f;) +drop(toSequence locate f, 1) +drop(toSequence locate C, 1) +drop(toSequence locate C_0, 1) +drop(toSequence locate C_1, 1) +drop(toSequence locate C_1_0, 1) +drop(toSequence locate C_1_1, 1) +-- 1 1 1 +-- 4 7 0 3 5 +f = () -> (A B) C +(C = pseudocode functionBody f;) +drop(toSequence locate f, 1) +drop(toSequence locate C, 1) +drop(toSequence locate C_0, 1) +drop(toSequence locate C_1, 1) +drop(toSequence locate C_0_0, 1) +drop(toSequence locate C_0_1, 1) + -- TODO: add tests for other kinds of code as well