@zzzen/pyright-internal 1.2.0-dev.20241020 → 1.2.0-dev.20241103

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 (107) hide show
  1. package/dist/analyzer/binder.d.ts +1 -3
  2. package/dist/analyzer/binder.js +62 -46
  3. package/dist/analyzer/binder.js.map +1 -1
  4. package/dist/analyzer/checker.js +9 -5
  5. package/dist/analyzer/checker.js.map +1 -1
  6. package/dist/analyzer/codeFlowEngine.js +2 -2
  7. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  8. package/dist/analyzer/constraintSolver.js +11 -1
  9. package/dist/analyzer/constraintSolver.js.map +1 -1
  10. package/dist/analyzer/constructorTransform.js +18 -1
  11. package/dist/analyzer/constructorTransform.js.map +1 -1
  12. package/dist/analyzer/constructors.js +1 -1
  13. package/dist/analyzer/constructors.js.map +1 -1
  14. package/dist/analyzer/dataClasses.js +1 -17
  15. package/dist/analyzer/dataClasses.js.map +1 -1
  16. package/dist/analyzer/declaration.d.ts +1 -1
  17. package/dist/analyzer/declaration.js.map +1 -1
  18. package/dist/analyzer/declarationUtils.js +1 -3
  19. package/dist/analyzer/declarationUtils.js.map +1 -1
  20. package/dist/analyzer/enums.js +3 -1
  21. package/dist/analyzer/enums.js.map +1 -1
  22. package/dist/analyzer/operations.js +2 -2
  23. package/dist/analyzer/operations.js.map +1 -1
  24. package/dist/analyzer/parameterUtils.js +2 -0
  25. package/dist/analyzer/parameterUtils.js.map +1 -1
  26. package/dist/analyzer/parseTreeUtils.js +4 -0
  27. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  28. package/dist/analyzer/patternMatching.js +1 -1
  29. package/dist/analyzer/patternMatching.js.map +1 -1
  30. package/dist/analyzer/protocols.js +1 -1
  31. package/dist/analyzer/protocols.js.map +1 -1
  32. package/dist/analyzer/service.js +5 -5
  33. package/dist/analyzer/service.js.map +1 -1
  34. package/dist/analyzer/sourceFile.js +1 -1
  35. package/dist/analyzer/sourceFile.js.map +1 -1
  36. package/dist/analyzer/symbol.d.ts +8 -3
  37. package/dist/analyzer/symbol.js +4 -4
  38. package/dist/analyzer/symbol.js.map +1 -1
  39. package/dist/analyzer/tuples.d.ts +2 -2
  40. package/dist/analyzer/typeEvaluator.js +209 -95
  41. package/dist/analyzer/typeEvaluator.js.map +1 -1
  42. package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -5
  43. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  44. package/dist/analyzer/typeGuards.js +13 -10
  45. package/dist/analyzer/typeGuards.js.map +1 -1
  46. package/dist/analyzer/typePrinter.d.ts +1 -1
  47. package/dist/analyzer/typePrinter.js +23 -17
  48. package/dist/analyzer/typePrinter.js.map +1 -1
  49. package/dist/analyzer/typeUtils.d.ts +2 -2
  50. package/dist/analyzer/typeUtils.js +59 -29
  51. package/dist/analyzer/typeUtils.js.map +1 -1
  52. package/dist/analyzer/typedDicts.d.ts +2 -1
  53. package/dist/analyzer/typedDicts.js +21 -1
  54. package/dist/analyzer/typedDicts.js.map +1 -1
  55. package/dist/analyzer/types.d.ts +1 -1
  56. package/dist/analyzer/types.js +7 -6
  57. package/dist/analyzer/types.js.map +1 -1
  58. package/dist/common/configOptions.d.ts +1 -1
  59. package/dist/common/configOptions.js +4 -3
  60. package/dist/common/configOptions.js.map +1 -1
  61. package/dist/languageService/completionProvider.js +3 -3
  62. package/dist/languageService/completionProvider.js.map +1 -1
  63. package/dist/languageService/definitionProvider.d.ts +2 -0
  64. package/dist/languageService/definitionProvider.js +21 -5
  65. package/dist/languageService/definitionProvider.js.map +1 -1
  66. package/dist/languageService/hoverProvider.d.ts +2 -1
  67. package/dist/languageService/hoverProvider.js +36 -12
  68. package/dist/languageService/hoverProvider.js.map +1 -1
  69. package/dist/localization/localize.d.ts +4 -0
  70. package/dist/localization/localize.js +10 -1
  71. package/dist/localization/localize.js.map +1 -1
  72. package/dist/localization/package.nls.cs.json +3 -1
  73. package/dist/localization/package.nls.de.json +2 -0
  74. package/dist/localization/package.nls.en-us.json +4 -0
  75. package/dist/localization/package.nls.es.json +2 -0
  76. package/dist/localization/package.nls.fr.json +2 -0
  77. package/dist/localization/package.nls.it.json +3 -1
  78. package/dist/localization/package.nls.ja.json +2 -0
  79. package/dist/localization/package.nls.ko.json +2 -0
  80. package/dist/localization/package.nls.pl.json +2 -0
  81. package/dist/localization/package.nls.pt-br.json +3 -1
  82. package/dist/localization/package.nls.qps-ploc.json +3 -1
  83. package/dist/localization/package.nls.ru.json +3 -1
  84. package/dist/localization/package.nls.tr.json +2 -0
  85. package/dist/localization/package.nls.zh-cn.json +2 -0
  86. package/dist/localization/package.nls.zh-tw.json +3 -1
  87. package/dist/server.d.ts +1 -2
  88. package/dist/tests/fourslash/hover.typedDict.get.fourslash.d.ts +1 -0
  89. package/dist/tests/fourslash/hover.typedDict.get.fourslash.js +16 -0
  90. package/dist/tests/fourslash/hover.typedDict.get.fourslash.js.map +1 -0
  91. package/dist/tests/fourslash/import.multipart2.fourslash.d.ts +1 -0
  92. package/dist/tests/fourslash/import.multipart2.fourslash.js +20 -0
  93. package/dist/tests/fourslash/import.multipart2.fourslash.js.map +1 -0
  94. package/dist/tests/typeEvaluator2.test.js +8 -0
  95. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  96. package/dist/tests/typeEvaluator3.test.js +5 -1
  97. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  98. package/dist/tests/typeEvaluator4.test.js +3 -3
  99. package/dist/tests/typeEvaluator5.test.js +7 -1
  100. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  101. package/dist/tests/typeEvaluator6.test.js +6 -0
  102. package/dist/tests/typeEvaluator6.test.js.map +1 -1
  103. package/dist/tests/typeEvaluator7.test.js +10 -0
  104. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  105. package/dist/tests/typeEvaluator8.test.js +4 -0
  106. package/dist/tests/typeEvaluator8.test.js.map +1 -1
  107. package/package.json +2 -2
