diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 0348469dae1..c0b0d170de8 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2021,6 +2021,22 @@ namespace ts { rangeStartPositionsAreOnSameLine(parentNode, statements[0], currentSourceFile) ); + // e.g: + // case 0: // Zero + // case 1: // One + // case 2: // two + // return "hi"; + // If there is no statements, emitNodeWithComments of the parentNode which is caseClause will take care of trailing comment. + // So in example above, comment "// Zero" and "// One" will be emit in emitTrailingComments in emitNodeWithComments. + // However, for "case 2", because parentNode which is caseClause has an "end" property to be end of the statements (in this case return statement) + // comment "// two" will not be emitted in emitNodeWithComments. + // Therefore, we have to do the check here to emit such comment. + if (statements.length > 0) { + // We use emitTrailingCommentsOfPosition instead of emitLeadingCommentsOfPosition because leading comments is defined as comments before the node after newline character separating it from previous line + // Note: we can't use parentNode.end as such position includes statements. + emitTrailingCommentsOfPosition(statements.pos); + } + if (emitAsSingleStatement) { write(" "); emit(statements[0]); diff --git a/tests/baselines/reference/commentsAfterCaseClauses1.js b/tests/baselines/reference/commentsAfterCaseClauses1.js new file mode 100644 index 00000000000..e12fe703335 --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses1.js @@ -0,0 +1,31 @@ +//// [commentsAfterCaseClauses1.ts] +function getSecurity(level) { + switch(level){ + case 0: // Zero + case 1: // one + case 2: // two + return "Hi"; + case 3: // three + case 4 : // four + return "hello"; + case 5: // five + default: // default + return "world"; + } +} + +//// [commentsAfterCaseClauses1.js] +function getSecurity(level) { + switch (level) { + case 0: // Zero + case 1: // one + case 2:// two + return "Hi"; + case 3: // three + case 4:// four + return "hello"; + case 5: // five + default:// default + return "world"; + } +} diff --git a/tests/baselines/reference/commentsAfterCaseClauses1.symbols b/tests/baselines/reference/commentsAfterCaseClauses1.symbols new file mode 100644 index 00000000000..1ca620c4eb4 --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses1.symbols @@ -0,0 +1,20 @@ +=== tests/cases/compiler/commentsAfterCaseClauses1.ts === +function getSecurity(level) { +>getSecurity : Symbol(getSecurity, Decl(commentsAfterCaseClauses1.ts, 0, 0)) +>level : Symbol(level, Decl(commentsAfterCaseClauses1.ts, 0, 21)) + + switch(level){ +>level : Symbol(level, Decl(commentsAfterCaseClauses1.ts, 0, 21)) + + case 0: // Zero + case 1: // one + case 2: // two + return "Hi"; + case 3: // three + case 4 : // four + return "hello"; + case 5: // five + default: // default + return "world"; + } +} diff --git a/tests/baselines/reference/commentsAfterCaseClauses1.types b/tests/baselines/reference/commentsAfterCaseClauses1.types new file mode 100644 index 00000000000..c7759f1c2e6 --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses1.types @@ -0,0 +1,37 @@ +=== tests/cases/compiler/commentsAfterCaseClauses1.ts === +function getSecurity(level) { +>getSecurity : (level: any) => "Hi" | "hello" | "world" +>level : any + + switch(level){ +>level : any + + case 0: // Zero +>0 : 0 + + case 1: // one +>1 : 1 + + case 2: // two +>2 : 2 + + return "Hi"; +>"Hi" : "Hi" + + case 3: // three +>3 : 3 + + case 4 : // four +>4 : 4 + + return "hello"; +>"hello" : "hello" + + case 5: // five +>5 : 5 + + default: // default + return "world"; +>"world" : "world" + } +} diff --git a/tests/baselines/reference/commentsAfterCaseClauses2.js b/tests/baselines/reference/commentsAfterCaseClauses2.js new file mode 100644 index 00000000000..44cd3c0da74 --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses2.js @@ -0,0 +1,36 @@ +//// [commentsAfterCaseClauses2.ts] +function getSecurity(level) { + switch(level){ + case 0: // Zero + case 1: // one + case 2: // two + // Leading comments + return "Hi"; + case 3: // three + case 4: // four + return "hello"; + case 5: // five + default: // default + return "world"; + // Comment After + } /*Comment 1*/ // Comment After 1 + // Comment After 2 +} + +//// [commentsAfterCaseClauses2.js] +function getSecurity(level) { + switch (level) { + case 0: // Zero + case 1: // one + case 2:// two + // Leading comments + return "Hi"; + case 3: // three + case 4:// four + return "hello"; + case 5: // five + default:// default + return "world"; + } /*Comment 1*/ // Comment After 1 + // Comment After 2 +} diff --git a/tests/baselines/reference/commentsAfterCaseClauses2.symbols b/tests/baselines/reference/commentsAfterCaseClauses2.symbols new file mode 100644 index 00000000000..b68cf18c1b9 --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses2.symbols @@ -0,0 +1,23 @@ +=== tests/cases/compiler/commentsAfterCaseClauses2.ts === +function getSecurity(level) { +>getSecurity : Symbol(getSecurity, Decl(commentsAfterCaseClauses2.ts, 0, 0)) +>level : Symbol(level, Decl(commentsAfterCaseClauses2.ts, 0, 21)) + + switch(level){ +>level : Symbol(level, Decl(commentsAfterCaseClauses2.ts, 0, 21)) + + case 0: // Zero + case 1: // one + case 2: // two + // Leading comments + return "Hi"; + case 3: // three + case 4: // four + return "hello"; + case 5: // five + default: // default + return "world"; + // Comment After + } /*Comment 1*/ // Comment After 1 + // Comment After 2 +} diff --git a/tests/baselines/reference/commentsAfterCaseClauses2.types b/tests/baselines/reference/commentsAfterCaseClauses2.types new file mode 100644 index 00000000000..3b2d2e7688a --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses2.types @@ -0,0 +1,41 @@ +=== tests/cases/compiler/commentsAfterCaseClauses2.ts === +function getSecurity(level) { +>getSecurity : (level: any) => "Hi" | "hello" | "world" +>level : any + + switch(level){ +>level : any + + case 0: // Zero +>0 : 0 + + case 1: // one +>1 : 1 + + case 2: // two +>2 : 2 + + // Leading comments + return "Hi"; +>"Hi" : "Hi" + + case 3: // three +>3 : 3 + + case 4: // four +>4 : 4 + + return "hello"; +>"hello" : "hello" + + case 5: // five +>5 : 5 + + default: // default + return "world"; +>"world" : "world" + + // Comment After + } /*Comment 1*/ // Comment After 1 + // Comment After 2 +} diff --git a/tests/baselines/reference/commentsAfterCaseClauses3.js b/tests/baselines/reference/commentsAfterCaseClauses3.js new file mode 100644 index 00000000000..9538ad06c4f --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses3.js @@ -0,0 +1,34 @@ +//// [commentsAfterCaseClauses3.ts] +function getSecurity(level) { + switch(level){ + case 0: /*Zero*/ + case 1: /*One*/ + case 2: /*two*/ + // Leading comments + return "Hi"; + case 3: /*three*/ + case 4: /*four*/ + return "hello"; + case 5: /*five*/ + default: /*six*/ + return "world"; + } + +} + +//// [commentsAfterCaseClauses3.js] +function getSecurity(level) { + switch (level) { + case 0: /*Zero*/ + case 1: /*One*/ + case 2:/*two*/ + // Leading comments + return "Hi"; + case 3: /*three*/ + case 4:/*four*/ + return "hello"; + case 5: /*five*/ + default:/*six*/ + return "world"; + } +} diff --git a/tests/baselines/reference/commentsAfterCaseClauses3.symbols b/tests/baselines/reference/commentsAfterCaseClauses3.symbols new file mode 100644 index 00000000000..73151cffdd8 --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses3.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/commentsAfterCaseClauses3.ts === +function getSecurity(level) { +>getSecurity : Symbol(getSecurity, Decl(commentsAfterCaseClauses3.ts, 0, 0)) +>level : Symbol(level, Decl(commentsAfterCaseClauses3.ts, 0, 21)) + + switch(level){ +>level : Symbol(level, Decl(commentsAfterCaseClauses3.ts, 0, 21)) + + case 0: /*Zero*/ + case 1: /*One*/ + case 2: /*two*/ + // Leading comments + return "Hi"; + case 3: /*three*/ + case 4: /*four*/ + return "hello"; + case 5: /*five*/ + default: /*six*/ + return "world"; + } + +} diff --git a/tests/baselines/reference/commentsAfterCaseClauses3.types b/tests/baselines/reference/commentsAfterCaseClauses3.types new file mode 100644 index 00000000000..556370f4395 --- /dev/null +++ b/tests/baselines/reference/commentsAfterCaseClauses3.types @@ -0,0 +1,39 @@ +=== tests/cases/compiler/commentsAfterCaseClauses3.ts === +function getSecurity(level) { +>getSecurity : (level: any) => "Hi" | "hello" | "world" +>level : any + + switch(level){ +>level : any + + case 0: /*Zero*/ +>0 : 0 + + case 1: /*One*/ +>1 : 1 + + case 2: /*two*/ +>2 : 2 + + // Leading comments + return "Hi"; +>"Hi" : "Hi" + + case 3: /*three*/ +>3 : 3 + + case 4: /*four*/ +>4 : 4 + + return "hello"; +>"hello" : "hello" + + case 5: /*five*/ +>5 : 5 + + default: /*six*/ + return "world"; +>"world" : "world" + } + +} diff --git a/tests/baselines/reference/parserRealSource1.js b/tests/baselines/reference/parserRealSource1.js index d26e749a667..e41cb2a4b3f 100644 --- a/tests/baselines/reference/parserRealSource1.js +++ b/tests/baselines/reference/parserRealSource1.js @@ -247,28 +247,28 @@ var TypeScript; var addChar = function (index) { var ch = value.charCodeAt(index); switch (ch) { - case 0x09: + case 0x09:// tab result += "\\t"; break; - case 0x0a: + case 0x0a:// line feed result += "\\n"; break; - case 0x0b: + case 0x0b:// vertical tab result += "\\v"; break; - case 0x0c: + case 0x0c:// form feed result += "\\f"; break; - case 0x0d: + case 0x0d:// carriage return result += "\\r"; break; - case 0x22: + case 0x22:// double quote result += "\\\""; break; - case 0x27: + case 0x27:// single quote result += "\\\'"; break; - case 0x5c: + case 0x5c:// Backslash result += "\\"; break; default: diff --git a/tests/baselines/reference/parserindenter.js b/tests/baselines/reference/parserindenter.js index 8beb2393748..17f71318940 100644 --- a/tests/baselines/reference/parserindenter.js +++ b/tests/baselines/reference/parserindenter.js @@ -912,20 +912,20 @@ var Formatting; Indenter.prototype.GetSpecialCaseIndentation = function (token, node) { var indentationInfo = null; switch (token.Token) { - case AuthorTokenKind.atkLCurly: + case AuthorTokenKind.atkLCurly:// { is not part of the tree indentationInfo = this.GetSpecialCaseIndentationForLCurly(node); return indentationInfo; case AuthorTokenKind.atkElse: // else is not part of the tree - case AuthorTokenKind.atkRBrack: + case AuthorTokenKind.atkRBrack:// ] is not part of the tree indentationInfo = node.GetNodeStartLineIndentation(this); return indentationInfo; - case AuthorTokenKind.atkRCurly: + case AuthorTokenKind.atkRCurly:// } is not part of the tree // if '}' is for a body-block, get indentation based on its parent. if (node.AuthorNode.Details.Kind == AuthorParseNodeKind.apnkBlock && node.AuthorNode.EdgeLabel == AuthorParseNodeEdge.apneBody) node = node.Parent; indentationInfo = node.GetNodeStartLineIndentation(this); return indentationInfo; - case AuthorTokenKind.atkWhile: + case AuthorTokenKind.atkWhile:// while (in do-while) is not part of the tree if (node.AuthorNode.Details.Kind == AuthorParseNodeKind.apnkDoWhile) { indentationInfo = node.GetNodeStartLineIndentation(this); return indentationInfo; diff --git a/tests/baselines/reference/switchStatementsWithMultipleDefaults.js b/tests/baselines/reference/switchStatementsWithMultipleDefaults.js index e65e10a0c99..e41d8c016ef 100644 --- a/tests/baselines/reference/switchStatementsWithMultipleDefaults.js +++ b/tests/baselines/reference/switchStatementsWithMultipleDefaults.js @@ -35,7 +35,7 @@ var x = 10; switch (x) { case 1: case 2: - default: + default:// No issues. break; default: // Error; second 'default' clause. default: // Error; third 'default' clause. @@ -43,12 +43,12 @@ switch (x) { x *= x; } switch (x) { - default: + default:// No issues. break; case 100: switch (x * x) { default: // No issues. - default: + default:// Error; second 'default' clause. break; case 10000: x /= x; diff --git a/tests/baselines/reference/switchStatementsWithMultipleDefaults1.js b/tests/baselines/reference/switchStatementsWithMultipleDefaults1.js index 2d52dd761cc..d733ce38a7b 100644 --- a/tests/baselines/reference/switchStatementsWithMultipleDefaults1.js +++ b/tests/baselines/reference/switchStatementsWithMultipleDefaults1.js @@ -17,7 +17,7 @@ var x = 10; switch (x) { case 1: case 2: - default: + default:// No issues. break; default: // Error; second 'default' clause. default: // Error; third 'default' clause. diff --git a/tests/cases/compiler/commentsAfterCaseClauses1.ts b/tests/cases/compiler/commentsAfterCaseClauses1.ts new file mode 100644 index 00000000000..8b494161584 --- /dev/null +++ b/tests/cases/compiler/commentsAfterCaseClauses1.ts @@ -0,0 +1,14 @@ +function getSecurity(level) { + switch(level){ + case 0: // Zero + case 1: // one + case 2: // two + return "Hi"; + case 3: // three + case 4 : // four + return "hello"; + case 5: // five + default: // default + return "world"; + } +} \ No newline at end of file diff --git a/tests/cases/compiler/commentsAfterCaseClauses2.ts b/tests/cases/compiler/commentsAfterCaseClauses2.ts new file mode 100644 index 00000000000..9c35b80894e --- /dev/null +++ b/tests/cases/compiler/commentsAfterCaseClauses2.ts @@ -0,0 +1,17 @@ +function getSecurity(level) { + switch(level){ + case 0: // Zero + case 1: // one + case 2: // two + // Leading comments + return "Hi"; + case 3: // three + case 4: // four + return "hello"; + case 5: // five + default: // default + return "world"; + // Comment After + } /*Comment 1*/ // Comment After 1 + // Comment After 2 +} \ No newline at end of file diff --git a/tests/cases/compiler/commentsAfterCaseClauses3.ts b/tests/cases/compiler/commentsAfterCaseClauses3.ts new file mode 100644 index 00000000000..894e743c2e7 --- /dev/null +++ b/tests/cases/compiler/commentsAfterCaseClauses3.ts @@ -0,0 +1,16 @@ +function getSecurity(level) { + switch(level){ + case 0: /*Zero*/ + case 1: /*One*/ + case 2: /*two*/ + // Leading comments + return "Hi"; + case 3: /*three*/ + case 4: /*four*/ + return "hello"; + case 5: /*five*/ + default: /*six*/ + return "world"; + } + +} \ No newline at end of file