From ab7f49166ece9cc04fdb5b02818ba5d90ed2bce7 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Thu, 10 Aug 2023 23:17:35 +0000 Subject: [PATCH] Extension types. Report deferred superinterfaces. Change-Id: Ie767ce5e96953d83edeeb3331bea0aecfc5f51a1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/319904 Commit-Queue: Konstantin Shcheglov Reviewed-by: Phil Quitslund Reviewed-by: Brian Wilkerson --- .../lib/src/generated/error_verifier.dart | 17 ++++++ .../implements_deferred_class_test.dart | 56 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart index 440d4a383ae..d1050bff994 100644 --- a/pkg/analyzer/lib/src/generated/error_verifier.dart +++ b/pkg/analyzer/lib/src/generated/error_verifier.dart @@ -712,6 +712,7 @@ class ErrorVerifier extends RecursiveAstVisitor _checkForNonCovariantTypeParameterPositionInRepresentationType( node, element); _checkForExtensionTypeRepresentationDependsOnItself(node, element); + _checkForExtensionTypeImplementsDeferred(node); _checkForExtensionTypeImplementsItself(node, element); _checkForExtensionTypeMemberConflicts( node: node, @@ -2916,6 +2917,22 @@ class ErrorVerifier extends RecursiveAstVisitor } } + void _checkForExtensionTypeImplementsDeferred( + ExtensionTypeDeclarationImpl node, + ) { + final clause = node.implementsClause; + if (clause == null) { + return; + } + + for (final type in clause.interfaces) { + _checkForExtendsOrImplementsDeferredClass( + type, + CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, + ); + } + } + void _checkForExtensionTypeImplementsItself( ExtensionTypeDeclarationImpl node, ExtensionTypeElementImpl element, diff --git a/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart index 0618d01135c..90d8d0d1585 100644 --- a/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart +++ b/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart @@ -106,6 +106,62 @@ ImplementsClause '''); } + test_extensionType_implements_class() async { + newFile('$testPackageLibPath/a.dart', ''' +class A {} +'''); + + await assertErrorsInCode(''' +import 'a.dart' deferred as a; +extension type B(a.A it) implements a.A {} +''', [ + error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 67, 3), + ]); + + final node = findNode.singleImplementsClause; + assertResolvedNodeText(node, r''' +ImplementsClause + implementsKeyword: implements + interfaces + NamedType + importPrefix: ImportPrefixReference + name: a + period: . + element: self::@prefix::a + name: A + element: package:test/a.dart::@class::A + type: A +'''); + } + + test_extensionType_implements_extensionType() async { + newFile('$testPackageLibPath/a.dart', ''' +extension type A(int it) {} +'''); + + await assertErrorsInCode(''' +import 'a.dart' deferred as a; +extension type B(int it) implements a.A {} +''', [ + error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 67, 3), + ]); + + final node = findNode.singleImplementsClause; + assertResolvedNodeText(node, r''' +ImplementsClause + implementsKeyword: implements + interfaces + NamedType + importPrefix: ImportPrefixReference + name: a + period: . + element: self::@prefix::a + name: A + element: package:test/a.dart::@extensionType::A + type: A +'''); + } + test_mixin() async { await assertErrorsInCode(r''' import 'dart:math' deferred as math;