diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index e307b21979e..dea27d0f8d0 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -16,7 +16,7 @@ namespace ts.BreakpointResolver { let tokenAtLocation = getTokenAtPosition(sourceFile, position); let lineOfPosition = sourceFile.getLineAndCharacterOfPosition(position).line; - if (sourceFile.getLineAndCharacterOfPosition(tokenAtLocation.getStart()).line > lineOfPosition) { + if (sourceFile.getLineAndCharacterOfPosition(tokenAtLocation.getStart(sourceFile)).line > lineOfPosition) { // Get previous token if the token is returned starts on new line // eg: let x =10; |--- cursor is here // let y = 10; @@ -39,16 +39,20 @@ namespace ts.BreakpointResolver { return spanInNode(tokenAtLocation); function textSpan(startNode: Node, endNode?: Node) { - return createTextSpanFromBounds(startNode.getStart(), (endNode || startNode).getEnd()); + return createTextSpanFromBounds(startNode.getStart(sourceFile), (endNode || startNode).getEnd()); } function spanInNodeIfStartsOnSameLine(node: Node, otherwiseOnNode?: Node): TextSpan { - if (node && lineOfPosition === sourceFile.getLineAndCharacterOfPosition(node.getStart()).line) { + if (node && lineOfPosition === sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line) { return spanInNode(node); } return spanInNode(otherwiseOnNode); } + function spanInNodeArray(nodeArray: NodeArray) { + return createTextSpanFromBounds(skipTrivia(sourceFile.text, nodeArray.pos), nodeArray.end); + } + function spanInPreviousNode(node: Node): TextSpan { return spanInNode(findPrecedingToken(node.pos, sourceFile)); } @@ -65,6 +69,11 @@ namespace ts.BreakpointResolver { return spanInPreviousNode(node); } + if (node.parent.kind === SyntaxKind.Decorator) { + // Set breakpoint on the decorator emit + return spanInNode(node.parent); + } + if (node.parent.kind === SyntaxKind.ForStatement) { // For now lets set the span on this expression, fix it later return textSpan(node); @@ -207,6 +216,9 @@ namespace ts.BreakpointResolver { // span in statement return spanInNode((node).statement); + case SyntaxKind.Decorator: + return spanInNodeArray(node.parent.decorators); + // No breakpoint in interface, type alias case SyntaxKind.InterfaceDeclaration: case SyntaxKind.TypeAliasDeclaration: diff --git a/tests/baselines/reference/bpSpan_decorators.baseline b/tests/baselines/reference/bpSpan_decorators.baseline index dc7a9556d07..bba31d1df40 100644 --- a/tests/baselines/reference/bpSpan_decorators.baseline +++ b/tests/baselines/reference/bpSpan_decorators.baseline @@ -29,7 +29,7 @@ -------------------------------- 8 >@ClassDecorator1 - ~~~~~~~~~~~~~~~~~ => Pos: (594 to 610) SpanInfo: {"start":594,"length":952} + ~ => Pos: (594 to 594) SpanInfo: {"start":594,"length":952} >@ClassDecorator1 >@ClassDecorator2(10) >class Greeter { @@ -78,63 +78,19 @@ > } >} >:=> (line 8, col 0) to (line 54, col 1) +8 >@ClassDecorator1 + + ~~~~~~~~~~~~~~~~ => Pos: (595 to 610) SpanInfo: {"start":595,"length":36} + >ClassDecorator1 + >@ClassDecorator2(10) + >:=> (line 8, col 1) to (line 9, col 20) -------------------------------- 9 >@ClassDecorator2(10) - ~ => Pos: (611 to 611) SpanInfo: {"start":594,"length":952} - >@ClassDecorator1 + ~~~~~~~~~~~~~~~~~~~~~ => Pos: (611 to 631) SpanInfo: {"start":595,"length":36} + >ClassDecorator1 >@ClassDecorator2(10) - >class Greeter { - > constructor( - > @ParameterDecorator1 - > @ParameterDecorator2(20) - > public greeting: string, - > - > @ParameterDecorator1 - > @ParameterDecorator2(30) - > ...b: string[]) { - > } - > - > @PropertyDecorator1 - > @PropertyDecorator2(40) - > greet() { - > return "

" + this.greeting + "

"; - > } - > - > @PropertyDecorator1 - > @PropertyDecorator2(50) - > private x: string; - > - > @PropertyDecorator1 - > @PropertyDecorator2(60) - > private static x1: number = 10; - > - > private fn( - > @ParameterDecorator1 - > @ParameterDecorator2(70) - > x: number) { - > return this.greeting; - > } - > - > @PropertyDecorator1 - > @PropertyDecorator2(80) - > get greetings() { - > return this.greeting; - > } - > - > set greetings( - > @ParameterDecorator1 - > @ParameterDecorator2(90) - > greetings: string) { - > this.greeting = greetings; - > } - >} - >:=> (line 8, col 0) to (line 54, col 1) -9 >@ClassDecorator2(10) - - ~~~~~~~~~~~~~~~~~~~~ => Pos: (612 to 631) SpanInfo: {"start":612,"length":19} - >ClassDecorator2(10) - >:=> (line 9, col 1) to (line 9, col 20) + >:=> (line 8, col 1) to (line 9, col 20) -------------------------------- 10 >class Greeter { @@ -196,24 +152,24 @@ -------------------------------- 12 > @ParameterDecorator1 - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (665 to 693) SpanInfo: {"start":673,"length":85} + ~~~~~~~~~ => Pos: (665 to 673) SpanInfo: {"start":673,"length":85} >@ParameterDecorator1 > @ParameterDecorator2(20) > public greeting: string >:=> (line 12, col 8) to (line 14, col 31) +12 > @ParameterDecorator1 + + ~~~~~~~~~~~~~~~~~~~~ => Pos: (674 to 693) SpanInfo: {"start":674,"length":52} + >ParameterDecorator1 + > @ParameterDecorator2(20) + >:=> (line 12, col 9) to (line 13, col 32) -------------------------------- 13 > @ParameterDecorator2(20) - ~~~~~~~~~ => Pos: (694 to 702) SpanInfo: {"start":673,"length":85} - >@ParameterDecorator1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (694 to 726) SpanInfo: {"start":674,"length":52} + >ParameterDecorator1 > @ParameterDecorator2(20) - > public greeting: string - >:=> (line 12, col 8) to (line 14, col 31) -13 > @ParameterDecorator2(20) - - ~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (703 to 726) SpanInfo: {"start":703,"length":23} - >ParameterDecorator2(20) - >:=> (line 13, col 9) to (line 13, col 32) + >:=> (line 12, col 9) to (line 13, col 32) -------------------------------- 14 > public greeting: string, @@ -229,24 +185,24 @@ -------------------------------- 16 > @ParameterDecorator1 - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (761 to 789) SpanInfo: {"start":769,"length":80} + ~~~~~~~~~ => Pos: (761 to 769) SpanInfo: {"start":769,"length":80} >@ParameterDecorator1 > @ParameterDecorator2(30) > ...b: string[] >:=> (line 16, col 8) to (line 18, col 26) +16 > @ParameterDecorator1 + + ~~~~~~~~~~~~~~~~~~~~ => Pos: (770 to 789) SpanInfo: {"start":770,"length":52} + >ParameterDecorator1 + > @ParameterDecorator2(30) + >:=> (line 16, col 9) to (line 17, col 32) -------------------------------- 17 > @ParameterDecorator2(30) - ~~~~~~~~~ => Pos: (790 to 798) SpanInfo: {"start":769,"length":80} - >@ParameterDecorator1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (790 to 822) SpanInfo: {"start":770,"length":52} + >ParameterDecorator1 > @ParameterDecorator2(30) - > ...b: string[] - >:=> (line 16, col 8) to (line 18, col 26) -17 > @ParameterDecorator2(30) - - ~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (799 to 822) SpanInfo: {"start":799,"length":23} - >ParameterDecorator2(30) - >:=> (line 17, col 9) to (line 17, col 32) + >:=> (line 16, col 9) to (line 17, col 32) -------------------------------- 18 > ...b: string[]) { @@ -273,28 +229,26 @@ -------------------------------- 21 > @PropertyDecorator1 - ~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (860 to 883) SpanInfo: {"start":864,"length":116} + ~~~~~ => Pos: (860 to 864) SpanInfo: {"start":864,"length":116} >@PropertyDecorator1 > @PropertyDecorator2(40) > greet() { > return "

" + this.greeting + "

"; > } >:=> (line 21, col 4) to (line 25, col 5) +21 > @PropertyDecorator1 + + ~~~~~~~~~~~~~~~~~~~ => Pos: (865 to 883) SpanInfo: {"start":865,"length":46} + >PropertyDecorator1 + > @PropertyDecorator2(40) + >:=> (line 21, col 5) to (line 22, col 27) -------------------------------- 22 > @PropertyDecorator2(40) - ~~~~~ => Pos: (884 to 888) SpanInfo: {"start":864,"length":116} - >@PropertyDecorator1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (884 to 911) SpanInfo: {"start":865,"length":46} + >PropertyDecorator1 > @PropertyDecorator2(40) - > greet() { - > return "

" + this.greeting + "

"; - > } - >:=> (line 21, col 4) to (line 25, col 5) -22 > @PropertyDecorator2(40) - - ~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (889 to 911) SpanInfo: {"start":889,"length":22} - >PropertyDecorator2(40) - >:=> (line 22, col 5) to (line 22, col 27) + >:=> (line 21, col 5) to (line 22, col 27) -------------------------------- 23 > greet() { @@ -329,16 +283,20 @@ -------------------------------- 27 > @PropertyDecorator1 - ~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (982 to 1005) SpanInfo: undefined + ~~~~~ => Pos: (982 to 986) SpanInfo: undefined +27 > @PropertyDecorator1 + + ~~~~~~~~~~~~~~~~~~~ => Pos: (987 to 1005) SpanInfo: {"start":987,"length":46} + >PropertyDecorator1 + > @PropertyDecorator2(50) + >:=> (line 27, col 5) to (line 28, col 27) -------------------------------- 28 > @PropertyDecorator2(50) - ~~~~~ => Pos: (1006 to 1010) SpanInfo: undefined -28 > @PropertyDecorator2(50) - - ~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1011 to 1033) SpanInfo: {"start":1011,"length":22} - >PropertyDecorator2(50) - >:=> (line 28, col 5) to (line 28, col 27) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1006 to 1033) SpanInfo: {"start":987,"length":46} + >PropertyDecorator1 + > @PropertyDecorator2(50) + >:=> (line 27, col 5) to (line 28, col 27) -------------------------------- 29 > private x: string; @@ -350,24 +308,24 @@ -------------------------------- 31 > @PropertyDecorator1 - ~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1058 to 1081) SpanInfo: {"start":1062,"length":83} + ~~~~~ => Pos: (1058 to 1062) SpanInfo: {"start":1062,"length":83} >@PropertyDecorator1 > @PropertyDecorator2(60) > private static x1: number = 10; >:=> (line 31, col 4) to (line 33, col 35) +31 > @PropertyDecorator1 + + ~~~~~~~~~~~~~~~~~~~ => Pos: (1063 to 1081) SpanInfo: {"start":1063,"length":46} + >PropertyDecorator1 + > @PropertyDecorator2(60) + >:=> (line 31, col 5) to (line 32, col 27) -------------------------------- 32 > @PropertyDecorator2(60) - ~~~~~ => Pos: (1082 to 1086) SpanInfo: {"start":1062,"length":83} - >@PropertyDecorator1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1082 to 1109) SpanInfo: {"start":1063,"length":46} + >PropertyDecorator1 > @PropertyDecorator2(60) - > private static x1: number = 10; - >:=> (line 31, col 4) to (line 33, col 35) -32 > @PropertyDecorator2(60) - - ~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1087 to 1109) SpanInfo: {"start":1087,"length":22} - >PropertyDecorator2(60) - >:=> (line 32, col 5) to (line 32, col 27) + >:=> (line 31, col 5) to (line 32, col 27) -------------------------------- 33 > private static x1: number = 10; @@ -394,20 +352,22 @@ -------------------------------- 36 > @ParameterDecorator1 - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1163 to 1191) SpanInfo: {"start":1254,"length":20} + ~~~~~~~~~ => Pos: (1163 to 1171) SpanInfo: {"start":1254,"length":20} >return this.greeting >:=> (line 39, col 8) to (line 39, col 28) +36 > @ParameterDecorator1 + + ~~~~~~~~~~~~~~~~~~~~ => Pos: (1172 to 1191) SpanInfo: {"start":1172,"length":52} + >ParameterDecorator1 + > @ParameterDecorator2(70) + >:=> (line 36, col 9) to (line 37, col 32) -------------------------------- 37 > @ParameterDecorator2(70) - ~~~~~~~~~ => Pos: (1192 to 1200) SpanInfo: {"start":1254,"length":20} - >return this.greeting - >:=> (line 39, col 8) to (line 39, col 28) -37 > @ParameterDecorator2(70) - - ~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1201 to 1224) SpanInfo: {"start":1201,"length":23} - >ParameterDecorator2(70) - >:=> (line 37, col 9) to (line 37, col 32) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1192 to 1224) SpanInfo: {"start":1172,"length":52} + >ParameterDecorator1 + > @ParameterDecorator2(70) + >:=> (line 36, col 9) to (line 37, col 32) -------------------------------- 38 > x: number) { @@ -433,28 +393,26 @@ -------------------------------- 42 > @PropertyDecorator1 - ~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1283 to 1306) SpanInfo: {"start":1287,"length":105} + ~~~~~ => Pos: (1283 to 1287) SpanInfo: {"start":1287,"length":105} >@PropertyDecorator1 > @PropertyDecorator2(80) > get greetings() { > return this.greeting; > } >:=> (line 42, col 4) to (line 46, col 5) +42 > @PropertyDecorator1 + + ~~~~~~~~~~~~~~~~~~~ => Pos: (1288 to 1306) SpanInfo: {"start":1288,"length":46} + >PropertyDecorator1 + > @PropertyDecorator2(80) + >:=> (line 42, col 5) to (line 43, col 27) -------------------------------- 43 > @PropertyDecorator2(80) - ~~~~~ => Pos: (1307 to 1311) SpanInfo: {"start":1287,"length":105} - >@PropertyDecorator1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1307 to 1334) SpanInfo: {"start":1288,"length":46} + >PropertyDecorator1 > @PropertyDecorator2(80) - > get greetings() { - > return this.greeting; - > } - >:=> (line 42, col 4) to (line 46, col 5) -43 > @PropertyDecorator2(80) - - ~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1312 to 1334) SpanInfo: {"start":1312,"length":22} - >PropertyDecorator2(80) - >:=> (line 43, col 5) to (line 43, col 27) + >:=> (line 42, col 5) to (line 43, col 27) -------------------------------- 44 > get greetings() { @@ -500,20 +458,22 @@ -------------------------------- 49 > @ParameterDecorator1 - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1413 to 1441) SpanInfo: {"start":1512,"length":25} + ~~~~~~~~~ => Pos: (1413 to 1421) SpanInfo: {"start":1512,"length":25} >this.greeting = greetings >:=> (line 52, col 8) to (line 52, col 33) +49 > @ParameterDecorator1 + + ~~~~~~~~~~~~~~~~~~~~ => Pos: (1422 to 1441) SpanInfo: {"start":1422,"length":52} + >ParameterDecorator1 + > @ParameterDecorator2(90) + >:=> (line 49, col 9) to (line 50, col 32) -------------------------------- 50 > @ParameterDecorator2(90) - ~~~~~~~~~ => Pos: (1442 to 1450) SpanInfo: {"start":1512,"length":25} - >this.greeting = greetings - >:=> (line 52, col 8) to (line 52, col 33) -50 > @ParameterDecorator2(90) - - ~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1451 to 1474) SpanInfo: {"start":1451,"length":23} - >ParameterDecorator2(90) - >:=> (line 50, col 9) to (line 50, col 32) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (1442 to 1474) SpanInfo: {"start":1422,"length":52} + >ParameterDecorator1 + > @ParameterDecorator2(90) + >:=> (line 49, col 9) to (line 50, col 32) -------------------------------- 51 > greetings: string) {