| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /// This library defines individual world impacts. | 5 /// This library defines individual world impacts. |
| 6 /// | 6 /// |
| 7 /// We call these building blocks `uses`. Each `use` is a single impact of the | 7 /// We call these building blocks `uses`. Each `use` is a single impact of the |
| 8 /// world. Some example uses are: | 8 /// world. Some example uses are: |
| 9 /// | 9 /// |
| 10 /// * an invocation of a top level function | 10 /// * an invocation of a top level function |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 final Entity element; | 92 final Entity element; |
| 93 final StaticUseKind kind; | 93 final StaticUseKind kind; |
| 94 final int hashCode; | 94 final int hashCode; |
| 95 final DartType type; | 95 final DartType type; |
| 96 | 96 |
| 97 StaticUse.internal(Entity element, StaticUseKind kind, [DartType type = null]) | 97 StaticUse.internal(Entity element, StaticUseKind kind, [DartType type = null]) |
| 98 : this.element = element, | 98 : this.element = element, |
| 99 this.kind = kind, | 99 this.kind = kind, |
| 100 this.type = type, | 100 this.type = type, |
| 101 this.hashCode = Hashing.objectsHash(element, kind, type) { | 101 this.hashCode = Hashing.objectsHash(element, kind, type) { |
| 102 assert(invariant(element, !(element is Element && !element.isDeclaration), | 102 assert( |
| 103 message: "Static use element $element must be " | 103 !(element is Element && !element.isDeclaration), |
| 104 "the declaration element.")); | 104 failedAt(element, |
| 105 "Static use element $element must be the declaration element.")); |
| 105 } | 106 } |
| 106 | 107 |
| 107 /// Invocation of a static or top-level [element] with the given | 108 /// Invocation of a static or top-level [element] with the given |
| 108 /// [callStructure]. | 109 /// [callStructure]. |
| 109 factory StaticUse.staticInvoke( | 110 factory StaticUse.staticInvoke( |
| 110 FunctionEntity element, CallStructure callStructure) { | 111 FunctionEntity element, CallStructure callStructure) { |
| 111 // TODO(johnniwinther): Use the [callStructure]. | 112 // TODO(johnniwinther): Use the [callStructure]. |
| 112 assert(invariant(element, element.isStatic || element.isTopLevel, | 113 assert( |
| 113 message: "Static invoke element $element must be a top-level " | 114 element.isStatic || element.isTopLevel, |
| 115 failedAt( |
| 116 element, |
| 117 "Static invoke element $element must be a top-level " |
| 114 "or static method.")); | 118 "or static method.")); |
| 115 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 119 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 116 } | 120 } |
| 117 | 121 |
| 118 /// Closurization of a static or top-level function [element]. | 122 /// Closurization of a static or top-level function [element]. |
| 119 factory StaticUse.staticTearOff(FunctionEntity element) { | 123 factory StaticUse.staticTearOff(FunctionEntity element) { |
| 120 assert(invariant(element, element.isStatic || element.isTopLevel, | 124 assert( |
| 121 message: "Static tear-off element $element must be a top-level " | 125 element.isStatic || element.isTopLevel, |
| 126 failedAt( |
| 127 element, |
| 128 "Static tear-off element $element must be a top-level " |
| 122 "or static method.")); | 129 "or static method.")); |
| 123 return new StaticUse.internal(element, StaticUseKind.STATIC_TEAR_OFF); | 130 return new StaticUse.internal(element, StaticUseKind.STATIC_TEAR_OFF); |
| 124 } | 131 } |
| 125 | 132 |
| 126 /// Read access of a static or top-level field or getter [element]. | 133 /// Read access of a static or top-level field or getter [element]. |
| 127 factory StaticUse.staticGet(MemberEntity element) { | 134 factory StaticUse.staticGet(MemberEntity element) { |
| 128 assert(invariant(element, element.isStatic || element.isTopLevel, | 135 assert( |
| 129 message: "Static get element $element must be a top-level " | 136 element.isStatic || element.isTopLevel, |
| 137 failedAt( |
| 138 element, |
| 139 "Static get element $element must be a top-level " |
| 130 "or static method.")); | 140 "or static method.")); |
| 131 assert(invariant(element, element.isField || element.isGetter, | 141 assert( |
| 132 message: "Static get element $element must be a field or a getter.")); | 142 element.isField || element.isGetter, |
| 143 failedAt(element, |
| 144 "Static get element $element must be a field or a getter.")); |
| 133 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 145 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 134 } | 146 } |
| 135 | 147 |
| 136 /// Write access of a static or top-level field or setter [element]. | 148 /// Write access of a static or top-level field or setter [element]. |
| 137 factory StaticUse.staticSet(MemberEntity element) { | 149 factory StaticUse.staticSet(MemberEntity element) { |
| 138 assert(invariant(element, element.isStatic || element.isTopLevel, | 150 assert( |
| 139 message: "Static set element $element must be a top-level " | 151 element.isStatic || element.isTopLevel, |
| 140 "or static method.")); | 152 failedAt( |
| 141 assert(invariant(element, element.isField || element.isSetter, | 153 element, |
| 142 message: "Static set element $element must be a field or a setter.")); | 154 "Static set element $element " |
| 155 "must be a top-level or static method.")); |
| 156 assert( |
| 157 element.isField || element.isSetter, |
| 158 failedAt(element, |
| 159 "Static set element $element must be a field or a setter.")); |
| 143 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 160 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 144 } | 161 } |
| 145 | 162 |
| 146 /// Invocation of the lazy initializer for a static or top-level field | 163 /// Invocation of the lazy initializer for a static or top-level field |
| 147 /// [element]. | 164 /// [element]. |
| 148 factory StaticUse.staticInit(FieldEntity element) { | 165 factory StaticUse.staticInit(FieldEntity element) { |
| 149 assert(invariant(element, element.isStatic || element.isTopLevel, | 166 assert( |
| 150 message: "Static init element $element must be a top-level " | 167 element.isStatic || element.isTopLevel, |
| 168 failedAt( |
| 169 element, |
| 170 "Static init element $element must be a top-level " |
| 151 "or static method.")); | 171 "or static method.")); |
| 152 assert(invariant(element, element.isField, | 172 assert(element.isField, |
| 153 message: "Static init element $element must be a field.")); | 173 failedAt(element, "Static init element $element must be a field.")); |
| 154 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 174 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 155 } | 175 } |
| 156 | 176 |
| 157 /// Invocation of a super method [element] with the given [callStructure]. | 177 /// Invocation of a super method [element] with the given [callStructure]. |
| 158 factory StaticUse.superInvoke( | 178 factory StaticUse.superInvoke( |
| 159 FunctionEntity element, CallStructure callStructure) { | 179 FunctionEntity element, CallStructure callStructure) { |
| 160 // TODO(johnniwinther): Use the [callStructure]. | 180 // TODO(johnniwinther): Use the [callStructure]. |
| 161 assert(invariant(element, element.isInstanceMember, | 181 assert( |
| 162 message: "Super invoke element $element must be an instance method.")); | 182 element.isInstanceMember, |
| 183 failedAt(element, |
| 184 "Super invoke element $element must be an instance method.")); |
| 163 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 185 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 164 } | 186 } |
| 165 | 187 |
| 166 /// Read access of a super field or getter [element]. | 188 /// Read access of a super field or getter [element]. |
| 167 factory StaticUse.superGet(MemberEntity element) { | 189 factory StaticUse.superGet(MemberEntity element) { |
| 168 assert(invariant(element, element.isInstanceMember, | 190 assert( |
| 169 message: "Super get element $element must be an instance method.")); | 191 element.isInstanceMember, |
| 170 assert(invariant(element, element.isField || element.isGetter, | 192 failedAt( |
| 171 message: "Super get element $element must be a field or a getter.")); | 193 element, "Super get element $element must be an instance method.")); |
| 194 assert( |
| 195 element.isField || element.isGetter, |
| 196 failedAt(element, |
| 197 "Super get element $element must be a field or a getter.")); |
| 172 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 198 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 173 } | 199 } |
| 174 | 200 |
| 175 /// Write access of a super field [element]. | 201 /// Write access of a super field [element]. |
| 176 factory StaticUse.superFieldSet(FieldEntity element) { | 202 factory StaticUse.superFieldSet(FieldEntity element) { |
| 177 assert(invariant(element, element.isInstanceMember, | 203 assert( |
| 178 message: "Super set element $element must be an instance method.")); | 204 element.isInstanceMember, |
| 179 assert(invariant(element, element.isField, | 205 failedAt( |
| 180 message: "Super set element $element must be a field.")); | 206 element, "Super set element $element must be an instance method.")); |
| 207 assert(element.isField, |
| 208 failedAt(element, "Super set element $element must be a field.")); |
| 181 return new StaticUse.internal(element, StaticUseKind.SUPER_FIELD_SET); | 209 return new StaticUse.internal(element, StaticUseKind.SUPER_FIELD_SET); |
| 182 } | 210 } |
| 183 | 211 |
| 184 /// Write access of a super setter [element]. | 212 /// Write access of a super setter [element]. |
| 185 factory StaticUse.superSetterSet(FunctionEntity element) { | 213 factory StaticUse.superSetterSet(FunctionEntity element) { |
| 186 assert(invariant(element, element.isInstanceMember, | 214 assert( |
| 187 message: "Super set element $element must be an instance method.")); | 215 element.isInstanceMember, |
| 188 assert(invariant(element, element.isSetter, | 216 failedAt( |
| 189 message: "Super set element $element must be a setter.")); | 217 element, "Super set element $element must be an instance method.")); |
| 218 assert(element.isSetter, |
| 219 failedAt(element, "Super set element $element must be a setter.")); |
| 190 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 220 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 191 } | 221 } |
| 192 | 222 |
| 193 /// Closurization of a super method [element]. | 223 /// Closurization of a super method [element]. |
| 194 factory StaticUse.superTearOff(FunctionEntity element) { | 224 factory StaticUse.superTearOff(FunctionEntity element) { |
| 195 assert(invariant(element, element.isInstanceMember && element.isFunction, | 225 assert( |
| 196 message: "Super invoke element $element must be an instance method.")); | 226 element.isInstanceMember && element.isFunction, |
| 227 failedAt(element, |
| 228 "Super invoke element $element must be an instance method.")); |
| 197 return new StaticUse.internal(element, StaticUseKind.SUPER_TEAR_OFF); | 229 return new StaticUse.internal(element, StaticUseKind.SUPER_TEAR_OFF); |
| 198 } | 230 } |
| 199 | 231 |
| 200 /// Invocation of a constructor [element] through a this or super | 232 /// Invocation of a constructor [element] through a this or super |
| 201 /// constructor call with the given [callStructure]. | 233 /// constructor call with the given [callStructure]. |
| 202 factory StaticUse.superConstructorInvoke( | 234 factory StaticUse.superConstructorInvoke( |
| 203 ConstructorEntity element, CallStructure callStructure) { | 235 ConstructorEntity element, CallStructure callStructure) { |
| 204 // TODO(johnniwinther): Use the [callStructure]. | 236 // TODO(johnniwinther): Use the [callStructure]. |
| 205 assert(invariant(element, element.isGenerativeConstructor, | 237 assert( |
| 206 message: "Constructor invoke element $element must be a " | 238 element.isGenerativeConstructor, |
| 239 failedAt( |
| 240 element, |
| 241 "Constructor invoke element $element must be a " |
| 207 "generative constructor.")); | 242 "generative constructor.")); |
| 208 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 243 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 209 } | 244 } |
| 210 | 245 |
| 211 /// Invocation of a constructor (body) [element] through a this or super | 246 /// Invocation of a constructor (body) [element] through a this or super |
| 212 /// constructor call with the given [callStructure]. | 247 /// constructor call with the given [callStructure]. |
| 213 factory StaticUse.constructorBodyInvoke( | 248 factory StaticUse.constructorBodyInvoke( |
| 214 ConstructorBodyElement element, CallStructure callStructure) { | 249 ConstructorBodyElement element, CallStructure callStructure) { |
| 215 // TODO(johnniwinther): Use the [callStructure]. | 250 // TODO(johnniwinther): Use the [callStructure]. |
| 216 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 251 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 217 } | 252 } |
| 218 | 253 |
| 219 /// Direct invocation of a method [element] with the given [callStructure]. | 254 /// Direct invocation of a method [element] with the given [callStructure]. |
| 220 factory StaticUse.directInvoke( | 255 factory StaticUse.directInvoke( |
| 221 FunctionEntity element, CallStructure callStructure) { | 256 FunctionEntity element, CallStructure callStructure) { |
| 222 // TODO(johnniwinther): Use the [callStructure]. | 257 // TODO(johnniwinther): Use the [callStructure]. |
| 223 assert(invariant(element, element.isInstanceMember, | 258 assert( |
| 224 message: "Direct invoke element $element must be an instance member.")); | 259 element.isInstanceMember, |
| 225 assert(invariant(element, element.isFunction, | 260 failedAt(element, |
| 226 message: "Direct invoke element $element must be a method.")); | 261 "Direct invoke element $element must be an instance member.")); |
| 262 assert(element.isFunction, |
| 263 failedAt(element, "Direct invoke element $element must be a method.")); |
| 227 return new StaticUse.internal(element, StaticUseKind.DIRECT_INVOKE); | 264 return new StaticUse.internal(element, StaticUseKind.DIRECT_INVOKE); |
| 228 } | 265 } |
| 229 | 266 |
| 230 /// Direct read access of a field or getter [element]. | 267 /// Direct read access of a field or getter [element]. |
| 231 factory StaticUse.directGet(MemberEntity element) { | 268 factory StaticUse.directGet(MemberEntity element) { |
| 232 assert(invariant(element, element.isInstanceMember, | 269 assert( |
| 233 message: "Direct get element $element must be an instance member.")); | 270 element.isInstanceMember, |
| 234 assert(invariant(element, element.isField || element.isGetter, | 271 failedAt(element, |
| 235 message: "Direct get element $element must be a field or a getter.")); | 272 "Direct get element $element must be an instance member.")); |
| 273 assert( |
| 274 element.isField || element.isGetter, |
| 275 failedAt(element, |
| 276 "Direct get element $element must be a field or a getter.")); |
| 236 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 277 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 237 } | 278 } |
| 238 | 279 |
| 239 /// Direct write access of a field [element]. | 280 /// Direct write access of a field [element]. |
| 240 factory StaticUse.directSet(FieldEntity element) { | 281 factory StaticUse.directSet(FieldEntity element) { |
| 241 assert(invariant(element, element.isInstanceMember, | 282 assert( |
| 242 message: "Direct set element $element must be an instance member.")); | 283 element.isInstanceMember, |
| 243 assert(invariant(element, element.isField, | 284 failedAt(element, |
| 244 message: "Direct set element $element must be a field.")); | 285 "Direct set element $element must be an instance member.")); |
| 286 assert(element.isField, |
| 287 failedAt(element, "Direct set element $element must be a field.")); |
| 245 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 288 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 246 } | 289 } |
| 247 | 290 |
| 248 /// Constructor invocation of [element] with the given [callStructure]. | 291 /// Constructor invocation of [element] with the given [callStructure]. |
| 249 factory StaticUse.constructorInvoke( | 292 factory StaticUse.constructorInvoke( |
| 250 ConstructorEntity element, CallStructure callStructure) { | 293 ConstructorEntity element, CallStructure callStructure) { |
| 251 assert(invariant(element, element.isConstructor, | 294 assert( |
| 252 message: "Constructor invocation element $element " | 295 element.isConstructor, |
| 253 "must be a constructor.")); | 296 failedAt(element, |
| 297 "Constructor invocation element $element must be a constructor.")); |
| 254 // TODO(johnniwinther): Use the [callStructure]. | 298 // TODO(johnniwinther): Use the [callStructure]. |
| 255 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 299 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 256 } | 300 } |
| 257 | 301 |
| 258 /// Constructor invocation of [element] with the given [callStructure] on | 302 /// Constructor invocation of [element] with the given [callStructure] on |
| 259 /// [type]. | 303 /// [type]. |
| 260 factory StaticUse.typedConstructorInvoke( | 304 factory StaticUse.typedConstructorInvoke( |
| 261 ConstructorEntity element, CallStructure callStructure, DartType type) { | 305 ConstructorEntity element, CallStructure callStructure, DartType type) { |
| 262 assert(invariant(element, type != null, | 306 assert(type != null, |
| 263 message: "No type provided for constructor invocation.")); | 307 failedAt(element, "No type provided for constructor invocation.")); |
| 264 assert(invariant(element, element.isConstructor, | 308 assert( |
| 265 message: "Typed constructor invocation element $element " | 309 element.isConstructor, |
| 310 failedAt( |
| 311 element, |
| 312 "Typed constructor invocation element $element " |
| 266 "must be a constructor.")); | 313 "must be a constructor.")); |
| 267 // TODO(johnniwinther): Use the [callStructure]. | 314 // TODO(johnniwinther): Use the [callStructure]. |
| 268 return new StaticUse.internal( | 315 return new StaticUse.internal( |
| 269 element, StaticUseKind.CONSTRUCTOR_INVOKE, type); | 316 element, StaticUseKind.CONSTRUCTOR_INVOKE, type); |
| 270 } | 317 } |
| 271 | 318 |
| 272 /// Constant constructor invocation of [element] with the given | 319 /// Constant constructor invocation of [element] with the given |
| 273 /// [callStructure] on [type]. | 320 /// [callStructure] on [type]. |
| 274 factory StaticUse.constConstructorInvoke( | 321 factory StaticUse.constConstructorInvoke( |
| 275 ConstructorEntity element, CallStructure callStructure, DartType type) { | 322 ConstructorEntity element, CallStructure callStructure, DartType type) { |
| 276 assert(invariant(element, type != null, | 323 assert(type != null, |
| 277 message: "No type provided for constructor invocation.")); | 324 failedAt(element, "No type provided for constructor invocation.")); |
| 278 assert(invariant(element, element.isConstructor, | 325 assert( |
| 279 message: "Const constructor invocation element $element " | 326 element.isConstructor, |
| 327 failedAt( |
| 328 element, |
| 329 "Const constructor invocation element $element " |
| 280 "must be a constructor.")); | 330 "must be a constructor.")); |
| 281 // TODO(johnniwinther): Use the [callStructure]. | 331 // TODO(johnniwinther): Use the [callStructure]. |
| 282 return new StaticUse.internal( | 332 return new StaticUse.internal( |
| 283 element, StaticUseKind.CONST_CONSTRUCTOR_INVOKE, type); | 333 element, StaticUseKind.CONST_CONSTRUCTOR_INVOKE, type); |
| 284 } | 334 } |
| 285 | 335 |
| 286 /// Constructor redirection to [element] on [type]. | 336 /// Constructor redirection to [element] on [type]. |
| 287 factory StaticUse.constructorRedirect( | 337 factory StaticUse.constructorRedirect( |
| 288 ConstructorEntity element, InterfaceType type) { | 338 ConstructorEntity element, InterfaceType type) { |
| 289 assert(invariant(element, type != null, | 339 assert(type != null, |
| 290 message: "No type provided for constructor redirection.")); | 340 failedAt(element, "No type provided for constructor redirection.")); |
| 291 assert(invariant(element, element.isConstructor, | 341 assert( |
| 292 message: "Constructor redirection element $element " | 342 element.isConstructor, |
| 293 "must be a constructor.")); | 343 failedAt(element, |
| 344 "Constructor redirection element $element must be a constructor.")); |
| 294 return new StaticUse.internal(element, StaticUseKind.REDIRECTION, type); | 345 return new StaticUse.internal(element, StaticUseKind.REDIRECTION, type); |
| 295 } | 346 } |
| 296 | 347 |
| 297 /// Initialization of an instance field [element]. | 348 /// Initialization of an instance field [element]. |
| 298 factory StaticUse.fieldInit(FieldEntity element) { | 349 factory StaticUse.fieldInit(FieldEntity element) { |
| 299 assert(invariant(element, element.isInstanceMember, | 350 assert( |
| 300 message: "Field init element $element must be an instance field.")); | 351 element.isInstanceMember, |
| 352 failedAt( |
| 353 element, "Field init element $element must be an instance field.")); |
| 301 return new StaticUse.internal(element, StaticUseKind.GENERAL); | 354 return new StaticUse.internal(element, StaticUseKind.GENERAL); |
| 302 } | 355 } |
| 303 | 356 |
| 304 /// Read access of an instance field or boxed field [element]. | 357 /// Read access of an instance field or boxed field [element]. |
| 305 factory StaticUse.fieldGet(FieldEntity element) { | 358 factory StaticUse.fieldGet(FieldEntity element) { |
| 306 assert(invariant( | 359 assert( |
| 307 element, element.isInstanceMember || element is BoxFieldElement, | 360 element.isInstanceMember || element is BoxFieldElement, |
| 308 message: "Field init element $element must be an instance " | 361 failedAt(element, |
| 309 "or boxed field.")); | 362 "Field init element $element must be an instance or boxed field.")); |
| 310 return new StaticUse.internal(element, StaticUseKind.FIELD_GET); | 363 return new StaticUse.internal(element, StaticUseKind.FIELD_GET); |
| 311 } | 364 } |
| 312 | 365 |
| 313 /// Write access of an instance field or boxed field [element]. | 366 /// Write access of an instance field or boxed field [element]. |
| 314 factory StaticUse.fieldSet(FieldEntity element) { | 367 factory StaticUse.fieldSet(FieldEntity element) { |
| 315 assert(invariant( | 368 assert( |
| 316 element, element.isInstanceMember || element is BoxFieldElement, | 369 element.isInstanceMember || element is BoxFieldElement, |
| 317 message: "Field init element $element must be an instance " | 370 failedAt(element, |
| 318 "or boxed field.")); | 371 "Field init element $element must be an instance or boxed field.")); |
| 319 return new StaticUse.internal(element, StaticUseKind.FIELD_SET); | 372 return new StaticUse.internal(element, StaticUseKind.FIELD_SET); |
| 320 } | 373 } |
| 321 | 374 |
| 322 /// Read of a local function [element]. | 375 /// Read of a local function [element]. |
| 323 factory StaticUse.closure(Local element) { | 376 factory StaticUse.closure(Local element) { |
| 324 return new StaticUse.internal(element, StaticUseKind.CLOSURE); | 377 return new StaticUse.internal(element, StaticUseKind.CLOSURE); |
| 325 } | 378 } |
| 326 | 379 |
| 327 /// Use of [element] through reflection. | 380 /// Use of [element] through reflection. |
| 328 factory StaticUse.mirrorUse(MemberEntity element) { | 381 factory StaticUse.mirrorUse(MemberEntity element) { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 : this._(value, ConstantUseKind.DIRECT); | 520 : this._(value, ConstantUseKind.DIRECT); |
| 468 | 521 |
| 469 bool operator ==(other) { | 522 bool operator ==(other) { |
| 470 if (identical(this, other)) return true; | 523 if (identical(this, other)) return true; |
| 471 if (other is! ConstantUse) return false; | 524 if (other is! ConstantUse) return false; |
| 472 return value == other.value; | 525 return value == other.value; |
| 473 } | 526 } |
| 474 | 527 |
| 475 String toString() => 'ConstantUse(${value.toStructuredText()},$kind)'; | 528 String toString() => 'ConstantUse(${value.toStructuredText()},$kind)'; |
| 476 } | 529 } |
| OLD | NEW |