Fixed labels

This commit is contained in:
Ron Buckton
2016-03-02 16:55:25 -08:00
parent aaf3ab7406
commit c267691d8a
4 changed files with 65 additions and 8 deletions
+4
View File
@@ -1498,6 +1498,10 @@ namespace ts {
}
export function parenthesizeExpressionForList(expression: Expression) {
if (expression.kind === SyntaxKind.OmittedExpression) {
return expression;
}
const expressionPrecedence = getExpressionPrecedence(expression);
const commaPrecedence = getOperatorPrecedence(SyntaxKind.BinaryExpression, SyntaxKind.CommaToken);
return expressionPrecedence > commaPrecedence
+16 -1
View File
@@ -827,6 +827,13 @@ const _super = (function (geti, seti) {
else {
write(text);
}
if (node.kind === SyntaxKind.NumericLiteral) {
const trailingComment = (<NumericLiteral>node).trailingComment;
if (trailingComment) {
write(` /*${trailingComment}*/`);
}
}
}
//
@@ -1893,7 +1900,7 @@ const _super = (function (geti, seti) {
}
function emitCaseOrDefaultClauseStatements(parentNode: Node, statements: NodeArray<Statement>) {
if (statements.length === 1 && rangeStartPositionsAreOnSameLine(parentNode, statements[0])) {
if (statements.length === 1 && shouldEmitCaseOrDefaultClauseStatementOnSameLine(parentNode, statements[0])) {
write(" ");
emit(statements[0]);
}
@@ -1902,6 +1909,14 @@ const _super = (function (geti, seti) {
}
}
function shouldEmitCaseOrDefaultClauseStatementOnSameLine(parentNode: Node, statement: Statement) {
if (statement.startsOnNewLine || nodeIsSynthesized(parentNode)) {
return false;
}
return nodeIsSynthesized(statement) || rangeStartPositionsAreOnSameLine(parentNode, statement);
}
function emitHeritageClause(node: HeritageClause) {
emitStart(node);
write(" ");
+13
View File
@@ -163,6 +163,9 @@ namespace ts {
case SyntaxKind.TemplateExpression:
return visitTemplateExpression(<TemplateExpression>node);
case SyntaxKind.YieldExpression:
return visitYieldExpression(<YieldExpression>node);
case SyntaxKind.SuperKeyword:
return visitSuperKeyword(<PrimaryExpression>node);
@@ -1496,6 +1499,16 @@ namespace ts {
);
}
/**
* Visits a YieldExpression node.
*
* @param node A YieldExpression node.
*/
function visitYieldExpression(node: YieldExpression): Expression {
// `yield` expressions are transformed using the generators transformer.
return visitEachChild(node, visitor, context);
}
/**
* Visits an ArrayLiteralExpression that contains a spread element.
*
+32 -7
View File
@@ -283,6 +283,7 @@ namespace ts {
//
let blockIndex = 0; // The index of the current block.
let labelNumber = 0; // The current label number.
let labelNumbers: number[][];
let lastOperationWasAbrupt: boolean; // Indicates whether the last operation was abrupt (break/continue).
let lastOperationWasCompletion: boolean; // Indicates whether the last operation was a completion (return/throw).
let clauses: CaseClause[]; // The case clauses generated for labels.
@@ -391,7 +392,7 @@ namespace ts {
case SyntaxKind.SetAccessor:
return visitAccessorDeclaration(<AccessorDeclaration>node);
default:
if (node.transformFlags & TransformFlags.ContainsGenerators) {
if (node.transformFlags & TransformFlags.ContainsGenerators || containsYield(node)) {
return visitEachChild(node, visitor, context);
}
else {
@@ -2497,6 +2498,7 @@ namespace ts {
function build() {
blockIndex = 0;
labelNumber = 0;
labelNumbers = undefined;
lastOperationWasAbrupt = false;
lastOperationWasCompletion = false;
clauses = undefined;
@@ -2537,7 +2539,6 @@ namespace ts {
flushFinalLabel(0);
}
if (clauses) {
const state = getState();
const labelExpression = createPropertyAccess(state, "label");
@@ -2590,6 +2591,8 @@ namespace ts {
if (statements && clauses) {
appendLabel(/*markLabelEnd*/ false);
}
updateLabelExpressions();
}
/**
@@ -2674,11 +2677,33 @@ namespace ts {
for (let label = 0; label < labelOffsets.length; label++) {
if (labelOffsets[label] === operationIndex) {
flushLabel();
if (labelExpressions !== undefined) {
const expressions = labelExpressions[label];
if (expressions !== undefined) {
for (const expression of expressions) {
expression.text = String(labelNumber);
if (labelNumbers === undefined) {
labelNumbers = [];
}
if (labelNumbers[labelNumber] === undefined) {
labelNumbers[labelNumber] = [label]
}
else {
labelNumbers[labelNumber].push(label);
}
}
}
}
/**
* Updates literal expressions for labels with actual label numbers.
*/
function updateLabelExpressions() {
if (labelExpressions !== undefined && labelNumbers !== undefined) {
for (let labelNumber = 0; labelNumber < labelNumbers.length; labelNumber++) {
const labels = labelNumbers[labelNumber];
if (labels !== undefined) {
for (const label of labels) {
const expressions = labelExpressions[label];
if (expressions !== undefined) {
for (const expression of expressions) {
expression.text = String(labelNumber);
}
}
}
}