@@ -1,10 +1,8 @@
1
- import { DocStringService } from '../common/docStringService';
2
1
  import { AssertNode, AssignmentExpressionNode, AssignmentNode, AugmentedAssignmentNode, AwaitNode, BinaryOperationNode, BreakNode, CallNode, ClassNode, ComprehensionNode, ContinueNode, DelNode, ExceptNode, ForNode, FunctionNode, GlobalNode, IfNode, ImportAsNode, ImportFromNode, IndexNode, LambdaNode, MatchNode, MemberAccessNode, ModuleNameNode, ModuleNode, NameNode, NonlocalNode, ParseNode, PatternAsNode, PatternCaptureNode, PatternMappingExpandEntryNode, RaiseNode, ReturnNode, SuiteNode, TernaryNode, TryNode, TypeAliasNode, TypeAnnotationNode, TypeParameterListNode, UnaryOperationNode, WhileNode, WithNode, YieldFromNode, YieldNode } from '../parser/parseNodes';
3
2
  import { AnalyzerFileInfo } from './analyzerFileInfo';
4
3
  import { ParseTreeWalker } from './parseTreeWalker';
5
4
  import { Scope } from './scope';
6
5
  export declare class Binder extends ParseTreeWalker {
7
- private _docStringService;
8
6
  private _moduleSymbolOnly;
9
7
  private readonly _fileInfo;
10
8
  private _deferredBindingTasks;
@@ -34,7 +32,7 @@ export declare class Binder extends ParseTreeWalker {
34
32
  private _potentialHiddenSymbols;
35
33
  private _potentialPrivateSymbols;
36
34
  private _codeFlowComplexity;
37
- constructor(fileInfo: AnalyzerFileInfo, _docStringService: DocStringService, _moduleSymbolOnly?: boolean);
35
+ constructor(fileInfo: AnalyzerFileInfo, _moduleSymbolOnly?: boolean);
38
36
  bindModule(node: ModuleNode): void;
39
37
  visitModule(node: ModuleNode): boolean;
40
38
  visitSuite(node: SuiteNode): boolean;
@@ -64,9 +64,8 @@ const symbolNameUtils_1 = require("./symbolNameUtils");
64
64
  // flow nodes. This number is somewhat arbitrary and is tuned empirically.
65
65
  const flowNodeComplexityContribution = 0.05;
66
66
  class Binder extends parseTreeWalker_1.ParseTreeWalker {
67
- constructor(fileInfo, _docStringService, _moduleSymbolOnly = false) {
67
+ constructor(fileInfo, _moduleSymbolOnly = false) {
68
68
  super();
69
- this._docStringService = _docStringService;
70
69
  this._moduleSymbolOnly = _moduleSymbolOnly;
71
70
  // A queue of deferred analysis operations.
72
71
  this._deferredBindingTasks = [];
@@ -317,14 +316,8 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
317
316
  this._currentFlowNode = this._createStartFlowNode();
318
317
  this._codeFlowComplexity = 0;
319
318
  node.d.params.forEach((paramNode) => {
320
- var _a, _b;
321
319
  if (paramNode.d.name) {
322
320
  const symbol = this._bindNameToScope(this._currentScope, paramNode.d.name);
323
- // Extract the parameter docString from the function docString
324
- let docString = ParseTreeUtils.getDocString((_b = (_a = node === null || node === void 0 ? void 0 : node.d.suite) === null || _a === void 0 ? void 0 : _a.d.statements) !== null && _b !== void 0 ? _b : []);
325
- if (docString !== undefined) {
326
- docString = this._docStringService.extractParameterDocumentation(docString, paramNode.d.name.d.value);
327
- }
328
321
  if (symbol) {
329
322
  const paramDeclaration = {
330
323
  type: 2 /* DeclarationType.Param */,
@@ -333,7 +326,6 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
333
326
  range: (0, positionUtils_1.convertTextRangeToRange)(paramNode, this._fileInfo.lines),
334
327
  moduleName: this._fileInfo.moduleName,
335
328
  isInExceptSuite: this._isInExceptSuite,
336
- docString: docString,
337
329
  };
338
330
  symbol.addDeclaration(paramDeclaration);
339
331
  AnalyzerNodeInfo.setDeclaration(paramNode.d.name, paramDeclaration);
@@ -2242,7 +2234,7 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
2242
2234
  // Limit only to expressions that contain a narrowable subexpression
2243
2235
  // that is a name. This avoids complexities with composite expressions like
2244
2236
  // member access or index expressions.
2245
- if (this._isNarrowingExpression(node, expressionList, /* neverNarrowingExpressions */ true)) {
2237
+ if (this._isNarrowingExpression(node, expressionList, { filterForNeverNarrowing: true })) {
2246
2238
  const filteredExprList = expressionList.filter((expr) => expr.nodeType === 38 /* ParseNodeType.Name */);
2247
2239
  if (filteredExprList.length > 0) {
2248
2240
  this._currentFlowNode = this._createFlowConditional(isPositiveTest ? codeFlowTypes_1.FlowFlags.TrueNeverCondition : codeFlowTypes_1.FlowFlags.FalseNeverCondition, this._currentFlowNode, node);
@@ -2282,10 +2274,9 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
2282
2274
  return Binder._unreachableFlowNode;
2283
2275
  }
2284
2276
  const expressionList = [];
2285
- if (!this._isNarrowingExpression(expression, expressionList,
2286
- /* filterForNeverNarrowing */ (flags &
2287
- (codeFlowTypes_1.FlowFlags.TrueNeverCondition | codeFlowTypes_1.FlowFlags.FalseNeverCondition)) !==
2288
- 0)) {
2277
+ if (!this._isNarrowingExpression(expression, expressionList, {
2278
+ filterForNeverNarrowing: (flags & (codeFlowTypes_1.FlowFlags.TrueNeverCondition | codeFlowTypes_1.FlowFlags.FalseNeverCondition)) !== 0,
2279
+ })) {
2289
2280
  return antecedent;
2290
2281
  }
2291
2282
  expressionList.forEach((expr) => {
@@ -2324,12 +2315,12 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
2324
2315
  // The isComplexExpression parameter is used internally to determine whether
2325
2316
  // the call is an atom (name, member access, index - plus a "not" form of
2326
2317
  // these) or something more complex (binary operator, call, etc.).
2327
- _isNarrowingExpression(expression, expressionList, filterForNeverNarrowing = false, isComplexExpression = false) {
2318
+ _isNarrowingExpression(expression, expressionList, options = {}) {
2328
2319
  switch (expression.nodeType) {
2329
2320
  case 38 /* ParseNodeType.Name */:
2330
2321
  case 35 /* ParseNodeType.MemberAccess */:
2331
2322
  case 27 /* ParseNodeType.Index */: {
2332
- if (filterForNeverNarrowing) {
2323
+ if (options.filterForNeverNarrowing) {
2333
2324
  // Never narrowing doesn't support member access or index
2334
2325
  // expressions.
2335
2326
  if (expression.nodeType !== 38 /* ParseNodeType.Name */) {
@@ -2338,17 +2329,17 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
2338
2329
  // Never narrowing doesn't support simple names (falsy
2339
2330
  // or truthy narrowing) because it's too expensive and
2340
2331
  // provides relatively little utility.
2341
- if (!isComplexExpression) {
2332
+ if (!options.isComplexExpression) {
2342
2333
  return false;
2343
2334
  }
2344
2335
  }
2345
2336
  if ((0, codeFlowTypes_1.isCodeFlowSupportedForReference)(expression)) {
2346
2337
  expressionList.push(expression);
2347
- if (!filterForNeverNarrowing) {
2338
+ if (!options.filterForNeverNarrowing) {
2348
2339
  // If the expression is a member access expression, add its
2349
2340
  // leftExpression to the expression list because that expression
2350
2341
  // can be narrowed based on the attribute type.
2351
- if (expression.nodeType === 35 /* ParseNodeType.MemberAccess */) {
2342
+ if (expression.nodeType === 35 /* ParseNodeType.MemberAccess */ && options.allowDiscriminatedNarrowing) {
2352
2343
  if ((0, codeFlowTypes_1.isCodeFlowSupportedForReference)(expression.d.leftExpr)) {
2353
2344
  expressionList.push(expression.d.leftExpr);
2354
2345
  }
@@ -2371,8 +2362,10 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
2371
2362
  }
2372
2363
  case 4 /* ParseNodeType.AssignmentExpression */: {
2373
2364
  expressionList.push(expression.d.name);
2374
- this._isNarrowingExpression(expression.d.rightExpr, expressionList, filterForNeverNarrowing,
2375
- /* isComplexExpression */ true);
2365
+ this._isNarrowingExpression(expression.d.rightExpr, expressionList, {
2366
+ ...options,
2367
+ isComplexExpression: true,
2368
+ });
2376
2369
  return true;
2377
2370
  }
2378
2371
  case 7 /* ParseNodeType.BinaryOperation */: {
@@ -2383,8 +2376,11 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
2383
2376
  // These are commonly-used patterns used in control flow.
2384
2377
  if (expression.d.rightExpr.nodeType === 14 /* ParseNodeType.Constant */ &&
2385
2378
  expression.d.rightExpr.d.constType === 26 /* KeywordType.None */) {
2386
- return this._isNarrowingExpression(expression.d.leftExpr, expressionList, filterForNeverNarrowing,
2387
- /* isComplexExpression */ true);
2379
+ return this._isNarrowingExpression(expression.d.leftExpr, expressionList, {
2380
+ ...options,
2381
+ isComplexExpression: true,
2382
+ allowDiscriminatedNarrowing: true,
2383
+ });
2388
2384
  }
2389
2385
  // Look for "type(X) is Y" or "type(X) is not Y".
2390
2386
  if (isOrIsNotOperator &&
@@ -2393,11 +2389,13 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
2393
2389
  expression.d.leftExpr.d.leftExpr.d.value === 'type' &&
2394
2390
  expression.d.leftExpr.d.args.length === 1 &&
2395
2391
  expression.d.leftExpr.d.args[0].d.argCategory === 0 /* ArgCategory.Simple */) {
2396
- return this._isNarrowingExpression(expression.d.leftExpr.d.args[0].d.valueExpr, expressionList, filterForNeverNarrowing,
2397
- /* isComplexExpression */ true);
2392
+ return this._isNarrowingExpression(expression.d.leftExpr.d.args[0].d.valueExpr, expressionList, { ...options, isComplexExpression: true });
2398
2393
  }
2399
- const isLeftNarrowing = this._isNarrowingExpression(expression.d.leftExpr, expressionList, filterForNeverNarrowing,
2400
- /* isComplexExpression */ true);
2394
+ const isLeftNarrowing = this._isNarrowingExpression(expression.d.leftExpr, expressionList, {
2395
+ ...options,
2396
+ isComplexExpression: true,
2397
+ allowDiscriminatedNarrowing: true,
2398
+ });
2401
2399
  // Look for "X is Y" or "X is not Y".
2402
2400
  // Look for X == <literal> or X != <literal>
2403
2401
  // Look for len(X) == <literal> or len(X) != <literal>
@@ -2409,61 +2407,79 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
2409
2407
  expression.d.operator === 21 /* OperatorType.LessThanOrEqual */ ||
2410
2408
  expression.d.operator === 15 /* OperatorType.GreaterThan */ ||
2411
2409
  expression.d.operator === 16 /* OperatorType.GreaterThanOrEqual */) {
2412
- const isLeftNarrowing = this._isNarrowingExpression(expression.d.leftExpr, expressionList, filterForNeverNarrowing,
2413
- /* isComplexExpression */ true);
2410
+ const isLeftNarrowing = this._isNarrowingExpression(expression.d.leftExpr, expressionList, {
2411
+ ...options,
2412
+ isComplexExpression: true,
2413
+ });
2414
2414
  return isLeftNarrowing;
2415
2415
  }
2416
2416
  }
2417
2417
  // Look for "<string> in Y" or "<string> not in Y".
2418
2418
  if (expression.d.operator === 41 /* OperatorType.In */ || expression.d.operator === 42 /* OperatorType.NotIn */) {
2419
2419
  if (expression.d.leftExpr.nodeType === 48 /* ParseNodeType.StringList */ &&
2420
- this._isNarrowingExpression(expression.d.rightExpr, expressionList, filterForNeverNarrowing,
2421
- /* isComplexExpression */ true)) {
2420
+ this._isNarrowingExpression(expression.d.rightExpr, expressionList, {
2421
+ ...options,
2422
+ isComplexExpression: true,
2423
+ })) {
2422
2424
  return true;
2423
2425
  }
2424
2426
  }
2425
2427
  // Look for "X in Y" or "X not in Y".
2426
2428
  if (expression.d.operator === 41 /* OperatorType.In */ || expression.d.operator === 42 /* OperatorType.NotIn */) {
2427
- const isLeftNarrowable = this._isNarrowingExpression(expression.d.leftExpr, expressionList, filterForNeverNarrowing,
2428
- /* isComplexExpression */ true);
2429
- const isRightNarrowable = this._isNarrowingExpression(expression.d.rightExpr, expressionList, filterForNeverNarrowing,
2430
- /* isComplexExpression */ true);
2429
+ const isLeftNarrowable = this._isNarrowingExpression(expression.d.leftExpr, expressionList, {
2430
+ ...options,
2431
+ isComplexExpression: true,
2432
+ });
2433
+ const isRightNarrowable = this._isNarrowingExpression(expression.d.rightExpr, expressionList, {
2434
+ ...options,
2435
+ isComplexExpression: true,
2436
+ });
2431
2437
  return isLeftNarrowable || isRightNarrowable;
2432
2438
  }
2433
2439
  return false;
2434
2440
  }
2435
2441
  case 55 /* ParseNodeType.UnaryOperation */: {
2436
2442
  return (expression.d.operator === 38 /* OperatorType.Not */ &&
2437
- this._isNarrowingExpression(expression.d.expr, expressionList, filterForNeverNarrowing,
2438
- /* isComplexExpression */ false));
2443
+ this._isNarrowingExpression(expression.d.expr, expressionList, {
2444
+ ...options,
2445
+ isComplexExpression: false,
2446
+ }));
2439
2447
  }
2440
2448
  case 5 /* ParseNodeType.AugmentedAssignment */: {
2441
- return this._isNarrowingExpression(expression.d.rightExpr, expressionList, filterForNeverNarrowing,
2442
- /* isComplexExpression */ true);
2449
+ return this._isNarrowingExpression(expression.d.rightExpr, expressionList, {
2450
+ ...options,
2451
+ isComplexExpression: true,
2452
+ });
2443
2453
  }
2444
2454
  case 9 /* ParseNodeType.Call */: {
2445
2455
  if (expression.d.leftExpr.nodeType === 38 /* ParseNodeType.Name */ &&
2446
2456
  (expression.d.leftExpr.d.value === 'isinstance' ||
2447
2457
  expression.d.leftExpr.d.value === 'issubclass') &&
2448
2458
  expression.d.args.length === 2) {
2449
- return this._isNarrowingExpression(expression.d.args[0].d.valueExpr, expressionList, filterForNeverNarrowing,
2450
- /* isComplexExpression */ true);
2459
+ return this._isNarrowingExpression(expression.d.args[0].d.valueExpr, expressionList, {
2460
+ ...options,
2461
+ isComplexExpression: true,
2462
+ });
2451
2463
  }
2452
2464
  if (expression.d.leftExpr.nodeType === 38 /* ParseNodeType.Name */ &&
2453
2465
  expression.d.leftExpr.d.value === 'callable' &&
2454
2466
  expression.d.args.length === 1) {
2455
- return this._isNarrowingExpression(expression.d.args[0].d.valueExpr, expressionList, filterForNeverNarrowing,
2456
- /* isComplexExpression */ true);
2467
+ return this._isNarrowingExpression(expression.d.args[0].d.valueExpr, expressionList, {
2468
+ ...options,
2469
+ isComplexExpression: true,
2470
+ });
2457
2471
  }
2458
2472
  // Is this potentially a call to a user-defined type guard function?
2459
2473
  if (expression.d.args.length >= 1) {
2460
2474
  // Never narrowing doesn't support type guards because they do not
2461
2475
  // offer negative narrowing.
2462
- if (filterForNeverNarrowing) {
2476
+ if (options.filterForNeverNarrowing) {
2463
2477
  return false;
2464
2478
  }
2465
- return this._isNarrowingExpression(expression.d.args[0].d.valueExpr, expressionList, filterForNeverNarrowing,
2466
- /* isComplexExpression */ true);
2479
+ return this._isNarrowingExpression(expression.d.args[0].d.valueExpr, expressionList, {
2480
+ ...options,
2481
+ isComplexExpression: true,
2482
+ });
2467
2483
  }
2468
2484
  }
2469
2485
  }