-
Notifications
You must be signed in to change notification settings - Fork 12.8k
/
Copy pathpreparePasteEdits.ts
46 lines (45 loc) · 1.69 KB
/
preparePasteEdits.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import {
findAncestor,
forEachChild,
getTokenAtPosition,
isIdentifier,
rangeContainsPosition,
rangeContainsRange,
SourceFile,
SymbolFlags,
TextRange,
TypeChecker,
} from "./_namespaces/ts.js";
import { isInImport } from "./refactors/moveToFile.js";
/** @internal */
export function preparePasteEdits(
sourceFile: SourceFile,
copiedFromRange: TextRange[],
checker: TypeChecker,
): boolean {
let shouldProvidePasteEdits = false;
copiedFromRange.forEach(range => {
const enclosingNode = findAncestor(
getTokenAtPosition(sourceFile, range.pos),
ancestorNode => rangeContainsRange(ancestorNode, range),
);
if (!enclosingNode) return;
forEachChild(enclosingNode, function checkNameResolution(node) {
if (shouldProvidePasteEdits) return;
if (isIdentifier(node) && rangeContainsPosition(range, node.getStart(sourceFile))) {
const resolvedSymbol = checker.resolveName(node.text, node, SymbolFlags.All, /*excludeGlobals*/ false);
if (resolvedSymbol && resolvedSymbol.declarations) {
for (const decl of resolvedSymbol.declarations) {
if (isInImport(decl) || !!(node.text && sourceFile.symbol && sourceFile.symbol.exports?.has(node.escapedText))) {
shouldProvidePasteEdits = true;
return;
}
}
}
}
node.forEachChild(checkNameResolution);
});
if (shouldProvidePasteEdits) return;
});
return shouldProvidePasteEdits;
}