Chromium Code Reviews| 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 // Note: copied from package:kernel at revision 7346348. | 5 // Note: copied from package:kernel at revision 7346348. |
| 6 | 6 |
| 7 /// A library to help transform compounds and null-aware accessors into | 7 /// A library to help transform compounds and null-aware accessors into |
| 8 /// let expressions. | 8 /// let expressions. |
| 9 library kernel.frontend.accessors; | 9 library kernel.frontend.accessors; |
| 10 | 10 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 110 | 110 |
| 111 /// Returns an [Expression] representing a compile-time error wrapping | 111 /// Returns an [Expression] representing a compile-time error wrapping |
| 112 /// [value]. | 112 /// [value]. |
| 113 /// | 113 /// |
| 114 /// At runtime, [value] will be evaluated before throwing an exception. | 114 /// At runtime, [value] will be evaluated before throwing an exception. |
| 115 makeInvalidWrite(Expression value) => wrapInvalid(value); | 115 makeInvalidWrite(Expression value) => wrapInvalid(value); |
| 116 } | 116 } |
| 117 | 117 |
| 118 class VariableAccessor extends Accessor { | 118 class VariableAccessor extends Accessor { |
| 119 VariableDeclaration variable; | 119 VariableDeclaration variable; |
| 120 int charOffset; | |
| 120 DartType promotedType; | 121 DartType promotedType; |
| 121 | 122 |
| 122 VariableAccessor(this.variable, [this.promotedType]); | 123 VariableAccessor(this.variable, [this.promotedType]); |
| 123 | 124 |
| 124 VariableAccessor.internal(this.variable, this.promotedType); | 125 VariableAccessor.internal(this.variable, this.charOffset, this.promotedType); |
| 125 | 126 |
| 126 _makeRead() => new VariableGet(variable, promotedType); | 127 _makeRead() => new VariableGet(variable, promotedType)..fileOffset = charOffse t; |
|
ahe
2017/03/08 12:31:49
Long line.
| |
| 127 | 128 |
| 128 _makeWrite(Expression value, bool voidContext) { | 129 _makeWrite(Expression value, bool voidContext) { |
| 129 return variable.isFinal || variable.isConst | 130 return variable.isFinal || variable.isConst |
| 130 ? makeInvalidWrite(value) | 131 ? makeInvalidWrite(value) |
| 131 : new VariableSet(variable, value); | 132 : new VariableSet(variable, value)..fileOffset = charOffset; |
| 132 } | 133 } |
| 133 } | 134 } |
| 134 | 135 |
| 135 class PropertyAccessor extends Accessor { | 136 class PropertyAccessor extends Accessor { |
| 136 VariableDeclaration _receiverVariable; | 137 VariableDeclaration _receiverVariable; |
| 137 Expression receiver; | 138 Expression receiver; |
| 138 Name name; | 139 Name name; |
| 139 Member getter, setter; | 140 Member getter, setter; |
| 141 int charOffset; | |
| 140 | 142 |
| 141 static Accessor make( | 143 static Accessor make(Expression receiver, Name name, Member getter, |
| 142 Expression receiver, Name name, Member getter, Member setter) { | 144 Member setter, int charOffset) { |
| 143 if (receiver is ThisExpression) { | 145 if (receiver is ThisExpression) { |
| 144 return new ThisPropertyAccessor(name, getter, setter); | 146 return new ThisPropertyAccessor(name, getter, setter); |
| 145 } else { | 147 } else { |
| 146 return new PropertyAccessor.internal(receiver, name, getter, setter); | 148 return new PropertyAccessor.internal( |
| 149 receiver, name, getter, setter, charOffset); | |
| 147 } | 150 } |
| 148 } | 151 } |
| 149 | 152 |
| 150 PropertyAccessor.internal(this.receiver, this.name, this.getter, this.setter); | 153 PropertyAccessor.internal( |
| 154 this.receiver, this.name, this.getter, this.setter, this.charOffset); | |
| 151 | 155 |
| 152 _makeSimpleRead() => new PropertyGet(receiver, name, getter); | 156 _makeSimpleRead() => |
| 157 new PropertyGet(receiver, name, getter)..fileOffset = charOffset; | |
| 153 _makeSimpleWrite(Expression value, bool voidContext) { | 158 _makeSimpleWrite(Expression value, bool voidContext) { |
| 154 return new PropertySet(receiver, name, value, setter); | 159 return new PropertySet(receiver, name, value, setter) |
| 160 ..fileOffset = charOffset; | |
| 155 } | 161 } |
| 156 | 162 |
| 157 receiverAccess() { | 163 receiverAccess() { |
| 158 _receiverVariable ??= new VariableDeclaration.forValue(receiver); | 164 _receiverVariable ??= new VariableDeclaration.forValue(receiver); |
| 159 return new VariableGet(_receiverVariable); | 165 return new VariableGet(_receiverVariable)..fileOffset = charOffset; |
| 160 } | 166 } |
| 161 | 167 |
| 162 _makeRead() => new PropertyGet(receiverAccess(), name, getter); | 168 _makeRead() => |
| 169 new PropertyGet(receiverAccess(), name, getter)..fileOffset = charOffset; | |
| 163 | 170 |
| 164 _makeWrite(Expression value, bool voidContext) { | 171 _makeWrite(Expression value, bool voidContext) { |
| 165 return new PropertySet(receiverAccess(), name, value, setter); | 172 return new PropertySet(receiverAccess(), name, value, setter) |
| 173 ..fileOffset = charOffset; | |
| 166 } | 174 } |
| 167 | 175 |
| 168 _finish(Expression body) => makeLet(_receiverVariable, body); | 176 _finish(Expression body) => makeLet(_receiverVariable, body); |
| 169 } | 177 } |
| 170 | 178 |
| 171 /// Special case of [PropertyAccessor] to avoid creating an indirect access to | 179 /// Special case of [PropertyAccessor] to avoid creating an indirect access to |
| 172 /// 'this'. | 180 /// 'this'. |
| 173 class ThisPropertyAccessor extends Accessor { | 181 class ThisPropertyAccessor extends Accessor { |
| 174 Name name; | 182 Name name; |
| 175 Member getter, setter; | 183 Member getter, setter; |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 453 | 461 |
| 454 VariableDeclaration makeOrReuseVariable(Expression value) { | 462 VariableDeclaration makeOrReuseVariable(Expression value) { |
| 455 // TODO: Devise a way to remember if a variable declaration was reused | 463 // TODO: Devise a way to remember if a variable declaration was reused |
| 456 // or is fresh (hence needs a let binding). | 464 // or is fresh (hence needs a let binding). |
| 457 return new VariableDeclaration.forValue(value); | 465 return new VariableDeclaration.forValue(value); |
| 458 } | 466 } |
| 459 | 467 |
| 460 Expression wrapInvalid(Expression e) { | 468 Expression wrapInvalid(Expression e) { |
| 461 return new Let(new VariableDeclaration.forValue(e), new InvalidExpression()); | 469 return new Let(new VariableDeclaration.forValue(e), new InvalidExpression()); |
| 462 } | 470 } |
| OLD | NEW |