@zzzen/pyright-internal 1.2.0-dev.20220710 → 1.2.0-dev.20220717
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 +14 -0
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.js +47 -42
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.d.ts +0 -1
- package/dist/analyzer/codeFlowEngine.js +190 -196
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/codeFlowTypes.d.ts +1 -1
- package/dist/analyzer/codeFlowTypes.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +1 -1
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/importResolver.js +3 -2
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +3 -0
- package/dist/analyzer/parseTreeUtils.js +37 -3
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/service.js +1 -0
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.js +40 -9
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/typeEvaluator.d.ts +1 -1
- package/dist/analyzer/typeEvaluator.js +147 -82
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +4 -4
- package/dist/analyzer/typeEvaluatorWithTracker.js +8 -7
- package/dist/analyzer/typeEvaluatorWithTracker.js.map +1 -1
- package/dist/analyzer/typeGuards.js +1 -1
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +2 -1
- package/dist/analyzer/typeUtils.js +80 -4
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typedDicts.d.ts +1 -0
- package/dist/analyzer/typedDicts.js +22 -1
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +8 -0
- package/dist/analyzer/types.js +53 -0
- package/dist/analyzer/types.js.map +1 -1
- package/dist/common/diagnostic.d.ts +2 -1
- package/dist/common/diagnostic.js +2 -1
- package/dist/common/diagnostic.js.map +1 -1
- package/dist/common/diagnosticSink.d.ts +3 -0
- package/dist/common/diagnosticSink.js +15 -2
- package/dist/common/diagnosticSink.js.map +1 -1
- package/dist/languageServerBase.d.ts +2 -6
- package/dist/languageServerBase.js +27 -16
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/completionProvider.d.ts +15 -11
- package/dist/languageService/completionProvider.js +76 -5
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/tooltipUtils.js +1 -3
- package/dist/languageService/tooltipUtils.js.map +1 -1
- package/dist/localization/localize.d.ts +5 -0
- package/dist/localization/localize.js +2 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +2 -0
- package/dist/parser/parser.js +9 -1
- package/dist/parser/parser.js.map +1 -1
- package/dist/pyright.js +3 -1
- package/dist/pyright.js.map +1 -1
- package/dist/pyrightFileSystem.d.ts +1 -1
- package/dist/pyrightFileSystem.js +11 -1
- package/dist/pyrightFileSystem.js.map +1 -1
- package/dist/tests/chainedSourceFiles.test.js +2 -0
- package/dist/tests/chainedSourceFiles.test.js.map +1 -1
- package/dist/tests/fourslash/completions.commitChars.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/completions.commitChars.fourslash.js +47 -0
- package/dist/tests/fourslash/completions.commitChars.fourslash.js.map +1 -0
- package/dist/tests/fourslash/completions.triggers.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/completions.triggers.fourslash.js +29 -0
- package/dist/tests/fourslash/completions.triggers.fourslash.js.map +1 -0
- package/dist/tests/fourslash/fourslash.d.ts +1 -0
- package/dist/tests/harness/fourslash/testState.js +11 -2
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/pyrightFileSystem.test.js +28 -0
- package/dist/tests/pyrightFileSystem.test.js.map +1 -1
- package/dist/tests/testUtils.d.ts +2 -1
- package/dist/tests/testUtils.js +8 -5
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +2 -2
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +12 -4
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +1 -1
- package/dist/tests/typeEvaluator4.test.js +8 -0
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/package.json +1 -1
package/dist/analyzer/checker.js
CHANGED
@@ -386,14 +386,19 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
386
386
|
}
|
387
387
|
this._scopedNodes.push(node);
|
388
388
|
if (functionTypeResult && (0, types_1.isOverloadedFunction)(functionTypeResult.decoratedType)) {
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
389
|
+
// If this is the implementation for the overloaded function, skip
|
390
|
+
// overload consistency checks.
|
391
|
+
if (types_1.OverloadedFunctionType.getImplementation(functionTypeResult.decoratedType) !==
|
392
|
+
functionTypeResult.functionType) {
|
393
|
+
const overloads = types_1.OverloadedFunctionType.getOverloads(functionTypeResult.decoratedType);
|
394
|
+
if (overloads.length > 1) {
|
395
|
+
const maxOverloadConsistencyCheckLength = 100;
|
396
|
+
// The check is n^2 in time, so if the number of overloads
|
397
|
+
// is very large (which can happen for some generated code),
|
398
|
+
// skip this check to avoid quadratic analysis time.
|
399
|
+
if (overloads.length < maxOverloadConsistencyCheckLength) {
|
400
|
+
this._validateOverloadConsistency(node, overloads[overloads.length - 1], overloads.slice(0, overloads.length - 1));
|
401
|
+
}
|
397
402
|
}
|
398
403
|
}
|
399
404
|
}
|
@@ -1285,9 +1290,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1285
1290
|
_validateOverloadConsistency(node, functionType, prevOverloads) {
|
1286
1291
|
for (let i = 0; i < prevOverloads.length; i++) {
|
1287
1292
|
const prevOverload = prevOverloads[i];
|
1288
|
-
if (
|
1289
|
-
types_1.FunctionType.isOverloaded(prevOverload) &&
|
1290
|
-
this._isOverlappingOverload(functionType, prevOverload)) {
|
1293
|
+
if (this._isOverlappingOverload(functionType, prevOverload)) {
|
1291
1294
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportOverlappingOverload, diagnosticRules_1.DiagnosticRule.reportOverlappingOverload, localize_1.Localizer.Diagnostic.overlappingOverload().format({
|
1292
1295
|
name: node.name.value,
|
1293
1296
|
obscured: prevOverloads.length + 1,
|
@@ -1298,9 +1301,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1298
1301
|
}
|
1299
1302
|
for (let i = 0; i < prevOverloads.length; i++) {
|
1300
1303
|
const prevOverload = prevOverloads[i];
|
1301
|
-
if (
|
1302
|
-
types_1.FunctionType.isOverloaded(prevOverload) &&
|
1303
|
-
this._isOverlappingOverload(prevOverload, functionType)) {
|
1304
|
+
if (this._isOverlappingOverload(prevOverload, functionType)) {
|
1304
1305
|
const prevReturnType = types_1.FunctionType.getSpecializedReturnType(prevOverload);
|
1305
1306
|
const returnType = types_1.FunctionType.getSpecializedReturnType(functionType);
|
1306
1307
|
if (prevReturnType &&
|
@@ -1388,7 +1389,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1388
1389
|
const start = statement.start;
|
1389
1390
|
const lastStatement = statements[statements.length - 1];
|
1390
1391
|
const end = textRange_1.TextRange.getEnd(lastStatement);
|
1391
|
-
this._evaluator.
|
1392
|
+
this._evaluator.addUnreachableCode(statement, { start, length: end - start });
|
1392
1393
|
reportedUnreachable = true;
|
1393
1394
|
}
|
1394
1395
|
}
|
@@ -1578,8 +1579,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1578
1579
|
const primaryDecl = typedDecls[0];
|
1579
1580
|
if (primaryDecl.type === 5 /* Function */) {
|
1580
1581
|
const type = this._evaluator.getEffectiveTypeOfSymbol(symbol);
|
1581
|
-
const
|
1582
|
-
|
1582
|
+
const overloadedFunctions = (0, types_1.isOverloadedFunction)(type)
|
1583
|
+
? types_1.OverloadedFunctionType.getOverloads(type)
|
1584
|
+
: (0, types_1.isFunction)(type) && types_1.FunctionType.isOverloaded(type)
|
1585
|
+
? [type]
|
1586
|
+
: [];
|
1583
1587
|
if (overloadedFunctions.length === 1) {
|
1584
1588
|
// There should never be a single overload.
|
1585
1589
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.singleOverload().format({ name }), primaryDecl.node.name);
|
@@ -1596,9 +1600,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1596
1600
|
// verify that there is an implementation.
|
1597
1601
|
if (!this._fileInfo.isStubFile && overloadedFunctions.length > 0) {
|
1598
1602
|
let implementationFunction;
|
1599
|
-
if ((0, types_1.isOverloadedFunction)(type) &&
|
1600
|
-
|
1601
|
-
implementationFunction = type.overloads[type.overloads.length - 1];
|
1603
|
+
if ((0, types_1.isOverloadedFunction)(type) && types_1.OverloadedFunctionType.getImplementation(type)) {
|
1604
|
+
implementationFunction = types_1.OverloadedFunctionType.getImplementation(type);
|
1602
1605
|
}
|
1603
1606
|
else if ((0, types_1.isFunction)(type) && !types_1.FunctionType.isOverloaded(type)) {
|
1604
1607
|
implementationFunction = type;
|
@@ -1622,11 +1625,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1622
1625
|
}
|
1623
1626
|
else if ((0, types_1.isOverloadedFunction)(type)) {
|
1624
1627
|
// Verify that all overload signatures are assignable to implementation signature.
|
1625
|
-
type.
|
1628
|
+
types_1.OverloadedFunctionType.getOverloads(type).forEach((overload, index) => {
|
1626
1629
|
var _a, _b, _c, _d;
|
1627
|
-
if (overload === implementationFunction || !types_1.FunctionType.isOverloaded(overload)) {
|
1628
|
-
return;
|
1629
|
-
}
|
1630
1630
|
const diag = new diagnostic_1.DiagnosticAddendum();
|
1631
1631
|
if (!this._isLegalOverloadImplementation(overload, implementationFunction, diag)) {
|
1632
1632
|
if (implementationFunction.details.declaration) {
|
@@ -3012,7 +3012,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3012
3012
|
}
|
3013
3013
|
if ((0, types_1.isOverloadedFunction)(newMemberType)) {
|
3014
3014
|
// Find the implementation, not the overloaded signatures.
|
3015
|
-
newMemberType =
|
3015
|
+
newMemberType = types_1.OverloadedFunctionType.getImplementation(newMemberType);
|
3016
3016
|
if (!newMemberType) {
|
3017
3017
|
return;
|
3018
3018
|
}
|
@@ -3027,7 +3027,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3027
3027
|
}
|
3028
3028
|
if ((0, types_1.isOverloadedFunction)(initMemberType)) {
|
3029
3029
|
// Find the implementation, not the overloaded signatures.
|
3030
|
-
initMemberType =
|
3030
|
+
initMemberType = types_1.OverloadedFunctionType.getImplementation(initMemberType);
|
3031
3031
|
if (!initMemberType) {
|
3032
3032
|
return;
|
3033
3033
|
}
|
@@ -3165,9 +3165,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3165
3165
|
}
|
3166
3166
|
else if ((0, types_1.isOverloadedFunction)(overrideType)) {
|
3167
3167
|
// Use the last overload.
|
3168
|
-
overrideFunction =
|
3168
|
+
overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
|
3169
3169
|
// If the last overload isn't an implementation, skip the check for this symbol.
|
3170
|
-
if (
|
3170
|
+
if (!overrideFunction) {
|
3171
3171
|
return;
|
3172
3172
|
}
|
3173
3173
|
}
|
@@ -3235,7 +3235,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3235
3235
|
}
|
3236
3236
|
// If the symbol has no declaration, and the type is inferred,
|
3237
3237
|
// skip this check.
|
3238
|
-
if (!symbol.hasTypedDeclarations()) {
|
3238
|
+
if (!symbol.hasTypedDeclarations() && !(0, symbolUtils_1.isFinalVariable)(symbol)) {
|
3239
3239
|
return;
|
3240
3240
|
}
|
3241
3241
|
// Get the symbol type defined in this class.
|
@@ -3263,7 +3263,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3263
3263
|
});
|
3264
3264
|
}
|
3265
3265
|
_validateBaseClassOverride(baseClassAndSymbol, overrideSymbol, overrideType, childClassType, memberName) {
|
3266
|
-
var _a;
|
3267
3266
|
if (!(0, types_1.isInstantiableClass)(baseClassAndSymbol.classType)) {
|
3268
3267
|
return;
|
3269
3268
|
}
|
@@ -3281,15 +3280,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3281
3280
|
const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClassAndSymbol.classType);
|
3282
3281
|
if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
|
3283
3282
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
3284
|
-
|
3285
|
-
if ((0, types_1.isFunction)(overrideType)) {
|
3286
|
-
overrideFunction = overrideType;
|
3287
|
-
}
|
3288
|
-
else if ((0, types_1.isOverloadedFunction)(overrideType)) {
|
3289
|
-
// Use the last overload.
|
3290
|
-
overrideFunction = overrideType.overloads[overrideType.overloads.length - 1];
|
3291
|
-
}
|
3292
|
-
if (overrideFunction) {
|
3283
|
+
if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
|
3293
3284
|
const exemptMethods = ['__init__', '__new__', '__init_subclass__'];
|
3294
3285
|
// Don't enforce parameter names for dundered methods. Many of them
|
3295
3286
|
// are misnamed in typeshed stubs, so this would result in many
|
@@ -3298,8 +3289,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3298
3289
|
// Don't check certain magic functions or private symbols.
|
3299
3290
|
if (!exemptMethods.some((exempt) => exempt === memberName) &&
|
3300
3291
|
!SymbolNameUtils.isPrivateName(memberName)) {
|
3301
|
-
if (!this._evaluator.validateOverrideMethod(baseType,
|
3302
|
-
const decl = (
|
3292
|
+
if (!this._evaluator.validateOverrideMethod(baseType, overrideType, diagAddendum, enforceParamNameMatch)) {
|
3293
|
+
const decl = (0, types_1.isFunction)(overrideType) && overrideType.details.declaration
|
3294
|
+
? overrideType.details.declaration
|
3295
|
+
: (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overrideSymbol);
|
3303
3296
|
if (decl) {
|
3304
3297
|
const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.incompatibleMethodOverride().format({
|
3305
3298
|
name: memberName,
|
@@ -3436,6 +3429,18 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3436
3429
|
diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), origDecl.path, origDecl.range);
|
3437
3430
|
}
|
3438
3431
|
}
|
3432
|
+
// Verify that there is not a Final mismatch.
|
3433
|
+
const isBaseVarFinal = (0, symbolUtils_1.isFinalVariable)(baseClassAndSymbol.symbol);
|
3434
|
+
const overrideFinalVarDecl = decls.find((d) => (0, declarationUtils_1.isFinalVariableDeclaration)(d));
|
3435
|
+
if (!isBaseVarFinal && overrideFinalVarDecl) {
|
3436
|
+
const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.variableFinalOverride().format({
|
3437
|
+
name: memberName,
|
3438
|
+
className: baseClassAndSymbol.classType.details.name,
|
3439
|
+
}), lastDecl.node);
|
3440
|
+
if (diag) {
|
3441
|
+
diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), overrideFinalVarDecl.path, overrideFinalVarDecl.range);
|
3442
|
+
}
|
3443
|
+
}
|
3439
3444
|
// Verify that a class variable isn't overriding an instance
|
3440
3445
|
// variable or vice versa.
|
3441
3446
|
const isBaseClassVar = baseClassAndSymbol.symbol.isClassVar();
|
@@ -3770,7 +3775,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3770
3775
|
// Were all of the exception types overridden?
|
3771
3776
|
if (typesOfThisExcept.length === overriddenExceptionCount) {
|
3772
3777
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.unreachableExcept() + diagAddendum.getString(), except.typeExpression);
|
3773
|
-
this._evaluator.
|
3778
|
+
this._evaluator.addUnreachableCode(except, except.exceptSuite);
|
3774
3779
|
}
|
3775
3780
|
}
|
3776
3781
|
exceptionTypesSoFar.push(...typesOfThisExcept);
|