@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.
Files changed (86) hide show
  1. package/dist/analyzer/binder.js +14 -0
  2. package/dist/analyzer/binder.js.map +1 -1
  3. package/dist/analyzer/checker.js +47 -42
  4. package/dist/analyzer/checker.js.map +1 -1
  5. package/dist/analyzer/codeFlowEngine.d.ts +0 -1
  6. package/dist/analyzer/codeFlowEngine.js +190 -196
  7. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  8. package/dist/analyzer/codeFlowTypes.d.ts +1 -1
  9. package/dist/analyzer/codeFlowTypes.js.map +1 -1
  10. package/dist/analyzer/constraintSolver.js +1 -1
  11. package/dist/analyzer/constraintSolver.js.map +1 -1
  12. package/dist/analyzer/importResolver.js +3 -2
  13. package/dist/analyzer/importResolver.js.map +1 -1
  14. package/dist/analyzer/parseTreeUtils.d.ts +3 -0
  15. package/dist/analyzer/parseTreeUtils.js +37 -3
  16. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  17. package/dist/analyzer/service.js +1 -0
  18. package/dist/analyzer/service.js.map +1 -1
  19. package/dist/analyzer/sourceFile.js +40 -9
  20. package/dist/analyzer/sourceFile.js.map +1 -1
  21. package/dist/analyzer/typeEvaluator.d.ts +1 -1
  22. package/dist/analyzer/typeEvaluator.js +147 -82
  23. package/dist/analyzer/typeEvaluator.js.map +1 -1
  24. package/dist/analyzer/typeEvaluatorTypes.d.ts +4 -4
  25. package/dist/analyzer/typeEvaluatorWithTracker.js +8 -7
  26. package/dist/analyzer/typeEvaluatorWithTracker.js.map +1 -1
  27. package/dist/analyzer/typeGuards.js +1 -1
  28. package/dist/analyzer/typeGuards.js.map +1 -1
  29. package/dist/analyzer/typeUtils.d.ts +2 -1
  30. package/dist/analyzer/typeUtils.js +80 -4
  31. package/dist/analyzer/typeUtils.js.map +1 -1
  32. package/dist/analyzer/typedDicts.d.ts +1 -0
  33. package/dist/analyzer/typedDicts.js +22 -1
  34. package/dist/analyzer/typedDicts.js.map +1 -1
  35. package/dist/analyzer/types.d.ts +8 -0
  36. package/dist/analyzer/types.js +53 -0
  37. package/dist/analyzer/types.js.map +1 -1
  38. package/dist/common/diagnostic.d.ts +2 -1
  39. package/dist/common/diagnostic.js +2 -1
  40. package/dist/common/diagnostic.js.map +1 -1
  41. package/dist/common/diagnosticSink.d.ts +3 -0
  42. package/dist/common/diagnosticSink.js +15 -2
  43. package/dist/common/diagnosticSink.js.map +1 -1
  44. package/dist/languageServerBase.d.ts +2 -6
  45. package/dist/languageServerBase.js +27 -16
  46. package/dist/languageServerBase.js.map +1 -1
  47. package/dist/languageService/completionProvider.d.ts +15 -11
  48. package/dist/languageService/completionProvider.js +76 -5
  49. package/dist/languageService/completionProvider.js.map +1 -1
  50. package/dist/languageService/tooltipUtils.js +1 -3
  51. package/dist/languageService/tooltipUtils.js.map +1 -1
  52. package/dist/localization/localize.d.ts +5 -0
  53. package/dist/localization/localize.js +2 -0
  54. package/dist/localization/localize.js.map +1 -1
  55. package/dist/localization/package.nls.en-us.json +2 -0
  56. package/dist/parser/parser.js +9 -1
  57. package/dist/parser/parser.js.map +1 -1
  58. package/dist/pyright.js +3 -1
  59. package/dist/pyright.js.map +1 -1
  60. package/dist/pyrightFileSystem.d.ts +1 -1
  61. package/dist/pyrightFileSystem.js +11 -1
  62. package/dist/pyrightFileSystem.js.map +1 -1
  63. package/dist/tests/chainedSourceFiles.test.js +2 -0
  64. package/dist/tests/chainedSourceFiles.test.js.map +1 -1
  65. package/dist/tests/fourslash/completions.commitChars.fourslash.d.ts +1 -0
  66. package/dist/tests/fourslash/completions.commitChars.fourslash.js +47 -0
  67. package/dist/tests/fourslash/completions.commitChars.fourslash.js.map +1 -0
  68. package/dist/tests/fourslash/completions.triggers.fourslash.d.ts +1 -0
  69. package/dist/tests/fourslash/completions.triggers.fourslash.js +29 -0
  70. package/dist/tests/fourslash/completions.triggers.fourslash.js.map +1 -0
  71. package/dist/tests/fourslash/fourslash.d.ts +1 -0
  72. package/dist/tests/harness/fourslash/testState.js +11 -2
  73. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  74. package/dist/tests/pyrightFileSystem.test.js +28 -0
  75. package/dist/tests/pyrightFileSystem.test.js.map +1 -1
  76. package/dist/tests/testUtils.d.ts +2 -1
  77. package/dist/tests/testUtils.js +8 -5
  78. package/dist/tests/testUtils.js.map +1 -1
  79. package/dist/tests/typeEvaluator1.test.js +2 -2
  80. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  81. package/dist/tests/typeEvaluator2.test.js +12 -4
  82. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  83. package/dist/tests/typeEvaluator3.test.js +1 -1
  84. package/dist/tests/typeEvaluator4.test.js +8 -0
  85. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  86. package/package.json +1 -1
@@ -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
- const overloads = functionTypeResult.decoratedType.overloads;
390
- if (overloads.length > 1) {
391
- const maxOverloadConsistencyCheckLength = 100;
392
- // The check is n^2 in time, so if the number of overloads
393
- // is very large (which can happen for some generated code),
394
- // skip this check to avoid quadratic analysis time.
395
- if (overloads.length < maxOverloadConsistencyCheckLength) {
396
- this._validateOverloadConsistency(node, overloads[overloads.length - 1], overloads.slice(0, overloads.length - 1));
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 (types_1.FunctionType.isOverloaded(functionType) &&
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 (types_1.FunctionType.isOverloaded(functionType) &&
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.addUnusedCode(statement, { start, length: end - start });
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 functions = (0, types_1.isOverloadedFunction)(type) ? type.overloads : (0, types_1.isFunction)(type) ? [type] : [];
1582
- const overloadedFunctions = functions.filter((func) => types_1.FunctionType.isOverloaded(func));
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
- !types_1.FunctionType.isOverloaded(type.overloads[type.overloads.length - 1])) {
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.overloads.forEach((overload, index) => {
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 = newMemberType.overloads.find((func) => !types_1.FunctionType.isOverloaded(func));
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 = initMemberType.overloads.find((func) => !types_1.FunctionType.isOverloaded(func));
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 = overrideType.overloads[overrideType.overloads.length - 1];
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 (types_1.FunctionType.isOverloaded(overrideFunction)) {
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
- let overrideFunction;
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, overrideFunction, diagAddendum, enforceParamNameMatch)) {
3302
- const decl = (_a = overrideFunction.details.declaration) !== null && _a !== void 0 ? _a : (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overrideSymbol);
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.addUnusedCode(except, except.exceptSuite);
3778
+ this._evaluator.addUnreachableCode(except, except.exceptSuite);
3774
3779
  }
3775
3780
  }
3776
3781
  exceptionTypesSoFar.push(...typesOfThisExcept);