From 0dc74245e2072610d84d0bd03264793bca750315 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 27 Jul 2017 12:42:11 -0700 Subject: [PATCH] Added codefix for replacing qualified names with indexed access types. --- src/compiler/diagnosticMessages.json | 4 +++ ...correctQualifiedNameToIndexedAccessType.ts | 27 +++++++++++++++++++ src/services/codefixes/fixes.ts | 1 + 3 files changed, 32 insertions(+) create mode 100644 src/services/codefixes/correctQualifiedNameToIndexedAccessType.ts diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 0d9e7a0a6bf..1ffc78134c3 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3657,6 +3657,10 @@ "category": "Message", "code": 90025 }, + "Rewrite as the indexed access type '{0}'.": { + "category": "Message", + "code": 90026 + }, "Convert function to an ES2015 class": { "category": "Message", diff --git a/src/services/codefixes/correctQualifiedNameToIndexedAccessType.ts b/src/services/codefixes/correctQualifiedNameToIndexedAccessType.ts new file mode 100644 index 00000000000..3087d73276d --- /dev/null +++ b/src/services/codefixes/correctQualifiedNameToIndexedAccessType.ts @@ -0,0 +1,27 @@ +/* @internal */ +namespace ts.codefix { + registerCodeFix({ + errorCodes: [Diagnostics.Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1.code], + getCodeActions: (context: CodeFixContext) => { + const sourceFile = context.sourceFile; + const token = getTokenAtPosition(sourceFile, context.span.start, /*includeJsDocComment*/ false); + const qualifiedName = getAncestor(token, SyntaxKind.QualifiedName) as QualifiedName; + Debug.assert(!!qualifiedName, "Expected position to be owned by a qualified name."); + if (!isIdentifier(qualifiedName.left)) { + return undefined; + } + const leftText = qualifiedName.left.getText(sourceFile); + const rightText = qualifiedName.right.getText(sourceFile); + const replacement = createIndexedAccessTypeNode( + createTypeReferenceNode(qualifiedName.left, /*typeArguments*/ undefined), + createLiteralTypeNode(createLiteral(rightText))); + const changeTracker = textChanges.ChangeTracker.fromCodeFixContext(context); + changeTracker.replaceNode(sourceFile, qualifiedName, replacement); + + return [{ + description: formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Rewrite_as_the_indexed_access_type_0), [`${leftText}["${rightText}"]`]), + changes: changeTracker.getChanges() + }]; + } + }); +} diff --git a/src/services/codefixes/fixes.ts b/src/services/codefixes/fixes.ts index ef670c81ba9..9bc80cad691 100644 --- a/src/services/codefixes/fixes.ts +++ b/src/services/codefixes/fixes.ts @@ -1,3 +1,4 @@ +/// /// /// ///