From b9c5118c73fda9a2e43e204ae52e375874bff9f0 Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Thu, 6 Aug 2020 16:29:09 +0000 Subject: [PATCH] [cfe] Don't mark external methods as abstract Closes #31233 Related to flutter/flutter#62887 Change-Id: I96e5a1b8045f75f1ad02fb47e5e41fe402dc3dc1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/157481 Commit-Queue: Johnni Winther Reviewed-by: Jens Johansen --- .../lib/src/fasta/builder/field_builder.dart | 4 ++-- pkg/front_end/lib/src/fasta/modifier.dart | 17 +++++++++----- .../lib/src/fasta/source/outline_builder.dart | 10 +++------ .../testcases/general/external_method.dart | 11 ++++++++++ .../external_method.dart.outline.expect | 22 +++++++++++++++++++ .../external_method.dart.strong.expect | 22 +++++++++++++++++++ ...rnal_method.dart.strong.transformed.expect | 22 +++++++++++++++++++ ...xternal_method.dart.textual_outline.expect | 7 ++++++ ...ethod.dart.textual_outline_modelled.expect | 6 +++++ .../general/micro.dart.outline.expect | 4 ++-- .../general/micro.dart.strong.expect | 4 ++-- .../micro.dart.strong.transformed.expect | 4 ++-- .../general/optional.dart.outline.expect | 2 +- .../general/optional.dart.strong.expect | 2 +- .../micro.dart.weak.expect | 4 ++-- .../micro.dart.weak.transformed.expect | 4 ++-- .../optional.dart.weak.expect | 2 +- .../abstract_field_errors.dart.outline.expect | 20 ++++++++--------- .../abstract_field_errors.dart.strong.expect | 20 ++++++++--------- ...ield_errors.dart.strong.transformed.expect | 20 ++++++++--------- .../abstract_field_errors.dart.weak.expect | 20 ++++++++--------- ..._field_errors.dart.weak.transformed.expect | 20 ++++++++--------- .../main.dart.outline.expect | 2 +- .../main.dart.outline.expect | 2 +- pkg/kernel/lib/verifier.dart | 3 +++ 25 files changed, 175 insertions(+), 79 deletions(-) create mode 100644 pkg/front_end/testcases/general/external_method.dart create mode 100644 pkg/front_end/testcases/general/external_method.dart.outline.expect create mode 100644 pkg/front_end/testcases/general/external_method.dart.strong.expect create mode 100644 pkg/front_end/testcases/general/external_method.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/general/external_method.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/general/external_method.dart.textual_outline_modelled.expect diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart index cbb624a36f5..cbcc35432c4 100644 --- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart @@ -1410,7 +1410,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { _getter ..isStatic = !isInstanceMember ..isExtensionMember = isExtensionMember - ..isAbstract = isAbstract + ..isAbstract = isAbstract && !isExternal ..isExternal = isExternal; // TODO(johnniwinther): How can the name already have been computed? _getter.name ??= new Name(getterName, libraryBuilder.library); @@ -1428,7 +1428,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { _setter ..isStatic = !isInstanceMember ..isExtensionMember = isExtensionMember - ..isAbstract = isAbstract + ..isAbstract = isAbstract && !isExternal ..isExternal = isExternal; // TODO(johnniwinther): How can the name already have been computed? _setter?.name ??= new Name(setterName, libraryBuilder.library); diff --git a/pkg/front_end/lib/src/fasta/modifier.dart b/pkg/front_end/lib/src/fasta/modifier.dart index 0d6a2b12b9e..c93ef12b861 100644 --- a/pkg/front_end/lib/src/fasta/modifier.dart +++ b/pkg/front_end/lib/src/fasta/modifier.dart @@ -51,7 +51,7 @@ const int initializingFormalMask = hasInitializerMask << 1; const int declaresConstConstructorMask = initializingFormalMask << 1; /// Not a real modifier, and by setting it to zero, it is automatically ignored -/// by [Modifier.validate] below. +/// by [Modifier.toMask] below. const int varMask = 0; const Modifier Abstract = const Modifier(ModifierEnum.Abstract, abstractMask); @@ -90,10 +90,8 @@ class Modifier { toString() => "modifier(${'$kind'.substring('ModifierEnum.'.length)})"; - static int validate(List modifiers, {bool isAbstract: false}) { - // TODO(ahe): Rename this method, validation is now taken care of by the - // parser. - int result = isAbstract ? abstractMask : 0; + static int toMask(List modifiers) { + int result = 0; if (modifiers == null) return result; for (Modifier modifier in modifiers) { result |= modifier.mask; @@ -108,4 +106,13 @@ class Modifier { if (identical('var', lexeme)) return Var.mask; return unhandled(lexeme, "Modifier.validateVarFinalOrConst", -1, null); } + + /// Returns [modifier] with [abstractMask] added if [isAbstract] and + /// [modifiers] doesn't contain [externalMask]. + static int addAbstractMask(int modifiers, {bool isAbstract: false}) { + if (isAbstract && (modifiers & externalMask) == 0) { + modifiers |= abstractMask; + } + return modifiers; + } } diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart index 53b47292fb7..7fa22861eca 100644 --- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart @@ -813,9 +813,7 @@ class OutlineBuilder extends StackListenerImpl { } } int modifiers = pop(); - if (isAbstract) { - modifiers |= abstractMask; - } + modifiers = Modifier.addAbstractMask(modifiers, isAbstract: isAbstract); if (nativeMethodName != null) { modifiers |= externalMask; } @@ -1059,13 +1057,11 @@ class OutlineBuilder extends StackListenerImpl { isAbstract = false; } } - int modifiers = Modifier.validate(pop(), isAbstract: isAbstract); + int modifiers = Modifier.toMask(pop()); + modifiers = Modifier.addAbstractMask(modifiers, isAbstract: isAbstract); if (nativeMethodName != null) { modifiers |= externalMask; } - if ((modifiers & externalMask) != 0) { - modifiers &= ~abstractMask; - } bool isConst = (modifiers & constMask) != 0; int varFinalOrConstOffset = pop(); List metadata = pop(); diff --git a/pkg/front_end/testcases/general/external_method.dart b/pkg/front_end/testcases/general/external_method.dart new file mode 100644 index 00000000000..976d23b0002 --- /dev/null +++ b/pkg/front_end/testcases/general/external_method.dart @@ -0,0 +1,11 @@ +// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +external void externalMethod(); + +class Class { + external void externalMethod(); +} + +void main() {} diff --git a/pkg/front_end/testcases/general/external_method.dart.outline.expect b/pkg/front_end/testcases/general/external_method.dart.outline.expect new file mode 100644 index 00000000000..b9975e3ddc6 --- /dev/null +++ b/pkg/front_end/testcases/general/external_method.dart.outline.expect @@ -0,0 +1,22 @@ +library; +import self as self; +import "dart:core" as core; + +class Class extends core::Object { + synthetic constructor •() → self::Class* + ; + external method externalMethod() → void; + abstract member-signature get _identityHashCode() → core::int*; + abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; + abstract member-signature operator ==(dynamic other) → core::bool*; + abstract member-signature get hashCode() → core::int*; + abstract member-signature method toString() → core::String*; + abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; + abstract member-signature get runtimeType() → core::Type*; +} +external static method externalMethod() → void; +static method main() → void + ; diff --git a/pkg/front_end/testcases/general/external_method.dart.strong.expect b/pkg/front_end/testcases/general/external_method.dart.strong.expect new file mode 100644 index 00000000000..1fed66d18e8 --- /dev/null +++ b/pkg/front_end/testcases/general/external_method.dart.strong.expect @@ -0,0 +1,22 @@ +library; +import self as self; +import "dart:core" as core; + +class Class extends core::Object { + synthetic constructor •() → self::Class* + : super core::Object::•() + ; + external method externalMethod() → void; + abstract member-signature get _identityHashCode() → core::int*; + abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; + abstract member-signature operator ==(dynamic other) → core::bool*; + abstract member-signature get hashCode() → core::int*; + abstract member-signature method toString() → core::String*; + abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; + abstract member-signature get runtimeType() → core::Type*; +} +external static method externalMethod() → void; +static method main() → void {} diff --git a/pkg/front_end/testcases/general/external_method.dart.strong.transformed.expect b/pkg/front_end/testcases/general/external_method.dart.strong.transformed.expect new file mode 100644 index 00000000000..1fed66d18e8 --- /dev/null +++ b/pkg/front_end/testcases/general/external_method.dart.strong.transformed.expect @@ -0,0 +1,22 @@ +library; +import self as self; +import "dart:core" as core; + +class Class extends core::Object { + synthetic constructor •() → self::Class* + : super core::Object::•() + ; + external method externalMethod() → void; + abstract member-signature get _identityHashCode() → core::int*; + abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; + abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; + abstract member-signature operator ==(dynamic other) → core::bool*; + abstract member-signature get hashCode() → core::int*; + abstract member-signature method toString() → core::String*; + abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; + abstract member-signature get runtimeType() → core::Type*; +} +external static method externalMethod() → void; +static method main() → void {} diff --git a/pkg/front_end/testcases/general/external_method.dart.textual_outline.expect b/pkg/front_end/testcases/general/external_method.dart.textual_outline.expect new file mode 100644 index 00000000000..a36e3804d3c --- /dev/null +++ b/pkg/front_end/testcases/general/external_method.dart.textual_outline.expect @@ -0,0 +1,7 @@ +external void externalMethod(); + +class Class { + external void externalMethod(); +} + +void main() {} diff --git a/pkg/front_end/testcases/general/external_method.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/external_method.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..b902ad8946c --- /dev/null +++ b/pkg/front_end/testcases/general/external_method.dart.textual_outline_modelled.expect @@ -0,0 +1,6 @@ +class Class { + external void externalMethod(); +} + +external void externalMethod(); +void main() {} diff --git a/pkg/front_end/testcases/general/micro.dart.outline.expect b/pkg/front_end/testcases/general/micro.dart.outline.expect index 110be54efab..7f7014266fc 100644 --- a/pkg/front_end/testcases/general/micro.dart.outline.expect +++ b/pkg/front_end/testcases/general/micro.dart.outline.expect @@ -115,8 +115,8 @@ class DynamicReceiver2 extends core::Object { } static method staticMethod() → dynamic ; -external static abstract method externalStatic() → core::bool*; -external static abstract method createBar() → self::Bar*; +external static method externalStatic() → core::bool*; +external static method createBar() → self::Bar*; static method stringArgument(dynamic x) → dynamic ; static method intArgument(dynamic x) → dynamic diff --git a/pkg/front_end/testcases/general/micro.dart.strong.expect b/pkg/front_end/testcases/general/micro.dart.strong.expect index 517068084e7..302f493e9dd 100644 --- a/pkg/front_end/testcases/general/micro.dart.strong.expect +++ b/pkg/front_end/testcases/general/micro.dart.strong.expect @@ -123,8 +123,8 @@ class DynamicReceiver2 extends core::Object { static method staticMethod() → dynamic { return "sdfg"; } -external static abstract method externalStatic() → core::bool*; -external static abstract method createBar() → self::Bar*; +external static method externalStatic() → core::bool*; +external static method createBar() → self::Bar*; static method stringArgument(dynamic x) → dynamic {} static method intArgument(dynamic x) → dynamic {} static method makeDynamicCall(dynamic receiver) → void { diff --git a/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect b/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect index 517068084e7..302f493e9dd 100644 --- a/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect @@ -123,8 +123,8 @@ class DynamicReceiver2 extends core::Object { static method staticMethod() → dynamic { return "sdfg"; } -external static abstract method externalStatic() → core::bool*; -external static abstract method createBar() → self::Bar*; +external static method externalStatic() → core::bool*; +external static method createBar() → self::Bar*; static method stringArgument(dynamic x) → dynamic {} static method intArgument(dynamic x) → dynamic {} static method makeDynamicCall(dynamic receiver) → void { diff --git a/pkg/front_end/testcases/general/optional.dart.outline.expect b/pkg/front_end/testcases/general/optional.dart.outline.expect index fc765ffa010..7960d64ab64 100644 --- a/pkg/front_end/testcases/general/optional.dart.outline.expect +++ b/pkg/front_end/testcases/general/optional.dart.outline.expect @@ -77,6 +77,6 @@ class InvalidListener extends core::Object { abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; abstract member-signature get runtimeType() → core::Type*; } -external static abstract method createExternal() → self::External*; +external static method createExternal() → self::External*; static method main() → dynamic ; diff --git a/pkg/front_end/testcases/general/optional.dart.strong.expect b/pkg/front_end/testcases/general/optional.dart.strong.expect index 699fb5582e5..fdbfad748de 100644 --- a/pkg/front_end/testcases/general/optional.dart.strong.expect +++ b/pkg/front_end/testcases/general/optional.dart.strong.expect @@ -108,7 +108,7 @@ class InvalidListener extends core::Object { abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; abstract member-signature get runtimeType() → core::Type*; } -external static abstract method createExternal() → self::External*; +external static method createExternal() → self::External*; static method main() → dynamic { self::Foo* foo = new self::Foo::•(); dynamic string1 = foo.{self::Foo::method}(1); diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.expect index 517068084e7..302f493e9dd 100644 --- a/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.expect +++ b/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.expect @@ -123,8 +123,8 @@ class DynamicReceiver2 extends core::Object { static method staticMethod() → dynamic { return "sdfg"; } -external static abstract method externalStatic() → core::bool*; -external static abstract method createBar() → self::Bar*; +external static method externalStatic() → core::bool*; +external static method createBar() → self::Bar*; static method stringArgument(dynamic x) → dynamic {} static method intArgument(dynamic x) → dynamic {} static method makeDynamicCall(dynamic receiver) → void { diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.transformed.expect index 517068084e7..302f493e9dd 100644 --- a/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/general_nnbd_opt_out/micro.dart.weak.transformed.expect @@ -123,8 +123,8 @@ class DynamicReceiver2 extends core::Object { static method staticMethod() → dynamic { return "sdfg"; } -external static abstract method externalStatic() → core::bool*; -external static abstract method createBar() → self::Bar*; +external static method externalStatic() → core::bool*; +external static method createBar() → self::Bar*; static method stringArgument(dynamic x) → dynamic {} static method intArgument(dynamic x) → dynamic {} static method makeDynamicCall(dynamic receiver) → void { diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/optional.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/optional.dart.weak.expect index 6e7a5a896d2..79679d1480f 100644 --- a/pkg/front_end/testcases/general_nnbd_opt_out/optional.dart.weak.expect +++ b/pkg/front_end/testcases/general_nnbd_opt_out/optional.dart.weak.expect @@ -108,7 +108,7 @@ class InvalidListener extends core::Object { abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; abstract member-signature get runtimeType() → core::Type*; } -external static abstract method createExternal() → self::External*; +external static method createExternal() → self::External*; static method main() → dynamic { self::Foo* foo = new self::Foo::•(); dynamic string1 = foo.{self::Foo::method}(1); diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect index 0f64f8f1134..4ac62a9f56e 100644 --- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect +++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect @@ -193,22 +193,22 @@ abstract class A extends core::Object { abstract set initializedField1(core::int #t2) → void; abstract get initializedField2() → core::int; abstract set initializedField2(core::int #t3) → void; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t4) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t5) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t4) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t5) → void; external get externalLateInstanceField() → core::int; external set externalLateInstanceField(core::int #t6) → void; } abstract class B extends core::Object /*isMixinDeclaration*/ { static field core::int staticField; static final field core::int finalStaticField; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t7) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t8) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t7) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t8) → void; } extension Extension on self::A { get extensionInstanceField = get self::Extension|extensionInstanceField; diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect index 002cc9d925d..8181af48ccc 100644 --- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect +++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect @@ -225,22 +225,22 @@ Try removing the field initializer or the 'abstract' keyword from the field decl abstract set initializedField1(core::int #t4) → void; abstract get initializedField2() → core::int; abstract set initializedField2(core::int #t5) → void; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t6) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t7) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t6) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t7) → void; external get externalLateInstanceField() → core::int; external set externalLateInstanceField(core::int #t8) → void; } abstract class B extends core::Object /*isMixinDeclaration*/ { static field core::int staticField = null; static final field core::int finalStaticField = null; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t9) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t10) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t9) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t10) → void; } extension Extension on self::A { get extensionInstanceField = get self::Extension|extensionInstanceField; diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect index 002cc9d925d..8181af48ccc 100644 --- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect @@ -225,22 +225,22 @@ Try removing the field initializer or the 'abstract' keyword from the field decl abstract set initializedField1(core::int #t4) → void; abstract get initializedField2() → core::int; abstract set initializedField2(core::int #t5) → void; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t6) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t7) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t6) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t7) → void; external get externalLateInstanceField() → core::int; external set externalLateInstanceField(core::int #t8) → void; } abstract class B extends core::Object /*isMixinDeclaration*/ { static field core::int staticField = null; static final field core::int finalStaticField = null; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t9) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t10) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t9) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t10) → void; } extension Extension on self::A { get extensionInstanceField = get self::Extension|extensionInstanceField; diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect index 002cc9d925d..8181af48ccc 100644 --- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect +++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect @@ -225,22 +225,22 @@ Try removing the field initializer or the 'abstract' keyword from the field decl abstract set initializedField1(core::int #t4) → void; abstract get initializedField2() → core::int; abstract set initializedField2(core::int #t5) → void; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t6) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t7) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t6) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t7) → void; external get externalLateInstanceField() → core::int; external set externalLateInstanceField(core::int #t8) → void; } abstract class B extends core::Object /*isMixinDeclaration*/ { static field core::int staticField = null; static final field core::int finalStaticField = null; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t9) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t10) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t9) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t10) → void; } extension Extension on self::A { get extensionInstanceField = get self::Extension|extensionInstanceField; diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect index 002cc9d925d..8181af48ccc 100644 --- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect @@ -225,22 +225,22 @@ Try removing the field initializer or the 'abstract' keyword from the field decl abstract set initializedField1(core::int #t4) → void; abstract get initializedField2() → core::int; abstract set initializedField2(core::int #t5) → void; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t6) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t7) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t6) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t7) → void; external get externalLateInstanceField() → core::int; external set externalLateInstanceField(core::int #t8) → void; } abstract class B extends core::Object /*isMixinDeclaration*/ { static field core::int staticField = null; static final field core::int finalStaticField = null; - external abstract get externalInstanceField() → core::int; - external abstract set externalInstanceField(core::int #t9) → void; - external abstract get externalFinalInstanceField() → core::int; - external abstract get externalCovariantInstanceField() → core::num; - external abstract set externalCovariantInstanceField(covariant core::num #t10) → void; + external get externalInstanceField() → core::int; + external set externalInstanceField(core::int #t9) → void; + external get externalFinalInstanceField() → core::int; + external get externalCovariantInstanceField() → core::num; + external set externalCovariantInstanceField(covariant core::num #t10) → void; } extension Extension on self::A { get extensionInstanceField = get self::Extension|extensionInstanceField; diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect index f734994f1c1..1d570f5c9c9 100644 --- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect +++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect @@ -35,6 +35,6 @@ class Class extends core::Object /*hasConstCons static method method(core::int a) → core::int ; @_in::patch -external static abstract method patchedMethod(core::int a) → void; +external static method patchedMethod(core::int a) → void; static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int ; diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect index 25d8360107c..85646ddba8a 100644 --- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect +++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect @@ -58,6 +58,6 @@ class Class extends core::Object { static method method([core::int i]) → void ; @_in::patch -external static abstract method patchedMethod([core::int i]) → void; +external static method patchedMethod([core::int i]) → void; static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod([core::int i]) → void ; diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart index 4a5614aa122..c9238d39a07 100644 --- a/pkg/kernel/lib/verifier.dart +++ b/pkg/kernel/lib/verifier.dart @@ -293,6 +293,9 @@ class VerifyingVisitor extends RecursiveVisitor { currentMember = node; var oldParent = enterParent(node); classTypeParametersAreInScope = !node.isStatic; + if (node.isAbstract && node.isExternal) { + problem(node, "Procedure cannot be both abstract and external."); + } node.function.accept(this); classTypeParametersAreInScope = false; visitList(node.annotations, this);