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

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

Issue 1870423002: Lint rule: Do not override fields. Base URL: https://github.com/dart-lang/linter.git@master
Patch Set: Hint if a field overrides other field. 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/overriden_field.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.overriden_field;
6
7 import 'package:analyzer/dart/ast/ast.dart';
8 import 'package:analyzer/dart/ast/visitor.dart';
9 import 'package:analyzer/dart/element/element.dart';
10 import 'package:analyzer/src/generated/resolver.dart';
11 import 'package:linter/src/linter.dart';
12
13 const desc = r'Do not override fields.';
14
15 const details = r'''
16
17 **DO** Do not override fields.
18
19 **BAD:**
20 ```
21 class Base {
22 Object field = 'lorem';
23
24 Object something = 'change';
25 }
26
27 class Bad1 extends Base {
28 @override
29 final field = 'ipsum'; // LINT
30 }
31
32 class Bad2 extends Base {
33 @override
34 Object something = 'done'; // LINT
35 }
36 ```
37
38 **GOOD:**
39 ```
40 class Base {
41 Object field = 'lorem';
42
43 Object something = 'change';
44 }
45
46 class Ok extends Base {
47 Object newField; // OK
48
49 final Object newFinal = 'ignore'; // OK
50 }
51 ```
52
53 ''';
54
55 class OverridenField extends LintRule {
56 OverridenField()
57 : super(
58 name: 'overriden_field',
59 description: desc,
60 details: details,
61 group: Group.style);
62
63 @override
64 AstVisitor getVisitor() => new _Visitor(this);
65 }
66
67 class _Visitor extends SimpleAstVisitor {
68 InheritanceManager _manager;
69
70 final LintRule rule;
71 _Visitor(this.rule);
72
73 @override
74 visitCompilationUnit(CompilationUnit node) {
75 LibraryElement library = node?.element?.library;
76 _manager = library == null ? null : new InheritanceManager(library);
77 }
78
79 @override
80 visitFieldDeclaration(FieldDeclaration node) {
81 void reportIfFinalFieldIsOverriden(VariableDeclaration variable) {
82 ExecutableElement member = _getOverriddenMember(variable.element);
83 final parentClass = member.enclosingElement as ClassElement;
Brian Wilkerson 2016/04/11 18:13:35 I believe that member can be null if the variable
Alexei Diaz 2016/04/11 18:28:53 Fixed
84 parentClass.fields.forEach((FieldElement field) {
85 if (field.name == node.fields.variables.first.name.name &&
Brian Wilkerson 2016/04/11 18:13:35 "node.fields.variables.first"? Shouldn't that be "
Alexei Diaz 2016/04/11 18:28:53 Hopefully is fixed now, PTAL.
86 field.getter != null &&
87 field.setter != null) {
88 rule.reportLint(variable.name);
89 }
90 });
91 }
92
93 node.fields.variables
94 .where((v) => v?.element != null && v.element.isOverride)
Brian Wilkerson 2016/04/11 18:13:35 Do you only want to catch cases where the field is
Alexei Diaz 2016/04/11 18:28:53 I think https://github.com/dart-lang/linter/blob/m
Brian Wilkerson 2016/04/11 18:55:31 It's possible for clients to enable this lint rule
Alexei Diaz 2016/04/11 19:17:02 Added the verification, my GUESS, is that the expe
95 .forEach(reportIfFinalFieldIsOverriden);
96 }
97
98 ExecutableElement _getOverriddenMember(Element member) {
99 if (member == null || _manager == null) {
100 return null;
101 }
102
103 ClassElement classElement =
104 member.getAncestor((element) => element is ClassElement);
105 if (classElement == null) {
106 return null;
107 }
108
109 return _manager.lookupInheritance(classElement, member.name);
110 }
111 }
OLDNEW
« no previous file with comments | « lib/src/rules.dart ('k') | test/rules/overriden_field.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698