mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 08:11:30 -06:00
Merge pull request #20545 from RyanCavanaugh/codefixOmnibus
Omnibus fixes for telemetry-sourced crashes
This commit is contained in:
commit
f6603cd9f2
@ -3951,7 +3951,12 @@ namespace ts {
|
||||
writePunctuation(writer, SyntaxKind.CloseBracketToken);
|
||||
writePunctuation(writer, SyntaxKind.ColonToken);
|
||||
writeSpace(writer);
|
||||
buildTypeDisplay(info.type, writer, enclosingDeclaration, globalFlags, symbolStack);
|
||||
if (info.type) {
|
||||
buildTypeDisplay(info.type, writer, enclosingDeclaration, globalFlags, symbolStack);
|
||||
}
|
||||
else {
|
||||
writeKeyword(writer, SyntaxKind.AnyKeyword);
|
||||
}
|
||||
writePunctuation(writer, SyntaxKind.SemicolonToken);
|
||||
writer.writeLine();
|
||||
}
|
||||
|
||||
@ -70,7 +70,6 @@ namespace ts.codefix {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const containingFunction = getContainingFunction(token);
|
||||
switch (errorCode) {
|
||||
// Variable and Property declarations
|
||||
case Diagnostics.Member_0_implicitly_has_an_1_type.code:
|
||||
@ -81,6 +80,13 @@ namespace ts.codefix {
|
||||
const symbol = program.getTypeChecker().getSymbolAtLocation(token);
|
||||
return symbol && symbol.valueDeclaration && getCodeActionForVariableDeclaration(<VariableDeclaration>symbol.valueDeclaration, sourceFile, program, cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
const containingFunction = getContainingFunction(token);
|
||||
if (containingFunction === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
switch (errorCode) {
|
||||
|
||||
// Parameter declarations
|
||||
case Diagnostics.Parameter_0_implicitly_has_an_1_type.code:
|
||||
@ -148,6 +154,11 @@ namespace ts.codefix {
|
||||
containingFunction.parameters.map(p => isIdentifier(p.name) ? inferTypeForVariableFromUsage(p.name, sourceFile, program, cancellationToken) : undefined);
|
||||
if (!types) return undefined;
|
||||
|
||||
// We didn't actually find a set of type inference positions matching each parameter position
|
||||
if (containingFunction.parameters.length !== types.length) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const textChanges = arrayFrom(mapDefinedIterator(zipToIterator(containingFunction.parameters, types), ([parameter, type]) =>
|
||||
type && !parameter.type && !parameter.initializer ? makeChange(containingFunction, parameter.end, type, program) : undefined));
|
||||
return textChanges.length ? { declaration: parameterDeclaration, textChanges } : undefined;
|
||||
@ -191,8 +202,9 @@ namespace ts.codefix {
|
||||
sourceFile,
|
||||
token.getStart(sourceFile));
|
||||
|
||||
Debug.assert(!!references, "Found no references!");
|
||||
Debug.assert(references.length === 1, "Found more references than expected");
|
||||
if (!references || references.length !== 1) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return references[0].references.map(r => <Identifier>getTokenAtPosition(program.getSourceFile(r.fileName), r.textSpan.start, /*includeJsDocComment*/ false));
|
||||
}
|
||||
@ -281,6 +293,10 @@ namespace ts.codefix {
|
||||
}
|
||||
|
||||
export function inferTypeForParametersFromReferences(references: Identifier[], declaration: FunctionLikeDeclaration, checker: TypeChecker, cancellationToken: CancellationToken): (Type | undefined)[] | undefined {
|
||||
if (references.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (declaration.parameters) {
|
||||
const usageContext: UsageContext = {};
|
||||
for (const reference of references) {
|
||||
|
||||
@ -496,7 +496,7 @@ namespace ts.SymbolDisplay {
|
||||
addNewLineIfDisplayPartsExist();
|
||||
if (symbolKind) {
|
||||
pushTypePart(symbolKind);
|
||||
if (!some(symbol.declarations, d => isArrowFunction(d) || (isFunctionExpression(d) || isClassExpression(d)) && !d.name)) {
|
||||
if (symbol && !some(symbol.declarations, d => isArrowFunction(d) || (isFunctionExpression(d) || isClassExpression(d)) && !d.name)) {
|
||||
displayParts.push(spacePart());
|
||||
addFullSymbolName(symbol);
|
||||
}
|
||||
|
||||
9
tests/cases/fourslash/incompleteFunctionCallCodefix.ts
Normal file
9
tests/cases/fourslash/incompleteFunctionCallCodefix.ts
Normal file
@ -0,0 +1,9 @@
|
||||
/// <reference path='fourslash.ts' />
|
||||
|
||||
// @noImplicitAny: true
|
||||
//// function f(/*1*/x) {
|
||||
//// }
|
||||
//// f(
|
||||
|
||||
verify.not.codeFixAvailable([]);
|
||||
|
||||
7
tests/cases/fourslash/incompleteFunctionCallCodefix2.ts
Normal file
7
tests/cases/fourslash/incompleteFunctionCallCodefix2.ts
Normal file
@ -0,0 +1,7 @@
|
||||
/// <reference path='fourslash.ts' />
|
||||
|
||||
// @noImplicitAny: true
|
||||
//// function f(new C(100, 3, undefined)
|
||||
|
||||
verify.not.codeFixAvailable([]);
|
||||
|
||||
7
tests/cases/fourslash/incompleteFunctionCallCodefix3.ts
Normal file
7
tests/cases/fourslash/incompleteFunctionCallCodefix3.ts
Normal file
@ -0,0 +1,7 @@
|
||||
/// <reference path='fourslash.ts' />
|
||||
|
||||
// @noImplicitAny: true
|
||||
//// function ...q) {}} f(10);
|
||||
|
||||
verify.not.codeFixAvailable([]);
|
||||
|
||||
6
tests/cases/fourslash/typeToStringCrashInCodeFix.ts
Normal file
6
tests/cases/fourslash/typeToStringCrashInCodeFix.ts
Normal file
@ -0,0 +1,6 @@
|
||||
/// <reference path="fourslash.ts" />
|
||||
|
||||
// @noImplicitAny: true
|
||||
//// function f(y, z = { p: y[
|
||||
|
||||
verify.getAndApplyCodeFix();
|
||||
Loading…
x
Reference in New Issue
Block a user