| Index: pkg/analyzer/lib/src/task/strong/checker.dart
|
| diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
|
| index 0fd6f26590745d1b76e8192ede98376a7a3e9e42..1183ce39b407921b236f43239d64a9e725cc5651 100644
|
| --- a/pkg/analyzer/lib/src/task/strong/checker.dart
|
| +++ b/pkg/analyzer/lib/src/task/strong/checker.dart
|
| @@ -13,6 +13,7 @@ import 'package:analyzer/dart/ast/token.dart';
|
| import 'package:analyzer/dart/ast/visitor.dart';
|
| import 'package:analyzer/dart/element/element.dart';
|
| import 'package:analyzer/dart/element/type.dart';
|
| +import 'package:analyzer/src/dart/element/element.dart';
|
| import 'package:analyzer/src/dart/element/type.dart';
|
| import 'package:analyzer/src/error/codes.dart' show StrongModeCode;
|
| import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
|
| @@ -74,10 +75,10 @@ Element _getKnownElement(Expression expression) {
|
|
|
| /// Return the field on type corresponding to member, or null if none
|
| /// exists or the "field" is actually a getter/setter.
|
| -PropertyInducingElement _getMemberField(
|
| +FieldElement _getMemberField(
|
| InterfaceType type, PropertyAccessorElement member) {
|
| String memberName = member.name;
|
| - PropertyInducingElement field;
|
| + FieldElement field;
|
| if (member.isGetter) {
|
| // The subclass member is an explicit getter or a field
|
| // - lookup the getter on the superclass.
|
| @@ -1388,9 +1389,10 @@ class _OverrideChecker {
|
|
|
| if (isSubclass && element is PropertyAccessorElement) {
|
| // Disallow any overriding if the base class defines this member
|
| - // as a field. We effectively treat fields as final / non-virtual.
|
| - PropertyInducingElement field = _getMemberField(type, element);
|
| - if (field != null) {
|
| + // as a field. We effectively treat fields as final / non-virtual,
|
| + // unless they are explicitly marked as @virtual
|
| + var field = _getMemberField(type, element);
|
| + if (field != null && !field.isVirtual) {
|
| _checker._recordMessage(
|
| errorLocation, StrongModeCode.INVALID_FIELD_OVERRIDE, [
|
| element.enclosingElement.name,
|
|
|