@zzzen/pyright-internal 1.2.0-dev.20220814 → 1.2.0-dev.20220821
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyzer/binder.js +9 -5
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.js +2 -1
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +32 -25
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeGuards.js +38 -9
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typedDicts.d.ts +3 -3
- package/dist/analyzer/typedDicts.js +9 -5
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.js +8 -7
- package/dist/analyzer/types.js.map +1 -1
- package/dist/common/diagnostic.d.ts +5 -1
- package/dist/common/diagnostic.js +34 -0
- package/dist/common/diagnostic.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +1 -1
- package/dist/parser/parser.js +8 -6
- package/dist/parser/parser.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.d.ts +8 -2
- package/dist/tests/harness/fourslash/testState.js +46 -40
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +1 -1
- package/package.json +1 -1
@@ -1884,11 +1884,11 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
1884
1884
|
return (suppressedNodeStack.some((suppressedNode) => ParseTreeUtils.isNodeContainedWithin(node, suppressedNode)) ||
|
1885
1885
|
speculativeTypeTracker.isSpeculative(node));
|
1886
1886
|
}
|
1887
|
-
function addDiagnostic(diagLevel, rule, message, node) {
|
1887
|
+
function addDiagnostic(diagLevel, rule, message, node, range) {
|
1888
1888
|
if (diagLevel === 'none') {
|
1889
1889
|
return undefined;
|
1890
1890
|
}
|
1891
|
-
const diagnostic = addDiagnosticWithSuppressionCheck(diagLevel, message, node);
|
1891
|
+
const diagnostic = addDiagnosticWithSuppressionCheck(diagLevel, message, node, range);
|
1892
1892
|
if (diagnostic) {
|
1893
1893
|
diagnostic.setRule(rule);
|
1894
1894
|
}
|
@@ -1917,6 +1917,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
1917
1917
|
addDiagnostic(fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.typeExpectedClass().format({ type: printType(type) }) + diag.getString(), node);
|
1918
1918
|
}
|
1919
1919
|
function assignTypeToNameNode(nameNode, type, isTypeIncomplete, ignoreEmptyContainers, srcExpression, allowAssignmentToFinalVar = false, expectedTypeDiagAddendum) {
|
1920
|
+
var _a, _b;
|
1920
1921
|
const nameValue = nameNode.value;
|
1921
1922
|
const symbolWithScope = lookUpSymbolRecursive(nameNode, nameValue, /* honorCodeFlow */ false);
|
1922
1923
|
if (!symbolWithScope) {
|
@@ -1954,7 +1955,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
1954
1955
|
addDiagnostic(fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.typeAssignmentMismatch().format({
|
1955
1956
|
sourceType: printType(type),
|
1956
1957
|
destType: printType(declaredType),
|
1957
|
-
}) + diagAddendum.getString(), srcExpression !== null && srcExpression !== void 0 ? srcExpression : nameNode);
|
1958
|
+
}) + diagAddendum.getString(), srcExpression !== null && srcExpression !== void 0 ? srcExpression : nameNode, (_b = (_a = diagAddendum.getEffectiveTextRange()) !== null && _a !== void 0 ? _a : srcExpression) !== null && _b !== void 0 ? _b : nameNode);
|
1958
1959
|
// Replace the assigned type with the (unnarrowed) declared type.
|
1959
1960
|
destType = declaredType;
|
1960
1961
|
}
|
@@ -3145,7 +3146,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
3145
3146
|
return typeResult;
|
3146
3147
|
}
|
3147
3148
|
function getTypeOfMemberAccessWithBaseType(node, baseTypeResult, usage, flags) {
|
3148
|
-
var _a;
|
3149
|
+
var _a, _b;
|
3149
3150
|
let baseType = baseTypeResult.type;
|
3150
3151
|
const memberName = node.memberName.value;
|
3151
3152
|
let diag = new diagnostic_1.DiagnosticAddendum();
|
@@ -3415,7 +3416,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
3415
3416
|
const [ruleSet, rule] = isFunctionRule
|
3416
3417
|
? [fileInfo.diagnosticRuleSet.reportFunctionMemberAccess, diagnosticRules_1.DiagnosticRule.reportFunctionMemberAccess]
|
3417
3418
|
: [fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues];
|
3418
|
-
addDiagnostic(ruleSet, rule, diagMessage.format({ name: memberName, type: printType(baseType) }) + diag.getString(), node.memberName);
|
3419
|
+
addDiagnostic(ruleSet, rule, diagMessage.format({ name: memberName, type: printType(baseType) }) + diag.getString(), node.memberName, (_a = diag.getEffectiveTextRange()) !== null && _a !== void 0 ? _a : node.memberName);
|
3419
3420
|
}
|
3420
3421
|
// If this is member access on a function, use "Any" so if the
|
3421
3422
|
// reportFunctionMemberAccess rule is disabled, we don't trigger
|
@@ -3436,7 +3437,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
3436
3437
|
// It can also come up in cases like "isinstance(x, (list, dict))".
|
3437
3438
|
if ((0, types_1.isInstantiableClass)(type)) {
|
3438
3439
|
const argNode = ParseTreeUtils.getParentNodeOfType(node, 1 /* Argument */);
|
3439
|
-
if (argNode && ((
|
3440
|
+
if (argNode && ((_b = argNode === null || argNode === void 0 ? void 0 : argNode.parent) === null || _b === void 0 ? void 0 : _b.nodeType) === 9 /* Call */) {
|
3440
3441
|
skipPartialUnknownCheck = true;
|
3441
3442
|
}
|
3442
3443
|
}
|
@@ -7207,6 +7208,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
7207
7208
|
return !reportedArgError;
|
7208
7209
|
}
|
7209
7210
|
function validateArgType(argParam, typeVarContext, functionType, skipUnknownCheck, skipOverloadArg, useNarrowBoundOnly, conditionFilter) {
|
7211
|
+
var _a;
|
7210
7212
|
let argType;
|
7211
7213
|
let expectedTypeDiag;
|
7212
7214
|
let isTypeIncomplete = false;
|
@@ -7380,7 +7382,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
7380
7382
|
if (expectedTypeDiag) {
|
7381
7383
|
diag = expectedTypeDiag;
|
7382
7384
|
}
|
7383
|
-
addDiagnostic(fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, message + diag.getString(), argParam.errorNode);
|
7385
|
+
addDiagnostic(fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, message + diag.getString(), argParam.errorNode, (_a = diag.getEffectiveTextRange()) !== null && _a !== void 0 ? _a : argParam.errorNode);
|
7384
7386
|
}
|
7385
7387
|
return { isCompatible: false, argType, isTypeIncomplete, condition };
|
7386
7388
|
}
|
@@ -8435,7 +8437,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
8435
8437
|
isIncomplete = true;
|
8436
8438
|
}
|
8437
8439
|
if (types_1.ClassType.isTypedDictClass(expectedType)) {
|
8438
|
-
const resultTypedDict = (0, typedDicts_1.assignToTypedDict)(evaluatorInterface, expectedType, keyTypes, valueTypes,
|
8440
|
+
const resultTypedDict = (0, typedDicts_1.assignToTypedDict)(evaluatorInterface, expectedType, keyTypes, valueTypes,
|
8441
|
+
// Don't overwrite existing expectedDiagAddendum messages if they were
|
8442
|
+
// already provided by getKeyValueTypesFromDictionary.
|
8443
|
+
(expectedDiagAddendum === null || expectedDiagAddendum === void 0 ? void 0 : expectedDiagAddendum.isEmpty()) ? expectedDiagAddendum : undefined);
|
8439
8444
|
if (resultTypedDict) {
|
8440
8445
|
return {
|
8441
8446
|
type: resultTypedDict,
|
@@ -8469,8 +8474,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
8469
8474
|
// and Iterable use covariant value types, so they can be narrowed.
|
8470
8475
|
const isValueTypeInvariant = (0, types_1.isClassInstance)(expectedType) &&
|
8471
8476
|
(types_1.ClassType.isBuiltIn(expectedType, 'dict') || types_1.ClassType.isBuiltIn(expectedType, 'MutableMapping'));
|
8472
|
-
const specializedKeyType = inferTypeArgFromExpectedType(expectedKeyType, keyTypes
|
8473
|
-
|
8477
|
+
const specializedKeyType = inferTypeArgFromExpectedType(expectedKeyType, keyTypes.map((result) => result.type),
|
8478
|
+
/* isNarrowable */ false);
|
8479
|
+
const specializedValueType = inferTypeArgFromExpectedType(expectedValueType, valueTypes.map((result) => result.type),
|
8474
8480
|
/* isNarrowable */ !isValueTypeInvariant);
|
8475
8481
|
if (!specializedKeyType || !specializedValueType) {
|
8476
8482
|
return undefined;
|
@@ -8484,17 +8490,18 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
8484
8490
|
const fallbackType = hasExpectedType ? types_1.AnyType.create() : types_1.UnknownType.create();
|
8485
8491
|
let keyType = fallbackType;
|
8486
8492
|
let valueType = fallbackType;
|
8487
|
-
|
8488
|
-
|
8493
|
+
const keyTypeResults = [];
|
8494
|
+
const valueTypeResults = [];
|
8489
8495
|
let isEmptyContainer = false;
|
8490
8496
|
let isIncomplete = false;
|
8491
8497
|
// Infer the key and value types if possible.
|
8492
|
-
if (getKeyAndValueTypesFromDictionary(node,
|
8498
|
+
if (getKeyAndValueTypesFromDictionary(node, keyTypeResults, valueTypeResults,
|
8499
|
+
/* forceStrictInference */ hasExpectedType)) {
|
8493
8500
|
isIncomplete = true;
|
8494
8501
|
}
|
8495
8502
|
// Strip any literal values.
|
8496
|
-
keyTypes =
|
8497
|
-
valueTypes =
|
8503
|
+
const keyTypes = keyTypeResults.map((t) => stripLiteralValue(t.type));
|
8504
|
+
const valueTypes = valueTypeResults.map((t) => stripLiteralValue(t.type));
|
8498
8505
|
keyType = keyTypes.length > 0 ? (0, types_1.combineTypes)(keyTypes) : fallbackType;
|
8499
8506
|
// If the value type differs and we're not using "strict inference mode",
|
8500
8507
|
// we need to back off because we can't properly represent the mappings
|
@@ -8556,8 +8563,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
8556
8563
|
isIncomplete = true;
|
8557
8564
|
}
|
8558
8565
|
if (forceStrictInference || index < maxEntriesToUseForInference) {
|
8559
|
-
keyTypes.push(keyType);
|
8560
|
-
valueTypes.push(valueType);
|
8566
|
+
keyTypes.push({ node: entryNode.keyExpression, type: keyType });
|
8567
|
+
valueTypes.push({ node: entryNode.valueExpression, type: valueType });
|
8561
8568
|
}
|
8562
8569
|
addUnknown = false;
|
8563
8570
|
}
|
@@ -8578,8 +8585,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
8578
8585
|
/* allowNarrowed */ true);
|
8579
8586
|
tdEntries.forEach((entry, name) => {
|
8580
8587
|
if (entry.isRequired || entry.isProvided) {
|
8581
|
-
keyTypes.push(types_1.ClassType.cloneWithLiteral(strObject, name));
|
8582
|
-
valueTypes.push(entry.valueType);
|
8588
|
+
keyTypes.push({ node: entryNode, type: types_1.ClassType.cloneWithLiteral(strObject, name) });
|
8589
|
+
valueTypes.push({ node: entryNode, type: entry.valueType });
|
8583
8590
|
}
|
8584
8591
|
});
|
8585
8592
|
addUnknown = false;
|
@@ -8604,8 +8611,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
8604
8611
|
const typeArgs = specializedMapping.typeArguments;
|
8605
8612
|
if (typeArgs && typeArgs.length >= 2) {
|
8606
8613
|
if (forceStrictInference || index < maxEntriesToUseForInference) {
|
8607
|
-
keyTypes.push(typeArgs[0]);
|
8608
|
-
valueTypes.push(typeArgs[1]);
|
8614
|
+
keyTypes.push({ node: entryNode, type: typeArgs[0] });
|
8615
|
+
valueTypes.push({ node: entryNode, type: typeArgs[1] });
|
8609
8616
|
}
|
8610
8617
|
addUnknown = false;
|
8611
8618
|
}
|
@@ -8628,8 +8635,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
8628
8635
|
const typeArgs = (_a = dictEntryType.tupleTypeArguments) === null || _a === void 0 ? void 0 : _a.map((t) => t.type);
|
8629
8636
|
if (typeArgs && typeArgs.length === 2) {
|
8630
8637
|
if (forceStrictInference || index < maxEntriesToUseForInference) {
|
8631
|
-
keyTypes.push(typeArgs[0]);
|
8632
|
-
valueTypes.push(typeArgs[1]);
|
8638
|
+
keyTypes.push({ node: entryNode, type: typeArgs[0] });
|
8639
|
+
valueTypes.push({ node: entryNode, type: typeArgs[1] });
|
8633
8640
|
}
|
8634
8641
|
addUnknown = false;
|
8635
8642
|
}
|
@@ -8637,8 +8644,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions) {
|
|
8637
8644
|
}
|
8638
8645
|
if (addUnknown) {
|
8639
8646
|
if (forceStrictInference || index < maxEntriesToUseForInference) {
|
8640
|
-
keyTypes.push(types_1.UnknownType.create());
|
8641
|
-
valueTypes.push(types_1.UnknownType.create());
|
8647
|
+
keyTypes.push({ node: entryNode, type: types_1.UnknownType.create() });
|
8648
|
+
valueTypes.push({ node: entryNode, type: types_1.UnknownType.create() });
|
8642
8649
|
}
|
8643
8650
|
}
|
8644
8651
|
});
|