OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 dart2js.resolution.constructors; | 5 library dart2js.resolution.constructors; |
6 import '../compiler.dart' show | 6 import '../compiler.dart' show |
7 Compiler; | 7 Compiler; |
8 import '../constants/constructors.dart' show | 8 import '../constants/constructors.dart' show |
9 GenerativeConstantConstructor, | 9 GenerativeConstantConstructor, |
10 RedirectingGenerativeConstantConstructor; | 10 RedirectingGenerativeConstantConstructor; |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 visitor.resolveSelector(call, null); | 161 visitor.resolveSelector(call, null); |
162 return visitor.resolveArguments(call.argumentsNode); | 162 return visitor.resolveArguments(call.argumentsNode); |
163 }, inConstantInitializer: isConst); | 163 }, inConstantInitializer: isConst); |
164 | 164 |
165 bool isSuperCall = Initializers.isSuperConstructorCall(call); | 165 bool isSuperCall = Initializers.isSuperConstructorCall(call); |
166 InterfaceType targetType = | 166 InterfaceType targetType = |
167 getSuperOrThisLookupTarget(call, isSuperCall: isSuperCall); | 167 getSuperOrThisLookupTarget(call, isSuperCall: isSuperCall); |
168 ClassElement lookupTarget = targetType.element; | 168 ClassElement lookupTarget = targetType.element; |
169 Selector constructorSelector = | 169 Selector constructorSelector = |
170 visitor.getRedirectingThisOrSuperConstructorSelector(call); | 170 visitor.getRedirectingThisOrSuperConstructorSelector(call); |
171 FunctionElement calledConstructor = | 171 ConstructorElement calledConstructor = findConstructor( |
172 lookupTarget.lookupConstructor(constructorSelector.name); | 172 constructor.library, lookupTarget, constructorSelector.name); |
173 | 173 |
174 final bool isImplicitSuperCall = false; | 174 final bool isImplicitSuperCall = false; |
175 final String className = lookupTarget.name; | 175 final String className = lookupTarget.name; |
176 verifyThatConstructorMatchesCall(calledConstructor, | 176 verifyThatConstructorMatchesCall(calledConstructor, |
177 argumentsResult.callStructure, | 177 argumentsResult.callStructure, |
178 isImplicitSuperCall, | 178 isImplicitSuperCall, |
179 call, | 179 call, |
180 className, | 180 className, |
181 constructorSelector); | 181 constructorSelector); |
182 | 182 |
(...skipping 25 matching lines...) Expand all Loading... |
208 ClassElement classElement = constructor.enclosingClass; | 208 ClassElement classElement = constructor.enclosingClass; |
209 ClassElement superClass = classElement.superclass; | 209 ClassElement superClass = classElement.superclass; |
210 if (classElement != visitor.compiler.objectClass) { | 210 if (classElement != visitor.compiler.objectClass) { |
211 assert(superClass != null); | 211 assert(superClass != null); |
212 assert(superClass.isResolved); | 212 assert(superClass.isResolved); |
213 | 213 |
214 InterfaceType targetType = | 214 InterfaceType targetType = |
215 getSuperOrThisLookupTarget(functionNode, isSuperCall: true); | 215 getSuperOrThisLookupTarget(functionNode, isSuperCall: true); |
216 ClassElement lookupTarget = targetType.element; | 216 ClassElement lookupTarget = targetType.element; |
217 Selector constructorSelector = new Selector.callDefaultConstructor(); | 217 Selector constructorSelector = new Selector.callDefaultConstructor(); |
218 Element calledConstructor = lookupTarget.lookupConstructor( | 218 ConstructorElement calledConstructor = findConstructor( |
| 219 constructor.library, |
| 220 lookupTarget, |
219 constructorSelector.name); | 221 constructorSelector.name); |
220 | 222 |
221 final String className = lookupTarget.name; | 223 final String className = lookupTarget.name; |
222 final bool isImplicitSuperCall = true; | 224 final bool isImplicitSuperCall = true; |
223 verifyThatConstructorMatchesCall(calledConstructor, | 225 verifyThatConstructorMatchesCall(calledConstructor, |
224 CallStructure.NO_ARGS, | 226 CallStructure.NO_ARGS, |
225 isImplicitSuperCall, | 227 isImplicitSuperCall, |
226 functionNode, | 228 functionNode, |
227 className, | 229 className, |
228 constructorSelector); | 230 constructorSelector); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 } | 459 } |
458 return new ConstructorResult(resultKind, error, type); | 460 return new ConstructorResult(resultKind, error, type); |
459 } | 461 } |
460 | 462 |
461 ConstructorResult resolveConstructor( | 463 ConstructorResult resolveConstructor( |
462 InterfaceType type, | 464 InterfaceType type, |
463 Node diagnosticNode, | 465 Node diagnosticNode, |
464 String constructorName) { | 466 String constructorName) { |
465 ClassElement cls = type.element; | 467 ClassElement cls = type.element; |
466 cls.ensureResolved(compiler); | 468 cls.ensureResolved(compiler); |
467 ConstructorElement constructor = cls.lookupConstructor(constructorName); | 469 ConstructorElement constructor = findConstructor( |
468 // TODO(johnniwinther): Use [Name] for lookup. | 470 resolver.enclosingElement.library, cls, constructorName); |
469 if (Name.isPrivateName(constructorName) && | |
470 resolver.enclosingElement.library != cls.library) { | |
471 constructor = null; | |
472 } | |
473 if (constructor == null) { | 471 if (constructor == null) { |
474 String fullConstructorName = | 472 String fullConstructorName = |
475 Elements.constructorNameForDiagnostics(cls.name, constructorName); | 473 Elements.constructorNameForDiagnostics(cls.name, constructorName); |
476 return reportAndCreateErroneousConstructorElement( | 474 return reportAndCreateErroneousConstructorElement( |
477 diagnosticNode, | 475 diagnosticNode, |
478 ConstructorResultKind.UNRESOLVED_CONSTRUCTOR, type, | 476 ConstructorResultKind.UNRESOLVED_CONSTRUCTOR, type, |
479 cls, constructorName, | 477 cls, constructorName, |
480 MessageKind.CANNOT_FIND_CONSTRUCTOR, | 478 MessageKind.CANNOT_FIND_CONSTRUCTOR, |
481 {'constructorName': fullConstructorName}, | 479 {'constructorName': fullConstructorName}, |
482 missingConstructor: true); | 480 missingConstructor: true); |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 sb.write('type=$type'); | 719 sb.write('type=$type'); |
722 } else if (element != null) { | 720 } else if (element != null) { |
723 sb.write('element=$element'); | 721 sb.write('element=$element'); |
724 } else { | 722 } else { |
725 sb.write('type=$type'); | 723 sb.write('type=$type'); |
726 } | 724 } |
727 sb.write(')'); | 725 sb.write(')'); |
728 return sb.toString(); | 726 return sb.toString(); |
729 } | 727 } |
730 } | 728 } |
| 729 |
| 730 /// Lookup the [constructorName] constructor in [cls] and normalize the result |
| 731 /// with respect to privacy and patching. |
| 732 ConstructorElement findConstructor( |
| 733 LibraryElement currentLibrary, |
| 734 ClassElement cls, |
| 735 String constructorName) { |
| 736 if (Name.isPrivateName(constructorName) && |
| 737 currentLibrary.library != cls.library) { |
| 738 // TODO(johnniwinther): Report a special error on unaccessible private |
| 739 // constructors. |
| 740 return null; |
| 741 } |
| 742 // TODO(johnniwinther): Use [Name] for lookup. |
| 743 ConstructorElement constructor = cls.lookupConstructor(constructorName); |
| 744 if (constructor != null) { |
| 745 constructor = constructor.declaration; |
| 746 } |
| 747 return constructor; |
| 748 } |
OLD | NEW |