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.js_backend.helpers; | 5 library dart2js.js_backend.helpers; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/names.dart' show Identifiers, Uris; | 8 import '../common/names.dart' show Identifiers, Uris; |
9 import '../common/resolution.dart' show Resolution; | 9 import '../common/resolution.dart' show Resolution; |
10 import '../compiler.dart' show Compiler; | 10 import '../compiler.dart' show Compiler; |
11 import '../core_types.dart' show CoreClasses; | 11 import '../core_types.dart' show CoreClasses; |
12 import '../elements/elements.dart' | 12 import '../elements/elements.dart' |
13 show | 13 show |
14 AbstractFieldElement, | 14 AbstractFieldElement, |
15 ClassElement, | 15 ClassElement, |
16 ConstructorElement, | 16 ConstructorElement, |
17 Element, | 17 Element, |
18 EnumClassElement, | 18 EnumClassElement, |
19 FunctionElement, | 19 FunctionElement, |
20 LibraryElement, | 20 LibraryElement, |
21 MethodElement; | 21 MethodElement, |
| 22 PublicName; |
22 import '../library_loader.dart' show LoadedLibraries; | 23 import '../library_loader.dart' show LoadedLibraries; |
| 24 import '../universe/call_structure.dart' show CallStructure; |
| 25 import '../universe/selector.dart' show Selector; |
23 | 26 |
24 import 'js_backend.dart'; | 27 import 'js_backend.dart'; |
25 | 28 |
26 /// Helper classes and functions for the JavaScript backend. | 29 /// Helper classes and functions for the JavaScript backend. |
27 class BackendHelpers { | 30 class BackendHelpers { |
28 static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper'); | 31 static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper'); |
29 static final Uri DART_INTERCEPTORS = | 32 static final Uri DART_INTERCEPTORS = |
30 new Uri(scheme: 'dart', path: '_interceptors'); | 33 new Uri(scheme: 'dart', path: '_interceptors'); |
31 static final Uri DART_FOREIGN_HELPER = | 34 static final Uri DART_FOREIGN_HELPER = |
32 new Uri(scheme: 'dart', path: '_foreign_helper'); | 35 new Uri(scheme: 'dart', path: '_foreign_helper'); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 | 170 |
168 /// Holds the method "requiresPreamble" in _js_helper. | 171 /// Holds the method "requiresPreamble" in _js_helper. |
169 FunctionElement requiresPreambleMarker; | 172 FunctionElement requiresPreambleMarker; |
170 | 173 |
171 /// Holds the class for the [JsGetName] enum. | 174 /// Holds the class for the [JsGetName] enum. |
172 EnumClassElement jsGetNameEnum; | 175 EnumClassElement jsGetNameEnum; |
173 | 176 |
174 /// Holds the class for the [JsBuiltins] enum. | 177 /// Holds the class for the [JsBuiltins] enum. |
175 EnumClassElement jsBuiltinEnum; | 178 EnumClassElement jsBuiltinEnum; |
176 | 179 |
| 180 ClassElement _symbolImplementationClass; |
| 181 ClassElement get symbolImplementationClass { |
| 182 return _symbolImplementationClass ??= find(internalLibrary, 'Symbol'); |
| 183 } |
| 184 |
| 185 final Selector symbolValidatedConstructorSelector = |
| 186 new Selector.call(const PublicName('validated'), CallStructure.ONE_ARG); |
| 187 |
| 188 ConstructorElement _symbolValidatedConstructor; |
| 189 |
| 190 bool isSymbolValidatedConstructor(Element element) { |
| 191 if (_symbolValidatedConstructor != null) { |
| 192 return element == _symbolValidatedConstructor; |
| 193 } |
| 194 return false; |
| 195 } |
| 196 |
| 197 ConstructorElement get symbolValidatedConstructor { |
| 198 return _symbolValidatedConstructor ??= _findConstructor( |
| 199 symbolImplementationClass, symbolValidatedConstructorSelector.name); |
| 200 } |
| 201 |
177 // TODO(johnniwinther): Make these private. | 202 // TODO(johnniwinther): Make these private. |
178 // TODO(johnniwinther): Split into findHelperFunction and findHelperClass and | 203 // TODO(johnniwinther): Split into findHelperFunction and findHelperClass and |
179 // add a check that the element has the expected kind. | 204 // add a check that the element has the expected kind. |
180 Element findHelper(String name) => find(jsHelperLibrary, name); | 205 Element findHelper(String name) => find(jsHelperLibrary, name); |
181 Element findAsyncHelper(String name) => find(asyncLibrary, name); | 206 Element findAsyncHelper(String name) => find(asyncLibrary, name); |
182 Element findInterceptor(String name) => find(interceptorsLibrary, name); | 207 Element findInterceptor(String name) => find(interceptorsLibrary, name); |
183 Element find(LibraryElement library, String name) { | 208 Element find(LibraryElement library, String name) { |
184 Element element = library.implementation.findLocal(name); | 209 Element element = library.implementation.findLocal(name); |
185 assert(invariant(library, element != null, | 210 assert(invariant(library, element != null, |
186 message: "Element '$name' not found in '${library.canonicalUri}'.")); | 211 message: "Element '$name' not found in '${library.canonicalUri}'.")); |
187 return element; | 212 return element; |
188 } | 213 } |
189 | 214 |
| 215 ConstructorElement _findConstructor(ClassElement cls, String name) { |
| 216 cls.ensureResolved(resolution); |
| 217 ConstructorElement constructor = cls.lookupConstructor(name); |
| 218 assert(invariant(cls, constructor != null, |
| 219 message: "Constructor '$name' not found in '${cls}'.")); |
| 220 return constructor; |
| 221 } |
| 222 |
190 void onLibraryCreated(LibraryElement library) { | 223 void onLibraryCreated(LibraryElement library) { |
191 Uri uri = library.canonicalUri; | 224 Uri uri = library.canonicalUri; |
192 if (uri == DART_JS_HELPER) { | 225 if (uri == DART_JS_HELPER) { |
193 jsHelperLibrary = library; | 226 jsHelperLibrary = library; |
194 } else if (uri == Uris.dart_async) { | 227 } else if (uri == Uris.dart_async) { |
195 asyncLibrary = library; | 228 asyncLibrary = library; |
196 } else if (uri == Uris.dart__internal) { | 229 } else if (uri == Uris.dart__internal) { |
197 internalLibrary = library; | 230 internalLibrary = library; |
198 } else if (uri == DART_INTERCEPTORS) { | 231 } else if (uri == DART_INTERCEPTORS) { |
199 interceptorsLibrary = library; | 232 interceptorsLibrary = library; |
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 MethodElement _objectNoSuchMethod; | 706 MethodElement _objectNoSuchMethod; |
674 | 707 |
675 MethodElement get objectNoSuchMethod { | 708 MethodElement get objectNoSuchMethod { |
676 if (_objectNoSuchMethod == null) { | 709 if (_objectNoSuchMethod == null) { |
677 _objectNoSuchMethod = | 710 _objectNoSuchMethod = |
678 coreClasses.objectClass.lookupLocalMember(Identifiers.noSuchMethod_); | 711 coreClasses.objectClass.lookupLocalMember(Identifiers.noSuchMethod_); |
679 } | 712 } |
680 return _objectNoSuchMethod; | 713 return _objectNoSuchMethod; |
681 } | 714 } |
682 } | 715 } |
OLD | NEW |