| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 elements.modelx; | 5 library elements.modelx; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/resolution.dart' show | 8 import '../common/resolution.dart' show |
| 9 Resolution, | 9 Resolution, |
| 10 Parsing; | 10 Parsing; |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 .message(messageArguments).toString(); | 315 .message(messageArguments).toString(); |
| 316 } | 316 } |
| 317 | 317 |
| 318 String toString() => '<$name: $message>'; | 318 String toString() => '<$name: $message>'; |
| 319 | 319 |
| 320 accept(ElementVisitor visitor, arg) { | 320 accept(ElementVisitor visitor, arg) { |
| 321 return visitor.visitErroneousElement(this, arg); | 321 return visitor.visitErroneousElement(this, arg); |
| 322 } | 322 } |
| 323 | 323 |
| 324 @override | 324 @override |
| 325 get isEffectiveTargetMalformed { |
| 326 throw new UnsupportedError("isEffectiveTargetMalformed"); |
| 327 } |
| 328 |
| 329 @override |
| 325 bool get isFromEnvironmentConstructor => false; | 330 bool get isFromEnvironmentConstructor => false; |
| 326 } | 331 } |
| 327 | 332 |
| 328 /// A constructor that was synthesized to recover from a compile-time error. | 333 /// A constructor that was synthesized to recover from a compile-time error. |
| 329 class ErroneousConstructorElementX extends ErroneousElementX | 334 class ErroneousConstructorElementX extends ErroneousElementX |
| 330 with PatchMixin<FunctionElement>, | 335 with PatchMixin<FunctionElement>, |
| 331 AnalyzableElementX, | 336 AnalyzableElementX, |
| 332 ConstantConstructorMixin | 337 ConstantConstructorMixin |
| 333 implements ConstructorElementX { | 338 implements ConstructorElementX { |
| 334 // TODO(ahe): Instead of subclassing [ErroneousElementX], this class should | 339 // TODO(ahe): Instead of subclassing [ErroneousElementX], this class should |
| 335 // be more like [ErroneousFieldElementX]. In particular, its kind should be | 340 // be more like [ErroneousFieldElementX]. In particular, its kind should be |
| 336 // [ElementKind.GENERATIVE_CONSTRUCTOR], and it shouldn't throw as much. | 341 // [ElementKind.GENERATIVE_CONSTRUCTOR], and it shouldn't throw as much. |
| 337 | 342 |
| 338 ErroneousConstructorElementX( | 343 ErroneousConstructorElementX( |
| 339 MessageKind messageKind, | 344 MessageKind messageKind, |
| 340 Map messageArguments, | 345 Map messageArguments, |
| 341 String name, | 346 String name, |
| 342 Element enclosing) | 347 Element enclosing) |
| 343 : super(messageKind, messageArguments, name, enclosing); | 348 : super(messageKind, messageArguments, name, enclosing); |
| 344 | 349 |
| 350 @override |
| 345 bool get isRedirectingGenerative => false; | 351 bool get isRedirectingGenerative => false; |
| 346 | 352 |
| 353 @override |
| 347 void set isRedirectingGenerative(_) { | 354 void set isRedirectingGenerative(_) { |
| 348 throw new UnsupportedError("isRedirectingGenerative"); | 355 throw new UnsupportedError("isRedirectingGenerative"); |
| 349 } | 356 } |
| 350 | 357 |
| 358 @override |
| 351 bool get isRedirectingFactory => false; | 359 bool get isRedirectingFactory => false; |
| 352 | 360 |
| 361 @override |
| 353 get definingElement { | 362 get definingElement { |
| 354 throw new UnsupportedError("definingElement"); | 363 throw new UnsupportedError("definingElement"); |
| 355 } | 364 } |
| 356 | 365 |
| 366 @override |
| 357 get asyncMarker { | 367 get asyncMarker { |
| 358 throw new UnsupportedError("asyncMarker"); | 368 throw new UnsupportedError("asyncMarker"); |
| 359 } | 369 } |
| 360 | 370 |
| 371 @override |
| 361 set asyncMarker(_) { | 372 set asyncMarker(_) { |
| 362 throw new UnsupportedError("asyncMarker="); | 373 throw new UnsupportedError("asyncMarker="); |
| 363 } | 374 } |
| 364 | 375 |
| 365 get internalEffectiveTarget { | 376 @override |
| 366 throw new UnsupportedError("internalEffectiveTarget"); | 377 get effectiveTargetInternal { |
| 378 throw new UnsupportedError("effectiveTargetInternal"); |
| 367 } | 379 } |
| 368 | 380 |
| 369 set internalEffectiveTarget(_) { | 381 @override |
| 370 throw new UnsupportedError("internalEffectiveTarget="); | 382 set effectiveTargetInternal(_) { |
| 383 throw new UnsupportedError("effectiveTargetInternal="); |
| 371 } | 384 } |
| 372 | 385 |
| 386 @override |
| 387 get _effectiveTargetType { |
| 388 throw new UnsupportedError("_effectiveTargetType"); |
| 389 } |
| 390 |
| 391 @override |
| 392 set _effectiveTargetType(_) { |
| 393 throw new UnsupportedError("_effectiveTargetType="); |
| 394 } |
| 395 |
| 396 @override |
| 373 get effectiveTargetType { | 397 get effectiveTargetType { |
| 374 throw new UnsupportedError("effectiveTargetType"); | 398 throw new UnsupportedError("effectiveTargetType"); |
| 375 } | 399 } |
| 376 | 400 |
| 377 set effectiveTargetType(_) { | 401 @override |
| 378 throw new UnsupportedError("effectiveTargetType="); | 402 get _isEffectiveTargetMalformed { |
| 403 throw new UnsupportedError("_isEffectiveTargetMalformed"); |
| 379 } | 404 } |
| 380 | 405 |
| 406 @override |
| 407 set _isEffectiveTargetMalformed(_) { |
| 408 throw new UnsupportedError("_isEffectiveTargetMalformed="); |
| 409 } |
| 410 |
| 411 @override |
| 412 get isEffectiveTargetMalformed { |
| 413 throw new UnsupportedError("isEffectiveTargetMalformed"); |
| 414 } |
| 415 |
| 416 @override |
| 417 void setEffectiveTarget(ConstructorElement target, |
| 418 InterfaceType type, |
| 419 {bool isMalformed: false}) { |
| 420 throw new UnsupportedError("setEffectiveTarget"); |
| 421 } |
| 422 |
| 423 @override |
| 381 void _computeSignature(Resolution resolution) { | 424 void _computeSignature(Resolution resolution) { |
| 382 throw new UnsupportedError("_computeSignature"); | 425 throw new UnsupportedError("_computeSignature"); |
| 383 } | 426 } |
| 384 | 427 |
| 428 @override |
| 385 get typeCache { | 429 get typeCache { |
| 386 throw new UnsupportedError("typeCache"); | 430 throw new UnsupportedError("typeCache"); |
| 387 } | 431 } |
| 388 | 432 |
| 433 @override |
| 389 set typeCache(_) { | 434 set typeCache(_) { |
| 390 throw new UnsupportedError("typeCache="); | 435 throw new UnsupportedError("typeCache="); |
| 391 } | 436 } |
| 392 | 437 |
| 438 @override |
| 393 get immediateRedirectionTarget { | 439 get immediateRedirectionTarget { |
| 394 throw new UnsupportedError("immediateRedirectionTarget"); | 440 throw new UnsupportedError("immediateRedirectionTarget"); |
| 395 } | 441 } |
| 396 | 442 |
| 443 @override |
| 397 set immediateRedirectionTarget(_) { | 444 set immediateRedirectionTarget(_) { |
| 398 throw new UnsupportedError("immediateRedirectionTarget="); | 445 throw new UnsupportedError("immediateRedirectionTarget="); |
| 399 } | 446 } |
| 400 | 447 |
| 448 @override |
| 401 get _functionSignatureCache { | 449 get _functionSignatureCache { |
| 402 throw new UnsupportedError("functionSignatureCache"); | 450 throw new UnsupportedError("functionSignatureCache"); |
| 403 } | 451 } |
| 404 | 452 |
| 453 @override |
| 405 set _functionSignatureCache(_) { | 454 set _functionSignatureCache(_) { |
| 406 throw new UnsupportedError("functionSignatureCache="); | 455 throw new UnsupportedError("functionSignatureCache="); |
| 407 } | 456 } |
| 408 | 457 |
| 458 @override |
| 409 set functionSignature(_) { | 459 set functionSignature(_) { |
| 410 throw new UnsupportedError("functionSignature="); | 460 throw new UnsupportedError("functionSignature="); |
| 411 } | 461 } |
| 412 | 462 |
| 463 @override |
| 413 get nestedClosures { | 464 get nestedClosures { |
| 414 throw new UnsupportedError("nestedClosures"); | 465 throw new UnsupportedError("nestedClosures"); |
| 415 } | 466 } |
| 416 | 467 |
| 468 @override |
| 417 set nestedClosures(_) { | 469 set nestedClosures(_) { |
| 418 throw new UnsupportedError("nestedClosures="); | 470 throw new UnsupportedError("nestedClosures="); |
| 419 } | 471 } |
| 420 | 472 |
| 473 @override |
| 421 set redirectionDeferredPrefix(_) { | 474 set redirectionDeferredPrefix(_) { |
| 422 throw new UnsupportedError("redirectionDeferredPrefix="); | 475 throw new UnsupportedError("redirectionDeferredPrefix="); |
| 423 } | 476 } |
| 424 | |
| 425 void set effectiveTarget(_) { | |
| 426 throw new UnsupportedError("effectiveTarget="); | |
| 427 } | |
| 428 } | 477 } |
| 429 | 478 |
| 430 /// A message attached to a [WarnOnUseElementX]. | 479 /// A message attached to a [WarnOnUseElementX]. |
| 431 class WrappedMessage { | 480 class WrappedMessage { |
| 432 /// The message position. If [:null:] the position of the reference to the | 481 /// The message position. If [:null:] the position of the reference to the |
| 433 /// [WarnOnUseElementX] is used. | 482 /// [WarnOnUseElementX] is used. |
| 434 final Spannable spannable; | 483 final Spannable spannable; |
| 435 | 484 |
| 436 /** | 485 /** |
| 437 * The message to report on resolving a wrapped element. | 486 * The message to report on resolving a wrapped element. |
| (...skipping 1776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2214 | 2263 |
| 2215 FunctionElement immediateRedirectionTarget; | 2264 FunctionElement immediateRedirectionTarget; |
| 2216 PrefixElement redirectionDeferredPrefix; | 2265 PrefixElement redirectionDeferredPrefix; |
| 2217 | 2266 |
| 2218 bool get isRedirectingFactory => immediateRedirectionTarget != null; | 2267 bool get isRedirectingFactory => immediateRedirectionTarget != null; |
| 2219 | 2268 |
| 2220 // TODO(johnniwinther): This should also return true for cyclic redirecting | 2269 // TODO(johnniwinther): This should also return true for cyclic redirecting |
| 2221 // generative constructors. | 2270 // generative constructors. |
| 2222 bool get isCyclicRedirection => effectiveTarget.isRedirectingFactory; | 2271 bool get isCyclicRedirection => effectiveTarget.isRedirectingFactory; |
| 2223 | 2272 |
| 2224 /// This field is set by the post process queue when checking for cycles. | 2273 /// These fields are set by the post process queue when checking for cycles. |
| 2225 ConstructorElement internalEffectiveTarget; | 2274 ConstructorElement effectiveTargetInternal; |
| 2226 DartType effectiveTargetType; | 2275 DartType _effectiveTargetType; |
| 2276 bool _isEffectiveTargetMalformed; |
| 2227 | 2277 |
| 2228 void set effectiveTarget(ConstructorElement constructor) { | 2278 void setEffectiveTarget(ConstructorElement target, |
| 2229 assert(constructor != null && internalEffectiveTarget == null); | 2279 DartType type, |
| 2230 internalEffectiveTarget = constructor; | 2280 {bool isMalformed: false}) { |
| 2281 assert(invariant(this, target != null, |
| 2282 message: 'No effective target provided for $this.')); |
| 2283 assert(invariant(this, effectiveTargetInternal == null, |
| 2284 message: 'Effective target has already been computed for $this.')); |
| 2285 effectiveTargetInternal = target; |
| 2286 _effectiveTargetType = type; |
| 2287 _isEffectiveTargetMalformed = isMalformed; |
| 2231 } | 2288 } |
| 2232 | 2289 |
| 2233 ConstructorElement get effectiveTarget { | 2290 ConstructorElement get effectiveTarget { |
| 2234 if (Elements.isMalformed(immediateRedirectionTarget)) { | 2291 if (Elements.isMalformed(immediateRedirectionTarget)) { |
| 2235 return immediateRedirectionTarget; | 2292 return immediateRedirectionTarget; |
| 2236 } | 2293 } |
| 2237 assert(!isRedirectingFactory || internalEffectiveTarget != null); | 2294 assert(!isRedirectingFactory || effectiveTargetInternal != null); |
| 2238 if (isRedirectingFactory) return internalEffectiveTarget; | 2295 if (isRedirectingFactory) { |
| 2296 return effectiveTargetInternal; |
| 2297 } |
| 2239 if (isPatched) { | 2298 if (isPatched) { |
| 2240 return internalEffectiveTarget ?? this; | 2299 return effectiveTargetInternal ?? this; |
| 2241 } | 2300 } |
| 2242 return this; | 2301 return this; |
| 2243 } | 2302 } |
| 2244 | 2303 |
| 2304 InterfaceType get effectiveTargetType { |
| 2305 assert(invariant(this, _effectiveTargetType != null, |
| 2306 message: 'Effective target type has not yet been computed for $this.')); |
| 2307 return _effectiveTargetType; |
| 2308 } |
| 2309 |
| 2245 InterfaceType computeEffectiveTargetType(InterfaceType newType) { | 2310 InterfaceType computeEffectiveTargetType(InterfaceType newType) { |
| 2246 if (!isRedirectingFactory) return newType; | 2311 if (!isRedirectingFactory) return newType; |
| 2247 assert(invariant(this, effectiveTargetType != null, | |
| 2248 message: 'Redirection target type has not yet been computed for ' | |
| 2249 '$this.')); | |
| 2250 return effectiveTargetType.substByContext(newType); | 2312 return effectiveTargetType.substByContext(newType); |
| 2251 } | 2313 } |
| 2252 | 2314 |
| 2315 bool get isEffectiveTargetMalformed { |
| 2316 if (!isRedirectingFactory) return false; |
| 2317 assert(invariant(this, _isEffectiveTargetMalformed != null, |
| 2318 message: 'Malformedness has not yet been computed for $this.')); |
| 2319 return _isEffectiveTargetMalformed == true; |
| 2320 } |
| 2321 |
| 2253 accept(ElementVisitor visitor, arg) { | 2322 accept(ElementVisitor visitor, arg) { |
| 2254 return visitor.visitConstructorElement(this, arg); | 2323 return visitor.visitConstructorElement(this, arg); |
| 2255 } | 2324 } |
| 2256 | 2325 |
| 2257 ConstructorElement get definingConstructor => null; | 2326 ConstructorElement get definingConstructor => null; |
| 2258 | 2327 |
| 2259 ClassElement get enclosingClass => enclosingElement; | 2328 ClassElement get enclosingClass => enclosingElement; |
| 2260 } | 2329 } |
| 2261 | 2330 |
| 2262 class DeferredLoaderGetterElementX extends GetterElementX | 2331 class DeferredLoaderGetterElementX extends GetterElementX |
| (...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3121 AstElement get definingElement; | 3190 AstElement get definingElement; |
| 3122 | 3191 |
| 3123 bool get hasResolvedAst => definingElement.hasTreeElements; | 3192 bool get hasResolvedAst => definingElement.hasTreeElements; |
| 3124 | 3193 |
| 3125 ResolvedAst get resolvedAst { | 3194 ResolvedAst get resolvedAst { |
| 3126 return new ResolvedAst(declaration, | 3195 return new ResolvedAst(declaration, |
| 3127 definingElement.node, definingElement.treeElements); | 3196 definingElement.node, definingElement.treeElements); |
| 3128 } | 3197 } |
| 3129 | 3198 |
| 3130 } | 3199 } |
| OLD | NEW |