OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE.md file. |
| 4 |
| 5 /// Extension of the kernel accessors library with accessors that use the |
| 6 /// rasta-specific error handling. |
| 7 library rasta.accessors; |
| 8 |
| 9 import 'package:kernel/ast.dart' as ir; |
| 10 |
| 11 import 'package:kernel/frontend/accessors.dart' as ir_accessors; |
| 12 |
| 13 import 'unresolved.dart' show RastaUnresolved; |
| 14 |
| 15 import 'kernel.dart' show Kernel; |
| 16 |
| 17 // Expose the common superclass of accessors. |
| 18 export 'package:kernel/frontend/accessors.dart' show Accessor; |
| 19 |
| 20 class TopLevelStaticAccessor extends ir_accessors.StaticAccessor { |
| 21 final RastaUnresolved builder; |
| 22 |
| 23 /// Name of the property attempted to be accessed, used to generate an |
| 24 /// error if unresolved. |
| 25 final String name; |
| 26 |
| 27 Kernel get kernel => builder.kernel; |
| 28 |
| 29 TopLevelStaticAccessor( |
| 30 this.builder, |
| 31 this.name, |
| 32 ir.Member readTarget, |
| 33 ir.Member writeTarget) |
| 34 : super(readTarget, writeTarget); |
| 35 |
| 36 @override |
| 37 makeInvalidRead() { |
| 38 return builder.buildThrowNoSuchMethodError( |
| 39 kernel.getUnresolvedTopLevelGetterBuilder(), |
| 40 new ir.NullLiteral(), |
| 41 name, |
| 42 new ir.Arguments.empty()); |
| 43 } |
| 44 |
| 45 @override |
| 46 makeInvalidWrite(ir.Expression value) { |
| 47 return builder.buildThrowNoSuchMethodError( |
| 48 kernel.getUnresolvedTopLevelSetterBuilder(), |
| 49 new ir.NullLiteral(), |
| 50 name, |
| 51 new ir.Arguments(<ir.Expression>[value])); |
| 52 } |
| 53 } |
| 54 |
| 55 class ClassStaticAccessor extends ir_accessors.StaticAccessor { |
| 56 final RastaUnresolved builder; |
| 57 |
| 58 /// Name of the property attempted to be accessed, used to generate an |
| 59 /// error if unresolved. |
| 60 final String name; |
| 61 |
| 62 Kernel get kernel => builder.kernel; |
| 63 |
| 64 ClassStaticAccessor(this.builder, this.name, |
| 65 ir.Member readTarget, ir.Member writeTarget) |
| 66 : super(readTarget, writeTarget); |
| 67 |
| 68 @override |
| 69 makeInvalidRead() { |
| 70 return builder.buildThrowNoSuchMethodError( |
| 71 kernel.getUnresolvedStaticGetterBuilder(), |
| 72 new ir.NullLiteral(), |
| 73 name, |
| 74 new ir.Arguments.empty()); |
| 75 } |
| 76 |
| 77 @override |
| 78 makeInvalidWrite(ir.Expression value) { |
| 79 return builder.buildThrowNoSuchMethodError( |
| 80 kernel.getUnresolvedStaticSetterBuilder(), |
| 81 new ir.NullLiteral(), |
| 82 name, |
| 83 new ir.Arguments(<ir.Expression>[value])); |
| 84 } |
| 85 } |
| 86 |
| 87 class SuperPropertyAccessor extends ir_accessors.SuperPropertyAccessor { |
| 88 final RastaUnresolved builder; |
| 89 |
| 90 /// Name of the property attempted to be accessed, used to generate an |
| 91 /// error if unresolved. |
| 92 final String name; |
| 93 |
| 94 SuperPropertyAccessor( |
| 95 this.builder, |
| 96 this.name, |
| 97 ir.Member readTarget, |
| 98 ir.Member writeTarget) |
| 99 : super(readTarget, writeTarget); |
| 100 |
| 101 @override |
| 102 makeInvalidRead() { |
| 103 // TODO(asgerf): Technically, we should invoke 'super.noSuchMethod' for |
| 104 // this and the other invalid super cases. |
| 105 return builder.buildThrowUnresolvedSuperGetter(name); |
| 106 } |
| 107 |
| 108 @override |
| 109 makeInvalidWrite(ir.Expression value) { |
| 110 return builder.buildThrowUnresolvedSuperSetter(name, value); |
| 111 } |
| 112 } |
| 113 |
| 114 class SuperIndexAccessor extends ir_accessors.SuperIndexAccessor { |
| 115 final RastaUnresolved builder; |
| 116 |
| 117 Kernel get kernel => builder.kernel; |
| 118 |
| 119 SuperIndexAccessor( |
| 120 this.builder, |
| 121 ir.Expression index, |
| 122 ir.Member readTarget, |
| 123 ir.Member writeTarget) |
| 124 : super(index, readTarget, writeTarget); |
| 125 |
| 126 @override |
| 127 makeInvalidRead() { |
| 128 return builder.buildThrowNoSuchMethodError( |
| 129 kernel.getUnresolvedSuperMethodBuilder(), |
| 130 new ir.ThisExpression(), |
| 131 '[]', |
| 132 new ir.Arguments(<ir.Expression>[indexAccess()])); |
| 133 } |
| 134 |
| 135 @override |
| 136 makeInvalidWrite(ir.Expression value) { |
| 137 return builder.buildThrowNoSuchMethodError( |
| 138 kernel.getUnresolvedSuperMethodBuilder(), |
| 139 new ir.ThisExpression(), |
| 140 '[]=', |
| 141 new ir.Arguments(<ir.Expression>[indexAccess(), value])); |
| 142 } |
| 143 } |
OLD | NEW |