Skip to content

Commit 06d7230

Browse files
author
Andy Hanson
committed
Don't allow to rename string literal
1 parent aa0cddd commit 06d7230

File tree

2 files changed

+22
-30
lines changed

2 files changed

+22
-30
lines changed

src/services/rename.ts

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,31 @@ namespace ts.Rename {
2121

2222
function getRenameInfoForNode(node: Node, typeChecker: TypeChecker, sourceFile: SourceFile, isDefinedInLibraryFile: (declaration: Node) => boolean): RenameInfo | undefined {
2323
const symbol = typeChecker.getSymbolAtLocation(node);
24-
24+
if (!symbol) return;
2525
// Only allow a symbol to be renamed if it actually has at least one declaration.
26-
if (symbol) {
27-
const { declarations } = symbol;
28-
if (declarations && declarations.length > 0) {
29-
// Disallow rename for elements that are defined in the standard TypeScript library.
30-
if (declarations.some(isDefinedInLibraryFile)) {
31-
return getRenameInfoError(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library);
32-
}
33-
34-
// Cannot rename `default` as in `import { default as foo } from "./someModule";
35-
if (isIdentifier(node) && node.originalKeywordKind === SyntaxKind.DefaultKeyword && symbol.parent!.flags & SymbolFlags.Module) {
36-
return undefined;
37-
}
38-
39-
// Can't rename a module name.
40-
if (isStringLiteralLike(node) && tryGetImportFromModuleSpecifier(node)) return undefined;
26+
const { declarations } = symbol;
27+
if (!declarations || declarations.length === 0) return;
4128

42-
const kind = SymbolDisplay.getSymbolKind(typeChecker, symbol, node);
43-
const specifierName = (isImportOrExportSpecifierName(node) || isStringOrNumericLiteral(node) && node.parent.kind === SyntaxKind.ComputedPropertyName)
44-
? stripQuotes(getTextOfIdentifierOrLiteral(node))
45-
: undefined;
46-
const displayName = specifierName || typeChecker.symbolToString(symbol);
47-
const fullDisplayName = specifierName || typeChecker.getFullyQualifiedName(symbol);
48-
return getRenameInfoSuccess(displayName, fullDisplayName, kind, SymbolDisplay.getSymbolModifiers(symbol), node, sourceFile);
49-
}
29+
// Disallow rename for elements that are defined in the standard TypeScript library.
30+
if (declarations.some(isDefinedInLibraryFile)) {
31+
return getRenameInfoError(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library);
5032
}
51-
else if (isStringLiteral(node)) {
52-
if (isDefinedInLibraryFile(node)) {
53-
return getRenameInfoError(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library);
54-
}
55-
return getRenameInfoSuccess(node.text, node.text, ScriptElementKind.variableElement, ScriptElementKindModifier.none, node, sourceFile);
33+
34+
// Cannot rename `default` as in `import { default as foo } from "./someModule";
35+
if (isIdentifier(node) && node.originalKeywordKind === SyntaxKind.DefaultKeyword && symbol.parent!.flags & SymbolFlags.Module) {
36+
return undefined;
5637
}
38+
39+
// Can't rename a module name.
40+
if (isStringLiteralLike(node) && tryGetImportFromModuleSpecifier(node)) return undefined;
41+
42+
const kind = SymbolDisplay.getSymbolKind(typeChecker, symbol, node);
43+
const specifierName = (isImportOrExportSpecifierName(node) || isStringOrNumericLiteral(node) && node.parent.kind === SyntaxKind.ComputedPropertyName)
44+
? stripQuotes(getTextOfIdentifierOrLiteral(node))
45+
: undefined;
46+
const displayName = specifierName || typeChecker.symbolToString(symbol);
47+
const fullDisplayName = specifierName || typeChecker.getFullyQualifiedName(symbol);
48+
return getRenameInfoSuccess(displayName, fullDisplayName, kind, SymbolDisplay.getSymbolModifiers(symbol), node, sourceFile);
5749
}
5850

5951
function getRenameInfoSuccess(displayName: string, fullDisplayName: string, kind: ScriptElementKind, kindModifiers: string, node: Node, sourceFile: SourceFile): RenameInfo {

tests/cases/fourslash/renameStringLiteralTypes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@
1111
////
1212
////animate({ deltaX: 100, deltaY: 100, easing: "[|ease-in-out|]" });
1313

14-
verify.rangesAreRenameLocations();
14+
goTo.eachRange(() => { verify.renameInfoFailed(); });

0 commit comments

Comments
 (0)