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 2114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2125 | 2125 |
2126 /// Expression of form `x.foo(y)`. | 2126 /// Expression of form `x.foo(y)`. |
2127 class MethodInvocation extends InvocationExpression { | 2127 class MethodInvocation extends InvocationExpression { |
2128 Expression receiver; | 2128 Expression receiver; |
2129 Name name; | 2129 Name name; |
2130 Arguments arguments; | 2130 Arguments arguments; |
2131 | 2131 |
2132 Reference interfaceTargetReference; | 2132 Reference interfaceTargetReference; |
2133 | 2133 |
2134 MethodInvocation(Expression receiver, Name name, Arguments arguments, | 2134 MethodInvocation(Expression receiver, Name name, Arguments arguments, |
2135 [Procedure interfaceTarget]) | 2135 [Member interfaceTarget]) |
2136 : this.byReference( | 2136 : this.byReference( |
2137 receiver, name, arguments, getMemberReference(interfaceTarget)); | 2137 receiver, name, arguments, getMemberReference(interfaceTarget)); |
2138 | 2138 |
2139 MethodInvocation.byReference( | 2139 MethodInvocation.byReference( |
2140 this.receiver, this.name, this.arguments, this.interfaceTargetReference) { | 2140 this.receiver, this.name, this.arguments, this.interfaceTargetReference) { |
2141 receiver?.parent = this; | 2141 receiver?.parent = this; |
2142 arguments?.parent = this; | 2142 arguments?.parent = this; |
2143 } | 2143 } |
2144 | 2144 |
2145 Procedure get interfaceTarget => interfaceTargetReference?.asProcedure; | 2145 Member get interfaceTarget => interfaceTargetReference?.asMember; |
2146 | 2146 |
2147 void set interfaceTarget(Member target) { | 2147 void set interfaceTarget(Member target) { |
2148 interfaceTargetReference = getMemberReference(target); | 2148 interfaceTargetReference = getMemberReference(target); |
2149 } | 2149 } |
2150 | 2150 |
2151 DartType getStaticType(TypeEnvironment types) { | 2151 DartType getStaticType(TypeEnvironment types) { |
| 2152 var interfaceTarget = this.interfaceTarget; |
2152 if (interfaceTarget != null) { | 2153 if (interfaceTarget != null) { |
2153 if (types.isOverloadedArithmeticOperator(interfaceTarget)) { | 2154 if (interfaceTarget is Procedure && |
| 2155 types.isOverloadedArithmeticOperator(interfaceTarget)) { |
2154 return types.getTypeOfOverloadedArithmetic( | 2156 return types.getTypeOfOverloadedArithmetic( |
2155 receiver.getStaticType(types), | 2157 receiver.getStaticType(types), |
2156 arguments.positional[0].getStaticType(types)); | 2158 arguments.positional[0].getStaticType(types)); |
2157 } | 2159 } |
2158 Class superclass = interfaceTarget.enclosingClass; | 2160 Class superclass = interfaceTarget.enclosingClass; |
2159 var receiverType = receiver.getStaticTypeAsInstanceOf(superclass, types); | 2161 var receiverType = receiver.getStaticTypeAsInstanceOf(superclass, types); |
2160 var returnType = Substitution | 2162 var getterType = Substitution |
2161 .fromInterfaceType(receiverType) | 2163 .fromInterfaceType(receiverType) |
2162 .substituteType(interfaceTarget.function.returnType); | 2164 .substituteType(interfaceTarget.getterType); |
2163 return Substitution | 2165 if (getterType is FunctionType) { |
2164 .fromPairs(interfaceTarget.function.typeParameters, arguments.types) | 2166 return Substitution |
2165 .substituteType(returnType); | 2167 .fromPairs(getterType.typeParameters, arguments.types) |
| 2168 .substituteType(getterType.returnType); |
| 2169 } else { |
| 2170 return const DynamicType(); |
| 2171 } |
2166 } | 2172 } |
2167 if (name.name == 'call') { | 2173 if (name.name == 'call') { |
2168 var receiverType = receiver.getStaticType(types); | 2174 var receiverType = receiver.getStaticType(types); |
2169 if (receiverType is FunctionType) { | 2175 if (receiverType is FunctionType) { |
2170 if (receiverType.typeParameters.length != arguments.types.length) { | 2176 if (receiverType.typeParameters.length != arguments.types.length) { |
2171 return const BottomType(); | 2177 return const BottomType(); |
2172 } | 2178 } |
2173 return Substitution | 2179 return Substitution |
2174 .fromPairs(receiverType.typeParameters, arguments.types) | 2180 .fromPairs(receiverType.typeParameters, arguments.types) |
2175 .substituteType(receiverType.returnType); | 2181 .substituteType(receiverType.returnType); |
(...skipping 2428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4604 /// typedef has not been assigned a canonical name yet. | 4610 /// typedef has not been assigned a canonical name yet. |
4605 /// | 4611 /// |
4606 /// Returns `null` if the typedef is `null`. | 4612 /// Returns `null` if the typedef is `null`. |
4607 CanonicalName getCanonicalNameOfTypedef(Typedef typedef_) { | 4613 CanonicalName getCanonicalNameOfTypedef(Typedef typedef_) { |
4608 if (typedef_ == null) return null; | 4614 if (typedef_ == null) return null; |
4609 if (typedef_.canonicalName == null) { | 4615 if (typedef_.canonicalName == null) { |
4610 throw '$typedef_ has no canonical name'; | 4616 throw '$typedef_ has no canonical name'; |
4611 } | 4617 } |
4612 return typedef_.canonicalName; | 4618 return typedef_.canonicalName; |
4613 } | 4619 } |
OLD | NEW |