@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.
- package/dist/analyzer/aliasDeclarationUtils.js +2 -2
- package/dist/analyzer/analyzerNodeInfo.d.ts +4 -1
- package/dist/analyzer/analyzerNodeInfo.js +12 -1
- package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
- package/dist/analyzer/binder.d.ts +6 -1
- package/dist/analyzer/binder.js +133 -30
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +4 -1
- package/dist/analyzer/checker.js +125 -47
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +6 -3
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/declaration.d.ts +18 -6
- package/dist/analyzer/declaration.js +19 -9
- package/dist/analyzer/declaration.js.map +1 -1
- package/dist/analyzer/declarationUtils.d.ts +1 -1
- package/dist/analyzer/declarationUtils.js +19 -16
- package/dist/analyzer/declarationUtils.js.map +1 -1
- package/dist/analyzer/packageTypeVerifier.js +6 -6
- package/dist/analyzer/parseTreeUtils.d.ts +3 -3
- package/dist/analyzer/parseTreeUtils.js +16 -11
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/parseTreeWalker.d.ts +4 -1
- package/dist/analyzer/parseTreeWalker.js +19 -1
- package/dist/analyzer/parseTreeWalker.js.map +1 -1
- package/dist/analyzer/properties.js +2 -0
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/protocols.d.ts +0 -1
- package/dist/analyzer/protocols.js +1 -63
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/tracePrinter.js +8 -4
- package/dist/analyzer/tracePrinter.js.map +1 -1
- package/dist/analyzer/typeDocStringUtils.js +1 -1
- package/dist/analyzer/typeEvaluator.js +524 -176
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -0
- package/dist/analyzer/typeEvaluatorWithTracker.js +2 -0
- package/dist/analyzer/typeEvaluatorWithTracker.js.map +1 -1
- package/dist/analyzer/typePrinter.js +4 -1
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typeStubWriter.d.ts +4 -1
- package/dist/analyzer/typeStubWriter.js +36 -0
- package/dist/analyzer/typeStubWriter.js.map +1 -1
- package/dist/analyzer/typeUtils.js +10 -5
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/types.d.ts +11 -4
- package/dist/analyzer/types.js +23 -8
- package/dist/analyzer/types.js.map +1 -1
- package/dist/languageService/autoImporter.js +1 -1
- package/dist/languageService/callHierarchyProvider.js +9 -9
- package/dist/languageService/completionProvider.js +19 -13
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/definitionProvider.js +3 -3
- package/dist/languageService/documentSymbolCollector.js +1 -1
- package/dist/languageService/documentSymbolProvider.js +10 -7
- package/dist/languageService/documentSymbolProvider.js.map +1 -1
- package/dist/languageService/hoverProvider.js +19 -5
- package/dist/languageService/hoverProvider.js.map +1 -1
- package/dist/languageService/referencesProvider.js +8 -5
- package/dist/languageService/referencesProvider.js.map +1 -1
- package/dist/languageService/tooltipUtils.js +1 -1
- package/dist/localization/localize.d.ts +27 -0
- package/dist/localization/localize.js +16 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +18 -2
- package/dist/parser/parseNodes.d.ts +41 -5
- package/dist/parser/parseNodes.js +83 -4
- package/dist/parser/parseNodes.js.map +1 -1
- package/dist/parser/parser.d.ts +3 -0
- package/dist/parser/parser.js +129 -12
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokenizer.js +4 -3
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/parser/tokenizerTypes.d.ts +5 -3
- package/dist/parser/tokenizerTypes.js +6 -4
- package/dist/parser/tokenizerTypes.js.map +1 -1
- package/dist/tests/typeEvaluator5.test.d.ts +1 -0
- package/dist/tests/typeEvaluator5.test.js +112 -0
- package/dist/tests/typeEvaluator5.test.js.map +1 -0
- package/package.json +1 -1
package/dist/parser/parser.js
CHANGED
@@ -184,13 +184,13 @@ class Parser {
|
|
184
184
|
switch (this._peekKeywordType()) {
|
185
185
|
case 20 /* If */:
|
186
186
|
return this._parseIfStatement();
|
187
|
-
case
|
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
|
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
|
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(
|
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(
|
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(
|
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() !==
|
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
|
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
|
-
|
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);
|