| OLD | NEW |
| 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.fasta_accessors; | 5 library fasta.fasta_accessors; |
| 6 | 6 |
| 7 import 'package:kernel/ast.dart' | 7 import 'package:kernel/ast.dart' |
| 8 hide InvalidExpression, InvalidInitializer, InvalidStatement; | 8 hide InvalidExpression, InvalidInitializer, InvalidStatement; |
| 9 | 9 |
| 10 import '../../scanner/token.dart' show Token; | 10 import '../../scanner/token.dart' show Token; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 show | 38 show |
| 39 Builder, | 39 Builder, |
| 40 KernelClassBuilder, | 40 KernelClassBuilder, |
| 41 KernelInvalidTypeBuilder, | 41 KernelInvalidTypeBuilder, |
| 42 LibraryBuilder, | 42 LibraryBuilder, |
| 43 PrefixBuilder, | 43 PrefixBuilder, |
| 44 TypeDeclarationBuilder; | 44 TypeDeclarationBuilder; |
| 45 | 45 |
| 46 import 'kernel_shadow_ast.dart' | 46 import 'kernel_shadow_ast.dart' |
| 47 show | 47 show |
| 48 KernelArguments, | 48 ShadowArguments, |
| 49 KernelComplexAssignment, | 49 ShadowComplexAssignment, |
| 50 KernelIllegalAssignment, | 50 ShadowIllegalAssignment, |
| 51 KernelIndexAssign, | 51 ShadowIndexAssign, |
| 52 KernelPropertyAssign, | 52 ShadowPropertyAssign, |
| 53 KernelStaticAssignment, | 53 ShadowStaticAssignment, |
| 54 KernelThisExpression, | 54 ShadowThisExpression, |
| 55 KernelTypeLiteral, | 55 ShadowTypeLiteral, |
| 56 KernelVariableAssignment; | 56 ShadowVariableAssignment; |
| 57 | 57 |
| 58 import 'utils.dart' show offsetForToken; | 58 import 'utils.dart' show offsetForToken; |
| 59 | 59 |
| 60 abstract class BuilderHelper { | 60 abstract class BuilderHelper { |
| 61 LibraryBuilder get library; | 61 LibraryBuilder get library; |
| 62 | 62 |
| 63 Uri get uri; | 63 Uri get uri; |
| 64 | 64 |
| 65 TypePromoter get typePromoter; | 65 TypePromoter get typePromoter; |
| 66 | 66 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 Expression makeInvalidRead() { | 158 Expression makeInvalidRead() { |
| 159 return buildThrowNoSuchMethodError( | 159 return buildThrowNoSuchMethodError( |
| 160 new NullLiteral()..fileOffset = offsetForToken(token), | 160 new NullLiteral()..fileOffset = offsetForToken(token), |
| 161 new Arguments.empty(), | 161 new Arguments.empty(), |
| 162 isGetter: true); | 162 isGetter: true); |
| 163 } | 163 } |
| 164 | 164 |
| 165 Expression makeInvalidWrite(Expression value) { | 165 Expression makeInvalidWrite(Expression value) { |
| 166 return buildThrowNoSuchMethodError( | 166 return buildThrowNoSuchMethodError( |
| 167 new NullLiteral()..fileOffset = offsetForToken(token), | 167 new NullLiteral()..fileOffset = offsetForToken(token), |
| 168 new KernelArguments(<Expression>[value]), | 168 new ShadowArguments(<Expression>[value]), |
| 169 isSetter: true); | 169 isSetter: true); |
| 170 } | 170 } |
| 171 | 171 |
| 172 /* Expression | FastaAccessor | Initializer */ doInvocation( | 172 /* Expression | FastaAccessor | Initializer */ doInvocation( |
| 173 int offset, Arguments arguments); | 173 int offset, Arguments arguments); |
| 174 | 174 |
| 175 /* Expression | FastaAccessor */ buildPropertyAccess( | 175 /* Expression | FastaAccessor */ buildPropertyAccess( |
| 176 IncompleteSend send, int operatorOffset, bool isNullAware) { | 176 IncompleteSend send, int operatorOffset, bool isNullAware) { |
| 177 if (send is SendAccessor) { | 177 if (send is SendAccessor) { |
| 178 return helper.buildMethodInvocation(buildSimpleRead(), send.name, | 178 return helper.buildMethodInvocation(buildSimpleRead(), send.name, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 200 arguments, offset ?? offsetForToken(this.token), | 200 arguments, offset ?? offsetForToken(this.token), |
| 201 isGetter: isGetter, | 201 isGetter: isGetter, |
| 202 isSetter: isSetter, | 202 isSetter: isSetter, |
| 203 isSuper: isSuper, | 203 isSuper: isSuper, |
| 204 isStatic: isStatic); | 204 isStatic: isStatic); |
| 205 } | 205 } |
| 206 | 206 |
| 207 bool get isThisPropertyAccessor => false; | 207 bool get isThisPropertyAccessor => false; |
| 208 | 208 |
| 209 @override | 209 @override |
| 210 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 210 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 211 new KernelIllegalAssignment(rhs); | 211 new ShadowIllegalAssignment(rhs); |
| 212 } | 212 } |
| 213 | 213 |
| 214 abstract class ErrorAccessor implements FastaAccessor { | 214 abstract class ErrorAccessor implements FastaAccessor { |
| 215 /// Pass [arguments] that must be evaluated before throwing an error. At | 215 /// Pass [arguments] that must be evaluated before throwing an error. At |
| 216 /// most one of [isGetter] and [isSetter] should be true and they're passed | 216 /// most one of [isGetter] and [isSetter] should be true and they're passed |
| 217 /// to [BuilderHelper.buildThrowNoSuchMethodError] if it is used. | 217 /// to [BuilderHelper.buildThrowNoSuchMethodError] if it is used. |
| 218 Expression buildError(Arguments arguments, | 218 Expression buildError(Arguments arguments, |
| 219 {bool isGetter: false, bool isSetter: false, int offset}); | 219 {bool isGetter: false, bool isSetter: false, int offset}); |
| 220 | 220 |
| 221 Name get name => unsupported("name", offsetForToken(token), uri); | 221 Name get name => unsupported("name", offsetForToken(token), uri); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 248 bool isGetter: false, | 248 bool isGetter: false, |
| 249 bool isSetter: false, | 249 bool isSetter: false, |
| 250 bool isStatic: false, | 250 bool isStatic: false, |
| 251 String name, | 251 String name, |
| 252 int offset}) { | 252 int offset}) { |
| 253 return this; | 253 return this; |
| 254 } | 254 } |
| 255 | 255 |
| 256 @override | 256 @override |
| 257 Expression buildAssignment(Expression value, {bool voidContext: false}) { | 257 Expression buildAssignment(Expression value, {bool voidContext: false}) { |
| 258 return buildError(new KernelArguments(<Expression>[value]), isSetter: true); | 258 return buildError(new ShadowArguments(<Expression>[value]), isSetter: true); |
| 259 } | 259 } |
| 260 | 260 |
| 261 @override | 261 @override |
| 262 Expression buildCompoundAssignment(Name binaryOperator, Expression value, | 262 Expression buildCompoundAssignment(Name binaryOperator, Expression value, |
| 263 {int offset: TreeNode.noOffset, | 263 {int offset: TreeNode.noOffset, |
| 264 bool voidContext: false, | 264 bool voidContext: false, |
| 265 Procedure interfaceTarget, | 265 Procedure interfaceTarget, |
| 266 bool isPreIncDec: false}) { | 266 bool isPreIncDec: false}) { |
| 267 return buildError(new KernelArguments(<Expression>[value]), isGetter: true); | 267 return buildError(new ShadowArguments(<Expression>[value]), isGetter: true); |
| 268 } | 268 } |
| 269 | 269 |
| 270 @override | 270 @override |
| 271 Expression buildPrefixIncrement(Name binaryOperator, | 271 Expression buildPrefixIncrement(Name binaryOperator, |
| 272 {int offset: TreeNode.noOffset, | 272 {int offset: TreeNode.noOffset, |
| 273 bool voidContext: false, | 273 bool voidContext: false, |
| 274 Procedure interfaceTarget}) { | 274 Procedure interfaceTarget}) { |
| 275 return buildError(new KernelArguments(<Expression>[new IntLiteral(1)]), | 275 return buildError(new ShadowArguments(<Expression>[new IntLiteral(1)]), |
| 276 isGetter: true); | 276 isGetter: true); |
| 277 } | 277 } |
| 278 | 278 |
| 279 @override | 279 @override |
| 280 Expression buildPostfixIncrement(Name binaryOperator, | 280 Expression buildPostfixIncrement(Name binaryOperator, |
| 281 {int offset: TreeNode.noOffset, | 281 {int offset: TreeNode.noOffset, |
| 282 bool voidContext: false, | 282 bool voidContext: false, |
| 283 Procedure interfaceTarget}) { | 283 Procedure interfaceTarget}) { |
| 284 return buildError(new KernelArguments(<Expression>[new IntLiteral(1)]), | 284 return buildError(new ShadowArguments(<Expression>[new IntLiteral(1)]), |
| 285 isGetter: true); | 285 isGetter: true); |
| 286 } | 286 } |
| 287 | 287 |
| 288 @override | 288 @override |
| 289 Expression buildNullAwareAssignment( | 289 Expression buildNullAwareAssignment( |
| 290 Expression value, DartType type, int offset, | 290 Expression value, DartType type, int offset, |
| 291 {bool voidContext: false}) { | 291 {bool voidContext: false}) { |
| 292 return buildError(new KernelArguments(<Expression>[value]), isSetter: true); | 292 return buildError(new ShadowArguments(<Expression>[value]), isSetter: true); |
| 293 } | 293 } |
| 294 | 294 |
| 295 @override | 295 @override |
| 296 Expression buildSimpleRead() => | 296 Expression buildSimpleRead() => |
| 297 buildError(new Arguments.empty(), isGetter: true); | 297 buildError(new Arguments.empty(), isGetter: true); |
| 298 | 298 |
| 299 @override | 299 @override |
| 300 Expression makeInvalidRead() => | 300 Expression makeInvalidRead() => |
| 301 buildError(new Arguments.empty(), isGetter: true); | 301 buildError(new Arguments.empty(), isGetter: true); |
| 302 | 302 |
| 303 @override | 303 @override |
| 304 Expression makeInvalidWrite(Expression value) { | 304 Expression makeInvalidWrite(Expression value) { |
| 305 return buildError(new KernelArguments(<Expression>[value]), isSetter: true); | 305 return buildError(new ShadowArguments(<Expression>[value]), isSetter: true); |
| 306 } | 306 } |
| 307 } | 307 } |
| 308 | 308 |
| 309 class ThisAccessor extends FastaAccessor { | 309 class ThisAccessor extends FastaAccessor { |
| 310 final BuilderHelper helper; | 310 final BuilderHelper helper; |
| 311 | 311 |
| 312 final Token token; | 312 final Token token; |
| 313 | 313 |
| 314 final bool isInitializer; | 314 final bool isInitializer; |
| 315 | 315 |
| 316 final bool isSuper; | 316 final bool isSuper; |
| 317 | 317 |
| 318 ThisAccessor(this.helper, this.token, this.isInitializer, | 318 ThisAccessor(this.helper, this.token, this.isInitializer, |
| 319 {this.isSuper: false}); | 319 {this.isSuper: false}); |
| 320 | 320 |
| 321 String get plainNameForRead { | 321 String get plainNameForRead { |
| 322 return unsupported("${isSuper ? 'super' : 'this'}.plainNameForRead", | 322 return unsupported("${isSuper ? 'super' : 'this'}.plainNameForRead", |
| 323 offsetForToken(token), uri); | 323 offsetForToken(token), uri); |
| 324 } | 324 } |
| 325 | 325 |
| 326 Expression buildSimpleRead() { | 326 Expression buildSimpleRead() { |
| 327 if (!isSuper) { | 327 if (!isSuper) { |
| 328 return new KernelThisExpression(); | 328 return new ShadowThisExpression(); |
| 329 } else { | 329 } else { |
| 330 return helper.deprecated_buildCompileTimeError( | 330 return helper.deprecated_buildCompileTimeError( |
| 331 "Can't use `super` as an expression.", offsetForToken(token)); | 331 "Can't use `super` as an expression.", offsetForToken(token)); |
| 332 } | 332 } |
| 333 } | 333 } |
| 334 | 334 |
| 335 @override | 335 @override |
| 336 Initializer buildFieldInitializer(Map<String, int> initializedFields) { | 336 Initializer buildFieldInitializer(Map<String, int> initializedFields) { |
| 337 String keyword = isSuper ? "super" : "this"; | 337 String keyword = isSuper ? "super" : "this"; |
| 338 int offset = offsetForToken(token); | 338 int offset = offsetForToken(token); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 349 helper.deprecated_addCompileTimeError( | 349 helper.deprecated_addCompileTimeError( |
| 350 operatorOffset, "Expected '.'\nTry removing '?'."); | 350 operatorOffset, "Expected '.'\nTry removing '?'."); |
| 351 } | 351 } |
| 352 return buildConstructorInitializer( | 352 return buildConstructorInitializer( |
| 353 offsetForToken(send.token), send.name, send.arguments); | 353 offsetForToken(send.token), send.name, send.arguments); |
| 354 } | 354 } |
| 355 if (send is SendAccessor) { | 355 if (send is SendAccessor) { |
| 356 // Notice that 'this' or 'super' can't be null. So we can ignore the | 356 // Notice that 'this' or 'super' can't be null. So we can ignore the |
| 357 // value of [isNullAware]. | 357 // value of [isNullAware]. |
| 358 MethodInvocation result = helper.buildMethodInvocation( | 358 MethodInvocation result = helper.buildMethodInvocation( |
| 359 new KernelThisExpression(), | 359 new ShadowThisExpression(), |
| 360 send.name, | 360 send.name, |
| 361 send.arguments, | 361 send.arguments, |
| 362 offsetForToken(send.token)); | 362 offsetForToken(send.token)); |
| 363 return isSuper ? helper.toSuperMethodInvocation(result) : result; | 363 return isSuper ? helper.toSuperMethodInvocation(result) : result; |
| 364 } else { | 364 } else { |
| 365 if (isSuper) { | 365 if (isSuper) { |
| 366 Member getter = helper.lookupSuperMember(send.name); | 366 Member getter = helper.lookupSuperMember(send.name); |
| 367 Member setter = helper.lookupSuperMember(send.name, isSetter: true); | 367 Member setter = helper.lookupSuperMember(send.name, isSetter: true); |
| 368 return new SuperPropertyAccessor( | 368 return new SuperPropertyAccessor( |
| 369 helper, send.token, send.name, getter, setter); | 369 helper, send.token, send.name, getter, setter); |
| 370 } else { | 370 } else { |
| 371 return new ThisPropertyAccessor( | 371 return new ThisPropertyAccessor( |
| 372 helper, send.token, send.name, null, null); | 372 helper, send.token, send.name, null, null); |
| 373 } | 373 } |
| 374 } | 374 } |
| 375 } | 375 } |
| 376 | 376 |
| 377 doInvocation(int offset, Arguments arguments) { | 377 doInvocation(int offset, Arguments arguments) { |
| 378 if (isInitializer) { | 378 if (isInitializer) { |
| 379 return buildConstructorInitializer(offset, new Name(""), arguments); | 379 return buildConstructorInitializer(offset, new Name(""), arguments); |
| 380 } else { | 380 } else { |
| 381 return helper.buildMethodInvocation( | 381 return helper.buildMethodInvocation( |
| 382 new KernelThisExpression(), callName, arguments, offset, | 382 new ShadowThisExpression(), callName, arguments, offset, |
| 383 isImplicitCall: true); | 383 isImplicitCall: true); |
| 384 } | 384 } |
| 385 } | 385 } |
| 386 | 386 |
| 387 Initializer buildConstructorInitializer( | 387 Initializer buildConstructorInitializer( |
| 388 int offset, Name name, Arguments arguments) { | 388 int offset, Name name, Arguments arguments) { |
| 389 Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper); | 389 Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper); |
| 390 if (constructor == null || | 390 if (constructor == null || |
| 391 !helper.checkArguments( | 391 !helper.checkArguments( |
| 392 constructor.function, arguments, <TypeParameter>[])) { | 392 constructor.function, arguments, <TypeParameter>[])) { |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 Procedure setter) { | 656 Procedure setter) { |
| 657 if (receiver is ThisExpression) { | 657 if (receiver is ThisExpression) { |
| 658 return new ThisIndexAccessor(helper, token, index, getter, setter); | 658 return new ThisIndexAccessor(helper, token, index, getter, setter); |
| 659 } else { | 659 } else { |
| 660 return new IndexAccessor.internal( | 660 return new IndexAccessor.internal( |
| 661 helper, token, receiver, index, getter, setter); | 661 helper, token, receiver, index, getter, setter); |
| 662 } | 662 } |
| 663 } | 663 } |
| 664 | 664 |
| 665 @override | 665 @override |
| 666 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 666 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 667 new KernelIndexAssign(receiver, index, rhs); | 667 new ShadowIndexAssign(receiver, index, rhs); |
| 668 } | 668 } |
| 669 | 669 |
| 670 class PropertyAccessor extends kernel.PropertyAccessor with FastaAccessor { | 670 class PropertyAccessor extends kernel.PropertyAccessor with FastaAccessor { |
| 671 final BuilderHelper helper; | 671 final BuilderHelper helper; |
| 672 | 672 |
| 673 PropertyAccessor.internal(this.helper, Token token, Expression receiver, | 673 PropertyAccessor.internal(this.helper, Token token, Expression receiver, |
| 674 Name name, Member getter, Member setter) | 674 Name name, Member getter, Member setter) |
| 675 : super.internal(helper, receiver, name, getter, setter, token); | 675 : super.internal(helper, receiver, name, getter, setter, token); |
| 676 | 676 |
| 677 String get plainNameForRead => name.name; | 677 String get plainNameForRead => name.name; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 697 } else { | 697 } else { |
| 698 return isNullAware | 698 return isNullAware |
| 699 ? new NullAwarePropertyAccessor( | 699 ? new NullAwarePropertyAccessor( |
| 700 helper, token, receiver, name, getter, setter, null) | 700 helper, token, receiver, name, getter, setter, null) |
| 701 : new PropertyAccessor.internal( | 701 : new PropertyAccessor.internal( |
| 702 helper, token, receiver, name, getter, setter); | 702 helper, token, receiver, name, getter, setter); |
| 703 } | 703 } |
| 704 } | 704 } |
| 705 | 705 |
| 706 @override | 706 @override |
| 707 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 707 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 708 new KernelPropertyAssign(receiver, rhs); | 708 new ShadowPropertyAssign(receiver, rhs); |
| 709 } | 709 } |
| 710 | 710 |
| 711 class StaticAccessor extends kernel.StaticAccessor with FastaAccessor { | 711 class StaticAccessor extends kernel.StaticAccessor with FastaAccessor { |
| 712 StaticAccessor( | 712 StaticAccessor( |
| 713 BuilderHelper helper, Token token, Member readTarget, Member writeTarget) | 713 BuilderHelper helper, Token token, Member readTarget, Member writeTarget) |
| 714 : super(helper, readTarget, writeTarget, token) { | 714 : super(helper, readTarget, writeTarget, token) { |
| 715 assert(readTarget != null || writeTarget != null); | 715 assert(readTarget != null || writeTarget != null); |
| 716 } | 716 } |
| 717 | 717 |
| 718 factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder, | 718 factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 isImplicitCall: true); | 753 isImplicitCall: true); |
| 754 } else { | 754 } else { |
| 755 return helper.buildStaticInvocation(readTarget, arguments) | 755 return helper.buildStaticInvocation(readTarget, arguments) |
| 756 ..fileOffset = offset; | 756 ..fileOffset = offset; |
| 757 } | 757 } |
| 758 } | 758 } |
| 759 | 759 |
| 760 toString() => "StaticAccessor()"; | 760 toString() => "StaticAccessor()"; |
| 761 | 761 |
| 762 @override | 762 @override |
| 763 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 763 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 764 new KernelStaticAssignment(rhs); | 764 new ShadowStaticAssignment(rhs); |
| 765 } | 765 } |
| 766 | 766 |
| 767 class SuperPropertyAccessor extends kernel.SuperPropertyAccessor | 767 class SuperPropertyAccessor extends kernel.SuperPropertyAccessor |
| 768 with FastaAccessor { | 768 with FastaAccessor { |
| 769 SuperPropertyAccessor(BuilderHelper helper, Token token, Name name, | 769 SuperPropertyAccessor(BuilderHelper helper, Token token, Name name, |
| 770 Member getter, Member setter) | 770 Member getter, Member setter) |
| 771 : super(helper, name, getter, setter, token); | 771 : super(helper, name, getter, setter, token); |
| 772 | 772 |
| 773 String get plainNameForRead => name.name; | 773 String get plainNameForRead => name.name; |
| 774 | 774 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 787 } else { | 787 } else { |
| 788 // TODO(ahe): This could be something like "super.property(...)" where | 788 // TODO(ahe): This could be something like "super.property(...)" where |
| 789 // property is a setter. | 789 // property is a setter. |
| 790 return unhandled("${getter.runtimeType}", "doInvocation", offset, uri); | 790 return unhandled("${getter.runtimeType}", "doInvocation", offset, uri); |
| 791 } | 791 } |
| 792 } | 792 } |
| 793 | 793 |
| 794 toString() => "SuperPropertyAccessor()"; | 794 toString() => "SuperPropertyAccessor()"; |
| 795 | 795 |
| 796 @override | 796 @override |
| 797 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 797 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 798 new KernelPropertyAssign(null, rhs, isSuper: true); | 798 new ShadowPropertyAssign(null, rhs, isSuper: true); |
| 799 } | 799 } |
| 800 | 800 |
| 801 class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor { | 801 class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor { |
| 802 ThisIndexAccessor(BuilderHelper helper, Token token, Expression index, | 802 ThisIndexAccessor(BuilderHelper helper, Token token, Expression index, |
| 803 Procedure getter, Procedure setter) | 803 Procedure getter, Procedure setter) |
| 804 : super(helper, index, getter, setter, token); | 804 : super(helper, index, getter, setter, token); |
| 805 | 805 |
| 806 String get plainNameForRead => "[]"; | 806 String get plainNameForRead => "[]"; |
| 807 | 807 |
| 808 String get plainNameForWrite => "[]="; | 808 String get plainNameForWrite => "[]="; |
| 809 | 809 |
| 810 Expression doInvocation(int offset, Arguments arguments) { | 810 Expression doInvocation(int offset, Arguments arguments) { |
| 811 return helper.buildMethodInvocation( | 811 return helper.buildMethodInvocation( |
| 812 buildSimpleRead(), callName, arguments, offset, | 812 buildSimpleRead(), callName, arguments, offset, |
| 813 isImplicitCall: true); | 813 isImplicitCall: true); |
| 814 } | 814 } |
| 815 | 815 |
| 816 toString() => "ThisIndexAccessor()"; | 816 toString() => "ThisIndexAccessor()"; |
| 817 | 817 |
| 818 @override | 818 @override |
| 819 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 819 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 820 new KernelIndexAssign(null, index, rhs); | 820 new ShadowIndexAssign(null, index, rhs); |
| 821 } | 821 } |
| 822 | 822 |
| 823 class SuperIndexAccessor extends kernel.SuperIndexAccessor with FastaAccessor { | 823 class SuperIndexAccessor extends kernel.SuperIndexAccessor with FastaAccessor { |
| 824 SuperIndexAccessor(BuilderHelper helper, Token token, Expression index, | 824 SuperIndexAccessor(BuilderHelper helper, Token token, Expression index, |
| 825 Member getter, Member setter) | 825 Member getter, Member setter) |
| 826 : super(helper, index, getter, setter, token); | 826 : super(helper, index, getter, setter, token); |
| 827 | 827 |
| 828 String get plainNameForRead => "[]"; | 828 String get plainNameForRead => "[]"; |
| 829 | 829 |
| 830 String get plainNameForWrite => "[]="; | 830 String get plainNameForWrite => "[]="; |
| 831 | 831 |
| 832 Expression doInvocation(int offset, Arguments arguments) { | 832 Expression doInvocation(int offset, Arguments arguments) { |
| 833 return helper.buildMethodInvocation( | 833 return helper.buildMethodInvocation( |
| 834 buildSimpleRead(), callName, arguments, offset, | 834 buildSimpleRead(), callName, arguments, offset, |
| 835 isImplicitCall: true); | 835 isImplicitCall: true); |
| 836 } | 836 } |
| 837 | 837 |
| 838 toString() => "SuperIndexAccessor()"; | 838 toString() => "SuperIndexAccessor()"; |
| 839 | 839 |
| 840 @override | 840 @override |
| 841 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 841 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 842 new KernelIndexAssign(null, index, rhs, isSuper: true); | 842 new ShadowIndexAssign(null, index, rhs, isSuper: true); |
| 843 } | 843 } |
| 844 | 844 |
| 845 class ThisPropertyAccessor extends kernel.ThisPropertyAccessor | 845 class ThisPropertyAccessor extends kernel.ThisPropertyAccessor |
| 846 with FastaAccessor { | 846 with FastaAccessor { |
| 847 final BuilderHelper helper; | 847 final BuilderHelper helper; |
| 848 | 848 |
| 849 ThisPropertyAccessor( | 849 ThisPropertyAccessor( |
| 850 this.helper, Token token, Name name, Member getter, Member setter) | 850 this.helper, Token token, Name name, Member getter, Member setter) |
| 851 : super(helper, name, getter, setter, token); | 851 : super(helper, name, getter, setter, token); |
| 852 | 852 |
| 853 String get plainNameForRead => name.name; | 853 String get plainNameForRead => name.name; |
| 854 | 854 |
| 855 bool get isThisPropertyAccessor => true; | 855 bool get isThisPropertyAccessor => true; |
| 856 | 856 |
| 857 Expression doInvocation(int offset, Arguments arguments) { | 857 Expression doInvocation(int offset, Arguments arguments) { |
| 858 Member interfaceTarget = getter; | 858 Member interfaceTarget = getter; |
| 859 if (interfaceTarget is Field) { | 859 if (interfaceTarget is Field) { |
| 860 // TODO(ahe): In strong mode we should probably rewrite this to | 860 // TODO(ahe): In strong mode we should probably rewrite this to |
| 861 // `this.name.call(arguments)`. | 861 // `this.name.call(arguments)`. |
| 862 interfaceTarget = null; | 862 interfaceTarget = null; |
| 863 } | 863 } |
| 864 return helper.buildMethodInvocation( | 864 return helper.buildMethodInvocation( |
| 865 new KernelThisExpression(), name, arguments, offset); | 865 new ShadowThisExpression(), name, arguments, offset); |
| 866 } | 866 } |
| 867 | 867 |
| 868 toString() => "ThisPropertyAccessor()"; | 868 toString() => "ThisPropertyAccessor()"; |
| 869 | 869 |
| 870 @override | 870 @override |
| 871 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 871 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 872 new KernelPropertyAssign(null, rhs); | 872 new ShadowPropertyAssign(null, rhs); |
| 873 } | 873 } |
| 874 | 874 |
| 875 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor | 875 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor |
| 876 with FastaAccessor { | 876 with FastaAccessor { |
| 877 final BuilderHelper helper; | 877 final BuilderHelper helper; |
| 878 | 878 |
| 879 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver, | 879 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver, |
| 880 Name name, Member getter, Member setter, DartType type) | 880 Name name, Member getter, Member setter, DartType type) |
| 881 : super(helper, receiver, name, getter, setter, type, token); | 881 : super(helper, receiver, name, getter, setter, type, token); |
| 882 | 882 |
| 883 String get plainNameForRead => name.name; | 883 String get plainNameForRead => name.name; |
| 884 | 884 |
| 885 Expression doInvocation(int offset, Arguments arguments) { | 885 Expression doInvocation(int offset, Arguments arguments) { |
| 886 return unimplemented("doInvocation", offset, uri); | 886 return unimplemented("doInvocation", offset, uri); |
| 887 } | 887 } |
| 888 | 888 |
| 889 toString() => "NullAwarePropertyAccessor()"; | 889 toString() => "NullAwarePropertyAccessor()"; |
| 890 | 890 |
| 891 @override | 891 @override |
| 892 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 892 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 893 new KernelPropertyAssign(receiverExpression, rhs); | 893 new ShadowPropertyAssign(receiverExpression, rhs); |
| 894 } | 894 } |
| 895 | 895 |
| 896 int adjustForImplicitCall(String name, int offset) { | 896 int adjustForImplicitCall(String name, int offset) { |
| 897 // Normally the offset is at the start of the token, but in this case, | 897 // Normally the offset is at the start of the token, but in this case, |
| 898 // because we insert a '.call', we want it at the end instead. | 898 // because we insert a '.call', we want it at the end instead. |
| 899 return offset + (name?.length ?? 0); | 899 return offset + (name?.length ?? 0); |
| 900 } | 900 } |
| 901 | 901 |
| 902 class VariableAccessor extends kernel.VariableAccessor with FastaAccessor { | 902 class VariableAccessor extends kernel.VariableAccessor with FastaAccessor { |
| 903 VariableAccessor( | 903 VariableAccessor( |
| 904 BuilderHelper helper, Token token, VariableDeclaration variable, | 904 BuilderHelper helper, Token token, VariableDeclaration variable, |
| 905 [DartType promotedType]) | 905 [DartType promotedType]) |
| 906 : super(helper, variable, promotedType, token); | 906 : super(helper, variable, promotedType, token); |
| 907 | 907 |
| 908 String get plainNameForRead => variable.name; | 908 String get plainNameForRead => variable.name; |
| 909 | 909 |
| 910 Expression doInvocation(int offset, Arguments arguments) { | 910 Expression doInvocation(int offset, Arguments arguments) { |
| 911 return helper.buildMethodInvocation(buildSimpleRead(), callName, arguments, | 911 return helper.buildMethodInvocation(buildSimpleRead(), callName, arguments, |
| 912 adjustForImplicitCall(plainNameForRead, offset), | 912 adjustForImplicitCall(plainNameForRead, offset), |
| 913 isImplicitCall: true); | 913 isImplicitCall: true); |
| 914 } | 914 } |
| 915 | 915 |
| 916 toString() => "VariableAccessor()"; | 916 toString() => "VariableAccessor()"; |
| 917 | 917 |
| 918 @override | 918 @override |
| 919 KernelComplexAssignment startComplexAssignment(Expression rhs) => | 919 ShadowComplexAssignment startComplexAssignment(Expression rhs) => |
| 920 new KernelVariableAssignment(rhs); | 920 new ShadowVariableAssignment(rhs); |
| 921 } | 921 } |
| 922 | 922 |
| 923 class ReadOnlyAccessor extends kernel.ReadOnlyAccessor with FastaAccessor { | 923 class ReadOnlyAccessor extends kernel.ReadOnlyAccessor with FastaAccessor { |
| 924 final String plainNameForRead; | 924 final String plainNameForRead; |
| 925 | 925 |
| 926 ReadOnlyAccessor(BuilderHelper helper, Expression expression, | 926 ReadOnlyAccessor(BuilderHelper helper, Expression expression, |
| 927 this.plainNameForRead, Token token) | 927 this.plainNameForRead, Token token) |
| 928 : super(helper, expression, token); | 928 : super(helper, expression, token); |
| 929 | 929 |
| 930 Expression doInvocation(int offset, Arguments arguments) { | 930 Expression doInvocation(int offset, Arguments arguments) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 958 if (declaration is KernelInvalidTypeBuilder) { | 958 if (declaration is KernelInvalidTypeBuilder) { |
| 959 KernelInvalidTypeBuilder declaration = this.declaration; | 959 KernelInvalidTypeBuilder declaration = this.declaration; |
| 960 helper.library.addWarning( | 960 helper.library.addWarning( |
| 961 declaration.message, declaration.charOffset, declaration.fileUri); | 961 declaration.message, declaration.charOffset, declaration.fileUri); |
| 962 helper.warning(declaration.message, offset); | 962 helper.warning(declaration.message, offset); |
| 963 super.expression = new Throw( | 963 super.expression = new Throw( |
| 964 new StringLiteral(declaration.message.message) | 964 new StringLiteral(declaration.message.message) |
| 965 ..fileOffset = offsetForToken(token)) | 965 ..fileOffset = offsetForToken(token)) |
| 966 ..fileOffset = offset; | 966 ..fileOffset = offset; |
| 967 } else { | 967 } else { |
| 968 super.expression = new KernelTypeLiteral( | 968 super.expression = new ShadowTypeLiteral( |
| 969 buildType(null, nonInstanceAccessIsError: true)) | 969 buildType(null, nonInstanceAccessIsError: true)) |
| 970 ..fileOffset = offsetForToken(token); | 970 ..fileOffset = offsetForToken(token); |
| 971 } | 971 } |
| 972 } | 972 } |
| 973 return super.expression; | 973 return super.expression; |
| 974 } | 974 } |
| 975 | 975 |
| 976 Expression makeInvalidWrite(Expression value) { | 976 Expression makeInvalidWrite(Expression value) { |
| 977 return buildThrowNoSuchMethodError( | 977 return buildThrowNoSuchMethodError( |
| 978 new NullLiteral()..fileOffset = offsetForToken(token), | 978 new NullLiteral()..fileOffset = offsetForToken(token), |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1057 offset ??= offsetForToken(this.token); | 1057 offset ??= offsetForToken(this.token); |
| 1058 return helper.throwNoSuchMethodError(new NullLiteral()..fileOffset = offset, | 1058 return helper.throwNoSuchMethodError(new NullLiteral()..fileOffset = offset, |
| 1059 plainNameForRead, arguments, offset, | 1059 plainNameForRead, arguments, offset, |
| 1060 isGetter: isGetter, isSetter: isSetter); | 1060 isGetter: isGetter, isSetter: isSetter); |
| 1061 } | 1061 } |
| 1062 } | 1062 } |
| 1063 | 1063 |
| 1064 bool isFieldOrGetter(Member member) { | 1064 bool isFieldOrGetter(Member member) { |
| 1065 return member is Field || (member is Procedure && member.isGetter); | 1065 return member is Field || (member is Procedure && member.isGetter); |
| 1066 } | 1066 } |
| OLD | NEW |