diff --git a/src/services/preparePasteEdits.ts b/src/services/preparePasteEdits.ts index 9d3879fe5428c..21d2ad10e0be7 100644 --- a/src/services/preparePasteEdits.ts +++ b/src/services/preparePasteEdits.ts @@ -2,7 +2,17 @@ import { findAncestor, forEachChild, getTokenAtPosition, + isExportAssignment, + isExportDeclaration, + isExportSpecifier, isIdentifier, + isImportClause, + isImportDeclaration, + isImportEqualsDeclaration, + isImportSpecifier, + isNamedExports, + isNamedImports, + isNamespaceImport, rangeContainsPosition, rangeContainsRange, SourceFile, @@ -25,6 +35,13 @@ export function preparePasteEdits( ancestorNode => rangeContainsRange(ancestorNode, range), ); if (!enclosingNode) return; + if ( + isImportSpecifier(enclosingNode) || isImportClause(enclosingNode) || isNamespaceImport(enclosingNode) || isImportEqualsDeclaration(enclosingNode) + || isImportDeclaration(enclosingNode) || isNamedImports(enclosingNode) || isExportSpecifier(enclosingNode) || isNamedExports(enclosingNode) + || isExportAssignment(enclosingNode) || isExportDeclaration(enclosingNode) + ) { + return; + } forEachChild(enclosingNode, function checkNameResolution(node) { if (shouldProvidePasteEdits) return; if (isIdentifier(node) && rangeContainsPosition(range, node.getStart(sourceFile))) { diff --git a/tests/cases/fourslash/preparePasteEdits_returnFalseForImportAndExports.ts b/tests/cases/fourslash/preparePasteEdits_returnFalseForImportAndExports.ts new file mode 100644 index 0000000000000..547a4612b1393 --- /dev/null +++ b/tests/cases/fourslash/preparePasteEdits_returnFalseForImportAndExports.ts @@ -0,0 +1,21 @@ +/// + +// @Filename: /file1.ts +//// import {[|abc|]} from "[|./file2|]"; +//// import [|{q}|] from [|"./file3"|]; +//// [|import * as a from "./file2";|] +//// +//// const b = 1; +//// const c = 2; +//// [|export {[|b|], c} from "./file1";|] + +// @Filename: /file2.ts +//// export const abc = 1; + +// @Filename: /file3.ts +//// export const q = 1; +verify.preparePasteEdits({ + copiedFromFile: "/file1.ts", + copiedTextRange: test.ranges(), + providePasteEdits: false, +}) diff --git a/tests/cases/fourslash/preparePasteEdits_returnFalseForImportsAndExports2.ts b/tests/cases/fourslash/preparePasteEdits_returnFalseForImportsAndExports2.ts new file mode 100644 index 0000000000000..dacf3c6d96590 --- /dev/null +++ b/tests/cases/fourslash/preparePasteEdits_returnFalseForImportsAndExports2.ts @@ -0,0 +1,20 @@ +/// + +// @allowJs: true +// @module: commonjs + +// @Filename: /file1.ts +//// [|import [|t|] = require("./file2");|] +//// function add(a: number, b: number): number { +//// return a + b; +//// } +//// [|export = add;|] + +// @Filename: /file2.ts +//// export const t = 1; + +verify.preparePasteEdits({ + copiedFromFile: "/file1.ts", + copiedTextRange: test.ranges(), + providePasteEdits: false, +}) \ No newline at end of file