@zzzen/pyright-internal 1.2.0-dev.20260222 → 1.2.0-dev.20260422
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/backgroundAnalysisProgram.d.ts +1 -1
- package/dist/analyzer/backgroundAnalysisProgram.js +9 -6
- package/dist/analyzer/backgroundAnalysisProgram.js.map +1 -1
- package/dist/analyzer/binder.d.ts +10 -1
- package/dist/analyzer/binder.js +258 -41
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/cellChainIndex.d.ts +34 -0
- package/dist/analyzer/cellChainIndex.js +126 -0
- package/dist/analyzer/cellChainIndex.js.map +1 -0
- package/dist/analyzer/checker.js +0 -1
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +16 -1
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/constructors.js +9 -2
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +3 -21
- package/dist/analyzer/importResolver.js +42 -316
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importResolverFileSystem.d.ts +3 -0
- package/dist/analyzer/importResolverFileSystem.js +160 -0
- package/dist/analyzer/importResolverFileSystem.js.map +1 -0
- package/dist/analyzer/importResolverTypes.d.ts +24 -0
- package/dist/analyzer/importResolverTypes.js +8 -0
- package/dist/analyzer/importResolverTypes.js.map +1 -0
- package/dist/analyzer/importStatementUtils.js +9 -0
- package/dist/analyzer/importStatementUtils.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +1 -0
- package/dist/analyzer/parseTreeUtils.js +24 -7
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/patternMatching.js +14 -2
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/program.d.ts +5 -3
- package/dist/analyzer/program.js +40 -51
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/pythonPathUtils.d.ts +1 -1
- package/dist/analyzer/pythonPathUtils.js +3 -1
- package/dist/analyzer/pythonPathUtils.js.map +1 -1
- package/dist/analyzer/scope.d.ts +10 -1
- package/dist/analyzer/scope.js +14 -1
- package/dist/analyzer/scope.js.map +1 -1
- package/dist/analyzer/service.d.ts +11 -6
- package/dist/analyzer/service.js +82 -83
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceEnumerator.d.ts +3 -0
- package/dist/analyzer/sourceEnumerator.js +27 -1
- package/dist/analyzer/sourceEnumerator.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +2 -1
- package/dist/analyzer/sourceFile.js +2 -2
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/sourceFileInfo.d.ts +4 -0
- package/dist/analyzer/sourceFileInfo.js +9 -0
- package/dist/analyzer/sourceFileInfo.js.map +1 -1
- package/dist/analyzer/sourceMapper.d.ts +1 -0
- package/dist/analyzer/sourceMapper.js +44 -0
- package/dist/analyzer/sourceMapper.js.map +1 -1
- package/dist/analyzer/tuples.js +3 -1
- package/dist/analyzer/tuples.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +102 -51
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -0
- package/dist/analyzer/typeEvaluatorTypes.js +4 -0
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.js +28 -6
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typeStubWriter.d.ts +15 -50
- package/dist/analyzer/typeStubWriter.js +91 -9
- package/dist/analyzer/typeStubWriter.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +1 -0
- package/dist/analyzer/typeUtils.js +27 -3
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typeshedInfoProvider.d.ts +2 -0
- package/dist/analyzer/typeshedInfoProvider.js +232 -0
- package/dist/analyzer/typeshedInfoProvider.js.map +1 -0
- package/dist/backgroundAnalysisBase.d.ts +3 -3
- package/dist/backgroundAnalysisBase.js +12 -9
- package/dist/backgroundAnalysisBase.js.map +1 -1
- package/dist/commands/createTypeStub.d.ts +16 -8
- package/dist/commands/createTypeStub.js +58 -36
- package/dist/commands/createTypeStub.js.map +1 -1
- package/dist/common/cancellationUtils.d.ts +7 -0
- package/dist/common/cancellationUtils.js +34 -0
- package/dist/common/cancellationUtils.js.map +1 -1
- package/dist/common/collectionUtils.d.ts +3 -3
- package/dist/common/collectionUtils.js.map +1 -1
- package/dist/common/core.d.ts +1 -1
- package/dist/common/core.js.map +1 -1
- package/dist/common/crypto.js +11 -0
- package/dist/common/crypto.js.map +1 -1
- package/dist/common/extensibility.d.ts +7 -0
- package/dist/common/extensibility.js.map +1 -1
- package/dist/common/fullAccessHost.js +4 -2
- package/dist/common/fullAccessHost.js.map +1 -1
- package/dist/common/pathUtils.d.ts +4 -1
- package/dist/common/pathUtils.js.map +1 -1
- package/dist/common/realFileSystem.js +42 -3
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/common/serviceKeys.d.ts +3 -0
- package/dist/common/serviceKeys.js +2 -0
- package/dist/common/serviceKeys.js.map +1 -1
- package/dist/common/serviceProviderExtensions.js.map +1 -1
- package/dist/common/uri/uriUtils.d.ts +4 -0
- package/dist/common/uri/uriUtils.js +19 -3
- package/dist/common/uri/uriUtils.js.map +1 -1
- package/dist/common/workspaceEditUtils.js +0 -2
- package/dist/common/workspaceEditUtils.js.map +1 -1
- package/dist/languageServerBase.d.ts +1 -0
- package/dist/languageServerBase.js +6 -0
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/completionProvider.d.ts +6 -0
- package/dist/languageService/completionProvider.js +252 -75
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/definitionProvider.js +1 -1
- package/dist/languageService/definitionProvider.js.map +1 -1
- package/dist/languageService/documentSymbolCollector.js +34 -4
- package/dist/languageService/documentSymbolCollector.js.map +1 -1
- package/dist/languageService/dynamicFeature.d.ts +3 -0
- package/dist/languageService/dynamicFeature.js +5 -0
- package/dist/languageService/dynamicFeature.js.map +1 -1
- package/dist/languageService/hoverProvider.d.ts +2 -1
- package/dist/languageService/hoverProvider.js +13 -5
- package/dist/languageService/hoverProvider.js.map +1 -1
- package/dist/languageService/pullDiagnosticsDynamicFeature.d.ts +1 -0
- package/dist/languageService/pullDiagnosticsDynamicFeature.js +4 -0
- package/dist/languageService/pullDiagnosticsDynamicFeature.js.map +1 -1
- package/dist/languageService/referencesProvider.js +5 -4
- package/dist/languageService/referencesProvider.js.map +1 -1
- package/dist/languageService/signatureHelpProvider.d.ts +1 -0
- package/dist/languageService/signatureHelpProvider.js +76 -2
- package/dist/languageService/signatureHelpProvider.js.map +1 -1
- package/dist/languageService/symbolIndexer.d.ts +1 -0
- package/dist/languageService/symbolIndexer.js.map +1 -1
- package/dist/languageService/tooltipUtils.d.ts +11 -4
- package/dist/languageService/tooltipUtils.js +195 -7
- package/dist/languageService/tooltipUtils.js.map +1 -1
- package/dist/parser/tokenizer.js +6 -2
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/partialStubService.d.ts +11 -0
- package/dist/partialStubService.js +23 -1
- package/dist/partialStubService.js.map +1 -1
- package/dist/pyright.js +13 -2
- package/dist/pyright.js.map +1 -1
- package/dist/tests/chainedSourceFiles.test.js +138 -0
- package/dist/tests/chainedSourceFiles.test.js.map +1 -1
- package/dist/tests/checker.test.js +12 -0
- package/dist/tests/checker.test.js.map +1 -1
- package/dist/tests/completions.test.js +328 -0
- package/dist/tests/completions.test.js.map +1 -1
- package/dist/tests/config.test.js +54 -0
- package/dist/tests/config.test.js.map +1 -1
- package/dist/tests/filesystem.test.js +44 -0
- package/dist/tests/filesystem.test.js.map +1 -1
- package/dist/tests/fourSlashRunner.test.js +1 -1
- package/dist/tests/fourSlashRunner.test.js.map +1 -1
- package/dist/tests/fourslash/findDefinitions.definitionFilter.preferSource.fourslash.js +25 -1
- package/dist/tests/fourslash/findDefinitions.definitionFilter.preferSource.fourslash.js.map +1 -1
- package/dist/tests/fourslash/import.multipart3.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/import.multipart3.fourslash.js +46 -0
- package/dist/tests/fourslash/import.multipart3.fourslash.js.map +1 -0
- package/dist/tests/fourslash/import.pytyped.unsupportedDunderAll.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/import.pytyped.unsupportedDunderAll.fourslash.js +33 -0
- package/dist/tests/fourslash/import.pytyped.unsupportedDunderAll.fourslash.js.map +1 -0
- package/dist/tests/harness/fourslash/runner.d.ts +4 -4
- package/dist/tests/harness/fourslash/runner.js +5 -5
- package/dist/tests/harness/fourslash/runner.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.d.ts +20 -5
- package/dist/tests/harness/fourslash/testState.js +11 -26
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/harness/fourslash/testStateUtils.js +2 -0
- package/dist/tests/harness/fourslash/testStateUtils.js.map +1 -1
- package/dist/tests/harness/testAccessHost.d.ts +3 -1
- package/dist/tests/harness/testAccessHost.js +6 -2
- package/dist/tests/harness/testAccessHost.js.map +1 -1
- package/dist/tests/harness/testHost.js +20 -18
- package/dist/tests/harness/testHost.js.map +1 -1
- package/dist/tests/harness/vfs/factory.js +4 -1
- package/dist/tests/harness/vfs/factory.js.map +1 -1
- package/dist/tests/harness/vfs/filesystem.d.ts +8 -1
- package/dist/tests/harness/vfs/filesystem.js +84 -30
- package/dist/tests/harness/vfs/filesystem.js.map +1 -1
- package/dist/tests/hoverProvider.test.js +290 -0
- package/dist/tests/hoverProvider.test.js.map +1 -1
- package/dist/tests/importResolverSupport.test.d.ts +1 -0
- package/dist/tests/importResolverSupport.test.js +319 -0
- package/dist/tests/importResolverSupport.test.js.map +1 -0
- package/dist/tests/importStatementUtils.test.js +66 -0
- package/dist/tests/importStatementUtils.test.js.map +1 -1
- package/dist/tests/lsp/{webpack.testserver.config.d.ts → rspack.testserver.config.d.ts} +1 -1
- package/dist/tests/lsp/{webpack.testserver.config.js → rspack.testserver.config.js} +4 -11
- package/dist/tests/lsp/rspack.testserver.config.js.map +1 -0
- package/dist/tests/realTempFile.test.d.ts +1 -0
- package/dist/tests/realTempFile.test.js +144 -0
- package/dist/tests/realTempFile.test.js.map +1 -0
- package/dist/tests/service.test.js +182 -3
- package/dist/tests/service.test.js.map +1 -1
- package/dist/tests/signatureHelp.test.js +391 -6
- package/dist/tests/signatureHelp.test.js.map +1 -1
- package/dist/tests/testState.test.js +19 -0
- package/dist/tests/testState.test.js.map +1 -1
- package/dist/tests/tokenizer.test.js +42 -0
- package/dist/tests/tokenizer.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +4 -0
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +12 -0
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +8 -1
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator6.test.js +7 -0
- package/dist/tests/typeEvaluator6.test.js.map +1 -1
- package/dist/tests/typeEvaluator8.test.js +13 -1
- package/dist/tests/typeEvaluator8.test.js.map +1 -1
- package/dist/tests/uri.test.js +29 -0
- package/dist/tests/uri.test.js.map +1 -1
- package/dist/tests/wildcardImportPackageMerge.test.d.ts +1 -0
- package/dist/tests/wildcardImportPackageMerge.test.js +97 -0
- package/dist/tests/wildcardImportPackageMerge.test.js.map +1 -0
- package/dist/tests/workspaceEditUtils.test.js +0 -1
- package/dist/tests/workspaceEditUtils.test.js.map +1 -1
- package/package.json +12 -11
- package/dist/tests/lsp/webpack.testserver.config.js.map +0 -1
|
@@ -43,7 +43,7 @@ export declare class BackgroundAnalysisProgram {
|
|
|
43
43
|
getChainedUri(fileUri: Uri): Uri | undefined;
|
|
44
44
|
updateChainedUri(fileUri: Uri, chainedUri: Uri | undefined): void;
|
|
45
45
|
updateOpenFileContents(uri: Uri, version: number | null, contents: string, options: OpenFileOptions): void;
|
|
46
|
-
setFileClosed(fileUri: Uri
|
|
46
|
+
setFileClosed(fileUri: Uri): void;
|
|
47
47
|
addInterimFile(fileUri: Uri): void;
|
|
48
48
|
markAllFilesDirty(evenIfContentsAreSame: boolean): void;
|
|
49
49
|
markFilesDirty(fileUris: Uri[], evenIfContentsAreSame: boolean): void;
|
|
@@ -12,6 +12,7 @@ exports.BackgroundAnalysisProgram = exports.InvalidatedReason = void 0;
|
|
|
12
12
|
require("../common/serviceProviderExtensions");
|
|
13
13
|
const analysis_1 = require("./analysis");
|
|
14
14
|
const program_1 = require("./program");
|
|
15
|
+
const typeStubWriter_1 = require("./typeStubWriter");
|
|
15
16
|
var InvalidatedReason;
|
|
16
17
|
(function (InvalidatedReason) {
|
|
17
18
|
InvalidatedReason[InvalidatedReason["Reanalyzed"] = 0] = "Reanalyzed";
|
|
@@ -91,9 +92,9 @@ class BackgroundAnalysisProgram {
|
|
|
91
92
|
this._program.setFileOpened(uri, version, contents, options);
|
|
92
93
|
this.markFilesDirty([uri], /* evenIfContentsAreSame */ true);
|
|
93
94
|
}
|
|
94
|
-
setFileClosed(fileUri
|
|
95
|
-
this._backgroundAnalysis?.setFileClosed(fileUri
|
|
96
|
-
const diagnostics = this._program.setFileClosed(fileUri
|
|
95
|
+
setFileClosed(fileUri) {
|
|
96
|
+
this._backgroundAnalysis?.setFileClosed(fileUri);
|
|
97
|
+
const diagnostics = this._program.setFileClosed(fileUri);
|
|
97
98
|
this._reportDiagnosticsForRemovedFiles(diagnostics);
|
|
98
99
|
}
|
|
99
100
|
addInterimFile(fileUri) {
|
|
@@ -144,9 +145,11 @@ class BackgroundAnalysisProgram {
|
|
|
144
145
|
if (this._backgroundAnalysis) {
|
|
145
146
|
return this._backgroundAnalysis.writeTypeStub(targetImportUri, targetIsSingleFile, stubUri, token);
|
|
146
147
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
return new typeStubWriter_1.TypeStubWriter(this._program).writeTypeStub({
|
|
149
|
+
targetImportPath: targetImportUri,
|
|
150
|
+
targetIsSingleFile,
|
|
151
|
+
outputPath: stubUri,
|
|
152
|
+
}, token);
|
|
150
153
|
}
|
|
151
154
|
invalidateAndForceReanalysis(reason, refreshOptions) {
|
|
152
155
|
this._backgroundAnalysis?.invalidateAndForceReanalysis(reason);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backgroundAnalysisProgram.js","sourceRoot":"","sources":["../../../../../src/analyzer/backgroundAnalysisProgram.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AASH,+CAA6C;AAG7C,yCAAsE;AAEtE,uCAAsE;
|
|
1
|
+
{"version":3,"file":"backgroundAnalysisProgram.js","sourceRoot":"","sources":["../../../../../src/analyzer/backgroundAnalysisProgram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
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';
|
|
2
2
|
import { AnalyzerFileInfo } from './analyzerFileInfo';
|
|
3
3
|
import { ParseTreeWalker } from './parseTreeWalker';
|
|
4
|
+
import { CellChainIndexProvider } from './cellChainIndex';
|
|
4
5
|
import { Scope } from './scope';
|
|
5
6
|
export declare class Binder extends ParseTreeWalker {
|
|
6
7
|
private _moduleSymbolOnly;
|
|
8
|
+
private readonly _cellChainIndex?;
|
|
7
9
|
private readonly _fileInfo;
|
|
8
10
|
private _deferredBindingTasks;
|
|
9
11
|
private _currentScope;
|
|
@@ -35,7 +37,7 @@ export declare class Binder extends ParseTreeWalker {
|
|
|
35
37
|
private _potentialWildcardReexportSymbols;
|
|
36
38
|
private _potentialPrivateSymbols;
|
|
37
39
|
private _codeFlowComplexity;
|
|
38
|
-
constructor(fileInfo: AnalyzerFileInfo, _moduleSymbolOnly?: boolean);
|
|
40
|
+
constructor(fileInfo: AnalyzerFileInfo, _moduleSymbolOnly?: boolean, _cellChainIndex?: CellChainIndexProvider | undefined);
|
|
39
41
|
bindModule(node: ModuleNode): void;
|
|
40
42
|
visitModule(node: ModuleNode): boolean;
|
|
41
43
|
visitSuite(node: SuiteNode): boolean;
|
|
@@ -80,6 +82,7 @@ export declare class Binder extends ParseTreeWalker {
|
|
|
80
82
|
visitPatternAs(node: PatternAsNode): boolean;
|
|
81
83
|
visitPatternCapture(node: PatternCaptureNode): boolean;
|
|
82
84
|
visitPatternMappingExpandEntry(node: PatternMappingExpandEntryNode): boolean;
|
|
85
|
+
private _isNonEmptyListOrTupleLiteral;
|
|
83
86
|
private _addTypingImportAliasesFromBuiltinsScope;
|
|
84
87
|
private _formatModuleName;
|
|
85
88
|
private _getNonClassParentScope;
|
|
@@ -121,6 +124,7 @@ export declare class Binder extends ParseTreeWalker {
|
|
|
121
124
|
private _addImplicitSymbolToCurrentScope;
|
|
122
125
|
private _addSymbolToCurrentScope;
|
|
123
126
|
private _createNewScope;
|
|
127
|
+
private _createCellChainModuleLevelLookup;
|
|
124
128
|
private _addInferredTypeAssignmentForVariable;
|
|
125
129
|
private _isInferenceAllowedInPyTyped;
|
|
126
130
|
private _addTypeDeclarationForVariable;
|
|
@@ -132,6 +136,11 @@ export declare class Binder extends ParseTreeWalker {
|
|
|
132
136
|
private _isAnnotationClassVar;
|
|
133
137
|
private _getMemberAccessInfo;
|
|
134
138
|
private _addImplicitImportsToLoaderActions;
|
|
139
|
+
private _addWildcardImportedModuleAlias;
|
|
140
|
+
private _getMultipartModuleAliasDeclaration;
|
|
141
|
+
private _cloneMultipartModuleAliasDeclaration;
|
|
142
|
+
private _cloneModuleLoaderActions;
|
|
143
|
+
private _mergeModuleLoaderActions;
|
|
135
144
|
private _handleTypingStubAssignmentOrAnnotation;
|
|
136
145
|
private _deferBinding;
|
|
137
146
|
private _bindDeferred;
|
package/dist/analyzer/binder.js
CHANGED
|
@@ -64,9 +64,10 @@ const symbolNameUtils_1 = require("./symbolNameUtils");
|
|
|
64
64
|
// flow nodes. This number is somewhat arbitrary and is tuned empirically.
|
|
65
65
|
const flowNodeComplexityContribution = 0.025;
|
|
66
66
|
class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
67
|
-
constructor(fileInfo, _moduleSymbolOnly = false) {
|
|
67
|
+
constructor(fileInfo, _moduleSymbolOnly = false, _cellChainIndex) {
|
|
68
68
|
super();
|
|
69
69
|
this._moduleSymbolOnly = _moduleSymbolOnly;
|
|
70
|
+
this._cellChainIndex = _cellChainIndex;
|
|
70
71
|
// A queue of deferred analysis operations.
|
|
71
72
|
this._deferredBindingTasks = [];
|
|
72
73
|
// Flow nodes used within try blocks.
|
|
@@ -113,9 +114,10 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
113
114
|
// We'll assume that if there is no builtins scope provided, we must be
|
|
114
115
|
// binding the builtins module itself.
|
|
115
116
|
const isBuiltInModule = this._fileInfo.builtinsScope === undefined;
|
|
117
|
+
const chainedModuleLevelScopeLookup = this._createCellChainModuleLevelLookup();
|
|
116
118
|
this._addTypingImportAliasesFromBuiltinsScope();
|
|
117
119
|
this._createNewScope(isBuiltInModule ? 5 /* ScopeType.Builtin */ : 4 /* ScopeType.Module */, this._fileInfo.builtinsScope,
|
|
118
|
-
/* proxyScope */ undefined, () => {
|
|
120
|
+
/* proxyScope */ undefined, chainedModuleLevelScopeLookup, () => {
|
|
119
121
|
AnalyzerNodeInfo.setScope(node, this._currentScope);
|
|
120
122
|
AnalyzerNodeInfo.setFlowNode(node, this._currentFlowNode);
|
|
121
123
|
// Bind implicit names.
|
|
@@ -141,10 +143,15 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
141
143
|
});
|
|
142
144
|
// Perform all analysis that was deferred during the first pass.
|
|
143
145
|
this._bindDeferred();
|
|
144
|
-
// Use the __all__ list to determine whether any potential private
|
|
145
|
-
//
|
|
146
|
+
// Use the __all__ list to determine whether any potential private symbols should be
|
|
147
|
+
// made externally hidden or private. When __all__ uses an unsupported form (e.g.,
|
|
148
|
+
// dynamic construction like __all__ = _components + [...]), we can't determine
|
|
149
|
+
// membership statically; fall back to name-convention heuristics so that
|
|
150
|
+
// underscore-prefixed names are still treated as private while normally-named
|
|
151
|
+
// symbols avoid false positives.
|
|
152
|
+
const shouldProcess = (name) => !this._usesUnsupportedDunderAllForm || (0, symbolNameUtils_1.isPrivateOrProtectedName)(name);
|
|
146
153
|
this._potentialHiddenSymbols.forEach((symbol, name) => {
|
|
147
|
-
if (!this._dunderAllNames?.some((sym) => sym === name)) {
|
|
154
|
+
if (shouldProcess(name) && !this._dunderAllNames?.some((sym) => sym === name)) {
|
|
148
155
|
if (this._fileInfo.isStubFile) {
|
|
149
156
|
symbol.setIsExternallyHidden();
|
|
150
157
|
}
|
|
@@ -156,13 +163,20 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
156
163
|
// Wildcard imports are considered a re-export form, but if this module defines
|
|
157
164
|
// __all__, that list determines the public interface and should restrict which
|
|
158
165
|
// wildcard-imported symbols are exposed.
|
|
159
|
-
this.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
166
|
+
if (this._dunderAllNames) {
|
|
167
|
+
const dunderAllNames = this._dunderAllNames;
|
|
168
|
+
this._potentialWildcardReexportSymbols.forEach((symbol, name) => {
|
|
169
|
+
if (shouldProcess(name) && !dunderAllNames.some((sym) => sym === name)) {
|
|
170
|
+
symbol.setPrivatePyTypedImport();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
// Single-underscore module-level names remain private even when __all__ uses an
|
|
175
|
+
// unsupported/computed form. Since every entry in _potentialPrivateSymbols already
|
|
176
|
+
// has an underscore prefix, shouldProcess always returns true here, preserving
|
|
177
|
+
// the behavior of upstream pyright test `Private3`.
|
|
164
178
|
this._potentialPrivateSymbols.forEach((symbol, name) => {
|
|
165
|
-
if (!this._dunderAllNames?.some((sym) => sym === name)) {
|
|
179
|
+
if (shouldProcess(name) && !this._dunderAllNames?.some((sym) => sym === name)) {
|
|
166
180
|
symbol.setIsPrivateMember();
|
|
167
181
|
}
|
|
168
182
|
});
|
|
@@ -262,7 +276,8 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
262
276
|
}
|
|
263
277
|
this.walkMultiple(node.d.arguments);
|
|
264
278
|
this._createNewScope(3 /* ScopeType.Class */, typeParamScope ?? this._getNonClassParentScope(),
|
|
265
|
-
/* proxyScope */ undefined,
|
|
279
|
+
/* proxyScope */ undefined,
|
|
280
|
+
/* chainedModuleLevelScopeLookup */ undefined, () => {
|
|
266
281
|
AnalyzerNodeInfo.setScope(node, this._currentScope);
|
|
267
282
|
this._addImplicitSymbolToCurrentScope('__doc__', node, 'str | None');
|
|
268
283
|
this._addImplicitSymbolToCurrentScope('__module__', node, 'str');
|
|
@@ -329,7 +344,8 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
329
344
|
// Don't walk the body of the function until we're done analyzing
|
|
330
345
|
// the current scope.
|
|
331
346
|
this._createNewScope(2 /* ScopeType.Function */, typeParamScope ?? this._getNonClassParentScope(),
|
|
332
|
-
/* proxyScope */ undefined,
|
|
347
|
+
/* proxyScope */ undefined,
|
|
348
|
+
/* chainedModuleLevelScopeLookup */ undefined, () => {
|
|
333
349
|
AnalyzerNodeInfo.setScope(node, this._currentScope);
|
|
334
350
|
const enclosingClass = ParseTreeUtils.getEnclosingClass(node);
|
|
335
351
|
if (enclosingClass) {
|
|
@@ -390,7 +406,9 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
390
406
|
this.walk(param.d.defaultValue);
|
|
391
407
|
}
|
|
392
408
|
});
|
|
393
|
-
this._createNewScope(2 /* ScopeType.Function */, this._getNonClassParentScope(),
|
|
409
|
+
this._createNewScope(2 /* ScopeType.Function */, this._getNonClassParentScope(),
|
|
410
|
+
/* proxyScope */ undefined,
|
|
411
|
+
/* chainedModuleLevelScopeLookup */ undefined, () => {
|
|
394
412
|
AnalyzerNodeInfo.setScope(node, this._currentScope);
|
|
395
413
|
this._deferBinding(() => {
|
|
396
414
|
// Create a start node for the lambda.
|
|
@@ -627,7 +645,11 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
627
645
|
// If we didn't create assignment target flow nodes above, do so now.
|
|
628
646
|
this._createAssignmentTargetFlowNodes(node.d.leftExpr, /* walkTargets */ true, /* unbound */ false);
|
|
629
647
|
// Is this an assignment to dunder all?
|
|
630
|
-
|
|
648
|
+
// Process __all__ for both Module and Builtin scope types. The Builtin scope type
|
|
649
|
+
// is used when binding without a builtins scope (e.g., in indexing scenarios where
|
|
650
|
+
// typeshed may not be available). We still want to extract __all__ information
|
|
651
|
+
// to properly filter wildcard imports.
|
|
652
|
+
if (this._currentScope.type === 4 /* ScopeType.Module */ || this._currentScope.type === 5 /* ScopeType.Builtin */) {
|
|
631
653
|
if ((node.d.leftExpr.nodeType === 38 /* ParseNodeType.Name */ && node.d.leftExpr.d.value === '__all__') ||
|
|
632
654
|
(node.d.leftExpr.nodeType === 54 /* ParseNodeType.TypeAnnotation */ &&
|
|
633
655
|
node.d.leftExpr.d.valueExpr.nodeType === 38 /* ParseNodeType.Name */ &&
|
|
@@ -843,12 +865,19 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
843
865
|
const preForLabel = this._createLoopLabel();
|
|
844
866
|
const preElseLabel = this._createBranchLabel();
|
|
845
867
|
const postForLabel = this._createBranchLabel();
|
|
868
|
+
// Determine if this loop is guaranteed to execute at least once
|
|
869
|
+
const isGuaranteedToExecute = this._isNonEmptyListOrTupleLiteral(node.d.iterableExpr);
|
|
846
870
|
this._addAntecedent(preForLabel, this._currentFlowNode);
|
|
847
871
|
this._currentFlowNode = preForLabel;
|
|
848
|
-
|
|
872
|
+
// Only add zero-iteration path for potentially-empty iterables
|
|
873
|
+
if (!isGuaranteedToExecute) {
|
|
874
|
+
this._addAntecedent(preElseLabel, this._currentFlowNode);
|
|
875
|
+
}
|
|
849
876
|
const targetExpressions = this._trackCodeFlowExpressions(() => {
|
|
850
877
|
this._createAssignmentTargetFlowNodes(node.d.targetExpr, /* walkTargets */ true, /* unbound */ false);
|
|
851
878
|
});
|
|
879
|
+
// Record antecedent count before the loop body to detect continue back-edges.
|
|
880
|
+
const preBodyAntecedentCount = preForLabel.antecedents.length;
|
|
852
881
|
this._bindLoopStatement(preForLabel, postForLabel, () => {
|
|
853
882
|
this.walk(node.d.forSuite);
|
|
854
883
|
this._addAntecedent(preForLabel, this._currentFlowNode);
|
|
@@ -857,6 +886,39 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
857
886
|
this._currentScopeCodeFlowExpressions?.add(value);
|
|
858
887
|
});
|
|
859
888
|
});
|
|
889
|
+
// For guaranteed loops, add post-body exit path to preElseLabel.
|
|
890
|
+
// When _currentFlowNode is reachable (normal completion or conditional break),
|
|
891
|
+
// use it directly — it carries the post-body type state.
|
|
892
|
+
// When _currentFlowNode is unreachable (all paths end with break/continue/return/raise),
|
|
893
|
+
// we must distinguish the cause:
|
|
894
|
+
// - All break: preElseLabel gets nothing. Python's else doesn't run after break,
|
|
895
|
+
// and break already sent the assigned-state to postForLabel.
|
|
896
|
+
// - All continue: preForLabel accumulated continue back-edges. Use it as an
|
|
897
|
+
// approximation for the loop-completion state feeding into else.
|
|
898
|
+
// - All return/raise: preElseLabel gets nothing. Post-loop is unreachable.
|
|
899
|
+
// - Mix with continue: if any continues occurred, use preForLabel for else path.
|
|
900
|
+
if (isGuaranteedToExecute) {
|
|
901
|
+
if (this._currentFlowNode.flags &
|
|
902
|
+
(codeFlowTypes_1.FlowFlags.UnreachableStructural | codeFlowTypes_1.FlowFlags.UnreachableStaticCondition)) {
|
|
903
|
+
// Check if any continue statements added back-edges to preForLabel.
|
|
904
|
+
const hasContinueBackEdges = preForLabel.antecedents.length > preBodyAntecedentCount;
|
|
905
|
+
if (hasContinueBackEdges) {
|
|
906
|
+
// Some paths continued — use preForLabel (with accumulated continue state)
|
|
907
|
+
// as the else-clause antecedent.
|
|
908
|
+
const savedFlowNode = this._currentFlowNode;
|
|
909
|
+
this._currentFlowNode = preForLabel;
|
|
910
|
+
this._addAntecedent(preElseLabel, preForLabel);
|
|
911
|
+
this._currentFlowNode = savedFlowNode;
|
|
912
|
+
}
|
|
913
|
+
// Otherwise (all break / all return / all raise): preElseLabel gets no
|
|
914
|
+
// antecedent. For break, the flow already reached postForLabel directly.
|
|
915
|
+
// For return/raise, post-loop code is unreachable.
|
|
916
|
+
}
|
|
917
|
+
else {
|
|
918
|
+
// Normal completion or conditional break — use current flow node.
|
|
919
|
+
this._addAntecedent(preElseLabel, this._currentFlowNode);
|
|
920
|
+
}
|
|
921
|
+
}
|
|
860
922
|
this._currentFlowNode = this._finishFlowLabel(preElseLabel);
|
|
861
923
|
if (node.d.elseSuite) {
|
|
862
924
|
this.walk(node.d.elseSuite);
|
|
@@ -1377,19 +1439,24 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
1377
1439
|
// Is the symbol in the target module's symbol table? If so,
|
|
1378
1440
|
// alias it.
|
|
1379
1441
|
if (importedSymbol) {
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1442
|
+
if (this._addWildcardImportedModuleAlias(node, localSymbol, importedSymbol)) {
|
|
1443
|
+
names.push(name);
|
|
1444
|
+
}
|
|
1445
|
+
else {
|
|
1446
|
+
const aliasDecl = {
|
|
1447
|
+
type: 8 /* DeclarationType.Alias */,
|
|
1448
|
+
node,
|
|
1449
|
+
uri: resolvedPath,
|
|
1450
|
+
loadSymbolsFromPath: true,
|
|
1451
|
+
range: (0, textRange_1.getEmptyRange)(), // Range is unknown for wildcard name import.
|
|
1452
|
+
usesLocalName: false,
|
|
1453
|
+
symbolName: name,
|
|
1454
|
+
moduleName: this._fileInfo.moduleName,
|
|
1455
|
+
isInExceptSuite: this._isInExceptSuite,
|
|
1456
|
+
};
|
|
1457
|
+
localSymbol.addDeclaration(aliasDecl);
|
|
1458
|
+
names.push(name);
|
|
1459
|
+
}
|
|
1393
1460
|
}
|
|
1394
1461
|
else {
|
|
1395
1462
|
// The symbol wasn't in the target module's symbol table. It's probably
|
|
@@ -1675,7 +1742,8 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
1675
1742
|
this.walk(node.d.forIfNodes[0].d.iterableExpr);
|
|
1676
1743
|
}
|
|
1677
1744
|
this._createNewScope(1 /* ScopeType.Comprehension */, this._getNonClassParentScope(),
|
|
1678
|
-
/* proxyScope */ undefined,
|
|
1745
|
+
/* proxyScope */ undefined,
|
|
1746
|
+
/* chainedModuleLevelScopeLookup */ undefined, () => {
|
|
1679
1747
|
AnalyzerNodeInfo.setScope(node, this._currentScope);
|
|
1680
1748
|
const falseLabel = this._createBranchLabel();
|
|
1681
1749
|
// We'll walk the forIfNodes list twice. The first time we'll
|
|
@@ -1845,6 +1913,19 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
1845
1913
|
}
|
|
1846
1914
|
return true;
|
|
1847
1915
|
}
|
|
1916
|
+
// Helper method to determine if an expression is a non-empty list or tuple literal.
|
|
1917
|
+
// This is a syntactic check, not a semantic one, so it's very fast.
|
|
1918
|
+
// Guards against starred expressions ([*empty_list]) and comprehensions ([v for v in []]).
|
|
1919
|
+
_isNonEmptyListOrTupleLiteral(expr) {
|
|
1920
|
+
if (expr.nodeType === 34 /* ParseNodeType.List */) {
|
|
1921
|
+
return (expr.d.items.length > 0 &&
|
|
1922
|
+
expr.d.items.every((item) => item.nodeType !== 56 /* ParseNodeType.Unpack */ && item.nodeType !== 11 /* ParseNodeType.Comprehension */));
|
|
1923
|
+
}
|
|
1924
|
+
if (expr.nodeType === 52 /* ParseNodeType.Tuple */) {
|
|
1925
|
+
return expr.d.items.length > 0 && expr.d.items.every((item) => item.nodeType !== 56 /* ParseNodeType.Unpack */);
|
|
1926
|
+
}
|
|
1927
|
+
return false;
|
|
1928
|
+
}
|
|
1848
1929
|
_addTypingImportAliasesFromBuiltinsScope() {
|
|
1849
1930
|
if (!this._fileInfo.builtinsScope) {
|
|
1850
1931
|
return;
|
|
@@ -2740,17 +2821,14 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
2740
2821
|
this._potentialPrivateSymbols.set(name, symbol);
|
|
2741
2822
|
}
|
|
2742
2823
|
}
|
|
2743
|
-
else if (this.
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
symbol.setIsExternallyHidden();
|
|
2747
|
-
}
|
|
2748
|
-
else {
|
|
2749
|
-
this._potentialPrivateSymbols.set(name, symbol);
|
|
2750
|
-
}
|
|
2824
|
+
else if (this._currentScope.type === 5 /* ScopeType.Builtin */) {
|
|
2825
|
+
// Don't include private-named symbols in the builtin scope.
|
|
2826
|
+
symbol.setIsExternallyHidden();
|
|
2751
2827
|
}
|
|
2752
2828
|
else {
|
|
2753
|
-
|
|
2829
|
+
// Defer the private/protected decision until __all__ is processed
|
|
2830
|
+
// so an explicit __all__ entry can promote the symbol to public.
|
|
2831
|
+
this._potentialPrivateSymbols.set(name, symbol);
|
|
2754
2832
|
}
|
|
2755
2833
|
}
|
|
2756
2834
|
}
|
|
@@ -2826,9 +2904,9 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
2826
2904
|
}
|
|
2827
2905
|
return symbol;
|
|
2828
2906
|
}
|
|
2829
|
-
_createNewScope(scopeType, parentScope, proxyScope, callback) {
|
|
2907
|
+
_createNewScope(scopeType, parentScope, proxyScope, chainedModuleLevelScopeLookup, callback) {
|
|
2830
2908
|
const prevScope = this._currentScope;
|
|
2831
|
-
const newScope = new scope_1.Scope(scopeType, parentScope, proxyScope);
|
|
2909
|
+
const newScope = new scope_1.Scope(scopeType, parentScope, proxyScope, chainedModuleLevelScopeLookup);
|
|
2832
2910
|
this._currentScope = newScope;
|
|
2833
2911
|
// If this scope is an execution scope, allocate a new reference map.
|
|
2834
2912
|
const isExecutionScope = scopeType === 5 /* ScopeType.Builtin */ || scopeType === 4 /* ScopeType.Module */ || scopeType === 2 /* ScopeType.Function */;
|
|
@@ -2841,6 +2919,51 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
2841
2919
|
this._currentScope = prevScope;
|
|
2842
2920
|
return newScope;
|
|
2843
2921
|
}
|
|
2922
|
+
// The chained module-level lookup is installed only on Module scope. This ensures it is
|
|
2923
|
+
// consulted exactly once during recursive lookup — after the module's own symbol table
|
|
2924
|
+
// but before ascending to builtins — when `useChainedModuleLevelScopes` is set by a nested
|
|
2925
|
+
// evaluation context (function body, lambda, class header, or comprehension inside a
|
|
2926
|
+
// function). Non-module scopes pass `undefined` so they never trigger a redundant search.
|
|
2927
|
+
_createCellChainModuleLevelLookup() {
|
|
2928
|
+
if (!this._cellChainIndex) {
|
|
2929
|
+
return undefined;
|
|
2930
|
+
}
|
|
2931
|
+
const cellChainIndex = this._cellChainIndex;
|
|
2932
|
+
const fileUri = this._fileInfo.fileUri;
|
|
2933
|
+
// The callback preserves the caller's beyond-execution-scope
|
|
2934
|
+
// state so that hits from later cells are correctly marked.
|
|
2935
|
+
return (name, context) => {
|
|
2936
|
+
for (const moduleNode of cellChainIndex.getLaterModuleNodes(fileUri) ?? []) {
|
|
2937
|
+
const moduleScope = AnalyzerNodeInfo.getScope(moduleNode);
|
|
2938
|
+
if (!moduleScope) {
|
|
2939
|
+
continue;
|
|
2940
|
+
}
|
|
2941
|
+
const symbol = moduleScope.lookUpSymbol(name);
|
|
2942
|
+
if (!symbol) {
|
|
2943
|
+
continue;
|
|
2944
|
+
}
|
|
2945
|
+
if (context?.isOutsideCallerModule && symbol.isExternallyHidden()) {
|
|
2946
|
+
continue;
|
|
2947
|
+
}
|
|
2948
|
+
// Skip symbols whose only declarations are attribute assignments
|
|
2949
|
+
// (e.g. `self.x = ...`); these are instance-level, not module globals.
|
|
2950
|
+
const decls = symbol.getDeclarations();
|
|
2951
|
+
if (decls.length > 0 &&
|
|
2952
|
+
!decls.some((decl) => decl.type !== 1 /* DeclarationType.Variable */ || !decl.isDefinedByMemberAccess)) {
|
|
2953
|
+
continue;
|
|
2954
|
+
}
|
|
2955
|
+
return {
|
|
2956
|
+
symbol,
|
|
2957
|
+
scope: moduleScope,
|
|
2958
|
+
isOutsideCallerModule: !!context?.isOutsideCallerModule,
|
|
2959
|
+
isBeyondExecutionScope: !!context?.isBeyondExecutionScope,
|
|
2960
|
+
usesNonlocalBinding: !!context?.usesNonlocalBinding,
|
|
2961
|
+
usesGlobalBinding: !!context?.usesGlobalBinding,
|
|
2962
|
+
};
|
|
2963
|
+
}
|
|
2964
|
+
return undefined;
|
|
2965
|
+
};
|
|
2966
|
+
}
|
|
2844
2967
|
_addInferredTypeAssignmentForVariable(target, source, isPossibleTypeAlias = false) {
|
|
2845
2968
|
switch (target.nodeType) {
|
|
2846
2969
|
case 38 /* ParseNodeType.Name */: {
|
|
@@ -3277,6 +3400,100 @@ class Binder extends parseTreeWalker_1.ParseTreeWalker {
|
|
|
3277
3400
|
}
|
|
3278
3401
|
});
|
|
3279
3402
|
}
|
|
3403
|
+
_addWildcardImportedModuleAlias(node, localSymbol, importedSymbol) {
|
|
3404
|
+
const importedModuleAliasDecl = this._getMultipartModuleAliasDeclaration(importedSymbol);
|
|
3405
|
+
if (!importedModuleAliasDecl) {
|
|
3406
|
+
return false;
|
|
3407
|
+
}
|
|
3408
|
+
const existingModuleAliasDecl = this._getMultipartModuleAliasDeclaration(localSymbol, importedModuleAliasDecl.moduleName, importedModuleAliasDecl.firstNamePart);
|
|
3409
|
+
if (existingModuleAliasDecl) {
|
|
3410
|
+
this._mergeModuleLoaderActions(existingModuleAliasDecl, importedModuleAliasDecl);
|
|
3411
|
+
}
|
|
3412
|
+
else {
|
|
3413
|
+
localSymbol.addDeclaration(this._cloneMultipartModuleAliasDeclaration(node, importedModuleAliasDecl));
|
|
3414
|
+
}
|
|
3415
|
+
return true;
|
|
3416
|
+
}
|
|
3417
|
+
// Finds the latest alias declaration that represents the root of a multipart import
|
|
3418
|
+
// chain, regardless of whether it originated from a direct import or wildcard merge.
|
|
3419
|
+
_getMultipartModuleAliasDeclaration(symbol, moduleName, firstNamePart) {
|
|
3420
|
+
const declarations = symbol.getDeclarations();
|
|
3421
|
+
for (let index = declarations.length - 1; index >= 0; index--) {
|
|
3422
|
+
const declaration = declarations[index];
|
|
3423
|
+
if (declaration.type !== 8 /* DeclarationType.Alias */ || declaration.symbolName || !declaration.firstNamePart) {
|
|
3424
|
+
continue;
|
|
3425
|
+
}
|
|
3426
|
+
if (moduleName !== undefined && declaration.moduleName !== moduleName) {
|
|
3427
|
+
continue;
|
|
3428
|
+
}
|
|
3429
|
+
if (firstNamePart !== undefined && declaration.firstNamePart !== firstNamePart) {
|
|
3430
|
+
continue;
|
|
3431
|
+
}
|
|
3432
|
+
return declaration;
|
|
3433
|
+
}
|
|
3434
|
+
return undefined;
|
|
3435
|
+
}
|
|
3436
|
+
_cloneMultipartModuleAliasDeclaration(node, declaration) {
|
|
3437
|
+
const clonedLoaderActions = this._cloneModuleLoaderActions(declaration);
|
|
3438
|
+
const clonedDeclaration = {
|
|
3439
|
+
type: 8 /* DeclarationType.Alias */,
|
|
3440
|
+
node,
|
|
3441
|
+
uri: clonedLoaderActions.uri,
|
|
3442
|
+
loadSymbolsFromPath: clonedLoaderActions.loadSymbolsFromPath,
|
|
3443
|
+
range: (0, textRange_1.getEmptyRange)(),
|
|
3444
|
+
usesLocalName: false,
|
|
3445
|
+
moduleName: declaration.moduleName,
|
|
3446
|
+
firstNamePart: declaration.firstNamePart,
|
|
3447
|
+
isInExceptSuite: this._isInExceptSuite,
|
|
3448
|
+
implicitImports: clonedLoaderActions.implicitImports,
|
|
3449
|
+
};
|
|
3450
|
+
if (clonedLoaderActions.isUnresolved) {
|
|
3451
|
+
clonedDeclaration.isUnresolved = true;
|
|
3452
|
+
}
|
|
3453
|
+
if (declaration.isNativeLib) {
|
|
3454
|
+
clonedDeclaration.isNativeLib = true;
|
|
3455
|
+
}
|
|
3456
|
+
return clonedDeclaration;
|
|
3457
|
+
}
|
|
3458
|
+
_cloneModuleLoaderActions(loaderActions) {
|
|
3459
|
+
const clonedLoaderActions = {
|
|
3460
|
+
uri: loaderActions.uri,
|
|
3461
|
+
loadSymbolsFromPath: loaderActions.loadSymbolsFromPath,
|
|
3462
|
+
};
|
|
3463
|
+
if (loaderActions.isUnresolved) {
|
|
3464
|
+
clonedLoaderActions.isUnresolved = true;
|
|
3465
|
+
}
|
|
3466
|
+
if (loaderActions.implicitImports) {
|
|
3467
|
+
clonedLoaderActions.implicitImports = new Map();
|
|
3468
|
+
loaderActions.implicitImports.forEach((implicitImport, name) => {
|
|
3469
|
+
clonedLoaderActions.implicitImports.set(name, this._cloneModuleLoaderActions(implicitImport));
|
|
3470
|
+
});
|
|
3471
|
+
}
|
|
3472
|
+
return clonedLoaderActions;
|
|
3473
|
+
}
|
|
3474
|
+
_mergeModuleLoaderActions(target, source) {
|
|
3475
|
+
if (!source.uri.isEmpty() && (target.uri.isEmpty() || !target.loadSymbolsFromPath)) {
|
|
3476
|
+
target.uri = source.uri;
|
|
3477
|
+
}
|
|
3478
|
+
if (source.loadSymbolsFromPath) {
|
|
3479
|
+
target.loadSymbolsFromPath = true;
|
|
3480
|
+
}
|
|
3481
|
+
if (!source.isUnresolved) {
|
|
3482
|
+
delete target.isUnresolved;
|
|
3483
|
+
}
|
|
3484
|
+
source.implicitImports?.forEach((implicitImport, name) => {
|
|
3485
|
+
let targetImplicitImport = target.implicitImports?.get(name);
|
|
3486
|
+
if (!targetImplicitImport) {
|
|
3487
|
+
if (!target.implicitImports) {
|
|
3488
|
+
target.implicitImports = new Map();
|
|
3489
|
+
}
|
|
3490
|
+
targetImplicitImport = this._cloneModuleLoaderActions(implicitImport);
|
|
3491
|
+
target.implicitImports.set(name, targetImplicitImport);
|
|
3492
|
+
return;
|
|
3493
|
+
}
|
|
3494
|
+
this._mergeModuleLoaderActions(targetImplicitImport, implicitImport);
|
|
3495
|
+
});
|
|
3496
|
+
}
|
|
3280
3497
|
// Handles some special-case assignment statements that are found
|
|
3281
3498
|
// within the typings.pyi file.
|
|
3282
3499
|
_handleTypingStubAssignmentOrAnnotation(node) {
|