diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8f6445328dc..bcb35cefd53 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2444,18 +2444,21 @@ namespace ts { function createNodeBuilder() { return { typeToTypeNode: (type: Type, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => { + Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0); const context = createNodeBuilderContext(enclosingDeclaration, flags); const resultingNode = typeToTypeNodeHelper(type, context); const result = context.encounteredError ? undefined : resultingNode; return result; }, indexInfoToIndexSignatureDeclaration: (indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => { + Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0); const context = createNodeBuilderContext(enclosingDeclaration, flags); const resultingNode = indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, context); const result = context.encounteredError ? undefined : resultingNode; return result; }, signatureToSignatureDeclaration: (signature: Signature, kind: SyntaxKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => { + Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0); const context = createNodeBuilderContext(enclosingDeclaration, flags); const resultingNode = signatureToSignatureDeclarationHelper(signature, kind, context); const result = context.encounteredError ? undefined : resultingNode; diff --git a/src/services/refactors/extractSymbol.ts b/src/services/refactors/extractSymbol.ts index b18e12d2b96..5013acafc52 100644 --- a/src/services/refactors/extractSymbol.ts +++ b/src/services/refactors/extractSymbol.ts @@ -730,7 +730,7 @@ namespace ts.refactor.extractSymbol { let type = checker.getTypeOfSymbolAtLocation(usage.symbol, usage.node); // Widen the type so we don't emit nonsense annotations like "function fn(x: 3) {" type = checker.getBaseTypeOfLiteralType(type); - typeNode = checker.typeToTypeNode(type, node, NodeBuilderFlags.NoTruncation); + typeNode = checker.typeToTypeNode(type, scope, NodeBuilderFlags.NoTruncation); } const paramDecl = createParameter( diff --git a/tests/cases/fourslash/extract-method27.ts b/tests/cases/fourslash/extract-method27.ts new file mode 100644 index 00000000000..a5bb86e2f14 --- /dev/null +++ b/tests/cases/fourslash/extract-method27.ts @@ -0,0 +1,34 @@ +/// + +// Repro https://github.com/Microsoft/TypeScript/issues/19395 + +// @Filename: test.ts +//// export const b = 2; +//// interface Interface { } +//// +//// async function handle(i: Interface) { +//// /*a*/const x = 3, y = i;/*b*/ +//// } +// @Filename: library.d.ts +//// export as namespace NS; +//// export const a = 1; + + +goTo.select('a', 'b') +edit.applyRefactor({ + refactorName: "Extract Symbol", + actionName: "function_scope_1", + actionDescription: "Extract to function in module scope", + newContent: +`export const b = 2; +interface Interface { } + +async function handle(i: Interface) { + /*RENAME*/newFunction(i); +} + +function newFunction(i: Interface) { + const x = 3, y = i; +} +` +});