@zzzen/pyright-internal 1.2.0-dev.20230507 → 1.2.0-dev.20230521
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/analyzerFileInfo.d.ts +1 -0
- package/dist/analyzer/analyzerFileInfo.js +4 -3
- package/dist/analyzer/analyzerFileInfo.js.map +1 -1
- package/dist/analyzer/backgroundAnalysisProgram.d.ts +17 -15
- package/dist/analyzer/backgroundAnalysisProgram.js +43 -53
- package/dist/analyzer/backgroundAnalysisProgram.js.map +1 -1
- package/dist/analyzer/binder.d.ts +0 -2
- package/dist/analyzer/binder.js +2 -20
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +1 -1
- package/dist/analyzer/checker.js +97 -29
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +14 -15
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/constructorTransform.js +5 -1
- package/dist/analyzer/constructorTransform.js.map +1 -1
- package/dist/analyzer/constructors.js +248 -189
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/dataClasses.js +5 -2
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/declarationUtils.js +1 -0
- package/dist/analyzer/declarationUtils.js.map +1 -1
- package/dist/analyzer/docStringConversion.js +1 -1
- package/dist/analyzer/docStringConversion.js.map +1 -1
- package/dist/analyzer/enums.js +8 -0
- package/dist/analyzer/enums.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +4 -4
- package/dist/analyzer/importResolver.js +93 -69
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importResult.d.ts +2 -2
- package/dist/analyzer/importStatementUtils.js +2 -2
- package/dist/analyzer/importStatementUtils.js.map +1 -1
- package/dist/analyzer/namedTuples.js +2 -5
- package/dist/analyzer/namedTuples.js.map +1 -1
- package/dist/analyzer/packageTypeVerifier.js +1 -1
- package/dist/analyzer/packageTypeVerifier.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.js +2 -34
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/parseTreeWalker.js +2 -2
- package/dist/analyzer/parseTreeWalker.js.map +1 -1
- package/dist/analyzer/patternMatching.js +1 -0
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/program.d.ts +18 -34
- package/dist/analyzer/program.js +57 -259
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/protocols.js +4 -2
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/service.d.ts +8 -16
- package/dist/analyzer/service.js +33 -47
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +1 -15
- package/dist/analyzer/sourceFile.js +14 -96
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/sourceMapper.js +1 -1
- package/dist/analyzer/sourceMapper.js.map +1 -1
- package/dist/analyzer/symbol.d.ts +3 -1
- package/dist/analyzer/symbol.js +5 -0
- package/dist/analyzer/symbol.js.map +1 -1
- package/dist/analyzer/typeDocStringUtils.js +1 -1
- package/dist/analyzer/typeDocStringUtils.js.map +1 -1
- package/dist/analyzer/typeEvaluator.d.ts +2 -2
- package/dist/analyzer/typeEvaluator.js +495 -196
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +7 -2
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.js +1 -0
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typePrinter.d.ts +3 -3
- package/dist/analyzer/typePrinter.js +255 -101
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +12 -7
- package/dist/analyzer/typeUtils.js +174 -49
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typeVarContext.d.ts +1 -2
- package/dist/analyzer/typeVarContext.js +16 -34
- package/dist/analyzer/typeVarContext.js.map +1 -1
- package/dist/analyzer/typedDicts.js +138 -41
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +10 -3
- package/dist/analyzer/types.js +32 -16
- package/dist/analyzer/types.js.map +1 -1
- package/dist/backgroundAnalysisBase.d.ts +25 -19
- package/dist/backgroundAnalysisBase.js +161 -115
- package/dist/backgroundAnalysisBase.js.map +1 -1
- package/dist/backgroundThreadBase.d.ts +1 -1
- package/dist/backgroundThreadBase.js +1 -1
- package/dist/backgroundThreadBase.js.map +1 -1
- package/dist/commands/dumpFileDebugInfoCommand.js +3 -4
- package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
- package/dist/common/configOptions.js +1 -1
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/extensibility.d.ts +26 -5
- package/dist/common/extensibility.js.map +1 -1
- package/dist/common/logTracker.d.ts +2 -0
- package/dist/common/logTracker.js +8 -1
- package/dist/common/logTracker.js.map +1 -1
- package/dist/common/lspUtils.d.ts +4 -1
- package/dist/common/lspUtils.js +38 -1
- package/dist/common/lspUtils.js.map +1 -1
- package/dist/common/pythonVersion.d.ts +2 -1
- package/dist/common/pythonVersion.js +1 -0
- package/dist/common/pythonVersion.js.map +1 -1
- package/dist/common/textRange.js +1 -1
- package/dist/common/textRange.js.map +1 -1
- package/dist/common/workspaceEditUtils.d.ts +3 -3
- package/dist/common/workspaceEditUtils.js +15 -17
- package/dist/common/workspaceEditUtils.js.map +1 -1
- package/dist/languageServerBase.d.ts +2 -5
- package/dist/languageServerBase.js +35 -62
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/autoImporter.d.ts +51 -52
- package/dist/languageService/autoImporter.js +126 -211
- package/dist/languageService/autoImporter.js.map +1 -1
- package/dist/languageService/callHierarchyProvider.js +8 -33
- package/dist/languageService/callHierarchyProvider.js.map +1 -1
- package/dist/languageService/completionProvider.d.ts +42 -81
- package/dist/languageService/completionProvider.js +608 -841
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/documentSymbolCollector.d.ts +2 -2
- package/dist/languageService/documentSymbolCollector.js +40 -30
- package/dist/languageService/documentSymbolCollector.js.map +1 -1
- package/dist/languageService/documentSymbolProvider.d.ts +13 -35
- package/dist/languageService/documentSymbolProvider.js +52 -264
- package/dist/languageService/documentSymbolProvider.js.map +1 -1
- package/dist/languageService/hoverProvider.d.ts +1 -3
- package/dist/languageService/hoverProvider.js +11 -97
- package/dist/languageService/hoverProvider.js.map +1 -1
- package/dist/languageService/referencesProvider.d.ts +3 -3
- package/dist/languageService/referencesProvider.js +6 -8
- package/dist/languageService/referencesProvider.js.map +1 -1
- package/dist/languageService/renameProvider.d.ts +0 -1
- package/dist/languageService/renameProvider.js +2 -6
- package/dist/languageService/renameProvider.js.map +1 -1
- package/dist/languageService/signatureHelpProvider.js +1 -1
- package/dist/languageService/signatureHelpProvider.js.map +1 -1
- package/dist/languageService/symbolIndexer.d.ts +23 -0
- package/dist/languageService/symbolIndexer.js +105 -0
- package/dist/languageService/symbolIndexer.js.map +1 -0
- package/dist/languageService/tooltipUtils.d.ts +8 -1
- package/dist/languageService/tooltipUtils.js +102 -1
- package/dist/languageService/tooltipUtils.js.map +1 -1
- package/dist/languageService/workspaceSymbolProvider.d.ts +17 -0
- package/dist/languageService/workspaceSymbolProvider.js +133 -0
- package/dist/languageService/workspaceSymbolProvider.js.map +1 -0
- package/dist/localization/localize.d.ts +38 -4
- package/dist/localization/localize.js +21 -4
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +23 -6
- package/dist/parser/parseNodes.d.ts +8 -8
- package/dist/parser/parseNodes.js +20 -10
- package/dist/parser/parseNodes.js.map +1 -1
- package/dist/parser/parser.d.ts +3 -3
- package/dist/parser/parser.js +136 -159
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/stringTokenUtils.d.ts +3 -13
- package/dist/parser/stringTokenUtils.js +8 -181
- package/dist/parser/stringTokenUtils.js.map +1 -1
- package/dist/parser/tokenizer.d.ts +3 -0
- package/dist/parser/tokenizer.js +211 -24
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/parser/tokenizerTypes.d.ts +31 -1
- package/dist/parser/tokenizerTypes.js +51 -1
- package/dist/parser/tokenizerTypes.js.map +1 -1
- package/dist/pyright.js +26 -4
- package/dist/pyright.js.map +1 -1
- package/dist/readonlyAugmentedFileSystem.js +1 -1
- package/dist/readonlyAugmentedFileSystem.js.map +1 -1
- package/dist/tests/chainedSourceFiles.test.js +15 -20
- package/dist/tests/chainedSourceFiles.test.js.map +1 -1
- package/dist/tests/checker.test.js +14 -0
- package/dist/tests/checker.test.js.map +1 -1
- package/dist/tests/completions.test.js +11 -236
- package/dist/tests/completions.test.js.map +1 -1
- package/dist/tests/docStringConversion.test.js +36 -2
- package/dist/tests/docStringConversion.test.js.map +1 -1
- package/dist/tests/fourslash/completions.override2.fourslash.js +1 -16
- package/dist/tests/fourslash/completions.override2.fourslash.js.map +1 -1
- package/dist/tests/harness/fourslash/testLanguageService.js +1 -1
- package/dist/tests/harness/fourslash/testLanguageService.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.d.ts +14 -8
- package/dist/tests/harness/fourslash/testState.js +27 -37
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/importResolver.test.js +84 -4
- package/dist/tests/importResolver.test.js.map +1 -1
- package/dist/tests/textRange.test.js +45 -0
- package/dist/tests/textRange.test.js.map +1 -0
- package/dist/tests/tokenizer.test.js +272 -58
- package/dist/tests/tokenizer.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +16 -0
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +14 -0
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +7 -2
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/tests/typeEvaluator5.test.js +29 -9
- package/dist/tests/typeEvaluator5.test.js.map +1 -1
- package/dist/tests/workspaceEditUtils.test.js +15 -10
- package/dist/tests/workspaceEditUtils.test.js.map +1 -1
- package/dist/workspaceFactory.js +3 -5
- package/dist/workspaceFactory.js.map +1 -1
- package/package.json +1 -1
- package/dist/languageService/importAdder.d.ts +0 -40
- package/dist/languageService/importAdder.js +0 -388
- package/dist/languageService/importAdder.js.map +0 -1
- package/dist/tests/fourslash/completions.commitChars.fourslash.d.ts +0 -1
- package/dist/tests/fourslash/completions.commitChars.fourslash.js +0 -81
- package/dist/tests/fourslash/completions.commitChars.fourslash.js.map +0 -1
- package/dist/tests/importAdder.test.js +0 -1325
- package/dist/tests/importAdder.test.js.map +0 -1
- /package/dist/tests/{importAdder.test.d.ts → textRange.test.d.ts} +0 -0
package/dist/analyzer/checker.js
CHANGED
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
35
35
|
exports.Checker = void 0;
|
36
36
|
const vscode_languageserver_1 = require("vscode-languageserver");
|
37
|
+
const collectionUtils_1 = require("../common/collectionUtils");
|
37
38
|
const debug_1 = require("../common/debug");
|
38
39
|
const diagnostic_1 = require("../common/diagnostic");
|
39
40
|
const diagnosticRules_1 = require("../common/diagnosticRules");
|
@@ -61,9 +62,9 @@ const SymbolNameUtils = __importStar(require("./symbolNameUtils"));
|
|
61
62
|
const symbolUtils_1 = require("./symbolUtils");
|
62
63
|
const typeEvaluator_1 = require("./typeEvaluator");
|
63
64
|
const typeGuards_1 = require("./typeGuards");
|
64
|
-
const types_1 = require("./types");
|
65
65
|
const typeUtils_1 = require("./typeUtils");
|
66
66
|
const typeVarContext_1 = require("./typeVarContext");
|
67
|
+
const types_1 = require("./types");
|
67
68
|
const deprecatedAliases = new Map([
|
68
69
|
['Tuple', { version: pythonVersion_1.PythonVersion.V3_9, fullName: 'builtins.tuple', replacementText: 'tuple' }],
|
69
70
|
['List', { version: pythonVersion_1.PythonVersion.V3_9, fullName: 'builtins.list', replacementText: 'list' }],
|
@@ -213,7 +214,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
213
214
|
this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.name);
|
214
215
|
this._validateConstructorConsistency(classTypeResult.classType);
|
215
216
|
this._validateFinalMemberOverrides(classTypeResult.classType);
|
216
|
-
this._validateInstanceVariableInitialization(classTypeResult.classType);
|
217
|
+
this._validateInstanceVariableInitialization(node, classTypeResult.classType);
|
217
218
|
this._validateFinalClassNotAbstract(classTypeResult.classType, node);
|
218
219
|
this._validateDataClassPostInit(classTypeResult.classType, node);
|
219
220
|
this._validateProtocolCompatibility(classTypeResult.classType, node);
|
@@ -829,28 +830,47 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
829
830
|
return true;
|
830
831
|
}
|
831
832
|
visitStringList(node) {
|
833
|
+
// If this is Python 3.11 or older, there are several restrictions
|
834
|
+
// associated with f-strings that we need to validate. Determine whether
|
835
|
+
// we're within an f-string (or multiple f-strings if nesting is used).
|
836
|
+
const fStringContainers = [];
|
837
|
+
if (this._fileInfo.executionEnvironment.pythonVersion < pythonVersion_1.PythonVersion.V3_12) {
|
838
|
+
let curNode = node;
|
839
|
+
while (curNode) {
|
840
|
+
if (curNode.nodeType === 27 /* FormatString */) {
|
841
|
+
fStringContainers.push(curNode);
|
842
|
+
}
|
843
|
+
curNode = curNode.parent;
|
844
|
+
}
|
845
|
+
}
|
832
846
|
for (const stringNode of node.strings) {
|
833
|
-
|
834
|
-
|
847
|
+
const stringTokens = stringNode.nodeType === 49 /* String */ ? [stringNode.token] : stringNode.middleTokens;
|
848
|
+
stringTokens.forEach((token) => {
|
849
|
+
const unescapedResult = (0, stringTokenUtils_1.getUnescapedString)(token);
|
850
|
+
let start = token.start;
|
851
|
+
if (token.type === 5 /* String */) {
|
852
|
+
start += token.prefixLength + token.quoteMarkLength;
|
853
|
+
}
|
835
854
|
unescapedResult.unescapeErrors.forEach((error) => {
|
836
|
-
const start = stringNode.token.start +
|
837
|
-
stringNode.token.prefixLength +
|
838
|
-
stringNode.token.quoteMarkLength +
|
839
|
-
error.offset;
|
840
|
-
const textRange = { start, length: error.length };
|
841
855
|
if (error.errorType === 0 /* InvalidEscapeSequence */) {
|
842
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo, this._fileInfo.diagnosticRuleSet.reportInvalidStringEscapeSequence, diagnosticRules_1.DiagnosticRule.reportInvalidStringEscapeSequence, localize_1.Localizer.Diagnostic.stringUnsupportedEscape(),
|
843
|
-
}
|
844
|
-
else if (error.errorType === 1 /* EscapeWithinFormatExpression */) {
|
845
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo, 'error', '', localize_1.Localizer.Diagnostic.formatStringEscape(), textRange);
|
846
|
-
}
|
847
|
-
else if (error.errorType === 2 /* SingleCloseBraceWithinFormatLiteral */) {
|
848
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo, 'error', '', localize_1.Localizer.Diagnostic.formatStringBrace(), textRange);
|
849
|
-
}
|
850
|
-
else if (error.errorType === 3 /* UnterminatedFormatExpression */) {
|
851
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo, 'error', '', localize_1.Localizer.Diagnostic.formatStringUnterminated(), textRange);
|
856
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, this._fileInfo.diagnosticRuleSet.reportInvalidStringEscapeSequence, diagnosticRules_1.DiagnosticRule.reportInvalidStringEscapeSequence, localize_1.Localizer.Diagnostic.stringUnsupportedEscape(), { start: start + error.offset, length: error.length });
|
852
857
|
}
|
853
858
|
});
|
859
|
+
// Prior to Python 3.12, it was not allowed to include a slash in an f-string.
|
860
|
+
if (fStringContainers.length > 0) {
|
861
|
+
const escapeOffset = token.escapedValue.indexOf('\\');
|
862
|
+
if (escapeOffset >= 0) {
|
863
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, 'error', '', localize_1.Localizer.Diagnostic.formatStringEscape(), { start, length: 1 });
|
864
|
+
}
|
865
|
+
}
|
866
|
+
});
|
867
|
+
// Prior to Python 3.12, it was not allowed to nest strings that
|
868
|
+
// used the same quote scheme within an f-string.
|
869
|
+
if (fStringContainers.length > 0) {
|
870
|
+
const quoteTypeMask = 1 /* SingleQuote */ | 2 /* DoubleQuote */ | 4 /* Triplicate */;
|
871
|
+
if (fStringContainers.some((fStringContainer) => (fStringContainer.token.flags & quoteTypeMask) === (stringNode.token.flags & quoteTypeMask))) {
|
872
|
+
this._evaluator.addError(localize_1.Localizer.Diagnostic.formatStringNestedQuote(), stringNode);
|
873
|
+
}
|
854
874
|
}
|
855
875
|
}
|
856
876
|
if (node.typeAnnotation) {
|
@@ -862,8 +882,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
862
882
|
return true;
|
863
883
|
}
|
864
884
|
visitFormatString(node) {
|
865
|
-
node.
|
866
|
-
this._evaluator.getType(
|
885
|
+
node.fieldExpressions.forEach((expr) => {
|
886
|
+
this._evaluator.getType(expr);
|
887
|
+
});
|
888
|
+
node.formatExpressions.forEach((expr) => {
|
889
|
+
this._evaluator.getType(expr);
|
867
890
|
});
|
868
891
|
return true;
|
869
892
|
}
|
@@ -2737,7 +2760,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2737
2760
|
const desc = {
|
2738
2761
|
nameParts: moduleName.split('.'),
|
2739
2762
|
leadingDots: 0,
|
2740
|
-
importedSymbols:
|
2763
|
+
importedSymbols: new Set(),
|
2741
2764
|
};
|
2742
2765
|
const stdlibPath = this._importResolver.getTypeshedStdLibPath(this._fileInfo.executionEnvironment);
|
2743
2766
|
if (stdlibPath &&
|
@@ -2783,7 +2806,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2783
2806
|
const module = {
|
2784
2807
|
nameParts,
|
2785
2808
|
leadingDots: 0,
|
2786
|
-
importedSymbols:
|
2809
|
+
importedSymbols: new Set(),
|
2787
2810
|
};
|
2788
2811
|
// Make sure the module is a potential stdlib one so we don't spend the time
|
2789
2812
|
// searching for the definition.
|
@@ -3297,7 +3320,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3297
3320
|
}
|
3298
3321
|
// Reports the case where an instance variable is not declared or initialized
|
3299
3322
|
// within the class body or constructor method.
|
3300
|
-
_validateInstanceVariableInitialization(classType) {
|
3323
|
+
_validateInstanceVariableInitialization(node, classType) {
|
3301
3324
|
// This check doesn't apply to stub files.
|
3302
3325
|
if (this._fileInfo.isStubFile) {
|
3303
3326
|
return;
|
@@ -3313,7 +3336,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3313
3336
|
(types_1.ClassType.supportsAbstractMethods(classType) && !types_1.ClassType.isFinal(classType))) {
|
3314
3337
|
return;
|
3315
3338
|
}
|
3339
|
+
// If the class is final, see if it has any abstract base classes that define
|
3340
|
+
// variables. We need to make sure these are initialized.
|
3341
|
+
const abstractSymbols = new Map();
|
3342
|
+
if (types_1.ClassType.isFinal(classType)) {
|
3343
|
+
(0, typeUtils_1.getProtocolSymbolsRecursive)(classType, abstractSymbols, 1024 /* SupportsAbstractMethods */);
|
3344
|
+
}
|
3316
3345
|
classType.details.fields.forEach((localSymbol, name) => {
|
3346
|
+
abstractSymbols.delete(name);
|
3317
3347
|
// This applies only to instance members.
|
3318
3348
|
if (!localSymbol.isInstanceMember()) {
|
3319
3349
|
return;
|
@@ -3365,6 +3395,31 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3365
3395
|
// Report the variable as uninitialized only on the first decl.
|
3366
3396
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUninitializedInstanceVariable, diagnosticRules_1.DiagnosticRule.reportUninitializedInstanceVariable, localize_1.Localizer.Diagnostic.uninitializedInstanceVariable().format({ name: name }), decls[0].node);
|
3367
3397
|
});
|
3398
|
+
// See if there are any variables from abstract base classes
|
3399
|
+
// that are not initialized.
|
3400
|
+
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
3401
|
+
abstractSymbols.forEach((member, name) => {
|
3402
|
+
const decls = member.symbol.getDeclarations();
|
3403
|
+
if (decls.length === 0 || !(0, types_1.isClass)(member.classType)) {
|
3404
|
+
return;
|
3405
|
+
}
|
3406
|
+
if (decls[0].type === 1 /* Variable */) {
|
3407
|
+
// If none of the declarations involve assignments, assume it's
|
3408
|
+
// not implemented in the protocol.
|
3409
|
+
if (!decls.some((decl) => decl.type === 1 /* Variable */ && !!decl.inferredTypeSource)) {
|
3410
|
+
// This is a variable declaration that is not implemented in the
|
3411
|
+
// protocol base class. Make sure it's implemented in the derived class.
|
3412
|
+
diagAddendum.addMessage(localize_1.Localizer.DiagnosticAddendum.uninitializedAbstractVariable().format({
|
3413
|
+
name,
|
3414
|
+
classType: member.classType.details.name,
|
3415
|
+
}));
|
3416
|
+
}
|
3417
|
+
}
|
3418
|
+
});
|
3419
|
+
if (!diagAddendum.isEmpty()) {
|
3420
|
+
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUninitializedInstanceVariable, diagnosticRules_1.DiagnosticRule.reportUninitializedInstanceVariable, localize_1.Localizer.Diagnostic.uninitializedAbstractVariables().format({ classType: classType.details.name }) +
|
3421
|
+
diagAddendum.getString(), node.name);
|
3422
|
+
}
|
3368
3423
|
}
|
3369
3424
|
// Validates that the type variables used in a generic protocol class have
|
3370
3425
|
// the proper variance (invariant, covariant, contravariant). See PEP 544
|
@@ -3780,14 +3835,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3780
3835
|
if (!firstOverride) {
|
3781
3836
|
// If this is a method decorated with @override, validate that there
|
3782
3837
|
// is a base class method of the same name.
|
3783
|
-
this._validateOverrideDecoratorNotPresent(typeOfSymbol);
|
3838
|
+
this._validateOverrideDecoratorNotPresent(symbol, typeOfSymbol);
|
3784
3839
|
}
|
3785
3840
|
else {
|
3786
|
-
this._validateOverrideDecoratorPresent(typeOfSymbol, firstOverride);
|
3841
|
+
this._validateOverrideDecoratorPresent(symbol, typeOfSymbol, firstOverride);
|
3787
3842
|
}
|
3788
3843
|
});
|
3789
3844
|
}
|
3790
|
-
_validateOverrideDecoratorPresent(overrideType, baseMember) {
|
3845
|
+
_validateOverrideDecoratorPresent(symbol, overrideType, baseMember) {
|
3791
3846
|
var _a;
|
3792
3847
|
// Skip this check if disabled.
|
3793
3848
|
if (this._fileInfo.diagnosticRuleSet.reportImplicitOverride === 'none') {
|
@@ -3816,6 +3871,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3816
3871
|
if (overrideFunction.details.name === '__init__' || overrideFunction.details.name === '__new__') {
|
3817
3872
|
return;
|
3818
3873
|
}
|
3874
|
+
// If the declaration for the override function is not the same as the
|
3875
|
+
// declaration for the symbol, the function was probably replaced by a decorator.
|
3876
|
+
if (!symbol.getDeclarations().some((decl) => decl === overrideFunction.details.declaration)) {
|
3877
|
+
return;
|
3878
|
+
}
|
3819
3879
|
const funcNode = overrideFunction.details.declaration.node;
|
3820
3880
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportImplicitOverride, diagnosticRules_1.DiagnosticRule.reportImplicitOverride, localize_1.Localizer.Diagnostic.overrideDecoratorMissing().format({
|
3821
3881
|
name: funcNode.name.value,
|
@@ -3825,7 +3885,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3825
3885
|
// Determines whether the type is a function or overloaded function with an @override
|
3826
3886
|
// decorator. In this case, an error is reported because no base class has declared
|
3827
3887
|
// a method of the same name.
|
3828
|
-
_validateOverrideDecoratorNotPresent(overrideType) {
|
3888
|
+
_validateOverrideDecoratorNotPresent(symbol, overrideType) {
|
3829
3889
|
var _a;
|
3830
3890
|
let overrideFunction;
|
3831
3891
|
if ((0, types_1.isFunction)(overrideType)) {
|
@@ -3846,6 +3906,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3846
3906
|
if (!(overrideFunction === null || overrideFunction === void 0 ? void 0 : overrideFunction.details.declaration) || !types_1.FunctionType.isOverridden(overrideFunction)) {
|
3847
3907
|
return;
|
3848
3908
|
}
|
3909
|
+
// If the declaration for the override function is not the same as the
|
3910
|
+
// declaration for the symbol, the function was probably replaced by a decorator.
|
3911
|
+
if (!symbol.getDeclarations().some((decl) => decl === overrideFunction.details.declaration)) {
|
3912
|
+
return;
|
3913
|
+
}
|
3849
3914
|
const funcNode = overrideFunction.details.declaration.node;
|
3850
3915
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.overriddenMethodNotFound().format({ name: funcNode.name.value }), funcNode.name);
|
3851
3916
|
}
|
@@ -3853,6 +3918,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3853
3918
|
if (!(0, types_1.isInstantiableClass)(baseClassAndSymbol.classType)) {
|
3854
3919
|
return;
|
3855
3920
|
}
|
3921
|
+
if (baseClassAndSymbol.symbol.isIgnoredForOverrideChecks()) {
|
3922
|
+
return;
|
3923
|
+
}
|
3856
3924
|
// If the base class doesn't provide a type declaration, we won't bother
|
3857
3925
|
// proceeding with additional checks. Type inference is too inaccurate
|
3858
3926
|
// in this case, plus it would be very slow.
|
@@ -4387,7 +4455,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4387
4455
|
this._evaluator.addUnreachableCode(except, except.exceptSuite);
|
4388
4456
|
}
|
4389
4457
|
}
|
4390
|
-
|
4458
|
+
(0, collectionUtils_1.appendArray)(exceptionTypesSoFar, typesOfThisExcept);
|
4391
4459
|
});
|
4392
4460
|
}
|
4393
4461
|
_reportDuplicateImports() {
|