@@ -1254,13 +1254,12 @@ export const enum CheckMode {
1254
1254
Inferential = 1 << 1, // Inferential typing
1255
1255
SkipContextSensitive = 1 << 2, // Skip context sensitive function expressions
1256
1256
SkipGenericFunctions = 1 << 3, // Skip single signature generic functions
1257
- SkipAddingIntraExpressionSites = 1 << 4, // Skip adding intra expression sites in nested expressions since only the outermost one has to be added
1258
- IsForSignatureHelp = 1 << 5, // Call resolution for purposes of signature help
1259
- IsForStringLiteralArgumentCompletions = 1 << 6, // Do not infer from the argument currently being typed
1260
- RestBindingElement = 1 << 7, // Checking a type that is going to be used to determine the type of a rest binding element
1257
+ IsForSignatureHelp = 1 << 4, // Call resolution for purposes of signature help
1258
+ IsForStringLiteralArgumentCompletions = 1 << 5, // Do not infer from the argument currently being typed
1259
+ RestBindingElement = 1 << 6, // Checking a type that is going to be used to determine the type of a rest binding element
1261
1260
// e.g. in `const { a, ...rest } = foo`, when checking the type of `foo` to determine the type of `rest`,
1262
1261
// we need to preserve generic types instead of substituting them for constraints
1263
- TypeOnly = 1 << 8 , // Called from getTypeOfExpression, diagnostics may be omitted
1262
+ TypeOnly = 1 << 7 , // Called from getTypeOfExpression, diagnostics may be omitted
1264
1263
}
1265
1264
1266
1265
/** @internal */
@@ -29990,13 +29989,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
29990
29989
elementFlags.push(ElementFlags.Optional);
29991
29990
}
29992
29991
else {
29993
- const shouldAddAsIntraExpressionInferenceSite = inTupleContext && checkMode && checkMode & CheckMode.Inferential && !(checkMode & (CheckMode.SkipContextSensitive | CheckMode.SkipAddingIntraExpressionSites)) && isContextSensitive(e);
29994
- const elementCheckMode = (checkMode || CheckMode.Normal) | (shouldAddAsIntraExpressionInferenceSite ? CheckMode.SkipAddingIntraExpressionSites : 0);
29995
-
29996
- const type = checkExpressionForMutableLocation(e, elementCheckMode, forceTuple);
29992
+ const type = checkExpressionForMutableLocation(e, checkMode, forceTuple);
29997
29993
elementTypes.push(addOptionality(type, /*isProperty*/ true, hasOmittedExpression));
29998
29994
elementFlags.push(hasOmittedExpression ? ElementFlags.Optional : ElementFlags.Required);
29999
- if (shouldAddAsIntraExpressionInferenceSite ) {
29995
+ if (inTupleContext && checkMode && checkMode & CheckMode.Inferential && !(checkMode & CheckMode.SkipContextSensitive) && isContextSensitive(e) ) {
30000
29996
const inferenceContext = getInferenceContext(node);
30001
29997
Debug.assert(inferenceContext); // In CheckMode.Inferential we should always have an inference context
30002
29998
addIntraExpressionInferenceSite(inferenceContext, e, type);
@@ -30161,17 +30157,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30161
30157
if (memberDecl.kind === SyntaxKind.PropertyAssignment ||
30162
30158
memberDecl.kind === SyntaxKind.ShorthandPropertyAssignment ||
30163
30159
isObjectLiteralMethod(memberDecl)) {
30164
-
30165
- const shouldAddAsIntraExpressionInferenceSite = contextualType && checkMode & CheckMode.Inferential && !(checkMode & (CheckMode.SkipContextSensitive | CheckMode.SkipAddingIntraExpressionSites)) &&
30166
- (memberDecl.kind === SyntaxKind.PropertyAssignment || memberDecl.kind === SyntaxKind.MethodDeclaration) && isContextSensitive(memberDecl);
30167
- const propCheckMode = checkMode | (shouldAddAsIntraExpressionInferenceSite ? CheckMode.SkipAddingIntraExpressionSites : 0);
30168
-
30169
- let type = memberDecl.kind === SyntaxKind.PropertyAssignment ? checkPropertyAssignment(memberDecl, propCheckMode) :
30160
+ let type = memberDecl.kind === SyntaxKind.PropertyAssignment ? checkPropertyAssignment(memberDecl, checkMode) :
30170
30161
// avoid resolving the left side of the ShorthandPropertyAssignment outside of the destructuring
30171
30162
// for error recovery purposes. For example, if a user wrote `{ a = 100 }` instead of `{ a: 100 }`.
30172
30163
// we don't want to say "could not find 'a'".
30173
- memberDecl.kind === SyntaxKind.ShorthandPropertyAssignment ? checkExpressionForMutableLocation(!inDestructuringPattern && memberDecl.objectAssignmentInitializer ? memberDecl.objectAssignmentInitializer : memberDecl.name, propCheckMode ) :
30174
- checkObjectLiteralMethod(memberDecl, propCheckMode );
30164
+ memberDecl.kind === SyntaxKind.ShorthandPropertyAssignment ? checkExpressionForMutableLocation(!inDestructuringPattern && memberDecl.objectAssignmentInitializer ? memberDecl.objectAssignmentInitializer : memberDecl.name, checkMode ) :
30165
+ checkObjectLiteralMethod(memberDecl, checkMode );
30175
30166
if (isInJavascript) {
30176
30167
const jsDocType = getTypeForDeclarationFromJSDocComment(memberDecl);
30177
30168
if (jsDocType) {
@@ -30226,7 +30217,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30226
30217
member = prop;
30227
30218
allPropertiesTable?.set(prop.escapedName, prop);
30228
30219
30229
- if (shouldAddAsIntraExpressionInferenceSite) {
30220
+ if (contextualType && checkMode & CheckMode.Inferential && !(checkMode & CheckMode.SkipContextSensitive) &&
30221
+ (memberDecl.kind === SyntaxKind.PropertyAssignment || memberDecl.kind === SyntaxKind.MethodDeclaration) && isContextSensitive(memberDecl)) {
30230
30222
const inferenceContext = getInferenceContext(node);
30231
30223
Debug.assert(inferenceContext); // In CheckMode.Inferential we should always have an inference context
30232
30224
const inferenceNode = memberDecl.kind === SyntaxKind.PropertyAssignment ? memberDecl.initializer : memberDecl;
@@ -30460,10 +30452,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30460
30452
for (const attributeDecl of attributes.properties) {
30461
30453
const member = attributeDecl.symbol;
30462
30454
if (isJsxAttribute(attributeDecl)) {
30463
- const shouldAddAsIntraExpressionInferenceSite = contextualType && checkMode & CheckMode.Inferential && !(checkMode & (CheckMode.SkipContextSensitive | CheckMode.SkipAddingIntraExpressionSites)) && isContextSensitive(attributeDecl);
30464
- const attributeCheckMode = checkMode | (shouldAddAsIntraExpressionInferenceSite ? CheckMode.SkipAddingIntraExpressionSites : 0);
30465
-
30466
- const exprType = checkJsxAttribute(attributeDecl, attributeCheckMode);
30455
+ const exprType = checkJsxAttribute(attributeDecl, checkMode);
30467
30456
objectFlags |= getObjectFlags(exprType) & ObjectFlags.PropagatingFlags;
30468
30457
30469
30458
const attributeSymbol = createSymbol(SymbolFlags.Property | member.flags, member.escapedName);
@@ -30485,7 +30474,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30485
30474
addDeprecatedSuggestion(attributeDecl.name, prop.declarations, attributeDecl.name.escapedText as string);
30486
30475
}
30487
30476
}
30488
- if (shouldAddAsIntraExpressionInferenceSite ) {
30477
+ if (contextualType && checkMode & CheckMode.Inferential && !(checkMode & CheckMode.SkipContextSensitive) && isContextSensitive(attributeDecl) ) {
30489
30478
const inferenceContext = getInferenceContext(attributes);
30490
30479
Debug.assert(inferenceContext); // In CheckMode.Inferential we should always have an inference context
30491
30480
const inferenceNode = (attributeDecl.initializer as JsxExpression).expression!;
0 commit comments