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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart

Issue 2777883002: Remove Fasta's copy of accessors.dart. (Closed)
Patch Set: Created 3 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
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.builder_accessors; 5 library fasta.builder_accessors;
6 6
7 export 'frontend_accessors.dart' show wrapInvalid; 7 export 'package:kernel/frontend/accessors.dart' show wrapInvalid;
8 8
9 import 'frontend_accessors.dart' show Accessor; 9 import 'package:kernel/frontend/accessors.dart'
10 show Accessor, buildIsNull, makeLet;
10 11
11 import 'package:kernel/ast.dart'; 12 import 'package:kernel/ast.dart';
12 13
13 import '../errors.dart' show internalError; 14 import '../errors.dart' show internalError;
14 15
15 import '../builder/scope.dart' show AccessErrorBuilder, ProblemBuilder; 16 import '../builder/scope.dart' show AccessErrorBuilder, ProblemBuilder;
16 17
17 import 'frontend_accessors.dart' as kernel 18 import 'package:kernel/frontend/accessors.dart' as kernel
18 show 19 show
19 IndexAccessor, 20 IndexAccessor,
20 NullAwarePropertyAccessor, 21 NullAwarePropertyAccessor,
21 PropertyAccessor, 22 PropertyAccessor,
22 StaticAccessor, 23 StaticAccessor,
23 SuperIndexAccessor, 24 SuperIndexAccessor,
24 SuperPropertyAccessor, 25 SuperPropertyAccessor,
25 ThisIndexAccessor, 26 ThisIndexAccessor,
26 ThisPropertyAccessor, 27 ThisPropertyAccessor,
27 VariableAccessor; 28 VariableAccessor;
28 29
29 import 'frontend_accessors.dart' show buildIsNull, makeLet;
30
31 import 'kernel_builder.dart' 30 import 'kernel_builder.dart'
32 show Builder, KernelClassBuilder, PrefixBuilder, TypeDeclarationBuilder; 31 show Builder, KernelClassBuilder, PrefixBuilder, TypeDeclarationBuilder;
33 32
34 import '../names.dart' show callName; 33 import '../names.dart' show callName;
35 34
36 abstract class BuilderHelper { 35 abstract class BuilderHelper {
37 Uri get uri; 36 Uri get uri;
38 37
39 Constructor lookupConstructor(Name name, {bool isSuper}); 38 Constructor lookupConstructor(Name name, {bool isSuper});
40 39
41 Expression toSuperMethodInvocation(MethodInvocation node); 40 Expression toSuperMethodInvocation(MethodInvocation node);
42 41
43 Expression toValue(node); 42 Expression toValue(node);
44 43
45 Member lookupSuperMember(Name name, {bool isSetter: false}); 44 Member lookupSuperMember(Name name, {bool isSetter: false});
46 45
47 builderToFirstExpression(Builder builder, String name, int charOffset); 46 builderToFirstExpression(Builder builder, String name, int offset);
48 47
49 finishSend(Object receiver, Arguments arguments, int charOffset); 48 finishSend(Object receiver, Arguments arguments, int offset);
50 49
51 Expression buildCompileTimeError(error, [int charOffset]); 50 Expression buildCompileTimeError(error, [int offset]);
52 51
53 Initializer buildCompileTimeErrorIntializer(error, [int charOffset]); 52 Initializer buildCompileTimeErrorIntializer(error, [int offset]);
54 53
55 Expression buildStaticInvocation(Procedure target, Arguments arguments); 54 Expression buildStaticInvocation(Procedure target, Arguments arguments);
56 55
57 Expression buildProblemExpression(ProblemBuilder builder, int charOffset); 56 Expression buildProblemExpression(ProblemBuilder builder, int offset);
58 57
59 Expression throwNoSuchMethodError( 58 Expression throwNoSuchMethodError(
60 String name, Arguments arguments, int charOffset, 59 String name, Arguments arguments, int offset,
61 {bool isSuper: false, isGetter: false, isSetter: false}); 60 {bool isSuper: false, isGetter: false, isSetter: false});
62 } 61 }
63 62
64 abstract class BuilderAccessor implements Accessor { 63 abstract class BuilderAccessor implements Accessor {
ahe 2017/03/27 10:47:26 I'll rename this to FastaAccessor in the next CL.
65 BuilderHelper get helper; 64 BuilderHelper get helper;
66 65
67 int get charOffset;
68
69 String get plainNameForRead; 66 String get plainNameForRead;
70 67
71 Uri get uri => helper.uri; 68 Uri get uri => helper.uri;
72 69
73 String get plainNameForWrite => plainNameForRead; 70 String get plainNameForWrite => plainNameForRead;
74 71
75 Expression buildForEffect() => buildSimpleRead(); 72 Expression buildForEffect() => buildSimpleRead();
76 73
77 Initializer buildFieldInitializer( 74 Initializer buildFieldInitializer(
78 Map<String, FieldInitializer> initializers) { 75 Map<String, FieldInitializer> initializers) {
79 // TODO(ahe): This error message is really bad. 76 // TODO(ahe): This error message is really bad.
80 return helper.buildCompileTimeErrorIntializer( 77 return helper.buildCompileTimeErrorIntializer(
81 "Can't use $plainNameForRead here.", charOffset); 78 "Can't use $plainNameForRead here.", offset);
82 } 79 }
83 80
84 Expression makeInvalidRead() { 81 Expression makeInvalidRead() {
85 return buildThrowNoSuchMethodError(new Arguments.empty(), isGetter: true); 82 return buildThrowNoSuchMethodError(new Arguments.empty(), isGetter: true);
86 } 83 }
87 84
88 Expression makeInvalidWrite(Expression value) { 85 Expression makeInvalidWrite(Expression value) {
89 return buildThrowNoSuchMethodError(new Arguments(<Expression>[value]), 86 return buildThrowNoSuchMethodError(new Arguments(<Expression>[value]),
90 isSetter: true); 87 isSetter: true);
91 } 88 }
92 89
93 /* Expression | BuilderAccessor */ doInvocation( 90 /* Expression | BuilderAccessor */ doInvocation(
94 int charOffset, Arguments arguments); 91 int offset, Arguments arguments);
95 92
96 /* Expression | BuilderAccessor */ buildPropertyAccess( 93 /* Expression | BuilderAccessor */ buildPropertyAccess(
97 IncompleteSend send, bool isNullAware) { 94 IncompleteSend send, bool isNullAware) {
98 if (send is SendAccessor) { 95 if (send is SendAccessor) {
99 return buildMethodInvocation( 96 return buildMethodInvocation(
100 buildSimpleRead(), send.name, send.arguments, send.charOffset, 97 buildSimpleRead(), send.name, send.arguments, send.offset,
101 isNullAware: isNullAware); 98 isNullAware: isNullAware);
102 } else { 99 } else {
103 return PropertyAccessor.make(helper, send.charOffset, buildSimpleRead(), 100 return PropertyAccessor.make(helper, send.offset, buildSimpleRead(),
104 send.name, null, null, isNullAware); 101 send.name, null, null, isNullAware);
105 } 102 }
106 } 103 }
107 104
108 /* Expression | BuilderAccessor */ buildThrowNoSuchMethodError( 105 /* Expression | BuilderAccessor */ buildThrowNoSuchMethodError(
109 Arguments arguments, 106 Arguments arguments,
110 {bool isSuper: false, 107 {bool isSuper: false,
111 isGetter: false, 108 isGetter: false,
112 isSetter: false, 109 isSetter: false,
113 String name, 110 String name,
114 int charOffset}) { 111 int offset}) {
115 return helper.throwNoSuchMethodError( 112 return helper.throwNoSuchMethodError(
116 name ?? plainNameForWrite, arguments, charOffset ?? this.charOffset, 113 name ?? plainNameForWrite, arguments, offset ?? this.offset,
117 isGetter: isGetter, isSetter: isSetter, isSuper: isSuper); 114 isGetter: isGetter, isSetter: isSetter, isSuper: isSuper);
118 } 115 }
119 116
120 bool get isThisPropertyAccessor => false; 117 bool get isThisPropertyAccessor => false;
121 } 118 }
122 119
123 abstract class CompileTimeErrorAccessor implements BuilderAccessor { 120 abstract class CompileTimeErrorAccessor implements BuilderAccessor {
121 @override
122 Expression get builtBinary => internalError("Unsupported operation.");
123
124 @override
125 void set builtBinary(Expression expression) {
126 internalError("Unsupported operation.");
127 }
128
129 @override
130 Expression get builtGetter => internalError("Unsupported operation.");
131
132 @override
133 void set builtGetter(Expression expression) {
134 internalError("Unsupported operation.");
135 }
136
124 Expression buildError(); 137 Expression buildError();
125 138
126 Name get name => internalError("Unsupported operation."); 139 Name get name => internalError("Unsupported operation.");
127 140
128 String get plainNameForRead => name.name; 141 String get plainNameForRead => name.name;
129 142
130 withReceiver(Object receiver, {bool isNullAware}) => this; 143 withReceiver(Object receiver, {bool isNullAware}) => this;
131 144
132 Initializer buildFieldInitializer( 145 Initializer buildFieldInitializer(
133 Map<String, FieldInitializer> initializers) { 146 Map<String, FieldInitializer> initializers) {
134 return new LocalInitializer(new VariableDeclaration.forValue(buildError())); 147 return new LocalInitializer(new VariableDeclaration.forValue(buildError()));
135 } 148 }
136 149
137 doInvocation(int charOffset, Arguments arguments) => this; 150 doInvocation(int offset, Arguments arguments) => this;
138 151
139 buildPropertyAccess(IncompleteSend send, bool isNullAware) => this; 152 buildPropertyAccess(IncompleteSend send, bool isNullAware) => this;
140 153
141 buildThrowNoSuchMethodError(Arguments arguments, 154 buildThrowNoSuchMethodError(Arguments arguments,
142 {bool isSuper: false, 155 {bool isSuper: false,
143 isGetter: false, 156 isGetter: false,
144 isSetter: false, 157 isSetter: false,
145 String name, 158 String name,
146 int charOffset}) { 159 int offset}) {
147 return this; 160 return this;
148 } 161 }
149 162
150 Expression buildAssignment(Expression value, {bool voidContext: false}) { 163 Expression buildAssignment(Expression value, {bool voidContext: false}) {
151 return buildError(); 164 return buildError();
152 } 165 }
153 166
154 Expression buildCompoundAssignment( 167 Expression buildCompoundAssignment(Name binaryOperator, Expression value,
155 Name binaryOperator, Expression value, int charOffset, 168 {int offset: TreeNode.noOffset,
156 {bool voidContext: false, Procedure interfaceTarget}) { 169 bool voidContext: false,
170 Procedure interfaceTarget}) {
157 return buildError(); 171 return buildError();
158 } 172 }
159 173
160 Expression buildPrefixIncrement(Name binaryOperator, int charOffset, 174 Expression buildPrefixIncrement(Name binaryOperator,
161 {bool voidContext: false, Procedure interfaceTarget}) { 175 {int offset: TreeNode.noOffset,
176 bool voidContext: false,
177 Procedure interfaceTarget}) {
162 return buildError(); 178 return buildError();
163 } 179 }
164 180
165 Expression buildPostfixIncrement(Name binaryOperator, int charOffset, 181 Expression buildPostfixIncrement(Name binaryOperator,
166 {bool voidContext: false, Procedure interfaceTarget}) { 182 {int offset: TreeNode.noOffset,
183 bool voidContext: false,
184 Procedure interfaceTarget}) {
167 return buildError(); 185 return buildError();
168 } 186 }
169 187
170 Expression buildNullAwareAssignment(Expression value, DartType type, 188 Expression buildNullAwareAssignment(Expression value, DartType type,
171 {bool voidContext: false}) { 189 {bool voidContext: false}) {
172 return buildError(); 190 return buildError();
173 } 191 }
174 192
175 Expression buildSimpleRead() => buildError(); 193 Expression buildSimpleRead() => buildError();
176 194
177 Expression makeInvalidRead() => buildError(); 195 Expression makeInvalidRead() => buildError();
178 196
179 Expression makeInvalidWrite(Expression value) => buildError(); 197 Expression makeInvalidWrite(Expression value) => buildError();
180 } 198 }
181 199
182 class ThisAccessor extends BuilderAccessor { 200 class ThisAccessor extends BuilderAccessor {
183 final BuilderHelper helper; 201 final BuilderHelper helper;
184 202
185 final int charOffset; 203 final int offset;
186 204
187 final bool isInitializer; 205 final bool isInitializer;
188 206
189 final bool isSuper; 207 final bool isSuper;
190 208
191 ThisAccessor(this.helper, this.charOffset, this.isInitializer, 209 ThisAccessor(this.helper, this.offset, this.isInitializer,
192 {this.isSuper: false}); 210 {this.isSuper: false});
193 211
212 @override
213 Expression get builtBinary => internalError("Unsupported operation.");
214
215 @override
216 void set builtBinary(Expression expression) {
217 internalError("Unsupported operation.");
218 }
219
220 @override
221 Expression get builtGetter => internalError("Unsupported operation.");
222
223 @override
224 void set builtGetter(Expression expression) {
225 internalError("Unsupported operation.");
226 }
227
194 String get plainNameForRead => internalError(isSuper ? "super" : "this"); 228 String get plainNameForRead => internalError(isSuper ? "super" : "this");
195 229
196 Expression buildSimpleRead() { 230 Expression buildSimpleRead() {
197 if (!isSuper) { 231 if (!isSuper) {
198 return new ThisExpression(); 232 return new ThisExpression();
199 } else { 233 } else {
200 return helper.buildCompileTimeError( 234 return helper.buildCompileTimeError(
201 "Can't use `super` as an expression.", charOffset); 235 "Can't use `super` as an expression.", offset);
202 } 236 }
203 } 237 }
204 238
205 Initializer buildFieldInitializer( 239 Initializer buildFieldInitializer(
206 Map<String, FieldInitializer> initializers) { 240 Map<String, FieldInitializer> initializers) {
207 String keyword = isSuper ? "super" : "this"; 241 String keyword = isSuper ? "super" : "this";
208 return helper.buildCompileTimeErrorIntializer( 242 return helper.buildCompileTimeErrorIntializer(
209 "Can't use '$keyword' here, did you mean '$keyword()'?", charOffset); 243 "Can't use '$keyword' here, did you mean '$keyword()'?", offset);
210 } 244 }
211 245
212 buildPropertyAccess(IncompleteSend send, bool isNullAware) { 246 buildPropertyAccess(IncompleteSend send, bool isNullAware) {
213 if (isInitializer && send is SendAccessor) { 247 if (isInitializer && send is SendAccessor) {
214 return buildConstructorInitializer( 248 return buildConstructorInitializer(
215 send.charOffset, send.name, send.arguments); 249 send.offset, send.name, send.arguments);
216 } 250 }
217 if (send is SendAccessor) { 251 if (send is SendAccessor) {
218 // Notice that 'this' or 'super' can't be null. So we can ignore the 252 // Notice that 'this' or 'super' can't be null. So we can ignore the
219 // value of [isNullAware]. 253 // value of [isNullAware].
220 MethodInvocation result = buildMethodInvocation( 254 MethodInvocation result = buildMethodInvocation(
221 new ThisExpression(), send.name, send.arguments, charOffset); 255 new ThisExpression(), send.name, send.arguments, offset);
222 return isSuper ? helper.toSuperMethodInvocation(result) : result; 256 return isSuper ? helper.toSuperMethodInvocation(result) : result;
223 } else { 257 } else {
224 if (isSuper) { 258 if (isSuper) {
225 Member getter = helper.lookupSuperMember(send.name); 259 Member getter = helper.lookupSuperMember(send.name);
226 Member setter = helper.lookupSuperMember(send.name, isSetter: true); 260 Member setter = helper.lookupSuperMember(send.name, isSetter: true);
227 return new SuperPropertyAccessor( 261 return new SuperPropertyAccessor(
228 helper, send.charOffset, send.name, getter, setter); 262 helper, send.offset, send.name, getter, setter);
229 } else { 263 } else {
230 return new ThisPropertyAccessor( 264 return new ThisPropertyAccessor(
231 helper, send.charOffset, send.name, null, null); 265 helper, send.offset, send.name, null, null);
232 } 266 }
233 } 267 }
234 } 268 }
235 269
236 doInvocation(int charOffset, Arguments arguments) { 270 doInvocation(int offset, Arguments arguments) {
237 if (isInitializer) { 271 if (isInitializer) {
238 return buildConstructorInitializer(charOffset, new Name(""), arguments); 272 return buildConstructorInitializer(offset, new Name(""), arguments);
239 } else { 273 } else {
240 return buildMethodInvocation( 274 return buildMethodInvocation(
241 new ThisExpression(), callName, arguments, charOffset); 275 new ThisExpression(), callName, arguments, offset);
242 } 276 }
243 } 277 }
244 278
245 Initializer buildConstructorInitializer( 279 Initializer buildConstructorInitializer(
246 int charOffset, Name name, Arguments arguments) { 280 int offset, Name name, Arguments arguments) {
247 Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper); 281 Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
248 Initializer result; 282 Initializer result;
249 if (constructor == null) { 283 if (constructor == null) {
250 result = new LocalInitializer(new VariableDeclaration.forValue( 284 result = new LocalInitializer(new VariableDeclaration.forValue(
251 buildThrowNoSuchMethodError(arguments, 285 buildThrowNoSuchMethodError(arguments,
252 isSuper: isSuper, name: name.name, charOffset: charOffset))); 286 isSuper: isSuper, name: name.name, offset: offset)));
253 } else if (isSuper) { 287 } else if (isSuper) {
254 result = new SuperInitializer(constructor, arguments); 288 result = new SuperInitializer(constructor, arguments);
255 } else { 289 } else {
256 result = new RedirectingInitializer(constructor, arguments); 290 result = new RedirectingInitializer(constructor, arguments);
257 } 291 }
258 return result..fileOffset = charOffset; 292 return result..fileOffset = offset;
259 } 293 }
260 294
261 Expression buildAssignment(Expression value, {bool voidContext: false}) { 295 Expression buildAssignment(Expression value, {bool voidContext: false}) {
262 return buildAssignmentError(); 296 return buildAssignmentError();
263 } 297 }
264 298
265 Expression buildNullAwareAssignment(Expression value, DartType type, 299 Expression buildNullAwareAssignment(Expression value, DartType type,
266 {bool voidContext: false}) { 300 {bool voidContext: false}) {
267 return buildAssignmentError(); 301 return buildAssignmentError();
268 } 302 }
269 303
270 Expression buildCompoundAssignment( 304 Expression buildCompoundAssignment(Name binaryOperator, Expression value,
271 Name binaryOperator, Expression value, int charOffset, 305 {int offset: TreeNode.noOffset,
272 {bool voidContext: false, Procedure interfaceTarget}) { 306 bool voidContext: false,
307 Procedure interfaceTarget}) {
273 return buildAssignmentError(); 308 return buildAssignmentError();
274 } 309 }
275 310
276 Expression buildPrefixIncrement(Name binaryOperator, int charOffset, 311 Expression buildPrefixIncrement(Name binaryOperator,
277 {bool voidContext: false, Procedure interfaceTarget}) { 312 {int offset: TreeNode.noOffset,
313 bool voidContext: false,
314 Procedure interfaceTarget}) {
278 return buildAssignmentError(); 315 return buildAssignmentError();
279 } 316 }
280 317
281 Expression buildPostfixIncrement(Name binaryOperator, int charOffset, 318 Expression buildPostfixIncrement(Name binaryOperator,
282 {bool voidContext: false, Procedure interfaceTarget}) { 319 {int offset: TreeNode.noOffset,
320 bool voidContext: false,
321 Procedure interfaceTarget}) {
283 return buildAssignmentError(); 322 return buildAssignmentError();
284 } 323 }
285 324
286 Expression buildAssignmentError() { 325 Expression buildAssignmentError() {
287 String message = 326 String message =
288 isSuper ? "Can't assign to 'super'." : "Can't assign to 'this'."; 327 isSuper ? "Can't assign to 'super'." : "Can't assign to 'this'.";
289 return helper.buildCompileTimeError(message, charOffset); 328 return helper.buildCompileTimeError(message, offset);
290 } 329 }
291 330
292 toString() => "ThisAccessor($charOffset${isSuper ? ', super' : ''})"; 331 toString() => "ThisAccessor($offset${isSuper ? ', super' : ''})";
293 } 332 }
294 333
295 abstract class IncompleteSend extends BuilderAccessor { 334 abstract class IncompleteSend extends BuilderAccessor {
296 final BuilderHelper helper; 335 final BuilderHelper helper;
297 336
298 final int charOffset; 337 @override
338 final int offset;
299 339
300 final Name name; 340 final Name name;
301 341
302 IncompleteSend(this.helper, this.charOffset, this.name); 342 IncompleteSend(this.helper, this.offset, this.name);
343
344 @override
345 Expression get builtBinary => internalError("Unsupported operation.");
346
347 @override
348 void set builtBinary(Expression expression) {
349 internalError("Unsupported operation.");
350 }
351
352 @override
353 Expression get builtGetter => internalError("Unsupported operation.");
354
355 @override
356 void set builtGetter(Expression expression) {
357 internalError("Unsupported operation.");
358 }
303 359
304 withReceiver(Object receiver, {bool isNullAware}); 360 withReceiver(Object receiver, {bool isNullAware});
305 } 361 }
306 362
307 class IncompleteError extends IncompleteSend with CompileTimeErrorAccessor { 363 class IncompleteError extends IncompleteSend with CompileTimeErrorAccessor {
308 final Object error; 364 final Object error;
309 365
310 IncompleteError(BuilderHelper helper, int charOffset, this.error) 366 IncompleteError(BuilderHelper helper, int offset, this.error)
311 : super(helper, charOffset, null); 367 : super(helper, offset, null);
312 368
313 Expression buildError() { 369 Expression buildError() {
314 return helper.buildCompileTimeError(error, charOffset); 370 return helper.buildCompileTimeError(error, offset);
315 } 371 }
316 } 372 }
317 373
318 class SendAccessor extends IncompleteSend { 374 class SendAccessor extends IncompleteSend {
319 final Arguments arguments; 375 final Arguments arguments;
320 376
321 SendAccessor(BuilderHelper helper, int charOffset, Name name, this.arguments) 377 SendAccessor(BuilderHelper helper, int offset, Name name, this.arguments)
322 : super(helper, charOffset, name) { 378 : super(helper, offset, name) {
323 assert(arguments != null); 379 assert(arguments != null);
324 } 380 }
325 381
326 String get plainNameForRead => name.name; 382 String get plainNameForRead => name.name;
327 383
328 Expression buildSimpleRead() { 384 Expression buildSimpleRead() {
329 return internalError("Unhandled"); 385 return internalError("Unhandled");
330 } 386 }
331 387
332 Expression buildAssignment(Expression value, {bool voidContext: false}) { 388 Expression buildAssignment(Expression value, {bool voidContext: false}) {
333 return internalError("Unhandled"); 389 return internalError("Unhandled");
334 } 390 }
335 391
336 withReceiver(Object receiver, {bool isNullAware: false}) { 392 withReceiver(Object receiver, {bool isNullAware: false}) {
337 if (receiver is TypeDeclarationBuilder) { 393 if (receiver is TypeDeclarationBuilder) {
338 /// `SomeType?.toString` is the same as `SomeType.toString`, not 394 /// `SomeType?.toString` is the same as `SomeType.toString`, not
339 /// `(SomeType).toString`. 395 /// `(SomeType).toString`.
340 isNullAware = false; 396 isNullAware = false;
341 } 397 }
342 if (receiver is BuilderAccessor) { 398 if (receiver is BuilderAccessor) {
343 return receiver.buildPropertyAccess(this, isNullAware); 399 return receiver.buildPropertyAccess(this, isNullAware);
344 } 400 }
345 if (receiver is PrefixBuilder) { 401 if (receiver is PrefixBuilder) {
346 PrefixBuilder prefix = receiver; 402 PrefixBuilder prefix = receiver;
347 receiver = helper.builderToFirstExpression( 403 receiver = helper.builderToFirstExpression(
348 prefix.exports[name.name], "${prefix.name}.${name.name}", charOffset); 404 prefix.exports[name.name], "${prefix.name}.${name.name}", offset);
349 return helper.finishSend(receiver, arguments, charOffset); 405 return helper.finishSend(receiver, arguments, offset);
350 } 406 }
351 Expression result; 407 Expression result;
352 if (receiver is KernelClassBuilder) { 408 if (receiver is KernelClassBuilder) {
353 Builder builder = receiver.findStaticBuilder(name.name, charOffset, uri); 409 Builder builder = receiver.findStaticBuilder(name.name, offset, uri);
354 if (builder == null) { 410 if (builder == null) {
355 return buildThrowNoSuchMethodError(arguments); 411 return buildThrowNoSuchMethodError(arguments);
356 } 412 }
357 if (builder.hasProblem) { 413 if (builder.hasProblem) {
358 result = helper.buildProblemExpression(builder, charOffset); 414 result = helper.buildProblemExpression(builder, offset);
359 } else { 415 } else {
360 Member target = builder.target; 416 Member target = builder.target;
361 if (target != null) { 417 if (target != null) {
362 if (target is Field) { 418 if (target is Field) {
363 result = buildMethodInvocation(new StaticGet(target), callName, 419 result = buildMethodInvocation(new StaticGet(target), callName,
364 arguments, charOffset + (target.name?.name?.length ?? 0), 420 arguments, offset + (target.name?.name?.length ?? 0),
365 isNullAware: isNullAware); 421 isNullAware: isNullAware);
366 } else { 422 } else {
367 result = helper.buildStaticInvocation(target, arguments) 423 result = helper.buildStaticInvocation(target, arguments)
368 ..fileOffset = charOffset; 424 ..fileOffset = offset;
369 } 425 }
370 } else { 426 } else {
371 result = buildThrowNoSuchMethodError(arguments) 427 result = buildThrowNoSuchMethodError(arguments)..fileOffset = offset;
372 ..fileOffset = charOffset;
373 } 428 }
374 } 429 }
375 } else { 430 } else {
376 result = buildMethodInvocation( 431 result = buildMethodInvocation(
377 helper.toValue(receiver), name, arguments, charOffset, 432 helper.toValue(receiver), name, arguments, offset,
378 isNullAware: isNullAware); 433 isNullAware: isNullAware);
379 } 434 }
380 return result; 435 return result;
381 } 436 }
382 437
383 Expression buildNullAwareAssignment(Expression value, DartType type, 438 Expression buildNullAwareAssignment(Expression value, DartType type,
384 {bool voidContext: false}) { 439 {bool voidContext: false}) {
385 return internalError("Unhandled"); 440 return internalError("Unhandled");
386 } 441 }
387 442
388 Expression buildCompoundAssignment( 443 Expression buildCompoundAssignment(Name binaryOperator, Expression value,
389 Name binaryOperator, Expression value, int charOffset, 444 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
390 {bool voidContext: false, Procedure interfaceTarget}) {
391 return internalError("Unhandled"); 445 return internalError("Unhandled");
392 } 446 }
393 447
394 Expression buildPrefixIncrement(Name binaryOperator, int charOffset, 448 Expression buildPrefixIncrement(Name binaryOperator,
395 {bool voidContext: false, Procedure interfaceTarget}) { 449 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
396 return internalError("Unhandled"); 450 return internalError("Unhandled");
397 } 451 }
398 452
399 Expression buildPostfixIncrement(Name binaryOperator, int charOffset, 453 Expression buildPostfixIncrement(Name binaryOperator,
400 {bool voidContext: false, Procedure interfaceTarget}) { 454 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
401 return internalError("Unhandled"); 455 return internalError("Unhandled");
402 } 456 }
403 457
404 Expression doInvocation(int charOffset, Arguments arguments) { 458 Expression doInvocation(int offset, Arguments arguments) {
405 return internalError("Unhandled"); 459 return internalError("Unhandled");
406 } 460 }
407 461
408 toString() => "SendAccessor($charOffset, $name, $arguments)"; 462 toString() => "SendAccessor($offset, $name, $arguments)";
409 } 463 }
410 464
411 class IncompletePropertyAccessor extends IncompleteSend { 465 class IncompletePropertyAccessor extends IncompleteSend {
412 IncompletePropertyAccessor(BuilderHelper helper, int charOffset, Name name) 466 IncompletePropertyAccessor(BuilderHelper helper, int offset, Name name)
413 : super(helper, charOffset, name); 467 : super(helper, offset, name);
414 468
415 String get plainNameForRead => name.name; 469 String get plainNameForRead => name.name;
416 470
417 Expression buildSimpleRead() => internalError("Unhandled"); 471 Expression buildSimpleRead() => internalError("Unhandled");
418 472
419 Expression buildAssignment(Expression value, {bool voidContext: false}) { 473 Expression buildAssignment(Expression value, {bool voidContext: false}) {
420 return internalError("Unhandled"); 474 return internalError("Unhandled");
421 } 475 }
422 476
423 withReceiver(Object receiver, {bool isNullAware: false}) { 477 withReceiver(Object receiver, {bool isNullAware: false}) {
424 if (receiver is TypeDeclarationBuilder) { 478 if (receiver is TypeDeclarationBuilder) {
425 /// For reasons beyond comprehension, `SomeType?.toString` is the same as 479 /// For reasons beyond comprehension, `SomeType?.toString` is the same as
426 /// `SomeType.toString`, not `(SomeType).toString`. WTAF!?! 480 /// `SomeType.toString`, not `(SomeType).toString`. WTAF!?!
427 // 481 //
428 isNullAware = false; 482 isNullAware = false;
429 } 483 }
430 if (receiver is BuilderAccessor) { 484 if (receiver is BuilderAccessor) {
431 return receiver.buildPropertyAccess(this, isNullAware); 485 return receiver.buildPropertyAccess(this, isNullAware);
432 } 486 }
433 if (receiver is PrefixBuilder) { 487 if (receiver is PrefixBuilder) {
434 PrefixBuilder prefix = receiver; 488 PrefixBuilder prefix = receiver;
435 return helper.builderToFirstExpression( 489 return helper.builderToFirstExpression(
436 prefix.exports[name.name], name.name, charOffset); 490 prefix.exports[name.name], name.name, offset);
437 } 491 }
438 if (receiver is KernelClassBuilder) { 492 if (receiver is KernelClassBuilder) {
439 Builder builder = receiver.findStaticBuilder(name.name, charOffset, uri); 493 Builder builder = receiver.findStaticBuilder(name.name, offset, uri);
440 if (builder == null) { 494 if (builder == null) {
441 // If we find a setter, [builder] is an [AccessErrorBuilder], not null. 495 // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
442 return buildThrowNoSuchMethodError(new Arguments.empty(), 496 return buildThrowNoSuchMethodError(new Arguments.empty(),
443 isGetter: true); 497 isGetter: true);
444 } 498 }
445 Builder setter; 499 Builder setter;
446 if (builder.isSetter) { 500 if (builder.isSetter) {
447 setter = builder; 501 setter = builder;
448 } else if (builder.isGetter) { 502 } else if (builder.isGetter) {
449 setter = receiver.findStaticBuilder(name.name, charOffset, uri, 503 setter =
450 isSetter: true); 504 receiver.findStaticBuilder(name.name, offset, uri, isSetter: true);
451 } else if (builder.isField && !builder.isFinal) { 505 } else if (builder.isField && !builder.isFinal) {
452 setter = builder; 506 setter = builder;
453 } 507 }
454 return new StaticAccessor.fromBuilder( 508 return new StaticAccessor.fromBuilder(helper, builder, offset, setter);
455 helper, builder, charOffset, setter);
456 } 509 }
457 return PropertyAccessor.make(helper, charOffset, helper.toValue(receiver), 510 return PropertyAccessor.make(helper, offset, helper.toValue(receiver), name,
458 name, null, null, isNullAware); 511 null, null, isNullAware);
459 } 512 }
460 513
461 Expression buildNullAwareAssignment(Expression value, DartType type, 514 Expression buildNullAwareAssignment(Expression value, DartType type,
462 {bool voidContext: false}) { 515 {bool voidContext: false}) {
463 return internalError("Unhandled"); 516 return internalError("Unhandled");
464 } 517 }
465 518
466 Expression buildCompoundAssignment( 519 Expression buildCompoundAssignment(Name binaryOperator, Expression value,
467 Name binaryOperator, Expression value, int charOffset, 520 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
468 {bool voidContext: false, Procedure interfaceTarget}) {
469 return internalError("Unhandled"); 521 return internalError("Unhandled");
470 } 522 }
471 523
472 Expression buildPrefixIncrement(Name binaryOperator, int charOffset, 524 Expression buildPrefixIncrement(Name binaryOperator,
473 {bool voidContext: false, Procedure interfaceTarget}) { 525 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
474 return internalError("Unhandled"); 526 return internalError("Unhandled");
475 } 527 }
476 528
477 Expression buildPostfixIncrement(Name binaryOperator, int charOffset, 529 Expression buildPostfixIncrement(Name binaryOperator,
478 {bool voidContext: false, Procedure interfaceTarget}) { 530 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
479 return internalError("Unhandled"); 531 return internalError("Unhandled");
480 } 532 }
481 533
482 Expression doInvocation(int charOffset, Arguments arguments) { 534 Expression doInvocation(int offset, Arguments arguments) {
483 return internalError("Unhandled"); 535 return internalError("Unhandled");
484 } 536 }
485 537
486 toString() => "IncompletePropertyAccessor($charOffset, $name)"; 538 toString() => "IncompletePropertyAccessor($offset, $name)";
487 } 539 }
488 540
489 class IndexAccessor extends kernel.IndexAccessor with BuilderAccessor { 541 class IndexAccessor extends kernel.IndexAccessor with BuilderAccessor {
490 final BuilderHelper helper; 542 final BuilderHelper helper;
491 543
492 IndexAccessor.internal(this.helper, int charOffset, Expression receiver, 544 IndexAccessor.internal(this.helper, int offset, Expression receiver,
493 Expression index, Procedure getter, Procedure setter) 545 Expression index, Procedure getter, Procedure setter)
494 : super.internal(receiver, index, getter, setter, charOffset); 546 : super.internal(receiver, index, getter, setter, offset);
495 547
496 String get plainNameForRead => "[]"; 548 String get plainNameForRead => "[]";
497 549
498 String get plainNameForWrite => "[]="; 550 String get plainNameForWrite => "[]=";
499 551
500 Expression doInvocation(int charOffset, Arguments arguments) { 552 Expression doInvocation(int offset, Arguments arguments) {
501 return buildMethodInvocation( 553 return buildMethodInvocation(
502 buildSimpleRead(), callName, arguments, charOffset); 554 buildSimpleRead(), callName, arguments, offset);
503 } 555 }
504 556
505 toString() => "IndexAccessor()"; 557 toString() => "IndexAccessor()";
506 558
507 static BuilderAccessor make( 559 static BuilderAccessor make(
508 BuilderHelper helper, 560 BuilderHelper helper,
509 int charOffset, 561 int offset,
510 Expression receiver, 562 Expression receiver,
511 Expression index, 563 Expression index,
512 Procedure getter, 564 Procedure getter,
513 Procedure setter) { 565 Procedure setter) {
514 if (receiver is ThisExpression) { 566 if (receiver is ThisExpression) {
515 return new ThisIndexAccessor(helper, charOffset, index, getter, setter); 567 return new ThisIndexAccessor(helper, offset, index, getter, setter);
516 } else { 568 } else {
517 return new IndexAccessor.internal( 569 return new IndexAccessor.internal(
518 helper, charOffset, receiver, index, getter, setter); 570 helper, offset, receiver, index, getter, setter);
519 } 571 }
520 } 572 }
521 } 573 }
522 574
523 class PropertyAccessor extends kernel.PropertyAccessor with BuilderAccessor { 575 class PropertyAccessor extends kernel.PropertyAccessor with BuilderAccessor {
524 final BuilderHelper helper; 576 final BuilderHelper helper;
525 577
526 PropertyAccessor.internal(this.helper, int charOffset, Expression receiver, 578 PropertyAccessor.internal(this.helper, int offset, Expression receiver,
527 Name name, Member getter, Member setter) 579 Name name, Member getter, Member setter)
528 : super.internal(receiver, name, getter, setter, charOffset); 580 : super.internal(receiver, name, getter, setter, offset);
529 581
530 String get plainNameForRead => name.name; 582 String get plainNameForRead => name.name;
531 583
532 bool get isThisPropertyAccessor => receiver is ThisExpression; 584 bool get isThisPropertyAccessor => receiver is ThisExpression;
533 585
534 Expression doInvocation(int charOffset, Arguments arguments) { 586 Expression doInvocation(int offset, Arguments arguments) {
535 return buildMethodInvocation(receiver, name, arguments, charOffset); 587 return buildMethodInvocation(receiver, name, arguments, offset);
536 } 588 }
537 589
538 toString() => "PropertyAccessor()"; 590 toString() => "PropertyAccessor()";
539 591
540 static BuilderAccessor make( 592 static BuilderAccessor make(
541 BuilderHelper helper, 593 BuilderHelper helper,
542 int charOffset, 594 int offset,
543 Expression receiver, 595 Expression receiver,
544 Name name, 596 Name name,
545 Member getter, 597 Member getter,
546 Member setter, 598 Member setter,
547 bool isNullAware) { 599 bool isNullAware) {
548 if (receiver is ThisExpression) { 600 if (receiver is ThisExpression) {
549 return new ThisPropertyAccessor(helper, charOffset, name, getter, setter); 601 return new ThisPropertyAccessor(helper, offset, name, getter, setter);
550 } else { 602 } else {
551 return isNullAware 603 return isNullAware
552 ? new NullAwarePropertyAccessor( 604 ? new NullAwarePropertyAccessor(
553 helper, charOffset, receiver, name, getter, setter, null) 605 helper, offset, receiver, name, getter, setter, null)
554 : new PropertyAccessor.internal( 606 : new PropertyAccessor.internal(
555 helper, charOffset, receiver, name, getter, setter); 607 helper, offset, receiver, name, getter, setter);
556 } 608 }
557 } 609 }
558 } 610 }
559 611
560 class StaticAccessor extends kernel.StaticAccessor with BuilderAccessor { 612 class StaticAccessor extends kernel.StaticAccessor with BuilderAccessor {
561 final BuilderHelper helper; 613 final BuilderHelper helper;
562 614
563 StaticAccessor( 615 StaticAccessor(this.helper, int offset, Member readTarget, Member writeTarget)
564 this.helper, int charOffset, Member readTarget, Member writeTarget) 616 : super(readTarget, writeTarget, offset) {
565 : super(readTarget, writeTarget, charOffset) {
566 assert(readTarget != null || writeTarget != null); 617 assert(readTarget != null || writeTarget != null);
567 } 618 }
568 619
569 factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder, 620 factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder,
570 int charOffset, Builder builderSetter) { 621 int offset, Builder builderSetter) {
571 if (builder is AccessErrorBuilder) { 622 if (builder is AccessErrorBuilder) {
572 AccessErrorBuilder error = builder; 623 AccessErrorBuilder error = builder;
573 builder = error.builder; 624 builder = error.builder;
574 // We should only see an access error here if we've looked up a setter 625 // We should only see an access error here if we've looked up a setter
575 // when not explicitly looking for a setter. 626 // when not explicitly looking for a setter.
576 assert(builder.isSetter); 627 assert(builder.isSetter);
577 } else if (builder.target == null) { 628 } else if (builder.target == null) {
578 return internalError("Unhandled: ${builder}"); 629 return internalError("Unhandled: ${builder}");
579 } 630 }
580 Member getter = builder.target.hasGetter ? builder.target : null; 631 Member getter = builder.target.hasGetter ? builder.target : null;
581 Member setter = builder.target.hasSetter ? builder.target : null; 632 Member setter = builder.target.hasSetter ? builder.target : null;
582 if (setter == null) { 633 if (setter == null) {
583 if (builderSetter?.target?.hasSetter ?? false) { 634 if (builderSetter?.target?.hasSetter ?? false) {
584 setter = builderSetter.target; 635 setter = builderSetter.target;
585 } 636 }
586 } 637 }
587 return new StaticAccessor(helper, charOffset, getter, setter); 638 return new StaticAccessor(helper, offset, getter, setter);
588 } 639 }
589 640
590 String get plainNameForRead => (readTarget ?? writeTarget).name.name; 641 String get plainNameForRead => (readTarget ?? writeTarget).name.name;
591 642
592 Expression doInvocation(int charOffset, Arguments arguments) { 643 Expression doInvocation(int offset, Arguments arguments) {
593 if (readTarget == null || isFieldOrGetter(readTarget)) { 644 if (readTarget == null || isFieldOrGetter(readTarget)) {
594 return buildMethodInvocation(buildSimpleRead(), callName, arguments, 645 return buildMethodInvocation(buildSimpleRead(), callName, arguments,
595 charOffset + (readTarget?.name?.name?.length ?? 0)); 646 offset + (readTarget?.name?.name?.length ?? 0));
596 } else { 647 } else {
597 return helper.buildStaticInvocation(readTarget, arguments) 648 return helper.buildStaticInvocation(readTarget, arguments)
598 ..fileOffset = charOffset; 649 ..fileOffset = offset;
599 } 650 }
600 } 651 }
601 652
602 toString() => "StaticAccessor()"; 653 toString() => "StaticAccessor()";
603 } 654 }
604 655
605 class SuperPropertyAccessor extends kernel.SuperPropertyAccessor 656 class SuperPropertyAccessor extends kernel.SuperPropertyAccessor
606 with BuilderAccessor { 657 with BuilderAccessor {
607 final BuilderHelper helper; 658 final BuilderHelper helper;
608 659
609 SuperPropertyAccessor( 660 SuperPropertyAccessor(
610 this.helper, int charOffset, Name name, Member getter, Member setter) 661 this.helper, int offset, Name name, Member getter, Member setter)
611 : super(name, getter, setter, charOffset); 662 : super(name, getter, setter, offset);
612 663
613 String get plainNameForRead => name.name; 664 String get plainNameForRead => name.name;
614 665
615 Expression doInvocation(int charOffset, Arguments arguments) { 666 Expression doInvocation(int offset, Arguments arguments) {
616 if (getter == null || isFieldOrGetter(getter)) { 667 if (getter == null || isFieldOrGetter(getter)) {
617 return buildMethodInvocation( 668 return buildMethodInvocation(
618 buildSimpleRead(), callName, arguments, charOffset); 669 buildSimpleRead(), callName, arguments, offset);
619 } else { 670 } else {
620 return new DirectMethodInvocation(new ThisExpression(), getter, arguments) 671 return new DirectMethodInvocation(new ThisExpression(), getter, arguments)
621 ..fileOffset = charOffset; 672 ..fileOffset = offset;
622 } 673 }
623 } 674 }
624 675
625 toString() => "SuperPropertyAccessor()"; 676 toString() => "SuperPropertyAccessor()";
626 } 677 }
627 678
628 class ThisIndexAccessor extends kernel.ThisIndexAccessor with BuilderAccessor { 679 class ThisIndexAccessor extends kernel.ThisIndexAccessor with BuilderAccessor {
629 final BuilderHelper helper; 680 final BuilderHelper helper;
630 681
631 final int charOffset; 682 ThisIndexAccessor(this.helper, int offset, Expression index, Procedure getter,
632 683 Procedure setter)
633 ThisIndexAccessor(this.helper, this.charOffset, Expression index, 684 : super(index, getter, setter, offset);
634 Procedure getter, Procedure setter)
635 : super(index, getter, setter);
636 685
637 String get plainNameForRead => "[]"; 686 String get plainNameForRead => "[]";
638 687
639 String get plainNameForWrite => "[]="; 688 String get plainNameForWrite => "[]=";
640 689
641 Expression doInvocation(int charOffset, Arguments arguments) { 690 Expression doInvocation(int offset, Arguments arguments) {
642 return buildMethodInvocation( 691 return buildMethodInvocation(
643 buildSimpleRead(), callName, arguments, charOffset); 692 buildSimpleRead(), callName, arguments, offset);
644 } 693 }
645 694
646 toString() => "ThisIndexAccessor()"; 695 toString() => "ThisIndexAccessor()";
647 } 696 }
648 697
649 class SuperIndexAccessor extends kernel.SuperIndexAccessor 698 class SuperIndexAccessor extends kernel.SuperIndexAccessor
650 with BuilderAccessor { 699 with BuilderAccessor {
651 final BuilderHelper helper; 700 final BuilderHelper helper;
652 701
653 final int charOffset; 702 SuperIndexAccessor(
654 703 this.helper, int offset, Expression index, Member getter, Member setter)
655 SuperIndexAccessor(this.helper, this.charOffset, Expression index, 704 : super(index, getter, setter, offset);
656 Member getter, Member setter)
657 : super(index, getter, setter);
658 705
659 String get plainNameForRead => "[]"; 706 String get plainNameForRead => "[]";
660 707
661 String get plainNameForWrite => "[]="; 708 String get plainNameForWrite => "[]=";
662 709
663 Expression doInvocation(int charOffset, Arguments arguments) { 710 Expression doInvocation(int offset, Arguments arguments) {
664 return buildMethodInvocation( 711 return buildMethodInvocation(
665 buildSimpleRead(), callName, arguments, charOffset); 712 buildSimpleRead(), callName, arguments, offset);
666 } 713 }
667 714
668 toString() => "SuperIndexAccessor()"; 715 toString() => "SuperIndexAccessor()";
669 } 716 }
670 717
671 class ThisPropertyAccessor extends kernel.ThisPropertyAccessor 718 class ThisPropertyAccessor extends kernel.ThisPropertyAccessor
672 with BuilderAccessor { 719 with BuilderAccessor {
673 final BuilderHelper helper; 720 final BuilderHelper helper;
674 721
675 ThisPropertyAccessor( 722 ThisPropertyAccessor(
676 this.helper, int charOffset, Name name, Member getter, Member setter) 723 this.helper, int offset, Name name, Member getter, Member setter)
677 : super(name, getter, setter, charOffset); 724 : super(name, getter, setter, offset);
678 725
679 String get plainNameForRead => name.name; 726 String get plainNameForRead => name.name;
680 727
681 bool get isThisPropertyAccessor => true; 728 bool get isThisPropertyAccessor => true;
682 729
683 Expression doInvocation(int charOffset, Arguments arguments) { 730 Expression doInvocation(int offset, Arguments arguments) {
684 Member interfaceTarget = getter; 731 Member interfaceTarget = getter;
685 if (interfaceTarget is Field) { 732 if (interfaceTarget is Field) {
686 // TODO(ahe): In strong mode we should probably rewrite this to 733 // TODO(ahe): In strong mode we should probably rewrite this to
687 // `this.name.call(arguments)`. 734 // `this.name.call(arguments)`.
688 interfaceTarget = null; 735 interfaceTarget = null;
689 } 736 }
690 return buildMethodInvocation( 737 return buildMethodInvocation(new ThisExpression(), name, arguments, offset);
691 new ThisExpression(), name, arguments, charOffset);
692 } 738 }
693 739
694 toString() => "ThisPropertyAccessor()"; 740 toString() => "ThisPropertyAccessor()";
695 } 741 }
696 742
697 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor 743 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor
698 with BuilderAccessor { 744 with BuilderAccessor {
699 final BuilderHelper helper; 745 final BuilderHelper helper;
700 746
701 final int charOffset; 747 NullAwarePropertyAccessor(this.helper, int offset, Expression receiver,
702
703 NullAwarePropertyAccessor(this.helper, this.charOffset, Expression receiver,
704 Name name, Member getter, Member setter, DartType type) 748 Name name, Member getter, Member setter, DartType type)
705 : super(receiver, name, getter, setter, type); 749 : super(receiver, name, getter, setter, type, offset);
706 750
707 String get plainNameForRead => name.name; 751 String get plainNameForRead => name.name;
708 752
709 Expression doInvocation(int charOffset, Arguments arguments) { 753 Expression doInvocation(int offset, Arguments arguments) {
710 return internalError("Not implemented yet."); 754 return internalError("Not implemented yet.");
711 } 755 }
712 756
713 toString() => "NullAwarePropertyAccessor()"; 757 toString() => "NullAwarePropertyAccessor()";
714 } 758 }
715 759
716 class VariableAccessor extends kernel.VariableAccessor with BuilderAccessor { 760 class VariableAccessor extends kernel.VariableAccessor with BuilderAccessor {
717 final BuilderHelper helper; 761 final BuilderHelper helper;
718 762
719 VariableAccessor(this.helper, int charOffset, VariableDeclaration variable, 763 VariableAccessor(this.helper, int offset, VariableDeclaration variable,
720 [DartType promotedType]) 764 [DartType promotedType])
721 : super.internal(variable, charOffset, promotedType); 765 : super(variable, promotedType, offset);
722 766
723 String get plainNameForRead => variable.name; 767 String get plainNameForRead => variable.name;
724 768
725 Expression doInvocation(int charOffset, Arguments arguments) { 769 Expression doInvocation(int offset, Arguments arguments) {
726 // Normally the offset is at the start of the token, but in this case, 770 // Normally the offset is at the start of the token, but in this case,
727 // because we insert a '.call', we want it at the end instead. 771 // because we insert a '.call', we want it at the end instead.
728 return buildMethodInvocation(buildSimpleRead(), callName, arguments, 772 return buildMethodInvocation(buildSimpleRead(), callName, arguments,
729 charOffset + (variable.name?.length ?? 0)); 773 offset + (variable.name?.length ?? 0));
730 } 774 }
731 775
732 toString() => "VariableAccessor()"; 776 toString() => "VariableAccessor()";
733 } 777 }
734 778
735 bool isFieldOrGetter(Member member) { 779 bool isFieldOrGetter(Member member) {
736 return member is Field || (member is Procedure && member.isGetter); 780 return member is Field || (member is Procedure && member.isGetter);
737 } 781 }
738 782
739 Expression buildMethodInvocation( 783 Expression buildMethodInvocation(
740 Expression receiver, Name name, Arguments arguments, int charOffset, 784 Expression receiver, Name name, Arguments arguments, int offset,
741 {bool isNullAware: false}) { 785 {bool isNullAware: false}) {
742 if (isNullAware) { 786 if (isNullAware) {
743 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); 787 VariableDeclaration variable = new VariableDeclaration.forValue(receiver);
744 return makeLet( 788 return makeLet(
745 variable, 789 variable,
746 new ConditionalExpression( 790 new ConditionalExpression(
747 buildIsNull(new VariableGet(variable)), 791 buildIsNull(new VariableGet(variable)),
748 new NullLiteral(), 792 new NullLiteral(),
749 new MethodInvocation(new VariableGet(variable), name, arguments) 793 new MethodInvocation(new VariableGet(variable), name, arguments)
750 ..fileOffset = charOffset, 794 ..fileOffset = offset,
751 const DynamicType())); 795 const DynamicType()));
752 } else { 796 } else {
753 return new MethodInvocation(receiver, name, arguments) 797 return new MethodInvocation(receiver, name, arguments)..fileOffset = offset;
754 ..fileOffset = charOffset;
755 } 798 }
756 } 799 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698