From 467f252583d7b1fce01b3f5213e6e9b27fe98db3 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Fri, 28 Oct 2016 10:38:08 -0700 Subject: [PATCH] Update LKG --- lib/tsc.js | 45 ++++++++++++++++++++++++++++------ lib/tsserver.js | 45 ++++++++++++++++++++++++++++------ lib/tsserverlibrary.js | 45 ++++++++++++++++++++++++++++------ lib/typescript.js | 51 +++++++++++++++++++++++++++++++++------ lib/typescriptServices.js | 51 +++++++++++++++++++++++++++++++++------ 5 files changed, 200 insertions(+), 37 deletions(-) diff --git a/lib/tsc.js b/lib/tsc.js index 20052ec0c1e..e190108c5bc 100644 --- a/lib/tsc.js +++ b/lib/tsc.js @@ -26701,15 +26701,29 @@ var ts; } return undefined; } - function getNonGenericSignature(type) { + function getNonGenericSignature(type, node) { var signatures = getSignaturesOfStructuredType(type, 0); if (signatures.length === 1) { var signature = signatures[0]; - if (!signature.typeParameters) { + if (!signature.typeParameters && !isAritySmaller(signature, node)) { return signature; } } } + function isAritySmaller(signature, target) { + var targetParameterCount = 0; + for (; targetParameterCount < target.parameters.length; targetParameterCount++) { + var param = target.parameters[targetParameterCount]; + if (param.initializer || param.questionToken || param.dotDotDotToken || isJSDocOptionalParameter(param)) { + break; + } + } + if (target.parameters.length && ts.parameterIsThisKeyword(target.parameters[0])) { + targetParameterCount--; + } + var sourceLength = signature.hasRestParameter ? Number.MAX_VALUE : signature.parameters.length; + return sourceLength < targetParameterCount; + } function isFunctionExpressionOrArrowFunction(node) { return node.kind === 180 || node.kind === 181; } @@ -26730,13 +26744,13 @@ var ts; return undefined; } if (!(type.flags & 65536)) { - return getNonGenericSignature(type); + return getNonGenericSignature(type, node); } var signatureList; var types = type.types; for (var _i = 0, types_14 = types; _i < types_14.length; _i++) { var current = types_14[_i]; - var signature = getNonGenericSignature(current); + var signature = getNonGenericSignature(current, node); if (signature) { if (!signatureList) { signatureList = [signature]; @@ -39406,6 +39420,7 @@ var ts; var enclosingFunction; var enclosingNonArrowFunction; var enclosingNonAsyncFunctionBody; + var isInConstructorWithCapturedSuper; var convertedLoopState; var enabledSubstitutions; return transformSourceFile; @@ -39435,11 +39450,14 @@ var ts; var savedCurrentParent = currentParent; var savedCurrentNode = currentNode; var savedConvertedLoopState = convertedLoopState; + var savedIsInConstructorWithCapturedSuper = isInConstructorWithCapturedSuper; if (ts.nodeStartsNewLexicalEnvironment(node)) { + isInConstructorWithCapturedSuper = false; convertedLoopState = undefined; } onBeforeVisitNode(node); var visited = f(node); + isInConstructorWithCapturedSuper = savedIsInConstructorWithCapturedSuper; convertedLoopState = savedConvertedLoopState; enclosingFunction = savedEnclosingFunction; enclosingNonArrowFunction = savedEnclosingNonArrowFunction; @@ -39451,16 +39469,25 @@ var ts; currentNode = savedCurrentNode; return visited; } + function returnCapturedThis(node) { + return ts.setOriginalNode(ts.createReturn(ts.createIdentifier("_this")), node); + } + function isReturnVoidStatementInConstructorWithCapturedSuper(node) { + return isInConstructorWithCapturedSuper && node.kind === 212 && !node.expression; + } function shouldCheckNode(node) { return (node.transformFlags & 256) !== 0 || node.kind === 215 || (ts.isIterationStatement(node, false) && shouldConvertIterationStatementBody(node)); } function visitorWorker(node) { - if (shouldCheckNode(node)) { + if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) { + return returnCapturedThis(node); + } + else if (shouldCheckNode(node)) { return visitJavaScript(node); } - else if (node.transformFlags & 512) { + else if (node.transformFlags & 512 || (isInConstructorWithCapturedSuper && !ts.isExpression(node))) { return ts.visitEachChild(node, visitor, context); } else { @@ -39480,6 +39507,7 @@ var ts; function visitNodesInConvertedLoop(node) { switch (node.kind) { case 212: + node = isReturnVoidStatementInConstructorWithCapturedSuper(node) ? returnCapturedThis(node) : node; return visitReturnStatement(node); case 201: return visitVariableStatement(node); @@ -39794,7 +39822,10 @@ var ts; statementOffset++; } if (constructor) { - var body = saveStateAndInvoke(constructor, function (constructor) { return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, statementOffset); }); + var body = saveStateAndInvoke(constructor, function (constructor) { + isInConstructorWithCapturedSuper = superCaptureStatus === 1; + return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, statementOffset); + }); ts.addRange(statements, body); } if (extendsClauseElement diff --git a/lib/tsserver.js b/lib/tsserver.js index 7c2c7cb0462..75110bce98d 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -28206,15 +28206,29 @@ var ts; } return undefined; } - function getNonGenericSignature(type) { + function getNonGenericSignature(type, node) { var signatures = getSignaturesOfStructuredType(type, 0); if (signatures.length === 1) { var signature = signatures[0]; - if (!signature.typeParameters) { + if (!signature.typeParameters && !isAritySmaller(signature, node)) { return signature; } } } + function isAritySmaller(signature, target) { + var targetParameterCount = 0; + for (; targetParameterCount < target.parameters.length; targetParameterCount++) { + var param = target.parameters[targetParameterCount]; + if (param.initializer || param.questionToken || param.dotDotDotToken || isJSDocOptionalParameter(param)) { + break; + } + } + if (target.parameters.length && ts.parameterIsThisKeyword(target.parameters[0])) { + targetParameterCount--; + } + var sourceLength = signature.hasRestParameter ? Number.MAX_VALUE : signature.parameters.length; + return sourceLength < targetParameterCount; + } function isFunctionExpressionOrArrowFunction(node) { return node.kind === 180 || node.kind === 181; } @@ -28235,13 +28249,13 @@ var ts; return undefined; } if (!(type.flags & 65536)) { - return getNonGenericSignature(type); + return getNonGenericSignature(type, node); } var signatureList; var types = type.types; for (var _i = 0, types_14 = types; _i < types_14.length; _i++) { var current = types_14[_i]; - var signature = getNonGenericSignature(current); + var signature = getNonGenericSignature(current, node); if (signature) { if (!signatureList) { signatureList = [signature]; @@ -39525,6 +39539,7 @@ var ts; var enclosingFunction; var enclosingNonArrowFunction; var enclosingNonAsyncFunctionBody; + var isInConstructorWithCapturedSuper; var convertedLoopState; var enabledSubstitutions; return transformSourceFile; @@ -39554,11 +39569,14 @@ var ts; var savedCurrentParent = currentParent; var savedCurrentNode = currentNode; var savedConvertedLoopState = convertedLoopState; + var savedIsInConstructorWithCapturedSuper = isInConstructorWithCapturedSuper; if (ts.nodeStartsNewLexicalEnvironment(node)) { + isInConstructorWithCapturedSuper = false; convertedLoopState = undefined; } onBeforeVisitNode(node); var visited = f(node); + isInConstructorWithCapturedSuper = savedIsInConstructorWithCapturedSuper; convertedLoopState = savedConvertedLoopState; enclosingFunction = savedEnclosingFunction; enclosingNonArrowFunction = savedEnclosingNonArrowFunction; @@ -39570,16 +39588,25 @@ var ts; currentNode = savedCurrentNode; return visited; } + function returnCapturedThis(node) { + return ts.setOriginalNode(ts.createReturn(ts.createIdentifier("_this")), node); + } + function isReturnVoidStatementInConstructorWithCapturedSuper(node) { + return isInConstructorWithCapturedSuper && node.kind === 212 && !node.expression; + } function shouldCheckNode(node) { return (node.transformFlags & 256) !== 0 || node.kind === 215 || (ts.isIterationStatement(node, false) && shouldConvertIterationStatementBody(node)); } function visitorWorker(node) { - if (shouldCheckNode(node)) { + if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) { + return returnCapturedThis(node); + } + else if (shouldCheckNode(node)) { return visitJavaScript(node); } - else if (node.transformFlags & 512) { + else if (node.transformFlags & 512 || (isInConstructorWithCapturedSuper && !ts.isExpression(node))) { return ts.visitEachChild(node, visitor, context); } else { @@ -39599,6 +39626,7 @@ var ts; function visitNodesInConvertedLoop(node) { switch (node.kind) { case 212: + node = isReturnVoidStatementInConstructorWithCapturedSuper(node) ? returnCapturedThis(node) : node; return visitReturnStatement(node); case 201: return visitVariableStatement(node); @@ -39913,7 +39941,10 @@ var ts; statementOffset++; } if (constructor) { - var body = saveStateAndInvoke(constructor, function (constructor) { return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, statementOffset); }); + var body = saveStateAndInvoke(constructor, function (constructor) { + isInConstructorWithCapturedSuper = superCaptureStatus === 1; + return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, statementOffset); + }); ts.addRange(statements, body); } if (extendsClauseElement diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index f2839ce045e..e8ee1ffb7b7 100644 --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -28206,15 +28206,29 @@ var ts; } return undefined; } - function getNonGenericSignature(type) { + function getNonGenericSignature(type, node) { var signatures = getSignaturesOfStructuredType(type, 0); if (signatures.length === 1) { var signature = signatures[0]; - if (!signature.typeParameters) { + if (!signature.typeParameters && !isAritySmaller(signature, node)) { return signature; } } } + function isAritySmaller(signature, target) { + var targetParameterCount = 0; + for (; targetParameterCount < target.parameters.length; targetParameterCount++) { + var param = target.parameters[targetParameterCount]; + if (param.initializer || param.questionToken || param.dotDotDotToken || isJSDocOptionalParameter(param)) { + break; + } + } + if (target.parameters.length && ts.parameterIsThisKeyword(target.parameters[0])) { + targetParameterCount--; + } + var sourceLength = signature.hasRestParameter ? Number.MAX_VALUE : signature.parameters.length; + return sourceLength < targetParameterCount; + } function isFunctionExpressionOrArrowFunction(node) { return node.kind === 180 || node.kind === 181; } @@ -28235,13 +28249,13 @@ var ts; return undefined; } if (!(type.flags & 65536)) { - return getNonGenericSignature(type); + return getNonGenericSignature(type, node); } var signatureList; var types = type.types; for (var _i = 0, types_14 = types; _i < types_14.length; _i++) { var current = types_14[_i]; - var signature = getNonGenericSignature(current); + var signature = getNonGenericSignature(current, node); if (signature) { if (!signatureList) { signatureList = [signature]; @@ -39525,6 +39539,7 @@ var ts; var enclosingFunction; var enclosingNonArrowFunction; var enclosingNonAsyncFunctionBody; + var isInConstructorWithCapturedSuper; var convertedLoopState; var enabledSubstitutions; return transformSourceFile; @@ -39554,11 +39569,14 @@ var ts; var savedCurrentParent = currentParent; var savedCurrentNode = currentNode; var savedConvertedLoopState = convertedLoopState; + var savedIsInConstructorWithCapturedSuper = isInConstructorWithCapturedSuper; if (ts.nodeStartsNewLexicalEnvironment(node)) { + isInConstructorWithCapturedSuper = false; convertedLoopState = undefined; } onBeforeVisitNode(node); var visited = f(node); + isInConstructorWithCapturedSuper = savedIsInConstructorWithCapturedSuper; convertedLoopState = savedConvertedLoopState; enclosingFunction = savedEnclosingFunction; enclosingNonArrowFunction = savedEnclosingNonArrowFunction; @@ -39570,16 +39588,25 @@ var ts; currentNode = savedCurrentNode; return visited; } + function returnCapturedThis(node) { + return ts.setOriginalNode(ts.createReturn(ts.createIdentifier("_this")), node); + } + function isReturnVoidStatementInConstructorWithCapturedSuper(node) { + return isInConstructorWithCapturedSuper && node.kind === 212 && !node.expression; + } function shouldCheckNode(node) { return (node.transformFlags & 256) !== 0 || node.kind === 215 || (ts.isIterationStatement(node, false) && shouldConvertIterationStatementBody(node)); } function visitorWorker(node) { - if (shouldCheckNode(node)) { + if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) { + return returnCapturedThis(node); + } + else if (shouldCheckNode(node)) { return visitJavaScript(node); } - else if (node.transformFlags & 512) { + else if (node.transformFlags & 512 || (isInConstructorWithCapturedSuper && !ts.isExpression(node))) { return ts.visitEachChild(node, visitor, context); } else { @@ -39599,6 +39626,7 @@ var ts; function visitNodesInConvertedLoop(node) { switch (node.kind) { case 212: + node = isReturnVoidStatementInConstructorWithCapturedSuper(node) ? returnCapturedThis(node) : node; return visitReturnStatement(node); case 201: return visitVariableStatement(node); @@ -39913,7 +39941,10 @@ var ts; statementOffset++; } if (constructor) { - var body = saveStateAndInvoke(constructor, function (constructor) { return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, statementOffset); }); + var body = saveStateAndInvoke(constructor, function (constructor) { + isInConstructorWithCapturedSuper = superCaptureStatus === 1; + return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, statementOffset); + }); ts.addRange(statements, body); } if (extendsClauseElement diff --git a/lib/typescript.js b/lib/typescript.js index 72bacf89f83..0aef63d6c67 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -32320,15 +32320,30 @@ var ts; } // If the given type is an object or union type, if that type has a single signature, and if // that signature is non-generic, return the signature. Otherwise return undefined. - function getNonGenericSignature(type) { + function getNonGenericSignature(type, node) { var signatures = getSignaturesOfStructuredType(type, 0 /* Call */); if (signatures.length === 1) { var signature = signatures[0]; - if (!signature.typeParameters) { + if (!signature.typeParameters && !isAritySmaller(signature, node)) { return signature; } } } + /** If the contextual signature has fewer parameters than the function expression, do not use it */ + function isAritySmaller(signature, target) { + var targetParameterCount = 0; + for (; targetParameterCount < target.parameters.length; targetParameterCount++) { + var param = target.parameters[targetParameterCount]; + if (param.initializer || param.questionToken || param.dotDotDotToken || isJSDocOptionalParameter(param)) { + break; + } + } + if (target.parameters.length && ts.parameterIsThisKeyword(target.parameters[0])) { + targetParameterCount--; + } + var sourceLength = signature.hasRestParameter ? Number.MAX_VALUE : signature.parameters.length; + return sourceLength < targetParameterCount; + } function isFunctionExpressionOrArrowFunction(node) { return node.kind === 180 /* FunctionExpression */ || node.kind === 181 /* ArrowFunction */; } @@ -32355,13 +32370,13 @@ var ts; return undefined; } if (!(type.flags & 65536 /* Union */)) { - return getNonGenericSignature(type); + return getNonGenericSignature(type, node); } var signatureList; var types = type.types; for (var _i = 0, types_14 = types; _i < types_14.length; _i++) { var current = types_14[_i]; - var signature = getNonGenericSignature(current); + var signature = getNonGenericSignature(current, node); if (signature) { if (!signatureList) { // This signature will contribute to contextual union signature @@ -48816,6 +48831,7 @@ var ts; var enclosingFunction; var enclosingNonArrowFunction; var enclosingNonAsyncFunctionBody; + var isInConstructorWithCapturedSuper; /** * Used to track if we are emitting body of the converted loop */ @@ -48853,12 +48869,15 @@ var ts; var savedCurrentParent = currentParent; var savedCurrentNode = currentNode; var savedConvertedLoopState = convertedLoopState; + var savedIsInConstructorWithCapturedSuper = isInConstructorWithCapturedSuper; if (ts.nodeStartsNewLexicalEnvironment(node)) { - // don't treat content of nodes that start new lexical environment as part of converted loop copy + // don't treat content of nodes that start new lexical environment as part of converted loop copy or constructor body + isInConstructorWithCapturedSuper = false; convertedLoopState = undefined; } onBeforeVisitNode(node); var visited = f(node); + isInConstructorWithCapturedSuper = savedIsInConstructorWithCapturedSuper; convertedLoopState = savedConvertedLoopState; enclosingFunction = savedEnclosingFunction; enclosingNonArrowFunction = savedEnclosingNonArrowFunction; @@ -48870,16 +48889,28 @@ var ts; currentNode = savedCurrentNode; return visited; } + function returnCapturedThis(node) { + return ts.setOriginalNode(ts.createReturn(ts.createIdentifier("_this")), node); + } + function isReturnVoidStatementInConstructorWithCapturedSuper(node) { + return isInConstructorWithCapturedSuper && node.kind === 212 /* ReturnStatement */ && !node.expression; + } function shouldCheckNode(node) { return (node.transformFlags & 256 /* ES2015 */) !== 0 || node.kind === 215 /* LabeledStatement */ || (ts.isIterationStatement(node, /*lookInLabeledStatements*/ false) && shouldConvertIterationStatementBody(node)); } function visitorWorker(node) { - if (shouldCheckNode(node)) { + if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) { + return returnCapturedThis(node); + } + else if (shouldCheckNode(node)) { return visitJavaScript(node); } - else if (node.transformFlags & 512 /* ContainsES2015 */) { + else if (node.transformFlags & 512 /* ContainsES2015 */ || (isInConstructorWithCapturedSuper && !ts.isExpression(node))) { + // we want to dive in this branch either if node has children with ES2015 specific syntax + // or we are inside constructor that captures result of the super call so all returns without expression should be + // rewritten. Note: we skip expressions since returns should never appear there return ts.visitEachChild(node, visitor, context); } else { @@ -48899,6 +48930,7 @@ var ts; function visitNodesInConvertedLoop(node) { switch (node.kind) { case 212 /* ReturnStatement */: + node = isReturnVoidStatementInConstructorWithCapturedSuper(node) ? returnCapturedThis(node) : node; return visitReturnStatement(node); case 201 /* VariableStatement */: return visitVariableStatement(node); @@ -49353,7 +49385,10 @@ var ts; statementOffset++; } if (constructor) { - var body = saveStateAndInvoke(constructor, function (constructor) { return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, /*start*/ statementOffset); }); + var body = saveStateAndInvoke(constructor, function (constructor) { + isInConstructorWithCapturedSuper = superCaptureStatus === 1 /* ReplaceSuperCapture */; + return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, /*start*/ statementOffset); + }); ts.addRange(statements, body); } // Return `_this` unless we're sure enough that it would be pointless to add a return statement. diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index 72bacf89f83..0aef63d6c67 100644 --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -32320,15 +32320,30 @@ var ts; } // If the given type is an object or union type, if that type has a single signature, and if // that signature is non-generic, return the signature. Otherwise return undefined. - function getNonGenericSignature(type) { + function getNonGenericSignature(type, node) { var signatures = getSignaturesOfStructuredType(type, 0 /* Call */); if (signatures.length === 1) { var signature = signatures[0]; - if (!signature.typeParameters) { + if (!signature.typeParameters && !isAritySmaller(signature, node)) { return signature; } } } + /** If the contextual signature has fewer parameters than the function expression, do not use it */ + function isAritySmaller(signature, target) { + var targetParameterCount = 0; + for (; targetParameterCount < target.parameters.length; targetParameterCount++) { + var param = target.parameters[targetParameterCount]; + if (param.initializer || param.questionToken || param.dotDotDotToken || isJSDocOptionalParameter(param)) { + break; + } + } + if (target.parameters.length && ts.parameterIsThisKeyword(target.parameters[0])) { + targetParameterCount--; + } + var sourceLength = signature.hasRestParameter ? Number.MAX_VALUE : signature.parameters.length; + return sourceLength < targetParameterCount; + } function isFunctionExpressionOrArrowFunction(node) { return node.kind === 180 /* FunctionExpression */ || node.kind === 181 /* ArrowFunction */; } @@ -32355,13 +32370,13 @@ var ts; return undefined; } if (!(type.flags & 65536 /* Union */)) { - return getNonGenericSignature(type); + return getNonGenericSignature(type, node); } var signatureList; var types = type.types; for (var _i = 0, types_14 = types; _i < types_14.length; _i++) { var current = types_14[_i]; - var signature = getNonGenericSignature(current); + var signature = getNonGenericSignature(current, node); if (signature) { if (!signatureList) { // This signature will contribute to contextual union signature @@ -48816,6 +48831,7 @@ var ts; var enclosingFunction; var enclosingNonArrowFunction; var enclosingNonAsyncFunctionBody; + var isInConstructorWithCapturedSuper; /** * Used to track if we are emitting body of the converted loop */ @@ -48853,12 +48869,15 @@ var ts; var savedCurrentParent = currentParent; var savedCurrentNode = currentNode; var savedConvertedLoopState = convertedLoopState; + var savedIsInConstructorWithCapturedSuper = isInConstructorWithCapturedSuper; if (ts.nodeStartsNewLexicalEnvironment(node)) { - // don't treat content of nodes that start new lexical environment as part of converted loop copy + // don't treat content of nodes that start new lexical environment as part of converted loop copy or constructor body + isInConstructorWithCapturedSuper = false; convertedLoopState = undefined; } onBeforeVisitNode(node); var visited = f(node); + isInConstructorWithCapturedSuper = savedIsInConstructorWithCapturedSuper; convertedLoopState = savedConvertedLoopState; enclosingFunction = savedEnclosingFunction; enclosingNonArrowFunction = savedEnclosingNonArrowFunction; @@ -48870,16 +48889,28 @@ var ts; currentNode = savedCurrentNode; return visited; } + function returnCapturedThis(node) { + return ts.setOriginalNode(ts.createReturn(ts.createIdentifier("_this")), node); + } + function isReturnVoidStatementInConstructorWithCapturedSuper(node) { + return isInConstructorWithCapturedSuper && node.kind === 212 /* ReturnStatement */ && !node.expression; + } function shouldCheckNode(node) { return (node.transformFlags & 256 /* ES2015 */) !== 0 || node.kind === 215 /* LabeledStatement */ || (ts.isIterationStatement(node, /*lookInLabeledStatements*/ false) && shouldConvertIterationStatementBody(node)); } function visitorWorker(node) { - if (shouldCheckNode(node)) { + if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) { + return returnCapturedThis(node); + } + else if (shouldCheckNode(node)) { return visitJavaScript(node); } - else if (node.transformFlags & 512 /* ContainsES2015 */) { + else if (node.transformFlags & 512 /* ContainsES2015 */ || (isInConstructorWithCapturedSuper && !ts.isExpression(node))) { + // we want to dive in this branch either if node has children with ES2015 specific syntax + // or we are inside constructor that captures result of the super call so all returns without expression should be + // rewritten. Note: we skip expressions since returns should never appear there return ts.visitEachChild(node, visitor, context); } else { @@ -48899,6 +48930,7 @@ var ts; function visitNodesInConvertedLoop(node) { switch (node.kind) { case 212 /* ReturnStatement */: + node = isReturnVoidStatementInConstructorWithCapturedSuper(node) ? returnCapturedThis(node) : node; return visitReturnStatement(node); case 201 /* VariableStatement */: return visitVariableStatement(node); @@ -49353,7 +49385,10 @@ var ts; statementOffset++; } if (constructor) { - var body = saveStateAndInvoke(constructor, function (constructor) { return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, /*start*/ statementOffset); }); + var body = saveStateAndInvoke(constructor, function (constructor) { + isInConstructorWithCapturedSuper = superCaptureStatus === 1 /* ReplaceSuperCapture */; + return ts.visitNodes(constructor.body.statements, visitor, ts.isStatement, /*start*/ statementOffset); + }); ts.addRange(statements, body); } // Return `_this` unless we're sure enough that it would be pointless to add a return statement.