@zzzen/pyright-internal 1.2.0-dev.2022-07-02 → 1.2.0-dev.20220703

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 (80) hide show
  1. package/dist/analyzer/aliasDeclarationUtils.js +2 -2
  2. package/dist/analyzer/analyzerNodeInfo.d.ts +4 -1
  3. package/dist/analyzer/analyzerNodeInfo.js +12 -1
  4. package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
  5. package/dist/analyzer/binder.d.ts +6 -1
  6. package/dist/analyzer/binder.js +133 -30
  7. package/dist/analyzer/binder.js.map +1 -1
  8. package/dist/analyzer/checker.d.ts +4 -1
  9. package/dist/analyzer/checker.js +125 -47
  10. package/dist/analyzer/checker.js.map +1 -1
  11. package/dist/analyzer/constraintSolver.js +6 -3
  12. package/dist/analyzer/constraintSolver.js.map +1 -1
  13. package/dist/analyzer/declaration.d.ts +18 -6
  14. package/dist/analyzer/declaration.js +19 -9
  15. package/dist/analyzer/declaration.js.map +1 -1
  16. package/dist/analyzer/declarationUtils.d.ts +1 -1
  17. package/dist/analyzer/declarationUtils.js +19 -16
  18. package/dist/analyzer/declarationUtils.js.map +1 -1
  19. package/dist/analyzer/packageTypeVerifier.js +6 -6
  20. package/dist/analyzer/parseTreeUtils.d.ts +3 -3
  21. package/dist/analyzer/parseTreeUtils.js +16 -11
  22. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  23. package/dist/analyzer/parseTreeWalker.d.ts +4 -1
  24. package/dist/analyzer/parseTreeWalker.js +19 -1
  25. package/dist/analyzer/parseTreeWalker.js.map +1 -1
  26. package/dist/analyzer/properties.js +2 -0
  27. package/dist/analyzer/properties.js.map +1 -1
  28. package/dist/analyzer/protocols.d.ts +0 -1
  29. package/dist/analyzer/protocols.js +1 -63
  30. package/dist/analyzer/protocols.js.map +1 -1
  31. package/dist/analyzer/tracePrinter.js +8 -4
  32. package/dist/analyzer/tracePrinter.js.map +1 -1
  33. package/dist/analyzer/typeDocStringUtils.js +1 -1
  34. package/dist/analyzer/typeEvaluator.js +524 -176
  35. package/dist/analyzer/typeEvaluator.js.map +1 -1
  36. package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -0
  37. package/dist/analyzer/typeEvaluatorWithTracker.js +2 -0
  38. package/dist/analyzer/typeEvaluatorWithTracker.js.map +1 -1
  39. package/dist/analyzer/typePrinter.js +4 -1
  40. package/dist/analyzer/typePrinter.js.map +1 -1
  41. package/dist/analyzer/typeStubWriter.d.ts +4 -1
  42. package/dist/analyzer/typeStubWriter.js +36 -0
  43. package/dist/analyzer/typeStubWriter.js.map +1 -1
  44. package/dist/analyzer/typeUtils.js +10 -5
  45. package/dist/analyzer/typeUtils.js.map +1 -1
  46. package/dist/analyzer/types.d.ts +11 -4
  47. package/dist/analyzer/types.js +23 -8
  48. package/dist/analyzer/types.js.map +1 -1
  49. package/dist/languageService/autoImporter.js +1 -1
  50. package/dist/languageService/callHierarchyProvider.js +9 -9
  51. package/dist/languageService/completionProvider.js +19 -13
  52. package/dist/languageService/completionProvider.js.map +1 -1
  53. package/dist/languageService/definitionProvider.js +3 -3
  54. package/dist/languageService/documentSymbolCollector.js +1 -1
  55. package/dist/languageService/documentSymbolProvider.js +10 -7
  56. package/dist/languageService/documentSymbolProvider.js.map +1 -1
  57. package/dist/languageService/hoverProvider.js +19 -5
  58. package/dist/languageService/hoverProvider.js.map +1 -1
  59. package/dist/languageService/referencesProvider.js +8 -5
  60. package/dist/languageService/referencesProvider.js.map +1 -1
  61. package/dist/languageService/tooltipUtils.js +1 -1
  62. package/dist/localization/localize.d.ts +27 -0
  63. package/dist/localization/localize.js +16 -0
  64. package/dist/localization/localize.js.map +1 -1
  65. package/dist/localization/package.nls.en-us.json +18 -2
  66. package/dist/parser/parseNodes.d.ts +41 -5
  67. package/dist/parser/parseNodes.js +83 -4
  68. package/dist/parser/parseNodes.js.map +1 -1
  69. package/dist/parser/parser.d.ts +3 -0
  70. package/dist/parser/parser.js +129 -12
  71. package/dist/parser/parser.js.map +1 -1
  72. package/dist/parser/tokenizer.js +4 -3
  73. package/dist/parser/tokenizer.js.map +1 -1
  74. package/dist/parser/tokenizerTypes.d.ts +5 -3
  75. package/dist/parser/tokenizerTypes.js +6 -4
  76. package/dist/parser/tokenizerTypes.js.map +1 -1
  77. package/dist/tests/typeEvaluator5.test.d.ts +1 -0
  78. package/dist/tests/typeEvaluator5.test.js +112 -0
  79. package/dist/tests/typeEvaluator5.test.js.map +1 -0
  80. package/package.json +1 -1
