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

Side by Side Diff: pkg/front_end/lib/src/fasta/builder/scope.dart

Issue 2767653002: Implement fullNameForErrors on all Builders. (Closed)
Patch Set: Used <unnamed> instead of empty string. Created 3 years, 9 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
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 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 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.scope; 5 library fasta.scope;
6 6
7 import 'builder.dart' show Builder, MixedAccessor; 7 import 'builder.dart' show Builder, MixedAccessor;
8 8
9 import '../errors.dart' show internalError; 9 import '../errors.dart' show internalError;
10 10
(...skipping 19 matching lines...) Expand all
30 return new Scope(<String, Builder>{}, this, isModifiable: isModifiable); 30 return new Scope(<String, Builder>{}, this, isModifiable: isModifiable);
31 } 31 }
32 32
33 Builder lookup(String name, int charOffset, Uri fileUri) { 33 Builder lookup(String name, int charOffset, Uri fileUri) {
34 Builder builder = local[name]; 34 Builder builder = local[name];
35 if (builder != null) { 35 if (builder != null) {
36 if (builder.next != null) { 36 if (builder.next != null) {
37 return lookupAmbiguous(name, builder, false, charOffset, fileUri); 37 return lookupAmbiguous(name, builder, false, charOffset, fileUri);
38 } 38 }
39 return builder.isSetter 39 return builder.isSetter
40 ? new AccessErrorBuilder(builder, charOffset, fileUri) 40 ? new AccessErrorBuilder(name, builder, charOffset, fileUri)
41 : builder; 41 : builder;
42 } else { 42 } else {
43 return parent?.lookup(name, charOffset, fileUri); 43 return parent?.lookup(name, charOffset, fileUri);
44 } 44 }
45 } 45 }
46 46
47 Builder lookupSetter(String name, int charOffset, Uri fileUri) { 47 Builder lookupSetter(String name, int charOffset, Uri fileUri) {
48 Builder builder = local[name]; 48 Builder builder = local[name];
49 if (builder != null) { 49 if (builder != null) {
50 if (builder.next != null) { 50 if (builder.next != null) {
51 return lookupAmbiguous(name, builder, true, charOffset, fileUri); 51 return lookupAmbiguous(name, builder, true, charOffset, fileUri);
52 } 52 }
53 if (builder.isField) { 53 if (builder.isField) {
54 if (builder.isFinal) { 54 if (builder.isFinal) {
55 return new AccessErrorBuilder(builder, charOffset, fileUri); 55 return new AccessErrorBuilder(name, builder, charOffset, fileUri);
56 } else { 56 } else {
57 return builder; 57 return builder;
58 } 58 }
59 } else if (builder.isSetter) { 59 } else if (builder.isSetter) {
60 return builder; 60 return builder;
61 } else { 61 } else {
62 return new AccessErrorBuilder(builder, charOffset, fileUri); 62 return new AccessErrorBuilder(name, builder, charOffset, fileUri);
63 } 63 }
64 } else { 64 } else {
65 return parent?.lookupSetter(name, charOffset, fileUri); 65 return parent?.lookupSetter(name, charOffset, fileUri);
66 } 66 }
67 } 67 }
68 68
69 Builder lookupAmbiguous( 69 Builder lookupAmbiguous(
70 String name, Builder builder, bool setter, int charOffset, Uri fileUri) { 70 String name, Builder builder, bool setter, int charOffset, Uri fileUri) {
71 assert(builder.next != null); 71 assert(builder.next != null);
72 if (builder is MixedAccessor) { 72 if (builder is MixedAccessor) {
73 return setter ? builder.setter : builder.getter; 73 return setter ? builder.setter : builder.getter;
74 } 74 }
75 Builder setterBuilder; 75 Builder setterBuilder;
76 Builder getterBuilder; 76 Builder getterBuilder;
77 Builder current = builder; 77 Builder current = builder;
78 while (current != null) { 78 while (current != null) {
79 if (current.isGetter && getterBuilder == null) { 79 if (current.isGetter && getterBuilder == null) {
80 getterBuilder = current; 80 getterBuilder = current;
81 } else if (current.isSetter && setterBuilder == null) { 81 } else if (current.isSetter && setterBuilder == null) {
82 setterBuilder = current; 82 setterBuilder = current;
83 } else { 83 } else {
84 return new AmbiguousBuilder(builder, charOffset, fileUri); 84 return new AmbiguousBuilder(name, builder, charOffset, fileUri);
85 } 85 }
86 current = current.next; 86 current = current.next;
87 } 87 }
88 assert(getterBuilder != null); 88 assert(getterBuilder != null);
89 assert(setterBuilder != null); 89 assert(setterBuilder != null);
90 return setter ? setterBuilder : getterBuilder; 90 return setter ? setterBuilder : getterBuilder;
91 } 91 }
92 92
93 bool hasLocalLabel(String name) => labels != null && labels.containsKey(name); 93 bool hasLocalLabel(String name) => labels != null && labels.containsKey(name);
94 94
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 // TODO(ahe): Rename to extend or something. 126 // TODO(ahe): Rename to extend or something.
127 void operator []=(String name, Builder member) { 127 void operator []=(String name, Builder member) {
128 if (isModifiable) { 128 if (isModifiable) {
129 local[name] = member; 129 local[name] = member;
130 } else { 130 } else {
131 internalError("Can't extend an unmodifiable scope."); 131 internalError("Can't extend an unmodifiable scope.");
132 } 132 }
133 } 133 }
134 } 134 }
135 135
136 class AccessErrorBuilder extends Builder { 136 abstract class ProblemBuilder extends Builder {
137 final String name;
138
137 final Builder builder; 139 final Builder builder;
138 140
139 AccessErrorBuilder(this.builder, int charOffset, Uri fileUri) 141 ProblemBuilder(this.name, this.builder, int charOffset, Uri fileUri)
140 : super(null, charOffset, fileUri); 142 : super(null, charOffset, fileUri);
141 143
144 get target => null;
145
146 bool get hasProblem => true;
147
148 String get message;
149
150 @override
151 String get fullNameForErrors => name;
152 }
153
154 /// Represents a [builder] that's being accessed incorrectly. For example, an
155 /// attempt to write to a final field, or to read from a setter.
156 class AccessErrorBuilder extends ProblemBuilder {
157 AccessErrorBuilder(String name, Builder builder, int charOffset, Uri fileUri)
158 : super(name, builder, charOffset, fileUri);
159
142 Builder get parent => builder; 160 Builder get parent => builder;
143 161
144 get target => null;
145
146 bool get isFinal => builder.isFinal; 162 bool get isFinal => builder.isFinal;
147 163
148 bool get isField => builder.isField; 164 bool get isField => builder.isField;
149 165
150 bool get isRegularMethod => builder.isRegularMethod; 166 bool get isRegularMethod => builder.isRegularMethod;
151 167
152 bool get isGetter => !builder.isGetter; 168 bool get isGetter => !builder.isGetter;
153 169
154 bool get isSetter => !builder.isSetter; 170 bool get isSetter => !builder.isSetter;
155 171
156 bool get isInstanceMember => builder.isInstanceMember; 172 bool get isInstanceMember => builder.isInstanceMember;
157 173
158 bool get isStatic => builder.isStatic; 174 bool get isStatic => builder.isStatic;
159 175
160 bool get isTopLevel => builder.isTopLevel; 176 bool get isTopLevel => builder.isTopLevel;
161 177
162 bool get isTypeDeclaration => builder.isTypeDeclaration; 178 bool get isTypeDeclaration => builder.isTypeDeclaration;
163 179
164 bool get isLocal => builder.isLocal; 180 bool get isLocal => builder.isLocal;
165 181
166 bool get hasProblem => true; 182 String get message => "Access error: '$name'.";
167 } 183 }
168 184
169 class AmbiguousBuilder extends Builder { 185 class AmbiguousBuilder extends ProblemBuilder {
170 final Builder builder; 186 AmbiguousBuilder(String name, Builder builder, int charOffset, Uri fileUri)
187 : super(name, builder, charOffset, fileUri);
171 188
172 AmbiguousBuilder(this.builder, int charOffset, Uri fileUri) 189 String get message => "Duplicated named: '$name'.";
173 : super(null, charOffset, fileUri);
174
175 get target => null;
176
177 bool get hasProblem => true;
178 } 190 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/builder/prefix_builder.dart ('k') | pkg/front_end/lib/src/fasta/builder/type_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698