Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: lib/src/rules/final_override_non_final.dart

Issue 1870423002: Lint rule: Do not override fields. Base URL: https://github.com/dart-lang/linter.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/src/rules.dart ('k') | test/rules/final_override_non_final.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library linter.src.rules.final_override_non_final;
6
7 import 'package:linter/src/linter.dart';
8 import 'package:analyzer/dart/ast/visitor.dart';
9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/element/element.dart';
11 import 'package:analyzer/src/generated/resolver.dart';
12
13 const desc = r'Final field overrides non-final field xxx';
14
15 const details = r'''
16
17 **DO** Do not override final fields.
18
19 **BAD:**
20 ```
21 class Base {
22 final Object field = 'lorem';
23 }
24
25 class Bad extends Base {
26 @override
27 final field = 'ipsum';
28 }
29 ```
30
31 **GOOD:**
32 ```
33 class Base {
34 Object something = 'lorem';
35 }
36
37 class Ok extends Base {
38 @override
39 Object something = 'ipsum';
Lasse Reichstein Nielsen 2016/04/09 22:03:37 I'd argue that this is also bad. You are shadowing
Alexei Diaz 2016/04/10 23:22:12 Fixed
40 }
41 ```
42
43 ''';
44
45 class FinalOverrideNonFinal extends LintRule {
46 FinalOverrideNonFinal()
47 : super(
48 name: 'final_override_non_final',
49 description: desc,
50 details: details,
51 group: Group.style);
52
53 @override
54 AstVisitor getVisitor() => new _Visitor(this);
55 }
56
57 class _Visitor extends SimpleAstVisitor {
58 InheritanceManager _manager;
59
60 final LintRule rule;
61 _Visitor(this.rule);
62
63 @override
64 visitCompilationUnit(CompilationUnit node) {
65 LibraryElement library = node?.element?.library;
66 _manager = library == null ? null : new InheritanceManager(library);
67 }
68
69 @override
70 visitFieldDeclaration(FieldDeclaration node) {
71 void reportIfFinalFieldIsOverriden(VariableDeclaration variable) {
72 ExecutableElement member = _getOverriddenMember(variable.element);
73 final parentClass = member.enclosingElement as ClassElement;
74 parentClass.fields.forEach((FieldElement field) {
75 if (field.name == node.fields.variables.first.name.name &&
76 field.getter != null &&
77 field.setter != null) {
78 rule.reportLint(variable.name);
79 }
80 });
81 }
82 ;
83
84 node.fields.variables
85 .where((v) => v?.element != null && v.element.isOverride && v.isFinal)
86 .forEach(reportIfFinalFieldIsOverriden);
87 }
88
89 ExecutableElement _getOverriddenMember(Element member) {
90 if (member == null || _manager == null) {
91 return null;
92 }
93
94 ClassElement classElement =
95 member.getAncestor((element) => element is ClassElement);
96 if (classElement == null) {
97 return null;
98 }
99
100 return _manager.lookupInheritance(classElement, member.name);
101 }
102 }
OLDNEW
« no previous file with comments | « lib/src/rules.dart ('k') | test/rules/final_override_non_final.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698