Review comments

This commit is contained in:
Mohamed Hegazy 2016-03-29 11:51:04 -07:00
parent 632519ca62
commit 155f4879de
5 changed files with 284 additions and 34 deletions

View File

@ -179,6 +179,32 @@ namespace ts {
return node.pos;
}
export function getEndLinePosition(line: number, sourceFile: SourceFile): number {
Debug.assert(line >= 0);
let lineStarts = getLineStarts(sourceFile);
let lineIndex = line;
if (lineIndex + 1 === lineStarts.length) {
// last line - return EOF
return sourceFile.text.length - 1;
}
else {
// current line start
let start = lineStarts[lineIndex];
// take the start position of the next line -1 = it should be some line break
let pos = lineStarts[lineIndex + 1] - 1;
Debug.assert(isLineBreak(sourceFile.text.charCodeAt(pos)));
// walk backwards skipping line breaks, stop the the beginning of current line.
// i.e:
// <some text>
// $ <- end of line for this position should match the start position
while (start <= pos && isLineBreak(sourceFile.text.charCodeAt(pos))) {
pos--;
}
return pos;
}
}
// Returns true if this node is missing from the actual source code. A 'missing' node is different
// from 'undefined/defined'. When a node is undefined (which can happen for optional nodes
// in the tree), it is definitely missing. However, a node may be defined, but still be
@ -366,18 +392,15 @@ namespace ts {
function getErrorSpanForArrowFunction(sourceFile: SourceFile, node: ArrowFunction): TextSpan {
const pos = skipTrivia(sourceFile.text, node.pos);
if (node.body && node.body.kind === SyntaxKind.Block) {
const {line: startLine } = getLineAndCharacterOfPosition(sourceFile, node.body.pos);
const {line: endLine } = getLineAndCharacterOfPosition(sourceFile, node.body.end);
const { line: startLine } = getLineAndCharacterOfPosition(sourceFile, node.body.pos);
const { line: endLine } = getLineAndCharacterOfPosition(sourceFile, node.body.end);
if (startLine < endLine) {
// The arrow function body spans multiple lines,
// make the error span be the first line.
const endOfFirstLine = getLineStarts(sourceFile)[startLine + 1] - 1;
return createTextSpan(pos, endOfFirstLine - pos);
// The arrow function spans multiple lines,
// make the error span be the first line, inclusive.
return createTextSpan(pos, getEndLinePosition(startLine, sourceFile) - pos + 1);
}
}
return createTextSpanFromBounds(pos, node.end);
}

View File

@ -6,32 +6,6 @@ namespace ts {
list: Node;
}
export function getEndLinePosition(line: number, sourceFile: SourceFile): number {
Debug.assert(line >= 0);
let lineStarts = sourceFile.getLineStarts();
let lineIndex = line;
if (lineIndex + 1 === lineStarts.length) {
// last line - return EOF
return sourceFile.text.length - 1;
}
else {
// current line start
let start = lineStarts[lineIndex];
// take the start position of the next line -1 = it should be some line break
let pos = lineStarts[lineIndex + 1] - 1;
Debug.assert(isLineBreak(sourceFile.text.charCodeAt(pos)));
// walk backwards skipping line breaks, stop the the beginning of current line.
// i.e:
// <some text>
// $ <- end of line for this position should match the start position
while (start <= pos && isLineBreak(sourceFile.text.charCodeAt(pos))) {
pos--;
}
return pos;
}
}
export function getLineStartPositionForPosition(position: number, sourceFile: SourceFile): number {
let lineStarts = sourceFile.getLineStarts();
let line = sourceFile.getLineAndCharacterOfPosition(position).line;

View File

@ -0,0 +1,111 @@
tests/cases/compiler/arrowFunctionErrorSpan.ts(4,3): error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
Type 'void' is not assignable to type 'number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(7,3): error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
Type 'void' is not assignable to type 'number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(12,3): error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
Type 'void' is not assignable to type 'number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(17,3): error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
Type 'void' is not assignable to type 'number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(18,5): error TS1200: Line terminator not permitted before arrow.
tests/cases/compiler/arrowFunctionErrorSpan.ts(21,3): error TS2345: Argument of type '(a: any, b: any, c: any, d: any) => void' is not assignable to parameter of type '() => number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(28,7): error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
Type 'void' is not assignable to type 'number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(32,7): error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
Type 'void' is not assignable to type 'number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(36,7): error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
Type 'void' is not assignable to type 'number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(43,5): error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
Type 'void' is not assignable to type 'number'.
tests/cases/compiler/arrowFunctionErrorSpan.ts(52,3): error TS2345: Argument of type '(_: any) => number' is not assignable to parameter of type '() => number'.
==== tests/cases/compiler/arrowFunctionErrorSpan.ts (11 errors) ====
function f(a: () => number) { }
// oneliner
f(() => { });
~~~~~~~~~
!!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
!!! error TS2345: Type 'void' is not assignable to type 'number'.
// multiline, body
f(() => {
~~~~~~~
!!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
!!! error TS2345: Type 'void' is not assignable to type 'number'.
});
// multiline 2, body
f(() => {
~~~~~~~
!!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
!!! error TS2345: Type 'void' is not assignable to type 'number'.
});
// multiline 3, arrow on a new line
f(()
~~
=> { });
~~~~~~~~~~
!!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
!!! error TS2345: Type 'void' is not assignable to type 'number'.
~~
!!! error TS1200: Line terminator not permitted before arrow.
// multiline 4, arguments
f((a,
~~~
b,
~~~~~~
c,
~~~~~~
d) => { });
~~~~~~~~~~~~~
!!! error TS2345: Argument of type '(a: any, b: any, c: any, d: any) => void' is not assignable to parameter of type '() => number'.
// single line with a comment
f(/*
*/() => { });
~~~~~~~~~
!!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
!!! error TS2345: Type 'void' is not assignable to type 'number'.
// multi line with a comment
f(/*
*/() => { });
~~~~~~~~~
!!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
!!! error TS2345: Type 'void' is not assignable to type 'number'.
// multi line with a comment 2
f(/*
*/() => {
~~~~~~~~
!!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
!!! error TS2345: Type 'void' is not assignable to type 'number'.
});
// multi line with a comment 3
f( // comment 1
// comment 2
() =>
~~~~~
!!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '() => number'.
!!! error TS2345: Type 'void' is not assignable to type 'number'.
// comment 3
{
// comment 4
}
// comment 5
);
// body is not a block
f(_ => 1 +
~~~~~~~~
2);
~~~~~
!!! error TS2345: Argument of type '(_: any) => number' is not assignable to parameter of type '() => number'.

View File

@ -0,0 +1,89 @@
//// [arrowFunctionErrorSpan.ts]
function f(a: () => number) { }
// oneliner
f(() => { });
// multiline, body
f(() => {
});
// multiline 2, body
f(() => {
});
// multiline 3, arrow on a new line
f(()
=> { });
// multiline 4, arguments
f((a,
b,
c,
d) => { });
// single line with a comment
f(/*
*/() => { });
// multi line with a comment
f(/*
*/() => { });
// multi line with a comment 2
f(/*
*/() => {
});
// multi line with a comment 3
f( // comment 1
// comment 2
() =>
// comment 3
{
// comment 4
}
// comment 5
);
// body is not a block
f(_ => 1 +
2);
//// [arrowFunctionErrorSpan.js]
function f(a) { }
// oneliner
f(function () { });
// multiline, body
f(function () {
});
// multiline 2, body
f(function () {
});
// multiline 3, arrow on a new line
f(function () { });
// multiline 4, arguments
f(function (a, b, c, d) { });
// single line with a comment
f(/*
*/ function () { });
// multi line with a comment
f(/*
*/ function () { });
// multi line with a comment 2
f(/*
*/ function () {
});
// multi line with a comment 3
f(// comment 1
// comment 2
function () {
// comment 4
});
// body is not a block
f(function (_) { return 1 +
2; });

View File

@ -0,0 +1,53 @@
function f(a: () => number) { }
// oneliner
f(() => { });
// multiline, body
f(() => {
});
// multiline 2, body
f(() => {
});
// multiline 3, arrow on a new line
f(()
=> { });
// multiline 4, arguments
f((a,
b,
c,
d) => { });
// single line with a comment
f(/*
*/() => { });
// multi line with a comment
f(/*
*/() => { });
// multi line with a comment 2
f(/*
*/() => {
});
// multi line with a comment 3
f( // comment 1
// comment 2
() =>
// comment 3
{
// comment 4
}
// comment 5
);
// body is not a block
f(_ => 1 +
2);