@tslite/services 0.0.0-stage → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/LICENSE +55 -0
  2. package/NOTICE +13 -0
  3. package/dist/_namespaces/edit.d.ts +8 -0
  4. package/dist/_namespaces/edit.js +11 -0
  5. package/dist/_namespaces/ts.Completions.StringCompletions.d.ts +1 -0
  6. package/dist/_namespaces/ts.Completions.StringCompletions.js +2 -0
  7. package/dist/_namespaces/ts.Completions.d.ts +2 -0
  8. package/dist/_namespaces/ts.Completions.js +3 -0
  9. package/dist/_namespaces/ts.FindAllReferences.d.ts +2 -0
  10. package/dist/_namespaces/ts.FindAllReferences.js +3 -0
  11. package/dist/_namespaces/ts.GoToDefinition.d.ts +1 -0
  12. package/dist/_namespaces/ts.GoToDefinition.js +2 -0
  13. package/dist/_namespaces/ts.NavigationBar.d.ts +1 -0
  14. package/dist/_namespaces/ts.NavigationBar.js +2 -0
  15. package/dist/_namespaces/ts.OrganizeImports.d.ts +1 -0
  16. package/dist/_namespaces/ts.OrganizeImports.js +2 -0
  17. package/dist/_namespaces/ts.OutliningElementsCollector.d.ts +1 -0
  18. package/dist/_namespaces/ts.OutliningElementsCollector.js +2 -0
  19. package/dist/_namespaces/ts.Rename.d.ts +1 -0
  20. package/dist/_namespaces/ts.Rename.js +2 -0
  21. package/dist/_namespaces/ts.SignatureHelp.d.ts +1 -0
  22. package/dist/_namespaces/ts.SignatureHelp.js +2 -0
  23. package/dist/_namespaces/ts.SmartSelectionRange.d.ts +1 -0
  24. package/dist/_namespaces/ts.SmartSelectionRange.js +2 -0
  25. package/dist/_namespaces/ts.SymbolDisplay.d.ts +1 -0
  26. package/dist/_namespaces/ts.SymbolDisplay.js +2 -0
  27. package/dist/_namespaces/ts.codefix.d.ts +26 -0
  28. package/dist/_namespaces/ts.codefix.js +27 -0
  29. package/dist/_namespaces/ts.d.ts +17 -0
  30. package/dist/_namespaces/ts.formatting.d.ts +7 -0
  31. package/dist/_namespaces/ts.formatting.js +8 -0
  32. package/dist/_namespaces/ts.js +20 -0
  33. package/dist/_namespaces/ts.refactor.addOrRemoveBracesToArrowFunction.d.ts +1 -0
  34. package/dist/_namespaces/ts.refactor.addOrRemoveBracesToArrowFunction.js +2 -0
  35. package/dist/_namespaces/ts.refactor.convertParamsToDestructuredObject.d.ts +1 -0
  36. package/dist/_namespaces/ts.refactor.convertParamsToDestructuredObject.js +2 -0
  37. package/dist/_namespaces/ts.refactor.convertStringOrTemplateLiteral.d.ts +1 -0
  38. package/dist/_namespaces/ts.refactor.convertStringOrTemplateLiteral.js +2 -0
  39. package/dist/_namespaces/ts.refactor.d.ts +9 -0
  40. package/dist/_namespaces/ts.refactor.extractSymbol.d.ts +1 -0
  41. package/dist/_namespaces/ts.refactor.extractSymbol.js +2 -0
  42. package/dist/_namespaces/ts.refactor.js +10 -0
  43. package/dist/_namespaces/ts.textChanges.d.ts +1 -0
  44. package/dist/_namespaces/ts.textChanges.js +2 -0
  45. package/dist/classifier.d.ts +5 -0
  46. package/dist/classifier.js +439 -0
  47. package/dist/codeFixProvider.d.ts +13 -0
  48. package/dist/codeFixProvider.js +84 -0
  49. package/dist/codefixes/addConvertToUnknownForNonOverlappingTypes.d.ts +1 -0
  50. package/dist/codefixes/addConvertToUnknownForNonOverlappingTypes.js +21 -0
  51. package/dist/codefixes/addEmptyExportDeclaration.d.ts +1 -0
  52. package/dist/codefixes/addEmptyExportDeclaration.js +17 -0
  53. package/dist/codefixes/addMissingAsync.d.ts +1 -0
  54. package/dist/codefixes/addMissingAsync.js +75 -0
  55. package/dist/codefixes/addMissingAwait.d.ts +1 -0
  56. package/dist/codefixes/addMissingAwait.js +236 -0
  57. package/dist/codefixes/addMissingConst.d.ts +1 -0
  58. package/dist/codefixes/addMissingConst.js +91 -0
  59. package/dist/codefixes/addNameToNamelessParameter.d.ts +1 -0
  60. package/dist/codefixes/addNameToNamelessParameter.js +29 -0
  61. package/dist/codefixes/convertConstToLet.d.ts +1 -0
  62. package/dist/codefixes/convertConstToLet.js +30 -0
  63. package/dist/codefixes/convertToAsyncFunction.d.ts +1 -0
  64. package/dist/codefixes/convertToAsyncFunction.js +495 -0
  65. package/dist/codefixes/convertToMappedObjectType.d.ts +1 -0
  66. package/dist/codefixes/convertToMappedObjectType.js +48 -0
  67. package/dist/codefixes/correctQualifiedNameToIndexedAccessType.d.ts +1 -0
  68. package/dist/codefixes/correctQualifiedNameToIndexedAccessType.js +33 -0
  69. package/dist/codefixes/fixAddModuleReferTypeMissingTypeof.d.ts +1 -0
  70. package/dist/codefixes/fixAddModuleReferTypeMissingTypeof.js +27 -0
  71. package/dist/codefixes/fixAwaitInSyncFunction.d.ts +1 -0
  72. package/dist/codefixes/fixAwaitInSyncFunction.js +69 -0
  73. package/dist/codefixes/fixExpectedComma.d.ts +1 -0
  74. package/dist/codefixes/fixExpectedComma.js +35 -0
  75. package/dist/codefixes/fixInvalidJsxCharacters.d.ts +1 -0
  76. package/dist/codefixes/fixInvalidJsxCharacters.js +41 -0
  77. package/dist/codefixes/fixMissingCallParentheses.d.ts +1 -0
  78. package/dist/codefixes/fixMissingCallParentheses.js +42 -0
  79. package/dist/codefixes/fixSpelling.d.ts +1 -0
  80. package/dist/codefixes/fixSpelling.js +94 -0
  81. package/dist/codefixes/fixUnreachableCode.d.ts +1 -0
  82. package/dist/codefixes/fixUnreachableCode.js +65 -0
  83. package/dist/codefixes/fixUnusedIdentifier.d.ts +1 -0
  84. package/dist/codefixes/fixUnusedIdentifier.js +224 -0
  85. package/dist/codefixes/helpers.d.ts +8 -0
  86. package/dist/codefixes/helpers.js +53 -0
  87. package/dist/codefixes/importFixes.d.ts +14 -0
  88. package/dist/codefixes/importFixes.js +441 -0
  89. package/dist/codefixes/inferFromUsage.d.ts +1 -0
  90. package/dist/codefixes/inferFromUsage.js +742 -0
  91. package/dist/codefixes/removeUnnecessaryAwait.d.ts +1 -0
  92. package/dist/codefixes/removeUnnecessaryAwait.js +41 -0
  93. package/dist/codefixes/returnValueCorrect.d.ts +1 -0
  94. package/dist/codefixes/returnValueCorrect.js +132 -0
  95. package/dist/codefixes/splitTypeOnlyImport.d.ts +1 -0
  96. package/dist/codefixes/splitTypeOnlyImport.js +32 -0
  97. package/dist/codefixes/useBigintLiteral.d.ts +1 -0
  98. package/dist/codefixes/useBigintLiteral.js +29 -0
  99. package/dist/completions.d.ts +83 -0
  100. package/dist/completions.js +1720 -0
  101. package/dist/documentHighlights.d.ts +8 -0
  102. package/dist/documentHighlights.js +367 -0
  103. package/dist/documentRegistry.d.ts +36 -0
  104. package/dist/documentRegistry.js +63 -0
  105. package/dist/editingServices.d.ts +1 -0
  106. package/dist/editingServices.js +4 -0
  107. package/dist/findAllReferences.d.ts +113 -0
  108. package/dist/findAllReferences.js +1366 -0
  109. package/dist/formatting/formatting.d.ts +26 -0
  110. package/dist/formatting/formatting.js +1021 -0
  111. package/dist/formatting/formattingContext.d.ts +34 -0
  112. package/dist/formatting/formattingContext.js +78 -0
  113. package/dist/formatting/formattingScanner.d.ts +14 -0
  114. package/dist/formatting/formattingScanner.js +228 -0
  115. package/dist/formatting/rule.d.ts +31 -0
  116. package/dist/formatting/rule.js +22 -0
  117. package/dist/formatting/rules.d.ts +7 -0
  118. package/dist/formatting/rules.js +610 -0
  119. package/dist/formatting/rulesMap.d.ts +5 -0
  120. package/dist/formatting/rulesMap.js +127 -0
  121. package/dist/formatting/smartIndenter.d.ts +44 -0
  122. package/dist/formatting/smartIndenter.js +518 -0
  123. package/dist/getEditsForFileRename.d.ts +6 -0
  124. package/dist/getEditsForFileRename.js +86 -0
  125. package/dist/goToDefinition.d.ts +8 -0
  126. package/dist/goToDefinition.js +246 -0
  127. package/dist/importTracker.d.ts +50 -0
  128. package/dist/importTracker.js +422 -0
  129. package/dist/index.d.ts +1 -0
  130. package/dist/index.js +3 -0
  131. package/dist/navigationBar.d.ts +3 -0
  132. package/dist/navigationBar.js +549 -0
  133. package/dist/organizeImports.d.ts +18 -0
  134. package/dist/organizeImports.js +290 -0
  135. package/dist/outliningElementsCollector.d.ts +2 -0
  136. package/dist/outliningElementsCollector.js +261 -0
  137. package/dist/refactorProvider.d.ts +5 -0
  138. package/dist/refactorProvider.js +16 -0
  139. package/dist/refactors/addOrRemoveBracesToArrowFunction.d.ts +1 -0
  140. package/dist/refactors/addOrRemoveBracesToArrowFunction.js +86 -0
  141. package/dist/refactors/convertExport.d.ts +1 -0
  142. package/dist/refactors/convertExport.js +126 -0
  143. package/dist/refactors/convertImport.d.ts +1 -0
  144. package/dist/refactors/convertImport.js +116 -0
  145. package/dist/refactors/convertParamsToDestructuredObject.d.ts +1 -0
  146. package/dist/refactors/convertParamsToDestructuredObject.js +282 -0
  147. package/dist/refactors/convertStringOrTemplateLiteral.d.ts +1 -0
  148. package/dist/refactors/convertStringOrTemplateLiteral.js +148 -0
  149. package/dist/refactors/extractSymbol.d.ts +60 -0
  150. package/dist/refactors/extractSymbol.js +1281 -0
  151. package/dist/refactors/extractType.d.ts +1 -0
  152. package/dist/refactors/extractType.js +102 -0
  153. package/dist/refactors/moveToNewFile.d.ts +1 -0
  154. package/dist/refactors/moveToNewFile.js +477 -0
  155. package/dist/rename.d.ts +2 -0
  156. package/dist/rename.js +100 -0
  157. package/dist/services.d.ts +48 -0
  158. package/dist/services.js +1480 -0
  159. package/dist/signatureHelp.d.ts +8 -0
  160. package/dist/signatureHelp.js +414 -0
  161. package/dist/smartSelection.d.ts +2 -0
  162. package/dist/smartSelection.js +243 -0
  163. package/dist/stringCompletions.d.ts +4 -0
  164. package/dist/stringCompletions.js +220 -0
  165. package/dist/suggestionDiagnostics.d.ts +6 -0
  166. package/dist/suggestionDiagnostics.js +92 -0
  167. package/dist/symbolDisplay.d.ts +16 -0
  168. package/dist/symbolDisplay.js +400 -0
  169. package/dist/textChanges.d.ts +161 -0
  170. package/dist/textChanges.js +1163 -0
  171. package/dist/types.d.ts +908 -0
  172. package/dist/types.js +263 -0
  173. package/dist/utilities.d.ts +283 -0
  174. package/dist/utilities.js +1981 -0
  175. package/package.json +45 -3
  176. package/README.md +0 -3
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,102 @@
1
+ // Modificado de microsoft/TypeScript v3.9.10, src/services/refactors/extractType.ts: o namespace virou módulo ES, com os imports explícitos.
2
+ // Fica a extração para um alias de tipo. Saem a extração para um typedef do JSDoc, com o arquivo JavaScript que a
3
+ // oferecia (CK-03), e a extração para uma `interface`, com o achatamento dos membros que só ela usava: a Linguagem não tem
4
+ // `interface` (CK-02), e o alias diz o mesmo (CK-69).
5
+ import { Debug, Diagnostics, SymbolFlags, cast, createTextRangeFromSpan, createTypeAliasDeclaration, createTypeReferenceNode, emptyArray, findAncestor, first, forEachChild, getLocaleSpecificMessage, getRefactorContextSpan, getRenameLocation, getTokenAtPosition, getUniqueName, ignoreSourceNewlines, isConditionalTypeNode, isFunctionLike, isIdentifier, isInferTypeNode, isStatement, isTypeNode, isTypeParameterDeclaration, isTypePredicateNode, isTypeQueryNode, isTypeReferenceNode, rangeContainsStartEnd, skipTrivia, textChanges, updateTypeParameterDeclaration, } from "../_namespaces/edit.js";
6
+ import { registerRefactor, } from "../_namespaces/ts.refactor.js";
7
+ const refactorName = "Extract type";
8
+ const extractToTypeAlias = "Extract to type alias";
9
+ registerRefactor(refactorName, {
10
+ getAvailableActions(context) {
11
+ const info = getRangeToExtract(context);
12
+ if (!info)
13
+ return emptyArray;
14
+ return [{
15
+ name: refactorName,
16
+ description: getLocaleSpecificMessage(Diagnostics.Extract_type),
17
+ actions: [{
18
+ name: extractToTypeAlias, description: getLocaleSpecificMessage(Diagnostics.Extract_to_type_alias)
19
+ }]
20
+ }];
21
+ },
22
+ getEditsForAction(context, actionName) {
23
+ const { file } = context;
24
+ const info = Debug.checkDefined(getRangeToExtract(context), "Expected to find a range to extract");
25
+ const name = getUniqueName("NewType", file);
26
+ const edits = textChanges.ChangeTracker.with(context, changes => {
27
+ switch (actionName) {
28
+ case extractToTypeAlias:
29
+ return doTypeAliasChange(changes, file, name, info);
30
+ default:
31
+ Debug.fail("Unexpected action name");
32
+ }
33
+ });
34
+ const renameFilename = file.fileName;
35
+ const renameLocation = getRenameLocation(edits, renameFilename, name, /*preferLastLocation*/ false);
36
+ return { edits, renameFilename, renameLocation };
37
+ }
38
+ });
39
+ function getRangeToExtract(context) {
40
+ const { file, startPosition } = context;
41
+ const current = getTokenAtPosition(file, startPosition);
42
+ const range = createTextRangeFromSpan(getRefactorContextSpan(context));
43
+ const selection = findAncestor(current, (node => node.parent && rangeContainsSkipTrivia(range, node, file) && !rangeContainsSkipTrivia(range, node.parent, file)));
44
+ if (!selection || !isTypeNode(selection))
45
+ return undefined;
46
+ const checker = context.program.getTypeChecker();
47
+ const firstStatement = Debug.checkDefined(findAncestor(selection, isStatement), "Should find a statement");
48
+ const typeParameters = collectTypeParameters(checker, selection, firstStatement, file);
49
+ if (!typeParameters)
50
+ return undefined;
51
+ return { selection, firstStatement, typeParameters };
52
+ }
53
+ function rangeContainsSkipTrivia(r1, node, file) {
54
+ return rangeContainsStartEnd(r1, skipTrivia(file.text, node.pos), node.end);
55
+ }
56
+ function collectTypeParameters(checker, selection, statement, file) {
57
+ const result = [];
58
+ return visitor(selection) ? undefined : result;
59
+ function visitor(node) {
60
+ if (isTypeReferenceNode(node)) {
61
+ if (isIdentifier(node.typeName)) {
62
+ const symbol = checker.resolveName(node.typeName.text, node.typeName, SymbolFlags.TypeParameter, /* excludeGlobals */ true);
63
+ if (symbol) {
64
+ const declaration = cast(first(symbol.declarations), isTypeParameterDeclaration);
65
+ if (rangeContainsSkipTrivia(statement, declaration, file) && !rangeContainsSkipTrivia(selection, declaration, file)) {
66
+ result.push(declaration);
67
+ }
68
+ }
69
+ }
70
+ }
71
+ else if (isInferTypeNode(node)) {
72
+ const conditionalTypeNode = findAncestor(node, n => isConditionalTypeNode(n) && rangeContainsSkipTrivia(n.extendsType, node, file));
73
+ if (!conditionalTypeNode || !rangeContainsSkipTrivia(selection, conditionalTypeNode, file)) {
74
+ return true;
75
+ }
76
+ }
77
+ // Na tag, também o tipo `this`, que dependia da função em volta como o predicado de tipo (CK-02).
78
+ else if (isTypePredicateNode(node)) {
79
+ const functionLikeNode = findAncestor(node.parent, isFunctionLike);
80
+ if (functionLikeNode && functionLikeNode.type && rangeContainsSkipTrivia(functionLikeNode.type, node, file) && !rangeContainsSkipTrivia(selection, functionLikeNode, file)) {
81
+ return true;
82
+ }
83
+ }
84
+ // Na tag, também o `typeof this.x`, que dependia da classe em volta (CK-02).
85
+ else if (isTypeQueryNode(node)) {
86
+ if (isIdentifier(node.exprName)) {
87
+ const symbol = checker.resolveName(node.exprName.text, node.exprName, SymbolFlags.Value, /* excludeGlobals */ false);
88
+ if (symbol && rangeContainsSkipTrivia(statement, symbol.valueDeclaration, file) && !rangeContainsSkipTrivia(selection, symbol.valueDeclaration, file)) {
89
+ return true;
90
+ }
91
+ }
92
+ }
93
+ return forEachChild(node, visitor);
94
+ }
95
+ }
96
+ function doTypeAliasChange(changes, file, name, info) {
97
+ const { firstStatement, selection, typeParameters } = info;
98
+ const newTypeNode = createTypeAliasDeclaration(
99
+ /* modifiers */ undefined, name, typeParameters.map(id => updateTypeParameterDeclaration(id, id.name, id.constraint, /* defaultType */ undefined)), selection);
100
+ changes.insertNodeBefore(file, firstStatement, ignoreSourceNewlines(newTypeNode), /* blankLineBetween */ true);
101
+ changes.replaceNode(file, selection, createTypeReferenceNode(name, typeParameters.map(id => createTypeReferenceNode(id.name, /* typeArguments */ undefined))));
102
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,477 @@
1
+ // Modificado de microsoft/TypeScript v3.9.10, src/services/refactors/moveToNewFile.ts: o namespace virou módulo ES, com os imports explícitos.
2
+ // Saem o CommonJS inteiro — o `require`, o `exports.x = …` e o `import =` — e com ele a escolha entre as duas sintaxes de
3
+ // módulo: um arquivo-módulo usa a do ES (CK-03). Saem também a `function`, a classe, o enum e a interface de topo, e o
4
+ // modificador `default` de uma declaração (CK-02, CK-46); o import da fábrica do JSX, que é do emit (CK-19); e a inclusão
5
+ // do arquivo novo no `files` do `tsconfig` (CK-47, CK-06).
6
+ import { Debug, Diagnostics, FindAllReferences, ModifierFlags, ScriptTarget, SymbolFlags, SyntaxKind, append, cast, combinePaths, concatenate, contains, copyEntries, createIdentifier, createImportClause, createImportDeclaration, createImportSpecifier, createLiteral, createMap, createModifier, createNamedImports, createNamespaceImport, createTextRangeFromSpan, emptyArray, ensurePathIsNonModuleName, extensionFromPath, findIndex, firstDefined, flatMap, forEachEntry, getBaseFileName, getDirectoryPath, getLocaleSpecificMessage, getPropertySymbolFromBindingElement, getQuotePreference, getRangesWhere, getRefactorContextSpan, getSymbolId, getUniqueName, hasModifier, insertImports, isBindingElement, isDeclarationName, isIdentifier, isImportDeclaration, isNamedDeclaration, isOmittedExpression, isPropertyAccessExpression, isSourceFile, isStringLiteral, isVariableDeclaration, isVariableStatement, makeImportIfNecessary, moduleSpecifierToValidIdentifier, nodeSeenTracker, rangeContainsRange, removeFileExtension, skipAlias, symbolNameNoDefault, textChanges, tryCast, updateImportClause, updateModuleDeclaration, updateTypeAliasDeclaration, updateVariableStatement, } from "../_namespaces/edit.js";
7
+ import { registerRefactor, } from "../_namespaces/ts.refactor.js";
8
+ const refactorName = "Move to a new file";
9
+ registerRefactor(refactorName, {
10
+ getAvailableActions(context) {
11
+ if (!context.preferences.allowTextChangesInNewFiles || getStatementsToMove(context) === undefined)
12
+ return emptyArray;
13
+ const description = getLocaleSpecificMessage(Diagnostics.Move_to_a_new_file);
14
+ return [{ name: refactorName, description, actions: [{ name: refactorName, description }] }];
15
+ },
16
+ getEditsForAction(context, actionName) {
17
+ Debug.assert(actionName === refactorName, "Wrong refactor invoked");
18
+ const statements = Debug.checkDefined(getStatementsToMove(context));
19
+ const edits = textChanges.ChangeTracker.with(context, t => doChange(context.file, context.program, statements, t, context.host, context.preferences));
20
+ return { edits, renameFilename: undefined, renameLocation: undefined };
21
+ }
22
+ });
23
+ function getRangeToMove(context) {
24
+ const { file } = context;
25
+ const range = createTextRangeFromSpan(getRefactorContextSpan(context));
26
+ const { statements } = file;
27
+ const startNodeIndex = findIndex(statements, s => s.end > range.pos);
28
+ if (startNodeIndex === -1)
29
+ return undefined;
30
+ const startStatement = statements[startNodeIndex];
31
+ if (isNamedDeclaration(startStatement) && startStatement.name && rangeContainsRange(startStatement.name, range)) {
32
+ return { toMove: [statements[startNodeIndex]], afterLast: statements[startNodeIndex + 1] };
33
+ }
34
+ // Can't only partially include the start node or be partially into the next node
35
+ if (range.pos > startStatement.getStart(file))
36
+ return undefined;
37
+ const afterEndNodeIndex = findIndex(statements, s => s.end > range.end, startNodeIndex);
38
+ // Can't be partially into the next node
39
+ if (afterEndNodeIndex !== -1 && (afterEndNodeIndex === 0 || statements[afterEndNodeIndex].getStart(file) < range.end))
40
+ return undefined;
41
+ return {
42
+ toMove: statements.slice(startNodeIndex, afterEndNodeIndex === -1 ? statements.length : afterEndNodeIndex),
43
+ afterLast: afterEndNodeIndex === -1 ? undefined : statements[afterEndNodeIndex],
44
+ };
45
+ }
46
+ function doChange(oldFile, program, toMove, changes, host, preferences) {
47
+ const checker = program.getTypeChecker();
48
+ const usage = getUsageInfo(oldFile, toMove.all, checker);
49
+ const currentDirectory = getDirectoryPath(oldFile.fileName);
50
+ const extension = extensionFromPath(oldFile.fileName);
51
+ const newModuleName = makeUniqueModuleName(getNewModuleName(usage.movedSymbols), extension, currentDirectory, host);
52
+ const newFileNameWithExtension = newModuleName + extension;
53
+ // If previous file was global, this is easy.
54
+ changes.createNewFile(oldFile, combinePaths(currentDirectory, newFileNameWithExtension), getNewStatementsAndRemoveFromOldFile(oldFile, usage, changes, toMove, program, newModuleName, preferences));
55
+ // Na tag, o arquivo novo entrava também no `files` do `tsconfig` do programa (CK-47, CK-06).
56
+ }
57
+ // Filters imports out of the range of statements to move. Imports will be copied to the new file anyway, and may still be needed in the old file.
58
+ function getStatementsToMove(context) {
59
+ const rangeToMove = getRangeToMove(context);
60
+ if (rangeToMove === undefined)
61
+ return undefined;
62
+ const all = [];
63
+ const ranges = [];
64
+ const { toMove, afterLast } = rangeToMove;
65
+ getRangesWhere(toMove, s => !isPureImport(s), (start, afterEndIndex) => {
66
+ for (let i = start; i < afterEndIndex; i++)
67
+ all.push(toMove[i]);
68
+ ranges.push({ first: toMove[start], afterLast });
69
+ });
70
+ return all.length === 0 ? undefined : { all, ranges };
71
+ }
72
+ // Na tag, também o `import =` sem `export` e o `const x = require(…)` (CK-03).
73
+ function isPureImport(node) {
74
+ switch (node.kind) {
75
+ case SyntaxKind.ImportDeclaration:
76
+ return true;
77
+ default:
78
+ return false;
79
+ }
80
+ }
81
+ function getNewStatementsAndRemoveFromOldFile(oldFile, usage, changes, toMove, program, newModuleName, preferences) {
82
+ const checker = program.getTypeChecker();
83
+ if (!oldFile.externalModuleIndicator) {
84
+ deleteMovedStatements(oldFile, toMove.ranges, changes);
85
+ return toMove.all;
86
+ }
87
+ const quotePreference = getQuotePreference(oldFile, preferences);
88
+ const importsFromNewFile = createOldFileImportsFromNewFile(usage.oldFileImportsFromNewFile, newModuleName, quotePreference);
89
+ if (importsFromNewFile) {
90
+ insertImports(changes, oldFile, importsFromNewFile, /*blankLineBetween*/ true);
91
+ }
92
+ deleteUnusedOldImports(oldFile, toMove.all, changes, usage.unusedImportsFromOldFile, checker);
93
+ deleteMovedStatements(oldFile, toMove.ranges, changes);
94
+ updateImportsInOtherFiles(changes, program, oldFile, usage.movedSymbols, newModuleName);
95
+ return [
96
+ ...getNewFileImportsAndAddExportInOldFile(oldFile, usage.oldImportsNeededByNewFile, usage.newFileImportsFromOldFile, changes, checker, quotePreference),
97
+ ...addExports(oldFile, toMove.all, usage.oldFileImportsFromNewFile),
98
+ ];
99
+ }
100
+ function deleteMovedStatements(sourceFile, moved, changes) {
101
+ for (const { first, afterLast } of moved) {
102
+ changes.deleteNodeRangeExcludingEnd(sourceFile, first, afterLast);
103
+ }
104
+ }
105
+ function deleteUnusedOldImports(oldFile, toMove, changes, toDelete, checker) {
106
+ for (const statement of oldFile.statements) {
107
+ if (contains(toMove, statement))
108
+ continue;
109
+ forEachImportInStatement(statement, i => deleteUnusedImports(oldFile, i, changes, name => toDelete.has(checker.getSymbolAtLocation(name))));
110
+ }
111
+ }
112
+ function updateImportsInOtherFiles(changes, program, oldFile, movedSymbols, newModuleName) {
113
+ const checker = program.getTypeChecker();
114
+ for (const sourceFile of program.getSourceFiles()) {
115
+ if (sourceFile === oldFile)
116
+ continue;
117
+ for (const statement of sourceFile.statements) {
118
+ forEachImportInStatement(statement, importNode => {
119
+ if (checker.getSymbolAtLocation(moduleSpecifierFromImport(importNode)) !== oldFile.symbol)
120
+ return;
121
+ const shouldMove = (name) => {
122
+ const symbol = isBindingElement(name.parent)
123
+ ? getPropertySymbolFromBindingElement(checker, name.parent)
124
+ : skipAlias(checker.getSymbolAtLocation(name), checker);
125
+ return !!symbol && movedSymbols.has(symbol);
126
+ };
127
+ deleteUnusedImports(sourceFile, importNode, changes, shouldMove); // These will be changed to imports from the new file
128
+ const newModuleSpecifier = combinePaths(getDirectoryPath(moduleSpecifierFromImport(importNode).text), newModuleName);
129
+ const newImportDeclaration = filterImport(importNode, createLiteral(newModuleSpecifier), shouldMove);
130
+ if (newImportDeclaration)
131
+ changes.insertNodeAfter(sourceFile, statement, newImportDeclaration);
132
+ const ns = getNamespaceLikeImport(importNode);
133
+ if (ns)
134
+ updateNamespaceLikeImport(changes, sourceFile, checker, movedSymbols, newModuleName, newModuleSpecifier, ns, importNode);
135
+ });
136
+ }
137
+ }
138
+ }
139
+ function getNamespaceLikeImport(node) {
140
+ switch (node.kind) {
141
+ case SyntaxKind.ImportDeclaration:
142
+ return node.importClause && node.importClause.namedBindings && node.importClause.namedBindings.kind === SyntaxKind.NamespaceImport ?
143
+ node.importClause.namedBindings.name : undefined;
144
+ default:
145
+ return Debug.assertNever(node.kind, `Unexpected node kind ${node.kind}`);
146
+ }
147
+ }
148
+ function updateNamespaceLikeImport(changes, sourceFile, checker, movedSymbols, newModuleName, newModuleSpecifier, oldImportId, oldImportNode) {
149
+ const preferredNewNamespaceName = moduleSpecifierToValidIdentifier(newModuleName, ScriptTarget.ESNext);
150
+ let needUniqueName = false;
151
+ const toChange = [];
152
+ FindAllReferences.Core.eachSymbolReferenceInFile(oldImportId, checker, sourceFile, ref => {
153
+ if (!isPropertyAccessExpression(ref.parent))
154
+ return;
155
+ needUniqueName = needUniqueName || !!checker.resolveName(preferredNewNamespaceName, ref, SymbolFlags.All, /*excludeGlobals*/ true);
156
+ if (movedSymbols.has(checker.getSymbolAtLocation(ref.parent.name))) {
157
+ toChange.push(ref);
158
+ }
159
+ });
160
+ if (toChange.length) {
161
+ const newNamespaceName = needUniqueName ? getUniqueName(preferredNewNamespaceName, sourceFile) : preferredNewNamespaceName;
162
+ for (const ref of toChange) {
163
+ changes.replaceNode(sourceFile, ref, createIdentifier(newNamespaceName));
164
+ }
165
+ changes.insertNodeAfter(sourceFile, oldImportNode, updateNamespaceLikeImportNode(oldImportNode, newModuleName, newModuleSpecifier));
166
+ }
167
+ }
168
+ function updateNamespaceLikeImportNode(node, newNamespaceName, newModuleSpecifier) {
169
+ const newNamespaceId = createIdentifier(newNamespaceName);
170
+ const newModuleString = createLiteral(newModuleSpecifier);
171
+ switch (node.kind) {
172
+ case SyntaxKind.ImportDeclaration:
173
+ return createImportDeclaration(
174
+ /*modifiers*/ undefined, createImportClause(/*name*/ undefined, createNamespaceImport(newNamespaceId)), newModuleString);
175
+ default:
176
+ return Debug.assertNever(node.kind, `Unexpected node kind ${node.kind}`);
177
+ }
178
+ }
179
+ function moduleSpecifierFromImport(i) {
180
+ return i.moduleSpecifier;
181
+ }
182
+ function forEachImportInStatement(statement, cb) {
183
+ if (isImportDeclaration(statement)) {
184
+ if (isStringLiteral(statement.moduleSpecifier))
185
+ cb(statement);
186
+ }
187
+ }
188
+ function createOldFileImportsFromNewFile(newFileNeedExport, newFileNameWithExtension, quotePreference) {
189
+ const imports = [];
190
+ // Na tag, o símbolo `default` movido vinha como import default; só a `function` e a classe o declaravam (CK-02).
191
+ newFileNeedExport.forEach(symbol => {
192
+ imports.push(symbol.name);
193
+ });
194
+ return makeImportOrRequire(/*defaultImport*/ undefined, imports, newFileNameWithExtension, quotePreference);
195
+ }
196
+ function makeImportOrRequire(defaultImport, imports, path, quotePreference) {
197
+ path = ensurePathIsNonModuleName(path);
198
+ const specifiers = imports.map(i => createImportSpecifier(/*propertyName*/ undefined, createIdentifier(i)));
199
+ return makeImportIfNecessary(defaultImport, specifiers, path, quotePreference);
200
+ }
201
+ function addExports(sourceFile, toMove, needExport) {
202
+ return flatMap(toMove, statement => {
203
+ if (isTopLevelDeclarationStatement(statement) &&
204
+ !isExported(sourceFile, statement) &&
205
+ forEachTopLevelDeclaration(statement, d => needExport.has(Debug.checkDefined(d.symbol)))) {
206
+ const exports = addExport(statement);
207
+ if (exports)
208
+ return exports;
209
+ }
210
+ return statement;
211
+ });
212
+ }
213
+ function deleteUnusedImports(sourceFile, importDecl, changes, isUnused) {
214
+ switch (importDecl.kind) {
215
+ case SyntaxKind.ImportDeclaration:
216
+ deleteUnusedImportsInDeclaration(sourceFile, importDecl, changes, isUnused);
217
+ break;
218
+ default:
219
+ Debug.assertNever(importDecl.kind, `Unexpected import decl kind ${importDecl.kind}`);
220
+ }
221
+ }
222
+ function deleteUnusedImportsInDeclaration(sourceFile, importDecl, changes, isUnused) {
223
+ if (!importDecl.importClause)
224
+ return;
225
+ const { name, namedBindings } = importDecl.importClause;
226
+ const defaultUnused = !name || isUnused(name);
227
+ const namedBindingsUnused = !namedBindings ||
228
+ (namedBindings.kind === SyntaxKind.NamespaceImport ? isUnused(namedBindings.name) : namedBindings.elements.length !== 0 && namedBindings.elements.every(e => isUnused(e.name)));
229
+ if (defaultUnused && namedBindingsUnused) {
230
+ changes.delete(sourceFile, importDecl);
231
+ }
232
+ else {
233
+ if (name && defaultUnused) {
234
+ changes.delete(sourceFile, name);
235
+ }
236
+ if (namedBindings) {
237
+ if (namedBindingsUnused) {
238
+ changes.replaceNode(sourceFile, importDecl.importClause, updateImportClause(importDecl.importClause, name, /*namedBindings*/ undefined, importDecl.importClause.isTypeOnly));
239
+ }
240
+ else if (namedBindings.kind === SyntaxKind.NamedImports) {
241
+ for (const element of namedBindings.elements) {
242
+ if (isUnused(element.name))
243
+ changes.delete(sourceFile, element);
244
+ }
245
+ }
246
+ }
247
+ }
248
+ }
249
+ function getNewFileImportsAndAddExportInOldFile(oldFile, importsToCopy, newFileImportsFromOldFile, changes, checker, quotePreference) {
250
+ const copiedOldImports = [];
251
+ for (const oldStatement of oldFile.statements) {
252
+ forEachImportInStatement(oldStatement, i => {
253
+ append(copiedOldImports, filterImport(i, moduleSpecifierFromImport(i), name => importsToCopy.has(checker.getSymbolAtLocation(name))));
254
+ });
255
+ }
256
+ // Also, import things used from the old file, and insert 'export' modifiers as necessary in the old file.
257
+ const oldFileNamedImports = [];
258
+ const markSeenTop = nodeSeenTracker(); // Needed because multiple declarations may appear in `const x = 0, y = 1;`.
259
+ newFileImportsFromOldFile.forEach(symbol => {
260
+ for (const decl of symbol.declarations) {
261
+ if (!isTopLevelDeclaration(decl))
262
+ continue;
263
+ const name = nameOfTopLevelDeclaration(decl);
264
+ if (!name)
265
+ continue;
266
+ const top = getTopLevelDeclarationStatement(decl);
267
+ if (markSeenTop(top)) {
268
+ addExportToChanges(oldFile, top, changes);
269
+ }
270
+ // Na tag, a declaração com o modificador `default` vinha como import default (CK-02).
271
+ oldFileNamedImports.push(name.text);
272
+ }
273
+ });
274
+ append(copiedOldImports, makeImportOrRequire(/*defaultImport*/ undefined, oldFileNamedImports, removeFileExtension(getBaseFileName(oldFile.fileName)), quotePreference));
275
+ return copiedOldImports;
276
+ }
277
+ // Na tag, o nome se conferia pelo `fileExists` do host, que lia o disco; o host da Linguagem dá um mundo fechado, e um
278
+ // arquivo existe quando está entre os arquivos dele (CK-47).
279
+ function makeUniqueModuleName(moduleName, extension, inDirectory, host) {
280
+ let newModuleName = moduleName;
281
+ for (let i = 1;; i++) {
282
+ const name = combinePaths(inDirectory, newModuleName + extension);
283
+ if (!contains(host.getScriptFileNames(), name))
284
+ return newModuleName;
285
+ newModuleName = `${moduleName}.${i}`;
286
+ }
287
+ }
288
+ function getNewModuleName(movedSymbols) {
289
+ return movedSymbols.forEachEntry(symbolNameNoDefault) || "newFile";
290
+ }
291
+ function getUsageInfo(oldFile, toMove, checker) {
292
+ const movedSymbols = new SymbolSet();
293
+ const oldImportsNeededByNewFile = new SymbolSet();
294
+ const newFileImportsFromOldFile = new SymbolSet();
295
+ // Na tag, o import da fábrica do JSX ia junto com o JSX movido (CK-19).
296
+ for (const statement of toMove) {
297
+ forEachTopLevelDeclaration(statement, decl => {
298
+ movedSymbols.add(Debug.checkDefined(decl.symbol, "Need a symbol here"));
299
+ });
300
+ }
301
+ for (const statement of toMove) {
302
+ forEachReference(statement, checker, symbol => {
303
+ if (!symbol.declarations)
304
+ return;
305
+ for (const decl of symbol.declarations) {
306
+ if (isInImport(decl)) {
307
+ oldImportsNeededByNewFile.add(symbol);
308
+ }
309
+ else if (isTopLevelDeclaration(decl) && sourceFileOfTopLevelDeclaration(decl) === oldFile && !movedSymbols.has(symbol)) {
310
+ newFileImportsFromOldFile.add(symbol);
311
+ }
312
+ }
313
+ });
314
+ }
315
+ const unusedImportsFromOldFile = oldImportsNeededByNewFile.clone();
316
+ const oldFileImportsFromNewFile = new SymbolSet();
317
+ for (const statement of oldFile.statements) {
318
+ if (contains(toMove, statement))
319
+ continue;
320
+ forEachReference(statement, checker, symbol => {
321
+ if (movedSymbols.has(symbol))
322
+ oldFileImportsFromNewFile.add(symbol);
323
+ unusedImportsFromOldFile.delete(symbol);
324
+ });
325
+ }
326
+ return { movedSymbols, newFileImportsFromOldFile, oldFileImportsFromNewFile, oldImportsNeededByNewFile, unusedImportsFromOldFile };
327
+ }
328
+ // Below should all be utilities
329
+ // Na tag, também o `import =` e o `const x = require(…)` de topo (CK-03).
330
+ function isInImport(decl) {
331
+ switch (decl.kind) {
332
+ case SyntaxKind.ImportSpecifier:
333
+ case SyntaxKind.ImportClause:
334
+ case SyntaxKind.NamespaceImport:
335
+ return true;
336
+ default:
337
+ return false;
338
+ }
339
+ }
340
+ function filterImport(i, moduleSpecifier, keep) {
341
+ switch (i.kind) {
342
+ case SyntaxKind.ImportDeclaration: {
343
+ const clause = i.importClause;
344
+ if (!clause)
345
+ return undefined;
346
+ const defaultImport = clause.name && keep(clause.name) ? clause.name : undefined;
347
+ const namedBindings = clause.namedBindings && filterNamedBindings(clause.namedBindings, keep);
348
+ return defaultImport || namedBindings
349
+ ? createImportDeclaration(/*modifiers*/ undefined, createImportClause(defaultImport, namedBindings), moduleSpecifier)
350
+ : undefined;
351
+ }
352
+ default:
353
+ return Debug.assertNever(i.kind, `Unexpected import kind ${i.kind}`);
354
+ }
355
+ }
356
+ function filterNamedBindings(namedBindings, keep) {
357
+ if (namedBindings.kind === SyntaxKind.NamespaceImport) {
358
+ return keep(namedBindings.name) ? namedBindings : undefined;
359
+ }
360
+ else {
361
+ const newElements = namedBindings.elements.filter(e => keep(e.name));
362
+ return newElements.length ? createNamedImports(newElements) : undefined;
363
+ }
364
+ }
365
+ function forEachReference(node, checker, onReference) {
366
+ node.forEachChild(function cb(node) {
367
+ if (isIdentifier(node) && !isDeclarationName(node)) {
368
+ const sym = checker.getSymbolAtLocation(node);
369
+ if (sym)
370
+ onReference(sym);
371
+ }
372
+ else {
373
+ node.forEachChild(cb);
374
+ }
375
+ });
376
+ }
377
+ class SymbolSet {
378
+ constructor() {
379
+ this.map = createMap();
380
+ }
381
+ add(symbol) {
382
+ this.map.set(String(getSymbolId(symbol)), symbol);
383
+ }
384
+ has(symbol) {
385
+ return this.map.has(String(getSymbolId(symbol)));
386
+ }
387
+ delete(symbol) {
388
+ this.map.delete(String(getSymbolId(symbol)));
389
+ }
390
+ forEach(cb) {
391
+ this.map.forEach(cb);
392
+ }
393
+ forEachEntry(cb) {
394
+ return forEachEntry(this.map, cb);
395
+ }
396
+ clone() {
397
+ const clone = new SymbolSet();
398
+ copyEntries(this.map, clone.map);
399
+ return clone;
400
+ }
401
+ }
402
+ function isTopLevelDeclaration(node) {
403
+ return isNonVariableTopLevelDeclaration(node) && isSourceFile(node.parent) || isVariableDeclaration(node) && isSourceFile(node.parent.parent.parent);
404
+ }
405
+ function sourceFileOfTopLevelDeclaration(node) {
406
+ return isVariableDeclaration(node) ? node.parent.parent.parent : node.parent;
407
+ }
408
+ function isTopLevelDeclarationStatement(node) {
409
+ Debug.assert(isSourceFile(node.parent), "Node parent should be a SourceFile");
410
+ return isNonVariableTopLevelDeclaration(node) || isVariableStatement(node);
411
+ }
412
+ function isNonVariableTopLevelDeclaration(node) {
413
+ switch (node.kind) {
414
+ case SyntaxKind.ModuleDeclaration:
415
+ case SyntaxKind.TypeAliasDeclaration:
416
+ return true;
417
+ default:
418
+ return false;
419
+ }
420
+ }
421
+ function forEachTopLevelDeclaration(statement, cb) {
422
+ switch (statement.kind) {
423
+ case SyntaxKind.ModuleDeclaration:
424
+ case SyntaxKind.TypeAliasDeclaration:
425
+ return cb(statement);
426
+ case SyntaxKind.VariableStatement:
427
+ return firstDefined(statement.declarationList.declarations, decl => forEachTopLevelDeclarationInBindingName(decl.name, cb));
428
+ }
429
+ }
430
+ function forEachTopLevelDeclarationInBindingName(name, cb) {
431
+ switch (name.kind) {
432
+ case SyntaxKind.Identifier:
433
+ return cb(cast(name.parent, (x) => isVariableDeclaration(x) || isBindingElement(x)));
434
+ case SyntaxKind.ArrayBindingPattern:
435
+ case SyntaxKind.ObjectBindingPattern:
436
+ return firstDefined(name.elements, em => isOmittedExpression(em) ? undefined : forEachTopLevelDeclarationInBindingName(em.name, cb));
437
+ default:
438
+ return Debug.assertNever(name, `Unexpected name kind ${name.kind}`);
439
+ }
440
+ }
441
+ function nameOfTopLevelDeclaration(d) {
442
+ return tryCast(d.name, isIdentifier);
443
+ }
444
+ function getTopLevelDeclarationStatement(d) {
445
+ switch (d.kind) {
446
+ case SyntaxKind.VariableDeclaration:
447
+ return d.parent.parent;
448
+ case SyntaxKind.BindingElement:
449
+ return getTopLevelDeclarationStatement(cast(d.parent.parent, (p) => isVariableDeclaration(p) || isBindingElement(p)));
450
+ default:
451
+ return d;
452
+ }
453
+ }
454
+ function addExportToChanges(sourceFile, decl, changes) {
455
+ if (isExported(sourceFile, decl))
456
+ return;
457
+ changes.insertExportModifier(sourceFile, decl);
458
+ }
459
+ function isExported(_sourceFile, decl) {
460
+ return hasModifier(decl, ModifierFlags.Export);
461
+ }
462
+ function addExport(decl) {
463
+ return [addEs6Export(decl)];
464
+ }
465
+ function addEs6Export(d) {
466
+ const modifiers = concatenate([createModifier(SyntaxKind.ExportKeyword)], d.modifiers);
467
+ switch (d.kind) {
468
+ case SyntaxKind.VariableStatement:
469
+ return updateVariableStatement(d, modifiers, d.declarationList);
470
+ case SyntaxKind.ModuleDeclaration:
471
+ return updateModuleDeclaration(d, modifiers, d.name, d.body);
472
+ case SyntaxKind.TypeAliasDeclaration:
473
+ return updateTypeAliasDeclaration(d, modifiers, d.name, d.typeParameters, d.type);
474
+ default:
475
+ return Debug.assertNever(d, `Unexpected declaration kind ${d.kind}`);
476
+ }
477
+ }
@@ -0,0 +1,2 @@
1
+ import type { CheckResult, RenameInfo, RenameInfoOptions, SourceFile } from "./_namespaces/ts.js";
2
+ export declare function getRenameInfo(program: CheckResult, sourceFile: SourceFile, position: number, options?: RenameInfoOptions): RenameInfo;