Skip to content

Commit 1c504f8

Browse files
author
Jennifer Messerly
committed
Fix #28120, strong mode allows field overrides
Fix #28119, DDC supports field overrides without @virtual Fix #28801, devirtualize private fields in DDC where possible Fix #28589, stop supporting @virtual in strong mode [email protected], [email protected] Review-Url: https://codereview.chromium.org/2781443003 .
1 parent 9dd0668 commit 1c504f8

24 files changed

+19009
-5949
lines changed

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2520,12 +2520,6 @@ class ElementAnnotationImpl implements ElementAnnotation {
25202520
*/
25212521
static String _REQUIRED_VARIABLE_NAME = "required";
25222522

2523-
/**
2524-
* The name of the top-level variable used to mark a member as intended to be
2525-
* overridden.
2526-
*/
2527-
static String _VIRTUAL_VARIABLE_NAME = "virtual";
2528-
25292523
/**
25302524
* The element representing the field, variable, or constructor being used as
25312525
* an annotation.
@@ -2634,18 +2628,6 @@ class ElementAnnotationImpl implements ElementAnnotation {
26342628
element.name == _REQUIRED_VARIABLE_NAME &&
26352629
element.library?.name == _META_LIB_NAME;
26362630

2637-
/**
2638-
* Return `true` if this annotation marks the associated member as supporting
2639-
* overrides.
2640-
*
2641-
* This is currently used by fields in Strong Mode, as other members are
2642-
* already virtual-by-default.
2643-
*/
2644-
bool get isVirtual =>
2645-
element is PropertyAccessorElement &&
2646-
element.name == _VIRTUAL_VARIABLE_NAME &&
2647-
element.library?.name == _META_LIB_NAME;
2648-
26492631
/**
26502632
* Get the library containing this annotation.
26512633
*/
@@ -4273,14 +4255,7 @@ class FieldElementImpl extends PropertyInducingElementImpl
42734255
}
42744256

42754257
@override
4276-
bool get isVirtual {
4277-
for (ElementAnnotationImpl annotation in metadata) {
4278-
if (annotation.isVirtual) {
4279-
return true;
4280-
}
4281-
}
4282-
return false;
4283-
}
4258+
bool get isVirtual => true;
42844259

42854260
@override
42864261
ElementKind get kind => ElementKind.FIELD;

pkg/analyzer/test/generated/compile_time_error_code_test.dart

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5291,10 +5291,8 @@ import 'lib1.dart';
52915291
class C extends Object with A, B {}
52925292
''');
52935293
await computeAnalysisResult(source);
5294-
assertErrors(source, [
5295-
CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION,
5296-
StrongModeCode.INVALID_FIELD_OVERRIDE
5297-
]);
5294+
assertErrors(
5295+
source, [CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION]);
52985296
verify([source]);
52995297
}
53005298

@@ -5340,10 +5338,8 @@ import 'lib1.dart';
53405338
class C extends A with B {}
53415339
''');
53425340
await computeAnalysisResult(source);
5343-
assertErrors(source, [
5344-
CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION,
5345-
StrongModeCode.INVALID_FIELD_OVERRIDE
5346-
]);
5341+
assertErrors(
5342+
source, [CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION]);
53475343
verify([source]);
53485344
}
53495345

