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 /// ----------------------------------------------------------------------- | 5 /// ----------------------------------------------------------------------- |
6 /// ERROR HANDLING | 6 /// ERROR HANDLING |
7 /// ----------------------------------------------------------------------- | 7 /// ----------------------------------------------------------------------- |
8 /// | 8 /// |
9 /// As a rule of thumb, errors that can be detected statically are handled by | 9 /// As a rule of thumb, errors that can be detected statically are handled by |
10 /// the frontend, typically by translating the erroneous code into a 'throw' or | 10 /// the frontend, typically by translating the erroneous code into a 'throw' or |
(...skipping 4085 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4096 | 4096 |
4097 /// Stores the hash code of function type parameters while computing the hash | 4097 /// Stores the hash code of function type parameters while computing the hash |
4098 /// code of a [FunctionType] object. | 4098 /// code of a [FunctionType] object. |
4099 /// | 4099 /// |
4100 /// This ensures that distinct [FunctionType] objects get the same hash code | 4100 /// This ensures that distinct [FunctionType] objects get the same hash code |
4101 /// if they represent the same type, even though their type parameters are | 4101 /// if they represent the same type, even though their type parameters are |
4102 /// represented by different objects. | 4102 /// represented by different objects. |
4103 final Map<TypeParameter, int> _temporaryHashCodeTable = <TypeParameter, int>{}; | 4103 final Map<TypeParameter, int> _temporaryHashCodeTable = <TypeParameter, int>{}; |
4104 | 4104 |
4105 /// Reference to a type variable. | 4105 /// Reference to a type variable. |
| 4106 /// |
| 4107 /// A type variable has an optional bound because type promotion can change the |
| 4108 /// bound. A bound of `null` indicates that the bound has not been promoted and |
| 4109 /// is the same as the [TypeParameter]'s bound. This allows one to detect |
| 4110 /// whether the bound has been promoted. |
4106 class TypeParameterType extends DartType { | 4111 class TypeParameterType extends DartType { |
4107 TypeParameter parameter; | 4112 TypeParameter parameter; |
4108 | 4113 |
4109 TypeParameterType(this.parameter); | 4114 /// An optional promoted bound on the type parameter. |
| 4115 /// |
| 4116 /// 'null' indicates that the type parameter's bound has not been promoted and |
| 4117 /// is therefore the same as the bound of [parameter]. |
| 4118 DartType bound; |
| 4119 |
| 4120 TypeParameterType(this.parameter, [this.bound]); |
4110 | 4121 |
4111 accept(DartTypeVisitor v) => v.visitTypeParameterType(this); | 4122 accept(DartTypeVisitor v) => v.visitTypeParameterType(this); |
4112 | 4123 |
4113 visitChildren(Visitor v) {} | 4124 visitChildren(Visitor v) {} |
4114 | 4125 |
4115 bool operator ==(Object other) { | 4126 bool operator ==(Object other) { |
4116 return other is TypeParameterType && parameter == other.parameter; | 4127 return other is TypeParameterType && parameter == other.parameter; |
4117 } | 4128 } |
4118 | 4129 |
4119 int get hashCode => _temporaryHashCodeTable[parameter] ?? parameter.hashCode; | 4130 int get hashCode => _temporaryHashCodeTable[parameter] ?? parameter.hashCode; |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4474 /// typedef has not been assigned a canonical name yet. | 4485 /// typedef has not been assigned a canonical name yet. |
4475 /// | 4486 /// |
4476 /// Returns `null` if the typedef is `null`. | 4487 /// Returns `null` if the typedef is `null`. |
4477 CanonicalName getCanonicalNameOfTypedef(Typedef typedef_) { | 4488 CanonicalName getCanonicalNameOfTypedef(Typedef typedef_) { |
4478 if (typedef_ == null) return null; | 4489 if (typedef_ == null) return null; |
4479 if (typedef_.canonicalName == null) { | 4490 if (typedef_.canonicalName == null) { |
4480 throw '$typedef_ has no canonical name'; | 4491 throw '$typedef_ has no canonical name'; |
4481 } | 4492 } |
4482 return typedef_.canonicalName; | 4493 return typedef_.canonicalName; |
4483 } | 4494 } |
OLD | NEW |