Skip to content

Commit

Permalink
Fix microsoft#50869, only cache calculated type for non-context sensi…
Browse files Browse the repository at this point in the history
…tive parameters (microsoft#50976)

* Fix microsoft#50869, only cache calculated type for non-context sensitive parameters

* Simplify check, update comment
  • Loading branch information
weswigham authored Nov 1, 2022
1 parent c49c733 commit 4d15bb1
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 2 deletions.
21 changes: 19 additions & 2 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9746,16 +9746,33 @@ namespace ts {
}
}

function isParameterOfContextSensitiveSignature(symbol: Symbol) {
let decl = symbol.valueDeclaration;
if (!decl) {
return false;
}
if (isBindingElement(decl)) {
decl = walkUpBindingElementsAndPatterns(decl);
}
if (isParameter(decl)) {
return isContextSensitiveFunctionOrObjectLiteralMethod(decl.parent);
}
return false;
}

function getTypeOfVariableOrParameterOrProperty(symbol: Symbol): Type {
const links = getSymbolLinks(symbol);
if (!links.type) {
const type = getTypeOfVariableOrParameterOrPropertyWorker(symbol);
// For a contextually typed parameter it is possible that a type has already
// been assigned (in assignTypeToParameterAndFixTypeParameters), and we want
// to preserve this type.
if (!links.type) {
// to preserve this type. In fact, we need to _prefer_ that type, but it won't
// be assigned until contextual typing is complete, so we need to defer in
// cases where contextual typing may take place.
if (!links.type && !isParameterOfContextSensitiveSignature(symbol)) {
links.type = type;
}
return type;
}
return links.type;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
[
{
"marker": {
"fileName": "/tests/cases/fourslash/completionDetailsOfContextSensitiveParameterNoCrash.ts",
"position": 3101,
"name": ""
},
"quickInfo": {
"kind": "parameter",
"kindModifiers": "",
"textSpan": {
"start": 3101,
"length": 4
},
"displayParts": [
{
"text": "(",
"kind": "punctuation"
},
{
"text": "parameter",
"kind": "text"
},
{
"text": ")",
"kind": "punctuation"
},
{
"text": " ",
"kind": "space"
},
{
"text": "args",
"kind": "parameterName"
},
{
"text": ":",
"kind": "punctuation"
},
{
"text": " ",
"kind": "space"
},
{
"text": "any",
"kind": "keyword"
}
],
"documentation": []
}
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/// <reference path="fourslash.ts" />

// @strict: true
////type __ = never;
////
////interface CurriedFunction1<T1, R> {
//// (): CurriedFunction1<T1, R>;
//// (t1: T1): R;
////}
////interface CurriedFunction2<T1, T2, R> {
//// (): CurriedFunction2<T1, T2, R>;
//// (t1: T1): CurriedFunction1<T2, R>;
//// (t1: __, t2: T2): CurriedFunction1<T1, R>;
//// (t1: T1, t2: T2): R;
////}
////
////interface CurriedFunction3<T1, T2, T3, R> {
//// (): CurriedFunction3<T1, T2, T3, R>;
//// (t1: T1): CurriedFunction2<T2, T3, R>;
//// (t1: __, t2: T2): CurriedFunction2<T1, T3, R>;
//// (t1: T1, t2: T2): CurriedFunction1<T3, R>;
//// (t1: __, t2: __, t3: T3): CurriedFunction2<T1, T2, R>;
//// (t1: T1, t2: __, t3: T3): CurriedFunction1<T2, R>;
//// (t1: __, t2: T2, t3: T3): CurriedFunction1<T1, R>;
//// (t1: T1, t2: T2, t3: T3): R;
////}
////
////interface CurriedFunction4<T1, T2, T3, T4, R> {
//// (): CurriedFunction4<T1, T2, T3, T4, R>;
//// (t1: T1): CurriedFunction3<T2, T3, T4, R>;
//// (t1: __, t2: T2): CurriedFunction3<T1, T3, T4, R>;
//// (t1: T1, t2: T2): CurriedFunction2<T3, T4, R>;
//// (t1: __, t2: __, t3: T3): CurriedFunction3<T1, T2, T4, R>;
//// (t1: __, t2: __, t3: T3): CurriedFunction2<T2, T4, R>;
//// (t1: __, t2: T2, t3: T3): CurriedFunction2<T1, T4, R>;
//// (t1: T1, t2: T2, t3: T3): CurriedFunction1<T4, R>;
//// (t1: __, t2: __, t3: __, t4: T4): CurriedFunction3<T1, T2, T3, R>;
//// (t1: T1, t2: __, t3: __, t4: T4): CurriedFunction2<T2, T3, R>;
//// (t1: __, t2: T2, t3: __, t4: T4): CurriedFunction2<T1, T3, R>;
//// (t1: __, t2: __, t3: T3, t4: T4): CurriedFunction2<T1, T2, R>;
//// (t1: T1, t2: T2, t3: __, t4: T4): CurriedFunction1<T3, R>;
//// (t1: T1, t2: __, t3: T3, t4: T4): CurriedFunction1<T2, R>;
//// (t1: __, t2: T2, t3: T3, t4: T4): CurriedFunction1<T1, R>;
//// (t1: T1, t2: T2, t3: T3, t4: T4): R;
////}
////
////declare var curry: {
//// <T1, R>(func: (t1: T1) => R, arity?: number): CurriedFunction1<T1, R>;
//// <T1, T2, R>(func: (t1: T1, t2: T2) => R, arity?: number): CurriedFunction2<T1, T2, R>;
//// <T1, T2, T3, R>(func: (t1: T1, t2: T2, t3: T3) => R, arity?: number): CurriedFunction3<T1, T2, T3, R>;
//// <T1, T2, T3, T4, R>(func: (t1: T1, t2: T2, t3: T3, t4: T4) => R, arity?: number): CurriedFunction4<T1, T2, T3, T4, R>;
//// (func: (...args: any[]) => any, arity?: number): (...args: any[]) => any;
//// placeholder: __;
////};
////
////export type StylingFunction = (
//// keys: (string | false | undefined) | (string | false | undefined)[],
//// ...rest: unknown[]
////) => object;
////
////declare const getStylingByKeys: (
//// mergedStyling: object,
//// keys: (string | false | undefined) | (string | false | undefined)[],
//// ...args: unknown[]
////) => object;
////
////declare var mergedStyling: object;
////
////export const createStyling: CurriedFunction3<
//// (base16Theme: object) => unknown,
//// object | undefined,
//// object | undefined,
//// StylingFunction
////> = curry<
//// (base16Theme: object) => unknown,
//// object | undefined,
//// object | undefined,
//// StylingFunction
////>(
//// (
//// getStylingFromBase16: (base16Theme: object) => unknown,
//// options: object = {},
//// themeOrStyling: object = {},
//// ...args
//// ): StylingFunction => {
//// return curry(getStylingByKeys, 2)(mergedStyling, .../**/args);
//// },
//// 3
////);

verify.baselineQuickInfo();

0 comments on commit 4d15bb1

Please sign in to comment.