@@ -5365,10 +5361,8 @@ import 'lib1.dart';
53655361
class C extends A with A {}
53665362
''');
53675363
await computeAnalysisResult(source);
5368-
assertErrors(source, [
5369-
CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION,
5370-
StrongModeCode.INVALID_FIELD_OVERRIDE
5371-
]);
5364+
assertErrors(
5365+
source, [CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION]);
53725366
verify([source]);
53735367
}
53745368

pkg/analyzer/test/src/context/context_test.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4326,9 +4326,8 @@ class B extends A {
43264326
}
43274327
''');
43284328
_performPendingAnalysisTasks();
4329-
expect(context.getErrors(a).errors, hasLength(2));
4329+
expect(context.getErrors(a).errors, hasLength(1));
43304330
// Update a.dart: rename "int foo" to "int bar".
4331-
// The strong mode "getter cannot override field" error is gone.
43324331
context.setContents(
43334332
a,
43344333
r'''

pkg/analyzer/test/src/task/strong/checker_test.dart

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -726,10 +726,10 @@ class Base {
726726
}
727727
728728
class Child extends Base {
729-
/*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter
730-
/*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter
731-
/*error:INVALID_FIELD_OVERRIDE*/var f3;
732-
/*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/dynamic f4;
729+
/*error:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter
730+
/*error:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter
731+
var f3;
732+
/*error:INVALID_METHOD_OVERRIDE*/dynamic f4;
733733
}
734734
735735
class Child2 implements Base {
@@ -755,10 +755,10 @@ abstract class Base {
755755
}
756756
757757
class Child extends Base {
758-
/*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/A get f1 => null;
759-
/*error:INVALID_FIELD_OVERRIDE*/C get f2 => null;
760-
/*error:INVALID_FIELD_OVERRIDE*/get f3 => null;
761-
/*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
758+
/*error:INVALID_METHOD_OVERRIDE*/A get f1 => null;
759+
C get f2 => null;
760+
get f3 => null;
761+
/*error:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
762762
}
763763
764764
class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR*/Child2 implements Base {
@@ -779,8 +779,8 @@ class F {
779779
}
780780
781781
class G extends F {
782-
/*error:INVALID_FIELD_OVERRIDE*/final ToVoid<int> f = null;
783-
/*error:INVALID_FIELD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null;
782+
final ToVoid<int> f = null;
783+
/*error:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null;
784784
}
785785
786786
class H implements F {
@@ -815,7 +815,7 @@ class OverrideWithField extends C {
815815
set superX(int v) { super.x = v; }
816816
}
817817
class VirtualNotInherited extends OverrideWithField {
818-
/*error:INVALID_FIELD_OVERRIDE*/int x;
818+
int x;
819819
}
820820
''');
821821
}
@@ -835,17 +835,17 @@ class Base {
835835
}
836836
837837
class Child extends Base {
838-
/*error:INVALID_FIELD_OVERRIDE*/B get f1 => null;
839-
/*error:INVALID_FIELD_OVERRIDE*/B get f2 => null;
840-
/*error:INVALID_FIELD_OVERRIDE*/B get f3 => null;
841-
/*error:INVALID_FIELD_OVERRIDE*/B get f4 => null;
842-
/*error:INVALID_FIELD_OVERRIDE*/B get f5 => null;
838+
B get f1 => null;
839+
B get f2 => null;
840+
B get f3 => null;
841+
B get f4 => null;
842+
B get f5 => null;
843843
844-
/*error:INVALID_FIELD_OVERRIDE*/void set f1(A value) {}
845-
/*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
846-
/*error:INVALID_FIELD_OVERRIDE*/void set f3(value) {}
847-
/*error:INVALID_FIELD_OVERRIDE*/void set f4(dynamic value) {}
848-
/*error:INVALID_FIELD_OVERRIDE*/set f5(B value) {}
844+
void set f1(A value) {}
845+
/*error:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
846+
void set f3(value) {}
847+
void set f4(dynamic value) {}
848+
set f5(B value) {}
849849
}
850850
851851
class Child2 implements Base {
@@ -2494,21 +2494,21 @@ class Base {
24942494
}
24952495
24962496
class T1 extends Base {
2497-
/*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_FIELD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/B get f => null;
2497+
/*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,error:INVALID_METHOD_OVERRIDE*/B get f => null;
24982498
}
24992499
25002500
class T2 extends Base {
2501-
/*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_FIELD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/set f(
2501+
/*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,error:INVALID_METHOD_OVERRIDE*/set f(
25022502
B b) => null;
25032503
}
25042504
25052505
class T3 extends Base {
2506-
/*error:INVALID_FIELD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/final B
2506+
/*error:INVALID_METHOD_OVERRIDE*/final B
25072507
/*warning:FINAL_NOT_INITIALIZED*/f;
25082508
}
25092509
class T4 extends Base {
25102510
// two: one for the getter one for the setter.
2511-
/*error:INVALID_FIELD_OVERRIDE, error:INVALID_METHOD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/B f;
2511+
/*error:INVALID_METHOD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/B f;
25122512
}
25132513
25142514
class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T5 implements Base {
@@ -2610,7 +2610,7 @@ class Parent extends Grandparent {
26102610
26112611
class Test extends Parent {
26122612
/*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
2613-
/*error:INVALID_FIELD_OVERRIDE*/int x;
2613+
int x;
26142614
}
26152615
''');
26162616
}
@@ -2655,9 +2655,9 @@ class M2 {
26552655
class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
26562656
with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {}
26572657
class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base
2658-
with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, /*error:INVALID_FIELD_OVERRIDE*/M2 {}
2658+
with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, M2 {}
26592659
class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base
2660-
with /*error:INVALID_FIELD_OVERRIDE*/M2, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {}
2660+
with M2, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {}
26612661
''');
26622662
}
26632663

@@ -2681,7 +2681,7 @@ class M2 {
26812681
26822682
class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
26832683
with M1,
2684-
/*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN,error:INVALID_FIELD_OVERRIDE*/M2 {}
2684+
/*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2 {}
26852685
''');
26862686
}
26872687

@@ -3294,8 +3294,8 @@ class Base {
32943294
}
32953295
32963296
class GrandChild extends main.Child {
3297-
/*error:INVALID_FIELD_OVERRIDE*/var _f2;
3298-
/*error:INVALID_FIELD_OVERRIDE*/var _f3;
3297+
var _f2;
3298+
var _f3;
32993299
var _f4;
33003300
33013301
/*error:INVALID_METHOD_OVERRIDE*/String _m1() => null;
@@ -3306,7 +3306,7 @@ class GrandChild extends main.Child {
33063306
import 'helper.dart' as helper;
33073307
33083308
class Child extends helper.Base {
3309-
/*error:INVALID_FIELD_OVERRIDE*/var f1;
3309+
var f1;
33103310
var _f2;
33113311
var _f4;
33123312

pkg/analyzer/test/src/task/strong/inferred_type_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3187,7 +3187,7 @@ main() {
31873187
test_inferParameterType_setter_fromField() async {
31883188
var mainUnit = await checkFileElement('''
31893189
class C extends D {
3190-
/*error:INVALID_FIELD_OVERRIDE*/set foo(x) {}
3190+
set foo(x) {}
31913191
}
31923192
class D {
31933193
int foo;
@@ -3601,7 +3601,7 @@ class A {
36013601
}
36023602
36033603
class B extends A {
3604-
/*error:INVALID_FIELD_OVERRIDE*/get x => 3;
3604+
get x => 3;
36053605
}
36063606
36073607
foo() {
@@ -3741,7 +3741,7 @@ class A<T> {
37413741
37423742
class B<E> extends A<E> {
37433743
E y;
3744-
/*error:INVALID_FIELD_OVERRIDE*/get x => y;
3744+
get x => y;
37453745
}
37463746
37473747
foo() {

0 commit comments

Comments
 (0)