diff --git a/packages/pyright-internal/src/localization/package.nls.en-us.json b/packages/pyright-internal/src/localization/package.nls.en-us.json index c99266ce5..1947b982f 100644 --- a/packages/pyright-internal/src/localization/package.nls.en-us.json +++ b/packages/pyright-internal/src/localization/package.nls.en-us.json @@ -492,7 +492,7 @@ "message": "Class \"{type}\" is marked final and must implement all abstract symbols", "comment": "{Locked='final'}" }, - "classImplicitlyAbstract": "Class \"{type}\" is implicitly abstract because it extends an abstract class without implementing all abstract symbols. If this is intentional, add `ABC` to its base classes or use `metaclass=ABCMeta`.", + "classImplicitlyAbstract": "Class \"{type}\" is implicitly abstract because it extends an abstract class but still contains abstract symbols. If this is intentional, add `ABC` to its base classes or use `metaclass=ABCMeta`.", "classImplicitlyProtocol": "Class \"{type}\" is implicitly a `Protocol` because it extends a `Protocol` without implementing all abstract symbols. If this is intentional, add `Protocol` or `ABC` to its base classes, or use `metaclass=ABCMeta`.", "finalContext": { "message": "\"Final\" is not allowed in this context", diff --git a/packages/pyright-internal/src/tests/checker.test.ts b/packages/pyright-internal/src/tests/checker.test.ts index 838cfeb30..b40b62d61 100644 --- a/packages/pyright-internal/src/tests/checker.test.ts +++ b/packages/pyright-internal/src/tests/checker.test.ts @@ -813,8 +813,19 @@ test('reportImplicitAbstractClass', () => { const analysisResults = TestUtils.typeAnalyzeSampleFiles(['implicitAbstractClass.py'], configOptions); TestUtils.validateResultsButBased(analysisResults, { errors: [ - { code: DiagnosticRule.reportImplicitAbstractClass, line: 7 }, + { + code: DiagnosticRule.reportImplicitAbstractClass, + line: 7, + message: + 'Class "B" is implicitly abstract because it extends an abstract class but still contains abstract symbols. If this is intentional, add `ABC` to its base classes or use `metaclass=ABCMeta`.\n  "A.asdf" is not implemented', + }, { code: DiagnosticRule.reportImplicitAbstractClass, line: 25 }, + { + code: DiagnosticRule.reportImplicitAbstractClass, + line: 33, + message: + 'Class "J" is implicitly abstract because it extends an abstract class but still contains abstract symbols. If this is intentional, add `ABC` to its base classes or use `metaclass=ABCMeta`.\n  "J.asdf" is not implemented', + }, ], }); }); diff --git a/packages/pyright-internal/src/tests/samples/implicitAbstractClass.py b/packages/pyright-internal/src/tests/samples/implicitAbstractClass.py index 3d0232b5e..2d940dfa1 100644 --- a/packages/pyright-internal/src/tests/samples/implicitAbstractClass.py +++ b/packages/pyright-internal/src/tests/samples/implicitAbstractClass.py @@ -27,4 +27,10 @@ class G(F): # error pass class H(F, Protocol): - pass \ No newline at end of file + pass + +class I(ABC): ... + +class J(I): # error + @abstractmethod + def asdf(self) -> int: ...