Add a code fixer for --isolatedDeclarations errors (#58260)

Co-authored-by: Andrew Branch <andrewbranch@users.noreply.github.com>
This commit is contained in:
Hana Joo
2024-04-30 15:25:51 -07:00
committed by GitHub
co-authored by Andrew Branch
parent 749bd834be
commit 33b156147b
58 changed files with 2696 additions and 6 deletions
+1
View File
@@ -1611,6 +1611,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
getBaseTypes,
getBaseTypeOfLiteralType,
getWidenedType,
getWidenedLiteralType,
getTypeFromTypeNode: nodeIn => {
const node = getParseTreeNode(nodeIn, isTypeNode);
return node ? getTypeFromTypeNode(node) : errorType;
+40
View File
@@ -7336,6 +7336,46 @@
"category": "Message",
"code": 90061
},
"Add annotation of type '{0}'": {
"category": "Message",
"code": 90062
},
"Add return type '{0}'": {
"category": "Message",
"code": 90063
},
"Extract base class to variable": {
"category": "Message",
"code": 90064
},
"Extract default export to variable": {
"category": "Message",
"code": 90065
},
"Extract binding expressions to variable": {
"category": "Message",
"code": 90066
},
"Add all missing type annotations": {
"category": "Message",
"code": 90067
},
"Add satisfies and an inline type assertion with '{0}'": {
"category": "Message",
"code": 90068
},
"Extract to variable and replace with '{0} as typeof {0}'": {
"category": "Message",
"code": 90069
},
"Mark array literal as const": {
"category": "Message",
"code": 90070
},
"Annotate types of properties expando function in a namespace": {
"category": "Message",
"code": 90071
},
"Convert function to an ES2015 class": {
"category": "Message",
+2
View File
@@ -5022,6 +5022,8 @@ export interface TypeChecker {
getBaseTypeOfLiteralType(type: Type): Type;
getWidenedType(type: Type): Type;
/** @internal */
getWidenedLiteralType(type: Type): Type;
/** @internal */
getPromisedTypeOfPromise(promise: Type, errorNode?: Node): Type | undefined;
/** @internal */
getAwaitedType(type: Type): Type | undefined;
+1
View File
@@ -50,6 +50,7 @@ export * from "../codefixes/fixUnreachableCode";
export * from "../codefixes/fixUnusedLabel";
export * from "../codefixes/fixJSDocTypes";
export * from "../codefixes/fixMissingCallParentheses";
export * from "../codefixes/fixMissingTypeAnnotationOnExports";
export * from "../codefixes/fixAwaitInSyncFunction";
export * from "../codefixes/fixPropertyOverrideAccessor";
export * from "../codefixes/inferFromUsage";
+8 -1
View File
@@ -18,6 +18,7 @@ import {
DiagnosticWithLocation,
FileTextChanges,
flatMap,
getEmitDeclarations,
isString,
map,
TextChange,
@@ -124,9 +125,15 @@ export function eachDiagnostic(context: CodeFixAllContext, errorCodes: readonly
}
function getDiagnostics({ program, sourceFile, cancellationToken }: CodeFixContextBase) {
return [
const diagnostics = [
...program.getSemanticDiagnostics(sourceFile, cancellationToken),
...program.getSyntacticDiagnostics(sourceFile, cancellationToken),
...computeSuggestionDiagnostics(sourceFile, program, cancellationToken),
];
if (getEmitDeclarations(program.getCompilerOptions())) {
diagnostics.push(
...program.getDeclarationDiagnostics(sourceFile, cancellationToken),
);
}
return diagnostics;
}
File diff suppressed because it is too large Load Diff
+2 -5
View File
@@ -61,7 +61,6 @@ import {
hasEffectiveModifier,
hasSyntacticModifier,
Identifier,
identifierToKeywordKind,
isArray,
isArrowFunction,
isAssignmentExpression,
@@ -92,7 +91,6 @@ import {
isModuleBlock,
isParenthesizedTypeNode,
isPartOfTypeNode,
isPrivateIdentifier,
isPropertyAccessExpression,
isPropertyDeclaration,
isQualifiedName,
@@ -161,6 +159,7 @@ import {
VisitResult,
} from "../_namespaces/ts";
import {
getIdentifierForNode,
refactorKindBeginsWith,
registerRefactor,
} from "../_namespaces/ts.refactor";
@@ -1374,9 +1373,7 @@ function extractConstantInScope(
// Make a unique name for the extracted variable
const file = scope.getSourceFile();
const localNameText = isPropertyAccessExpression(node) && !isClassLike(scope) && !checker.resolveName(node.name.text, node, SymbolFlags.Value, /*excludeGlobals*/ false) && !isPrivateIdentifier(node.name) && !identifierToKeywordKind(node.name)
? node.name.text
: getUniqueName(isClassLike(scope) ? "newProperty" : "newLocal", file);
const localNameText = getIdentifierForNode(node, scope, checker, file);
const isJS = isInJSFile(scope);
let variableType = isJS || !checker.isContextSensitive(node)
+22
View File
@@ -1,12 +1,22 @@
import {
ClassLikeDeclaration,
codefix,
Debug,
findAncestor,
FunctionLikeDeclaration,
getUniqueName,
identifierToKeywordKind,
isAnyImportOrRequireStatement,
isClassLike,
isPrivateIdentifier,
isPropertyAccessExpression,
ModuleBlock,
Node,
Program,
skipAlias,
SourceFile,
Symbol,
SymbolFlags,
TypeChecker,
} from "../_namespaces/ts";
import { addImportsForMovedSymbols } from "./moveToFile";
@@ -39,6 +49,18 @@ export function refactorKindBeginsWith(known: string, requested: string | undefi
return known.substr(0, requested.length) === requested;
}
/**
* Try to come up with a unique name for a given node within the scope for the
* use of being used as a property/variable name.
*
* @internal
*/
export function getIdentifierForNode(node: Node, scope: FunctionLikeDeclaration | SourceFile | ModuleBlock | ClassLikeDeclaration, checker: TypeChecker, file: SourceFile) {
return isPropertyAccessExpression(node) && !isClassLike(scope) && !checker.resolveName(node.name.text, node, SymbolFlags.Value, /*excludeGlobals*/ false) && !isPrivateIdentifier(node.name) && !identifierToKeywordKind(node.name)
? node.name.text
: getUniqueName(isClassLike(scope) ? "newProperty" : "newLocal", file);
}
/** @internal */
export function addTargetFileImports(
oldFile: SourceFile,