@@ -184,13 +184,13 @@ class Parser {
184
184
  switch (this._peekKeywordType()) {
185
185
  case 20 /* If */:
186
186
  return this._parseIfStatement();
187
- case 35 /* While */:
187
+ case 36 /* While */:
188
188
  return this._parseWhileStatement();
189
189
  case 17 /* For */:
190
190
  return this._parseForStatement();
191
191
  case 34 /* Try */:
192
192
  return this._parseTryStatement();
193
- case 36 /* With */:
193
+ case 37 /* With */:
194
194
  return this._parseWithStatement();
195
195
  case 10 /* Def */:
196
196
  return this._parseFunctionDef();
@@ -227,6 +227,7 @@ class Parser {
227
227
  return matchStatement;
228
228
  }
229
229
  }
230
+ break;
230
231
  }
231
232
  }
232
233
  if (this._peekOperatorType() === 22 /* MatrixMultiply */) {
@@ -240,7 +241,7 @@ class Parser {
240
241
  switch (this._peekKeywordType()) {
241
242
  case 10 /* Def */:
242
243
  return this._parseFunctionDef(asyncToken);
243
- case 36 /* With */:
244
+ case 37 /* With */:
244
245
  return this._parseWithStatement(asyncToken);
245
246
  case 17 /* For */:
246
247
  return this._parseForStatement(asyncToken);
@@ -248,6 +249,87 @@ class Parser {
248
249
  this._addError(localize_1.Localizer.Diagnostic.unexpectedAsyncToken(), asyncToken);
249
250
  return undefined;
250
251
  }
252
+ // type_alias_stmt: "type" name [type_param_seq] = expr
253
+ _parseTypeAliasStatement() {
254
+ const typeToken = this._getKeywordToken(35 /* Type */);
255
+ if (!this._parseOptions.isStubFile && this._getLanguageVersion() < pythonVersion_1.PythonVersion.V3_12) {
256
+ this._addError(localize_1.Localizer.Diagnostic.typeAliasStatementIllegal(), typeToken);
257
+ }
258
+ const nameToken = this._getTokenIfIdentifier();
259
+ (0, debug_1.assert)(nameToken !== undefined);
260
+ const name = parseNodes_1.NameNode.create(nameToken);
261
+ let typeParameters;
262
+ if (this._peekToken().type === 15 /* OpenBracket */) {
263
+ typeParameters = this._parseTypeParameterList();
264
+ }
265
+ const assignToken = this._peekToken();
266
+ if (assignToken.type !== 9 /* Operator */ ||
267
+ assignToken.operatorType !== 2 /* Assign */) {
268
+ this._addError(localize_1.Localizer.Diagnostic.expectedEquals(), assignToken);
269
+ }
270
+ else {
271
+ this._getNextToken();
272
+ }
273
+ const expression = this._parseOrTest();
274
+ return parseNodes_1.TypeAliasNode.create(typeToken, name, expression, typeParameters);
275
+ }
276
+ // type_param_seq: '[' (type_param ',')+ ']'
277
+ _parseTypeParameterList() {
278
+ const typeVariableNodes = [];
279
+ const openBracketToken = this._getNextToken();
280
+ (0, debug_1.assert)(openBracketToken.type === 15 /* OpenBracket */);
281
+ while (true) {
282
+ const firstToken = this._peekToken();
283
+ if (firstToken.type === 16 /* CloseBracket */) {
284
+ if (typeVariableNodes.length === 0) {
285
+ this._addError(localize_1.Localizer.Diagnostic.typeParametersMissing(), this._peekToken());
286
+ }
287
+ break;
288
+ }
289
+ const typeVarNode = this._parseTypeParameter();
290
+ if (!typeVarNode) {
291
+ break;
292
+ }
293
+ typeVariableNodes.push(typeVarNode);
294
+ if (!this._consumeTokenIfType(12 /* Comma */)) {
295
+ break;
296
+ }
297
+ }
298
+ const closingToken = this._peekToken();
299
+ if (closingToken.type !== 16 /* CloseBracket */) {
300
+ this._addError(localize_1.Localizer.Diagnostic.expectedCloseBracket(), this._peekToken());
301
+ this._consumeTokensUntilType([2 /* NewLine */, 16 /* CloseBracket */, 10 /* Colon */]);
302
+ }
303
+ else {
304
+ this._getNextToken();
305
+ }
306
+ return parseNodes_1.TypeParameterListNode.create(openBracketToken, closingToken, typeVariableNodes);
307
+ }
308
+ // type_param: ['*' | '**'] NAME [':' expr]
309
+ _parseTypeParameter() {
310
+ let typeParamCategory = parseNodes_1.TypeParameterCategory.TypeVar;
311
+ if (this._consumeTokenIfOperator(26 /* Multiply */)) {
312
+ typeParamCategory = parseNodes_1.TypeParameterCategory.TypeVarTuple;
313
+ }
314
+ else if (this._consumeTokenIfOperator(29 /* Power */)) {
315
+ typeParamCategory = parseNodes_1.TypeParameterCategory.ParamSpec;
316
+ }
317
+ const nameToken = this._getTokenIfIdentifier();
318
+ if (!nameToken) {
319
+ this._addError(localize_1.Localizer.Diagnostic.expectedTypeParameterName(), this._peekToken());
320
+ return undefined;
321
+ }
322
+ const name = parseNodes_1.NameNode.create(nameToken);
323
+ let boundExpression;
324
+ if (this._peekTokenType() === 10 /* Colon */) {
325
+ this._getNextToken();
326
+ boundExpression = this._parseTestExpression(/* allowAssignmentExpression */ false);
327
+ if (typeParamCategory !== parseNodes_1.TypeParameterCategory.TypeVar) {
328
+ this._addError(localize_1.Localizer.Diagnostic.typeParameterBoundNotAllowed(), boundExpression);
329
+ }
330
+ }
331
+ return parseNodes_1.TypeParameterNode.create(name, typeParamCategory, boundExpression);
332
+ }
251
333
  // match_stmt: "match" subject_expr ':' NEWLINE INDENT case_block+ DEDENT
252
334
  // subject_expr:
253
335
  // | star_named_expression ',' star_named_expressions?
@@ -1137,7 +1219,7 @@ class Parser {
1137
1219
  }
1138
1220
  // while_stmt: 'while' test suite ['else' suite]
1139
1221
  _parseWhileStatement() {
1140
- const whileToken = this._getKeywordToken(35 /* While */);
1222
+ const whileToken = this._getKeywordToken(36 /* While */);
1141
1223
  const whileNode = parseNodes_1.WhileNode.create(whileToken, this._parseTestExpression(/* allowAssignmentExpression */ true), this._parseLoopSuite());
1142
1224
  if (this._consumeTokenIfKeyword(13 /* Else */)) {
1143
1225
  whileNode.elseSuite = this._parseSuite(this._isInFunction);
@@ -1242,6 +1324,14 @@ class Parser {
1242
1324
  this._addError(localize_1.Localizer.Diagnostic.expectedFunctionName(), defToken);
1243
1325
  return parseNodes_1.ErrorNode.create(defToken, 10 /* MissingFunctionParameterList */, undefined, decorators);
1244
1326
  }
1327
+ let typeParameters;
1328
+ const possibleOpenBracket = this._peekToken();
1329
+ if (possibleOpenBracket.type === 15 /* OpenBracket */) {
1330
+ typeParameters = this._parseTypeParameterList();
1331
+ if (!this._parseOptions.isStubFile && this._getLanguageVersion() < pythonVersion_1.PythonVersion.V3_12) {
1332
+ this._addError(localize_1.Localizer.Diagnostic.functionTypeParametersIllegal(), typeParameters);
1333
+ }
1334
+ }
1245
1335
  const openParenToken = this._peekToken();
1246
1336
  if (!this._consumeTokenIfType(13 /* OpenParenthesis */)) {
1247
1337
  this._addError(localize_1.Localizer.Diagnostic.expectedOpenParen(), this._peekToken());
@@ -1262,7 +1352,7 @@ class Parser {
1262
1352
  functionTypeAnnotationToken = this._getTypeAnnotationCommentText();
1263
1353
  }
1264
1354
  });
1265
- const functionNode = parseNodes_1.FunctionNode.create(defToken, parseNodes_1.NameNode.create(nameToken), suite);
1355
+ const functionNode = parseNodes_1.FunctionNode.create(defToken, parseNodes_1.NameNode.create(nameToken), suite, typeParameters);
1266
1356
  if (asyncToken) {
1267
1357
  functionNode.isAsync = true;
1268
1358
  (0, parseNodes_1.extendRange)(functionNode, asyncToken);
@@ -1481,7 +1571,7 @@ class Parser {
1481
1571
  // Python 3.10 adds support for optional parentheses around
1482
1572
  // with_item list.
1483
1573
  _parseWithStatement(asyncToken) {
1484
- const withToken = this._getKeywordToken(36 /* With */);
1574
+ const withToken = this._getKeywordToken(37 /* With */);
1485
1575
  let withItemList = [];
1486
1576
  const possibleParen = this._peekToken();
1487
1577
  // If the expression starts with a paren, parse it as though the
@@ -1642,6 +1732,14 @@ class Parser {
1642
1732
  this._addError(localize_1.Localizer.Diagnostic.expectedClassName(), this._peekToken());
1643
1733
  nameToken = tokenizerTypes_1.IdentifierToken.create(0, 0, '', /* comments */ undefined);
1644
1734
  }
1735
+ let typeParameters;
1736
+ const possibleOpenBracket = this._peekToken();
1737
+ if (possibleOpenBracket.type === 15 /* OpenBracket */) {
1738
+ typeParameters = this._parseTypeParameterList();
1739
+ if (!this._parseOptions.isStubFile && this._getLanguageVersion() < pythonVersion_1.PythonVersion.V3_12) {
1740
+ this._addError(localize_1.Localizer.Diagnostic.classTypeParametersIllegal(), typeParameters);
1741
+ }
1742
+ }
1645
1743
  let argList = [];
1646
1744
  const openParenToken = this._peekToken();
1647
1745
  if (this._consumeTokenIfType(13 /* OpenParenthesis */)) {
@@ -1651,7 +1749,7 @@ class Parser {
1651
1749
  }
1652
1750
  }
1653
1751
  const suite = this._parseSuite(/* isFunction */ false, this._parseOptions.skipFunctionAndClassBody);
1654
- const classNode = parseNodes_1.ClassNode.create(classToken, parseNodes_1.NameNode.create(nameToken), suite);
1752
+ const classNode = parseNodes_1.ClassNode.create(classToken, parseNodes_1.NameNode.create(nameToken), suite, typeParameters);
1655
1753
  classNode.arguments = argList;
1656
1754
  argList.forEach((arg) => {
1657
1755
  arg.parent = classNode;
@@ -2008,7 +2106,7 @@ class Parser {
2008
2106
  // yield_expr: 'yield' [yield_arg]
2009
2107
  // yield_arg: 'from' test | testlist
2010
2108
  _parseYieldExpression() {
2011
- const yieldToken = this._getKeywordToken(37 /* Yield */);
2109
+ const yieldToken = this._getKeywordToken(38 /* Yield */);
2012
2110
  const nextToken = this._peekToken();
2013
2111
  if (this._consumeTokenIfKeyword(18 /* From */)) {
2014
2112
  if (this._getLanguageVersion() < pythonVersion_1.PythonVersion.V3_3) {
@@ -2026,7 +2124,7 @@ class Parser {
2026
2124
  return parseNodes_1.YieldNode.create(yieldToken, exprList);
2027
2125
  }
2028
2126
  _tryParseYieldExpression() {
2029
- if (this._peekKeywordType() !== 37 /* Yield */) {
2127
+ if (this._peekKeywordType() !== 38 /* Yield */) {
2030
2128
  return undefined;
2031
2129
  }
2032
2130
  return this._parseYieldExpression();
@@ -2096,8 +2194,28 @@ class Parser {
2096
2194
  return this._parseAssertStatement();
2097
2195
  case 11 /* Del */:
2098
2196
  return this._parseDelStatement();
2099
- case 37 /* Yield */:
2197
+ case 38 /* Yield */:
2100
2198
  return this._parseYieldExpression();
2199
+ case 35 /* Type */: {
2200
+ // Type is considered a "soft" keyword, so we will treat it
2201
+ // as an identifier if it is followed by an unexpected token.
2202
+ const peekToken1 = this._peekToken(1);
2203
+ const peekToken2 = this._peekToken(2);
2204
+ let isInvalidTypeToken = true;
2205
+ if (peekToken1.type === 7 /* Identifier */ || peekToken1.type === 8 /* Keyword */) {
2206
+ if (peekToken2.type === 15 /* OpenBracket */) {
2207
+ isInvalidTypeToken = false;
2208
+ }
2209
+ else if (peekToken2.type === 9 /* Operator */ &&
2210
+ peekToken2.operatorType === 2 /* Assign */) {
2211
+ isInvalidTypeToken = false;
2212
+ }
2213
+ }
2214
+ if (!isInvalidTypeToken) {
2215
+ return this._parseTypeAliasStatement();
2216
+ }
2217
+ break;
2218
+ }
2101
2219
  }
2102
2220
  return this._parseExpressionStatement();
2103
2221
  }
@@ -3743,8 +3861,7 @@ class Parser {
3743
3861
  // If this is a "soft keyword", it can be converted into an identifier.
3744
3862
  if (nextToken.type === 8 /* Keyword */) {
3745
3863
  const keywordType = this._peekKeywordType();
3746
- const softKeywords = [9 /* Debug */, 25 /* Match */, 6 /* Case */];
3747
- if (softKeywords.find((type) => type === keywordType)) {
3864
+ if (tokenizerTypes_1.softKeywords.find((type) => type === keywordType)) {
3748
3865
  const keywordText = this._fileContents.substr(nextToken.start, nextToken.length);
3749
3866
  this._getNextToken();
3750
3867
  return tokenizerTypes_1.IdentifierToken.create(nextToken.start, nextToken.length, keywordText, nextToken.comments);