@zzzen/pyright-internal 1.2.0-dev.20260802 → 1.2.0-dev.20260816
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/analyzerNodeInfo.d.ts +4 -1
- package/dist/analyzer/analyzerNodeInfo.js +13 -0
- package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
- package/dist/analyzer/binder.js +88 -1
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +1 -0
- package/dist/analyzer/checker.js +71 -15
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +47 -7
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/constructors.js +18 -8
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/dataClasses.d.ts +1 -0
- package/dist/analyzer/dataClasses.js +98 -19
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/decorators.js +18 -0
- package/dist/analyzer/decorators.js.map +1 -1
- package/dist/analyzer/scope.d.ts +3 -0
- package/dist/analyzer/scope.js +10 -0
- package/dist/analyzer/scope.js.map +1 -1
- package/dist/analyzer/symbol.d.ts +4 -1
- package/dist/analyzer/symbol.js +8 -0
- package/dist/analyzer/symbol.js.map +1 -1
- package/dist/analyzer/typeCacheUtils.d.ts +6 -2
- package/dist/analyzer/typeCacheUtils.js +16 -37
- package/dist/analyzer/typeCacheUtils.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +955 -105
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeGuards.js +11 -8
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/types.d.ts +11 -1
- package/dist/analyzer/types.js +48 -0
- package/dist/analyzer/types.js.map +1 -1
- package/dist/localization/localize.d.ts +6 -0
- package/dist/localization/localize.js +4 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +13 -0
- package/dist/tests/typeCacheUtils.test.d.ts +1 -0
- package/dist/tests/typeCacheUtils.test.js +69 -0
- package/dist/tests/typeCacheUtils.test.js.map +1 -0
- package/dist/tests/typeEvaluator3.test.js +8 -0
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator5.test.js +12 -0
- package/dist/tests/typeEvaluator5.test.js.map +1 -1
- package/dist/tests/typeEvaluator6.test.js +33 -1
- package/dist/tests/typeEvaluator6.test.js.map +1 -1
- package/dist/tests/typeEvaluator7.test.js +37 -0
- package/dist/tests/typeEvaluator7.test.js.map +1 -1
- package/dist/tests/typeEvaluator8.test.js +318 -4
- package/dist/tests/typeEvaluator8.test.js.map +1 -1
- package/dist/tests/types.test.d.ts +1 -0
- package/dist/tests/types.test.js +63 -0
- package/dist/tests/types.test.js.map +1 -0
- package/dist/typeServer/typeGuards.js +4 -3
- package/dist/typeServer/typeGuards.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClassNode, ComprehensionNode, ExecutionScopeNode, FunctionNode, LambdaNode, ModuleNode, ParseNode, StringNode } from '../parser/parseNodes';
|
|
1
|
+
import { ClassNode, ComprehensionNode, ExecutionScopeNode, FunctionNode, IfNode, LambdaNode, ModuleNode, ParseNode, StringNode } from '../parser/parseNodes';
|
|
2
2
|
import { AnalyzerFileInfo } from './analyzerFileInfo';
|
|
3
3
|
import { FlowNode } from './codeFlowTypes';
|
|
4
4
|
import { Declaration } from './declaration';
|
|
@@ -18,6 +18,7 @@ export interface AnalyzerNodeInfo {
|
|
|
18
18
|
fileInfo?: AnalyzerFileInfo;
|
|
19
19
|
codeFlowExpressions?: Set<string>;
|
|
20
20
|
codeFlowComplexity?: number;
|
|
21
|
+
staticConditionValue?: boolean;
|
|
21
22
|
dunderAllInfo?: DunderAllInfo | undefined;
|
|
22
23
|
}
|
|
23
24
|
export type ScopedNode = ModuleNode | ClassNode | FunctionNode | LambdaNode | ComprehensionNode;
|
|
@@ -38,6 +39,8 @@ export declare function getCodeFlowExpressions(node: ExecutionScopeNode): Set<st
|
|
|
38
39
|
export declare function setCodeFlowExpressions(node: ExecutionScopeNode, expressions: Set<string>): void;
|
|
39
40
|
export declare function getCodeFlowComplexity(node: ExecutionScopeNode): number;
|
|
40
41
|
export declare function setCodeFlowComplexity(node: ExecutionScopeNode, complexity: number): void;
|
|
42
|
+
export declare function getStaticConditionValue(node: IfNode): boolean | undefined;
|
|
43
|
+
export declare function setStaticConditionValue(node: IfNode, value: boolean | undefined): void;
|
|
41
44
|
export declare function getDunderAllInfo(node: ModuleNode): DunderAllInfo | undefined;
|
|
42
45
|
export declare function setDunderAllInfo(node: ModuleNode, names: DunderAllInfo | undefined): void;
|
|
43
46
|
export declare function isCodeUnreachable(node: ParseNode): boolean;
|
|
@@ -28,6 +28,8 @@ exports.getCodeFlowExpressions = getCodeFlowExpressions;
|
|
|
28
28
|
exports.setCodeFlowExpressions = setCodeFlowExpressions;
|
|
29
29
|
exports.getCodeFlowComplexity = getCodeFlowComplexity;
|
|
30
30
|
exports.setCodeFlowComplexity = setCodeFlowComplexity;
|
|
31
|
+
exports.getStaticConditionValue = getStaticConditionValue;
|
|
32
|
+
exports.setStaticConditionValue = setStaticConditionValue;
|
|
31
33
|
exports.getDunderAllInfo = getDunderAllInfo;
|
|
32
34
|
exports.setDunderAllInfo = setDunderAllInfo;
|
|
33
35
|
exports.isCodeUnreachable = isCodeUnreachable;
|
|
@@ -57,6 +59,9 @@ function cleanNodeAnalysisInfo(node) {
|
|
|
57
59
|
if (info?.codeFlowComplexity) {
|
|
58
60
|
info.codeFlowComplexity = undefined;
|
|
59
61
|
}
|
|
62
|
+
if (info?.staticConditionValue !== undefined) {
|
|
63
|
+
info.staticConditionValue = undefined;
|
|
64
|
+
}
|
|
60
65
|
if (info?.dunderAllInfo) {
|
|
61
66
|
info.dunderAllInfo = undefined;
|
|
62
67
|
}
|
|
@@ -128,6 +133,14 @@ function setCodeFlowComplexity(node, complexity) {
|
|
|
128
133
|
const info = getAnalyzerInfoForWrite(node);
|
|
129
134
|
info.codeFlowComplexity = complexity;
|
|
130
135
|
}
|
|
136
|
+
function getStaticConditionValue(node) {
|
|
137
|
+
const info = getAnalyzerInfo(node);
|
|
138
|
+
return info?.staticConditionValue;
|
|
139
|
+
}
|
|
140
|
+
function setStaticConditionValue(node, value) {
|
|
141
|
+
const info = getAnalyzerInfoForWrite(node);
|
|
142
|
+
info.staticConditionValue = value;
|
|
143
|
+
}
|
|
131
144
|
function getDunderAllInfo(node) {
|
|
132
145
|
const info = getAnalyzerInfo(node);
|
|
133
146
|
return info?.dunderAllInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzerNodeInfo.js","sourceRoot":"","sources":["../../../../../src/analyzer/analyzerNodeInfo.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;
|
|
1
|
+
{"version":3,"file":"analyzerNodeInfo.js","sourceRoot":"","sources":["../../../../../src/analyzer/analyzerNodeInfo.ts"],"names":[],"mappings":"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"}
|
package/dist/analyzer/binder.js
CHANGED
|
@@ -68,6 +68,63 @@ const scope_1 = require("./scope");
|
|
|
68
68
|
const StaticExpressions = __importStar(require("./staticExpressions"));
|
|
69
69
|
const symbol_1 = require("./symbol");
|
|
70
70
|
const symbolNameUtils_1 = require("./symbolNameUtils");
|
|
71
|
+
function isStaticClassAssignmentTarget(target) {
|
|
72
|
+
switch (target.nodeType) {
|
|
73
|
+
case 38 /* ParseNodeType.Name */:
|
|
74
|
+
return true;
|
|
75
|
+
case 54 /* ParseNodeType.TypeAnnotation */:
|
|
76
|
+
return isStaticClassAssignmentTarget(target.d.valueExpr);
|
|
77
|
+
case 52 /* ParseNodeType.Tuple */:
|
|
78
|
+
case 34 /* ParseNodeType.List */:
|
|
79
|
+
return target.d.items.every((item) => isStaticClassAssignmentTarget(item));
|
|
80
|
+
case 56 /* ParseNodeType.Unpack */:
|
|
81
|
+
return isStaticClassAssignmentTarget(target.d.expr);
|
|
82
|
+
default:
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function getCalledBuiltInName(scope, expression, visitedSymbols = new Set()) {
|
|
87
|
+
if (expression.nodeType === 38 /* ParseNodeType.Name */) {
|
|
88
|
+
const symbolWithScope = scope.lookUpSymbolRecursive(expression.d.value);
|
|
89
|
+
if (!symbolWithScope || visitedSymbols.has(symbolWithScope.symbol)) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
visitedSymbols.add(symbolWithScope.symbol);
|
|
93
|
+
if (symbolWithScope.scope.type === 5 /* ScopeType.Builtin */) {
|
|
94
|
+
return expression.d.value;
|
|
95
|
+
}
|
|
96
|
+
const declarations = symbolWithScope.symbol.getDeclarations();
|
|
97
|
+
const declaration = declarations[declarations.length - 1];
|
|
98
|
+
if (declaration?.type === 1 /* DeclarationType.Variable */ &&
|
|
99
|
+
(declaration.inferredTypeSource?.nodeType === 38 /* ParseNodeType.Name */ ||
|
|
100
|
+
declaration.inferredTypeSource?.nodeType === 35 /* ParseNodeType.MemberAccess */)) {
|
|
101
|
+
return getCalledBuiltInName(scope, declaration.inferredTypeSource, visitedSymbols);
|
|
102
|
+
}
|
|
103
|
+
if (declaration?.type === 8 /* DeclarationType.Alias */ &&
|
|
104
|
+
declaration.moduleName === 'builtins' &&
|
|
105
|
+
declaration.symbolName) {
|
|
106
|
+
return declaration.symbolName;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (expression.nodeType === 35 /* ParseNodeType.MemberAccess */ &&
|
|
110
|
+
expression.d.leftExpr.nodeType === 38 /* ParseNodeType.Name */) {
|
|
111
|
+
const symbolWithScope = scope.lookUpSymbolRecursive(expression.d.leftExpr.d.value);
|
|
112
|
+
const declarations = symbolWithScope?.symbol.getDeclarations() ?? [];
|
|
113
|
+
const declaration = declarations[declarations.length - 1];
|
|
114
|
+
if (declaration?.type === 8 /* DeclarationType.Alias */ &&
|
|
115
|
+
declaration.moduleName === 'builtins' &&
|
|
116
|
+
!declaration.symbolName) {
|
|
117
|
+
return expression.d.member.d.value;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
function doesCallExposeClassNamespace(scope, node) {
|
|
123
|
+
const builtInName = getCalledBuiltInName(scope, node.d.leftExpr);
|
|
124
|
+
return (builtInName === 'exec' ||
|
|
125
|
+
(builtInName === 'eval' && node.d.args.length === 1) ||
|
|
126
|
+
((builtInName === 'locals' || builtInName === 'vars') && node.d.args.length === 0));
|
|
127
|
+
}
|
|
71
128
|
// For each flow node within an execution context, we'll add a small
|
|
72
129
|
// amount to the complexity factor. Without this, the complexity
|
|
73
130
|
// calculation fails to take into account large numbers of non-cyclical
|
|
@@ -480,6 +537,9 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
480
537
|
return false;
|
|
481
538
|
}
|
|
482
539
|
visitCall(node) {
|
|
540
|
+
if (this._currentScope.type === 3 /* ScopeType.Class */ && doesCallExposeClassNamespace(this._currentScope, node)) {
|
|
541
|
+
this._currentScope.hasPotentiallyDynamicSymbolTable = true;
|
|
542
|
+
}
|
|
483
543
|
this._disableTrueFalseTargets(() => {
|
|
484
544
|
this.walk(node.d.leftExpr);
|
|
485
545
|
const sortedArgs = ParseTreeUtils.getArgsByRuntimeOrder(node);
|
|
@@ -766,9 +826,23 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
766
826
|
}
|
|
767
827
|
});
|
|
768
828
|
}
|
|
829
|
+
else if (expr.nodeType === 18 /* ParseNodeType.Dictionary */) {
|
|
830
|
+
expr.d.items.forEach((dictionaryEntryNode) => {
|
|
831
|
+
if (dictionaryEntryNode.nodeType === 20 /* ParseNodeType.DictionaryKeyEntry */ &&
|
|
832
|
+
dictionaryEntryNode.d.keyExpr.nodeType === 48 /* ParseNodeType.StringList */ &&
|
|
833
|
+
dictionaryEntryNode.d.keyExpr.d.strings.length === 1 &&
|
|
834
|
+
dictionaryEntryNode.d.keyExpr.d.strings[0].nodeType === 49 /* ParseNodeType.String */) {
|
|
835
|
+
this._dunderSlotsEntries.push(dictionaryEntryNode.d.keyExpr);
|
|
836
|
+
}
|
|
837
|
+
else {
|
|
838
|
+
isExpressionUnderstood = false;
|
|
839
|
+
}
|
|
840
|
+
});
|
|
841
|
+
}
|
|
769
842
|
else {
|
|
770
843
|
isExpressionUnderstood = false;
|
|
771
844
|
}
|
|
845
|
+
this._currentScope.setHasNonEmptySlots(this._dunderSlotsEntries.some((entry) => entry.d.strings[0].d.value !== '__dict__'));
|
|
772
846
|
if (!isExpressionUnderstood) {
|
|
773
847
|
this._dunderSlotsEntries = undefined;
|
|
774
848
|
}
|
|
@@ -1056,6 +1130,7 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
1056
1130
|
// Determine if the test condition is always true or always false. If so,
|
|
1057
1131
|
// we can treat either the then or the else clause as unconditional.
|
|
1058
1132
|
const constExprValue = StaticExpressions.evaluateStaticBoolLikeExpression(node.d.testExpr, this._fileInfo.executionEnvironment, this._fileInfo.definedConstants, this._typingImportAliases, this._sysImportAliases);
|
|
1133
|
+
AnalyzerNodeInfo.setStaticConditionValue(node, constExprValue);
|
|
1059
1134
|
this._bindConditional(node.d.testExpr, thenLabel, elseLabel);
|
|
1060
1135
|
// Handle the if clause.
|
|
1061
1136
|
this._currentFlowNode =
|
|
@@ -1413,7 +1488,7 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
1413
1488
|
}
|
|
1414
1489
|
visitImportFrom(node) {
|
|
1415
1490
|
const typingSymbolsOfInterest = ['Final', 'ClassVar', 'Annotated'];
|
|
1416
|
-
const dataclassesSymbolsOfInterest = ['InitVar'];
|
|
1491
|
+
const dataclassesSymbolsOfInterest = ['InitVar', 'KW_ONLY'];
|
|
1417
1492
|
const importInfo = AnalyzerNodeInfo.getImportInfo(node.d.module);
|
|
1418
1493
|
AnalyzerNodeInfo.setFlowNode(node, this._currentFlowNode);
|
|
1419
1494
|
let resolvedPath = uri_1.Uri.empty();
|
|
@@ -2892,6 +2967,9 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
2892
2967
|
return undefined;
|
|
2893
2968
|
}
|
|
2894
2969
|
_bindPossibleTupleNamedTarget(target, addedSymbols) {
|
|
2970
|
+
if (this._currentScope.type === 3 /* ScopeType.Class */ && !isStaticClassAssignmentTarget(target)) {
|
|
2971
|
+
this._currentScope.hasPotentiallyDynamicSymbolTable = true;
|
|
2972
|
+
}
|
|
2895
2973
|
switch (target.nodeType) {
|
|
2896
2974
|
case 38 /* ParseNodeType.Name */: {
|
|
2897
2975
|
this._bindNameToScope(this._currentScope, target, addedSymbols);
|
|
@@ -3182,6 +3260,15 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
3182
3260
|
}
|
|
3183
3261
|
}
|
|
3184
3262
|
}
|
|
3263
|
+
if (this._isDataclassesAnnotation(typeAnnotation, 'KW_ONLY')) {
|
|
3264
|
+
symbolWithScope.symbol.setIsDataClassKeywordOnly();
|
|
3265
|
+
}
|
|
3266
|
+
else if (typeAnnotation.nodeType === 27 /* ParseNodeType.Index */ &&
|
|
3267
|
+
this._isTypingAnnotation(typeAnnotation.d.leftExpr, 'Annotated') &&
|
|
3268
|
+
typeAnnotation.d.items.length > 0 &&
|
|
3269
|
+
this._isDataclassesAnnotation(typeAnnotation.d.items[0].d.valueExpr, 'KW_ONLY')) {
|
|
3270
|
+
symbolWithScope.symbol.setIsDataClassKeywordOnly();
|
|
3271
|
+
}
|
|
3185
3272
|
}
|
|
3186
3273
|
declarationHandled = true;
|
|
3187
3274
|
break;
|