Skip to content

Commit c424fad

Browse files
Merge pull request microsoft#2255 from Microsoft/returnStatus
Address omitted return keyword.
2 parents ac56aa5 + 7570aaa commit c424fad

75 files changed

Lines changed: 748 additions & 160 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/compiler/emitter.ts

Lines changed: 91 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2918,6 +2918,7 @@ module ts {
29182918
function createPropertyAccessExpression(expression: LeftHandSideExpression, name: Identifier): PropertyAccessExpression {
29192919
var result = <PropertyAccessExpression>createSynthesizedNode(SyntaxKind.PropertyAccessExpression);
29202920
result.expression = expression;
2921+
result.dotToken = createSynthesizedNode(SyntaxKind.DotToken);
29212922
result.name = name;
29222923

29232924
return result;
@@ -3033,13 +3034,38 @@ module ts {
30333034
return false;
30343035
}
30353036

3037+
function indentIfOnDifferentLines(parent: Node, node1: Node, node2: Node) {
3038+
var isSynthesized = nodeIsSynthesized(parent);
3039+
3040+
var realNodesAreOnDifferentLines = !isSynthesized && !nodeEndIsOnSameLineAsNodeStart(node1, node2);
3041+
var synthesizedNodeIsOnDifferentLine = synthesizedNodeStartsOnNewLine(node2);
3042+
if (realNodesAreOnDifferentLines || synthesizedNodeIsOnDifferentLine) {
3043+
increaseIndent();
3044+
writeLine();
3045+
return true;
3046+
}
3047+
3048+
return false;
3049+
}
3050+
30363051
function emitPropertyAccess(node: PropertyAccessExpression) {
30373052
if (tryEmitConstantValue(node)) {
30383053
return;
30393054
}
3055+
30403056
emit(node.expression);
3057+
3058+
var indented = indentIfOnDifferentLines(node, node.expression, node.dotToken);
3059+
30413060
write(".");
3061+
3062+
indented = indented || indentIfOnDifferentLines(node, node.dotToken, node.name);
3063+
30423064
emit(node.name);
3065+
3066+
if (indented) {
3067+
decreaseIndent();
3068+
}
30433069
}
30443070

30453071
function emitQualifiedName(node: QualifiedName) {
@@ -3273,25 +3299,31 @@ module ts {
32733299
else {
32743300
emit(node.left);
32753301

3276-
if (node.operatorToken.kind !== SyntaxKind.CommaToken) {
3302+
// If there was a newline between the left side of the binary expression and the
3303+
// operator, then try to preserve that.
3304+
var indented1 = indentIfOnDifferentLines(node, node.left, node.operatorToken);
3305+
3306+
// Otherwise just emit the operator right afterwards. For everything but
3307+
// comma, emit a space before the operator.
3308+
if (!indented1 && node.operatorToken.kind !== SyntaxKind.CommaToken) {
32773309
write(" ");
32783310
}
32793311

32803312
write(tokenToString(node.operatorToken.kind));
32813313

3282-
var shouldPlaceOnNewLine = !nodeIsSynthesized(node) && !nodeEndIsOnSameLineAsNodeStart(node.operatorToken, node.right);
3283-
3284-
// Check if the right expression is on a different line versus the operator itself. If so,
3285-
// we'll emit newline.
3286-
if (shouldPlaceOnNewLine || synthesizedNodeStartsOnNewLine(node.right)) {
3287-
increaseIndent();
3288-
writeLine();
3289-
emit(node.right);
3290-
decreaseIndent();
3314+
if (!indented1) {
3315+
var indented2 = indentIfOnDifferentLines(node, node.operatorToken, node.right);
32913316
}
3292-
else {
3317+
3318+
if (!indented2) {
32933319
write(" ");
3294-
emit(node.right);
3320+
}
3321+
3322+
emit(node.right);
3323+
3324+
// If we indented the left or the right side, then dedent now.
3325+
if (indented1 || indented2) {
3326+
decreaseIndent();
32953327
}
32963328
}
32973329
}
@@ -3302,10 +3334,45 @@ module ts {
33023334

33033335
function emitConditionalExpression(node: ConditionalExpression) {
33043336
emit(node.condition);
3305-
write(" ? ");
3337+
var indent1 = indentIfOnDifferentLines(node, node.condition, node.questionToken);
3338+
if (!indent1) {
3339+
write(" ");
3340+
}
3341+
3342+
write("?");
3343+
3344+
if (!indent1) {
3345+
var indent2 = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue);
3346+
}
3347+
3348+
if (!indent2) {
3349+
write(" ");
3350+
}
3351+
33063352
emit(node.whenTrue);
3307-
write(" : ");
3353+
3354+
if (indent1 || indent2) {
3355+
decreaseIndent();
3356+
}
3357+
3358+
var indent3 = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken);
3359+
if (!indent3) {
3360+
write(" ");
3361+
}
3362+
3363+
write(":");
3364+
if (!indent3) {
3365+
var indent4 = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse);
3366+
}
3367+
3368+
if (!indent4) {
3369+
write(" ");
3370+
}
3371+
33083372
emit(node.whenFalse);
3373+
if (indent3 || indent4) {
3374+
decreaseIndent();
3375+
}
33093376
}
33103377

33113378
function isSingleLineEmptyBlock(node: Node) {
@@ -3678,10 +3745,16 @@ module ts {
36783745
equals.left = value;
36793746
equals.operatorToken = createSynthesizedNode(SyntaxKind.EqualsEqualsEqualsToken);
36803747
equals.right = createVoidZero();
3748+
return createConditionalExpression(equals, defaultValue, value);
3749+
}
3750+
3751+
function createConditionalExpression(condition: Expression, whenTrue: Expression, whenFalse: Expression) {
36813752
var cond = <ConditionalExpression>createSynthesizedNode(SyntaxKind.ConditionalExpression);
3682-
cond.condition = equals;
3683-
cond.whenTrue = defaultValue;
3684-
cond.whenFalse = value;
3753+
cond.condition = condition;
3754+
cond.questionToken = createSynthesizedNode(SyntaxKind.QuestionToken);
3755+
cond.whenTrue = whenTrue;
3756+
cond.colonToken = createSynthesizedNode(SyntaxKind.ColonToken);
3757+
cond.whenFalse = whenFalse;
36853758
return cond;
36863759
}
36873760

@@ -3704,10 +3777,7 @@ module ts {
37043777
if (propName.kind !== SyntaxKind.Identifier) {
37053778
return createElementAccess(object, propName);
37063779
}
3707-
var node = <PropertyAccessExpression>createSynthesizedNode(SyntaxKind.PropertyAccessExpression);
3708-
node.expression = parenthesizeForAccess(object);
3709-
node.name = propName;
3710-
return node;
3780+
return createPropertyAccessExpression(parenthesizeForAccess(object), propName);
37113781
}
37123782

37133783
function createElementAccess(object: Expression, index: Expression): Expression {

src/compiler/parser.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ module ts {
120120
return visitNodes(cbNodes, (<ObjectLiteralExpression>node).properties);
121121
case SyntaxKind.PropertyAccessExpression:
122122
return visitNode(cbNode, (<PropertyAccessExpression>node).expression) ||
123+
visitNode(cbNode, (<PropertyAccessExpression>node).dotToken) ||
123124
visitNode(cbNode, (<PropertyAccessExpression>node).name);
124125
case SyntaxKind.ElementAccessExpression:
125126
return visitNode(cbNode, (<ElementAccessExpression>node).expression) ||
@@ -156,7 +157,9 @@ module ts {
156157
visitNode(cbNode, (<BinaryExpression>node).right);
157158
case SyntaxKind.ConditionalExpression:
158159
return visitNode(cbNode, (<ConditionalExpression>node).condition) ||
160+
visitNode(cbNode, (<ConditionalExpression>node).questionToken) ||
159161
visitNode(cbNode, (<ConditionalExpression>node).whenTrue) ||
162+
visitNode(cbNode, (<ConditionalExpression>node).colonToken) ||
160163
visitNode(cbNode, (<ConditionalExpression>node).whenFalse);
161164
case SyntaxKind.SpreadElementExpression:
162165
return visitNode(cbNode, (<SpreadElementExpression>node).expression);
@@ -1327,13 +1330,16 @@ module ts {
13271330

13281331
function parseOptionalToken(t: SyntaxKind): Node {
13291332
if (token === t) {
1330-
var node = createNode(t);
1331-
nextToken();
1332-
return finishNode(node);
1333+
return parseTokenNode();
13331334
}
13341335
return undefined;
13351336
}
13361337

1338+
function parseExpectedToken(t: SyntaxKind, reportAtCurrentPosition: boolean, diagnosticMessage: DiagnosticMessage, arg0?: any): Node {
1339+
return parseOptionalToken(t) ||
1340+
createMissingNode(t, reportAtCurrentPosition, diagnosticMessage, arg0);
1341+
}
1342+
13371343
function parseTokenNode<T extends Node>(): T {
13381344
var node = <T>createNode(token);
13391345
nextToken();
@@ -2162,8 +2168,7 @@ module ts {
21622168
literal = parseLiteralNode();
21632169
}
21642170
else {
2165-
literal = <LiteralExpression>createMissingNode(
2166-
SyntaxKind.TemplateTail, /*reportAtCurrentPosition:*/ false, Diagnostics._0_expected, tokenToString(SyntaxKind.CloseBraceToken));
2171+
literal = <LiteralExpression>parseExpectedToken(SyntaxKind.TemplateTail, /*reportAtCurrentPosition:*/ false, Diagnostics._0_expected, tokenToString(SyntaxKind.CloseBraceToken));
21672172
}
21682173

21692174
span.literal = literal;
@@ -3186,16 +3191,19 @@ module ts {
31863191

31873192
function parseConditionalExpressionRest(leftOperand: Expression): Expression {
31883193
// Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher.
3189-
if (!parseOptional(SyntaxKind.QuestionToken)) {
3194+
var questionToken = parseOptionalToken(SyntaxKind.QuestionToken);
3195+
if (!questionToken) {
31903196
return leftOperand;
31913197
}
31923198

31933199
// Note: we explicitly 'allowIn' in the whenTrue part of the condition expression, and
31943200
// we do not that for the 'whenFalse' part.
31953201
var node = <ConditionalExpression>createNode(SyntaxKind.ConditionalExpression, leftOperand.pos);
31963202
node.condition = leftOperand;
3203+
node.questionToken = questionToken;
31973204
node.whenTrue = allowInAnd(parseAssignmentExpressionOrHigher);
3198-
parseExpected(SyntaxKind.ColonToken);
3205+
node.colonToken = parseExpectedToken(SyntaxKind.ColonToken, /*reportAtCurrentPosition:*/ false,
3206+
Diagnostics._0_expected, tokenToString(SyntaxKind.ColonToken));
31993207
node.whenFalse = parseAssignmentExpressionOrHigher();
32003208
return finishNode(node);
32013209
}
@@ -3458,7 +3466,7 @@ module ts {
34583466
// If it wasn't then just try to parse out a '.' and report an error.
34593467
var node = <PropertyAccessExpression>createNode(SyntaxKind.PropertyAccessExpression, expression.pos);
34603468
node.expression = expression;
3461-
parseExpected(SyntaxKind.DotToken, Diagnostics.super_must_be_followed_by_an_argument_list_or_member_access);
3469+
node.dotToken = parseExpectedToken(SyntaxKind.DotToken, /*reportAtCurrentPosition:*/ false, Diagnostics.super_must_be_followed_by_an_argument_list_or_member_access);
34623470
node.name = parseRightSideOfDot(/*allowIdentifierNames:*/ true);
34633471
return finishNode(node);
34643472
}
@@ -3474,10 +3482,11 @@ module ts {
34743482

34753483
function parseMemberExpressionRest(expression: LeftHandSideExpression): MemberExpression {
34763484
while (true) {
3477-
var dotOrBracketStart = scanner.getTokenPos();
3478-
if (parseOptional(SyntaxKind.DotToken)) {
3485+
var dotToken = parseOptionalToken(SyntaxKind.DotToken);
3486+
if (dotToken) {
34793487
var propertyAccess = <PropertyAccessExpression>createNode(SyntaxKind.PropertyAccessExpression, expression.pos);
34803488
propertyAccess.expression = expression;
3489+
propertyAccess.dotToken = dotToken;
34813490
propertyAccess.name = parseRightSideOfDot(/*allowIdentifierNames:*/ true);
34823491
expression = finishNode(propertyAccess);
34833492
continue;

src/compiler/tsc.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ module ts {
411411
// The emitter emitted something, inform the caller if that happened in the presence
412412
// of diagnostics or not.
413413
if (diagnostics.length > 0 || emitOutput.diagnostics.length > 0) {
414-
ExitStatus.DiagnosticsPresent_OutputsGenerated;
414+
return ExitStatus.DiagnosticsPresent_OutputsGenerated;
415415
}
416416

417417
return ExitStatus.Success;

src/compiler/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,9 @@ module ts {
641641

642642
export interface ConditionalExpression extends Expression {
643643
condition: Expression;
644+
questionToken: Node;
644645
whenTrue: Expression;
646+
colonToken: Node;
645647
whenFalse: Expression;
646648
}
647649

@@ -694,6 +696,7 @@ module ts {
694696

695697
export interface PropertyAccessExpression extends MemberExpression {
696698
expression: LeftHandSideExpression;
699+
dotToken: Node;
697700
name: Identifier;
698701
}
699702

tests/baselines/reference/APISample_compile.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,9 @@ declare module "typescript" {
543543
}
544544
interface ConditionalExpression extends Expression {
545545
condition: Expression;
546+
questionToken: Node;
546547
whenTrue: Expression;
548+
colonToken: Node;
547549
whenFalse: Expression;
548550
}
549551
interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclaration {
@@ -580,6 +582,7 @@ declare module "typescript" {
580582
}
581583
interface PropertyAccessExpression extends MemberExpression {
582584
expression: LeftHandSideExpression;
585+
dotToken: Node;
583586
name: Identifier;
584587
}
585588
interface ElementAccessExpression extends MemberExpression {

tests/baselines/reference/APISample_compile.types

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1636,10 +1636,18 @@ declare module "typescript" {
16361636
>condition : Expression
16371637
>Expression : Expression
16381638

1639+
questionToken: Node;
1640+
>questionToken : Node
1641+
>Node : Node
1642+
16391643
whenTrue: Expression;
16401644
>whenTrue : Expression
16411645
>Expression : Expression
16421646

1647+
colonToken: Node;
1648+
>colonToken : Node
1649+
>Node : Node
1650+
16431651
whenFalse: Expression;
16441652
>whenFalse : Expression
16451653
>Expression : Expression
@@ -1746,6 +1754,10 @@ declare module "typescript" {
17461754
>expression : LeftHandSideExpression
17471755
>LeftHandSideExpression : LeftHandSideExpression
17481756

1757+
dotToken: Node;
1758+
>dotToken : Node
1759+
>Node : Node
1760+
17491761
name: Identifier;
17501762
>name : Identifier
17511763
>Identifier : Identifier

tests/baselines/reference/APISample_linter.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,9 @@ declare module "typescript" {
574574
}
575575
interface ConditionalExpression extends Expression {
576576
condition: Expression;
577+
questionToken: Node;
577578
whenTrue: Expression;
579+
colonToken: Node;
578580
whenFalse: Expression;
579581
}
580582
interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclaration {
@@ -611,6 +613,7 @@ declare module "typescript" {
611613
}
612614
interface PropertyAccessExpression extends MemberExpression {
613615
expression: LeftHandSideExpression;
616+
dotToken: Node;
614617
name: Identifier;
615618
}
616619
interface ElementAccessExpression extends MemberExpression {

tests/baselines/reference/APISample_linter.types

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,10 +1782,18 @@ declare module "typescript" {
17821782
>condition : Expression
17831783
>Expression : Expression
17841784

1785+
questionToken: Node;
1786+
>questionToken : Node
1787+
>Node : Node
1788+
17851789
whenTrue: Expression;
17861790
>whenTrue : Expression
17871791
>Expression : Expression
17881792

1793+
colonToken: Node;
1794+
>colonToken : Node
1795+
>Node : Node
1796+
17891797
whenFalse: Expression;
17901798
>whenFalse : Expression
17911799
>Expression : Expression
@@ -1892,6 +1900,10 @@ declare module "typescript" {
18921900
>expression : LeftHandSideExpression
18931901
>LeftHandSideExpression : LeftHandSideExpression
18941902

1903+
dotToken: Node;
1904+
>dotToken : Node
1905+
>Node : Node
1906+
18951907
name: Identifier;
18961908
>name : Identifier
18971909
>Identifier : Identifier

0 commit comments

Comments
 (0)