OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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_model.elements; | 5 library dart2js.js_model.elements; |
6 | 6 |
7 import '../common_elements.dart'; | 7 import '../common_elements.dart'; |
8 import '../constants/constant_system.dart'; | 8 import '../constants/constant_system.dart'; |
9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
10 import '../elements/entities.dart'; | 10 import '../elements/entities.dart'; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 } | 90 } |
91 | 91 |
92 TypeVariableEntity createTypeVariable( | 92 TypeVariableEntity createTypeVariable( |
93 Entity typeDeclaration, TypeVariableEntity typeVariable) { | 93 Entity typeDeclaration, TypeVariableEntity typeVariable) { |
94 return new JTypeVariable( | 94 return new JTypeVariable( |
95 typeDeclaration, typeVariable.name, typeVariable.index); | 95 typeDeclaration, typeVariable.name, typeVariable.index); |
96 } | 96 } |
97 } | 97 } |
98 | 98 |
99 class JsElementCreatorMixin { | 99 class JsElementCreatorMixin { |
100 LibraryEntity createLibrary(IndexedLibrary library) { | 100 IndexedLibrary createLibrary( |
101 return new JLibrary( | 101 int libraryIndex, String name, Uri canonicalUri) { |
| 102 return new JLibrary(libraryIndex, name, canonicalUri); |
| 103 } |
| 104 |
| 105 IndexedClass createClass(LibraryEntity library, int classIndex, String name, |
| 106 {bool isAbstract}) { |
| 107 return new JClass(library, classIndex, name, isAbstract: isAbstract); |
| 108 } |
| 109 |
| 110 TypeVariableEntity createTypeVariable( |
| 111 Entity typeDeclaration, String name, int index) { |
| 112 throw new UnsupportedError('JsElementCreatorMixin.createTypeVariable'); |
| 113 } |
| 114 |
| 115 IndexedConstructor createGenerativeConstructor( |
| 116 int memberIndex, |
| 117 ClassEntity enclosingClass, |
| 118 Name name, |
| 119 ParameterStructure parameterStructure, |
| 120 {bool isExternal, |
| 121 bool isConst}) { |
| 122 return new JGenerativeConstructor( |
| 123 memberIndex, enclosingClass, name, parameterStructure, |
| 124 isExternal: isExternal, isConst: isConst); |
| 125 } |
| 126 |
| 127 IndexedConstructor createFactoryConstructor( |
| 128 int memberIndex, |
| 129 ClassEntity enclosingClass, |
| 130 Name name, |
| 131 ParameterStructure parameterStructure, |
| 132 {bool isExternal, |
| 133 bool isConst, |
| 134 bool isFromEnvironmentConstructor}) { |
| 135 return new JFactoryConstructor( |
| 136 memberIndex, enclosingClass, name, parameterStructure, |
| 137 isExternal: isExternal, |
| 138 isConst: isConst, |
| 139 isFromEnvironmentConstructor: isFromEnvironmentConstructor); |
| 140 } |
| 141 |
| 142 IndexedFunction createGetter(int memberIndex, LibraryEntity library, |
| 143 ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker, |
| 144 {bool isStatic, bool isExternal, bool isAbstract}) { |
| 145 return new JGetter(memberIndex, library, enclosingClass, name, asyncMarker, |
| 146 isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract); |
| 147 } |
| 148 |
| 149 IndexedFunction createMethod( |
| 150 int memberIndex, |
| 151 LibraryEntity library, |
| 152 ClassEntity enclosingClass, |
| 153 Name name, |
| 154 ParameterStructure parameterStructure, |
| 155 AsyncMarker asyncMarker, |
| 156 {bool isStatic, |
| 157 bool isExternal, |
| 158 bool isAbstract}) { |
| 159 return new JMethod(memberIndex, library, enclosingClass, name, |
| 160 parameterStructure, asyncMarker, |
| 161 isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract); |
| 162 } |
| 163 |
| 164 IndexedFunction createSetter(int memberIndex, LibraryEntity library, |
| 165 ClassEntity enclosingClass, Name name, |
| 166 {bool isStatic, bool isExternal, bool isAbstract}) { |
| 167 return new JSetter(memberIndex, library, enclosingClass, name, |
| 168 isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract); |
| 169 } |
| 170 |
| 171 IndexedField createField(int memberIndex, LibraryEntity library, |
| 172 ClassEntity enclosingClass, Name name, |
| 173 {bool isStatic, bool isAssignable, bool isConst}) { |
| 174 return new JField(memberIndex, library, enclosingClass, name, |
| 175 isStatic: isStatic, isAssignable: isAssignable, isConst: isConst); |
| 176 } |
| 177 |
| 178 Local createLocalFunction(String name, MemberEntity memberContext, |
| 179 Entity executableContext, FunctionType functionType) { |
| 180 throw new UnsupportedError('JsElementCreatorMixin.createLocalFunction'); |
| 181 } |
| 182 |
| 183 LibraryEntity convertLibrary(IndexedLibrary library) { |
| 184 return createLibrary( |
102 library.libraryIndex, library.name, library.canonicalUri); | 185 library.libraryIndex, library.name, library.canonicalUri); |
103 } | 186 } |
104 | 187 |
105 ClassEntity createClass(LibraryEntity library, IndexedClass cls) { | 188 ClassEntity convertClass(LibraryEntity library, IndexedClass cls) { |
106 return new JClass(library, cls.classIndex, cls.name, | 189 return createClass(library, cls.classIndex, cls.name, |
107 isAbstract: cls.isAbstract); | 190 isAbstract: cls.isAbstract); |
108 } | 191 } |
109 | 192 |
110 MemberEntity createMember( | 193 MemberEntity convertMember( |
111 LibraryEntity library, ClassEntity cls, IndexedMember member) { | 194 LibraryEntity library, ClassEntity cls, IndexedMember member) { |
112 Name memberName = new Name(member.memberName.text, library, | 195 Name memberName = new Name(member.memberName.text, library, |
113 isSetter: member.memberName.isSetter); | 196 isSetter: member.memberName.isSetter); |
114 if (member.isField) { | 197 if (member.isField) { |
115 IndexedField field = member; | 198 IndexedField field = member; |
116 return new JField(member.memberIndex, library, cls, memberName, | 199 return createField(member.memberIndex, library, cls, memberName, |
117 isStatic: field.isStatic, | 200 isStatic: field.isStatic, |
118 isAssignable: field.isAssignable, | 201 isAssignable: field.isAssignable, |
119 isConst: field.isConst); | 202 isConst: field.isConst); |
120 } else if (member.isConstructor) { | 203 } else if (member.isConstructor) { |
121 IndexedConstructor constructor = member; | 204 IndexedConstructor constructor = member; |
122 if (constructor.isFactoryConstructor) { | 205 if (constructor.isFactoryConstructor) { |
123 // TODO(redemption): This should be a JFunction. | 206 // TODO(redemption): This should be a JFunction. |
124 return new JFactoryConstructor( | 207 return createFactoryConstructor( |
125 member.memberIndex, cls, memberName, constructor.parameterStructure, | 208 member.memberIndex, cls, memberName, constructor.parameterStructure, |
126 isExternal: constructor.isExternal, | 209 isExternal: constructor.isExternal, |
127 isConst: constructor.isConst, | 210 isConst: constructor.isConst, |
128 isFromEnvironmentConstructor: | 211 isFromEnvironmentConstructor: |
129 constructor.isFromEnvironmentConstructor); | 212 constructor.isFromEnvironmentConstructor); |
130 } else { | 213 } else { |
131 return new JGenerativeConstructor( | 214 return createGenerativeConstructor( |
132 member.memberIndex, cls, memberName, constructor.parameterStructure, | 215 member.memberIndex, cls, memberName, constructor.parameterStructure, |
133 isExternal: constructor.isExternal, isConst: constructor.isConst); | 216 isExternal: constructor.isExternal, isConst: constructor.isConst); |
134 } | 217 } |
135 } else if (member.isGetter) { | 218 } else if (member.isGetter) { |
136 IndexedFunction getter = member; | 219 IndexedFunction getter = member; |
137 return new JGetter( | 220 return createGetter( |
138 member.memberIndex, library, cls, memberName, getter.asyncMarker, | 221 member.memberIndex, library, cls, memberName, getter.asyncMarker, |
139 isStatic: getter.isStatic, | 222 isStatic: getter.isStatic, |
140 isExternal: getter.isExternal, | 223 isExternal: getter.isExternal, |
141 isAbstract: getter.isAbstract); | 224 isAbstract: getter.isAbstract); |
142 } else if (member.isSetter) { | 225 } else if (member.isSetter) { |
143 IndexedFunction setter = member; | 226 IndexedFunction setter = member; |
144 return new JSetter(member.memberIndex, library, cls, memberName, | 227 return createSetter(member.memberIndex, library, cls, memberName, |
145 isStatic: setter.isStatic, | 228 isStatic: setter.isStatic, |
146 isExternal: setter.isExternal, | 229 isExternal: setter.isExternal, |
147 isAbstract: setter.isAbstract); | 230 isAbstract: setter.isAbstract); |
148 } else { | 231 } else { |
149 IndexedFunction function = member; | 232 IndexedFunction function = member; |
150 return new JMethod(member.memberIndex, library, cls, memberName, | 233 return createMethod(member.memberIndex, library, cls, memberName, |
151 function.parameterStructure, function.asyncMarker, | 234 function.parameterStructure, function.asyncMarker, |
152 isStatic: function.isStatic, | 235 isStatic: function.isStatic, |
153 isExternal: function.isExternal, | 236 isExternal: function.isExternal, |
154 isAbstract: function.isAbstract); | 237 isAbstract: function.isAbstract); |
155 } | 238 } |
156 } | 239 } |
157 } | 240 } |
158 | 241 |
159 typedef Entity EntityConverter(Entity cls); | 242 typedef Entity EntityConverter(Entity cls); |
160 | 243 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 TypeVariableType type, EntityConverter converter) { | 283 TypeVariableType type, EntityConverter converter) { |
201 return new TypeVariableType(converter(type.element)); | 284 return new TypeVariableType(converter(type.element)); |
202 } | 285 } |
203 | 286 |
204 @override | 287 @override |
205 DartType visitVoidType(VoidType type, EntityConverter converter) { | 288 DartType visitVoidType(VoidType type, EntityConverter converter) { |
206 return const VoidType(); | 289 return const VoidType(); |
207 } | 290 } |
208 } | 291 } |
209 | 292 |
| 293 const String jsElementPrefix = 'j'; |
| 294 |
210 class JLibrary implements LibraryEntity, IndexedLibrary { | 295 class JLibrary implements LibraryEntity, IndexedLibrary { |
211 /// Library index used for fast lookup in [JsToFrontendMapImpl]. | 296 /// Library index used for fast lookup in [JsToFrontendMapImpl]. |
212 final int libraryIndex; | 297 final int libraryIndex; |
213 final String name; | 298 final String name; |
214 final Uri canonicalUri; | 299 final Uri canonicalUri; |
215 | 300 |
216 JLibrary(this.libraryIndex, this.name, this.canonicalUri); | 301 JLibrary(this.libraryIndex, this.name, this.canonicalUri); |
217 | 302 |
218 String toString() => 'library($name)'; | 303 String toString() => '${jsElementPrefix}library($name)'; |
219 } | 304 } |
220 | 305 |
221 class JClass implements ClassEntity, IndexedClass { | 306 class JClass implements ClassEntity, IndexedClass { |
222 final JLibrary library; | 307 final JLibrary library; |
223 | 308 |
224 /// Class index used for fast lookup in [JsToFrontendMapImpl]. | 309 /// Class index used for fast lookup in [JsToFrontendMapImpl]. |
225 final int classIndex; | 310 final int classIndex; |
226 | 311 |
227 final String name; | 312 final String name; |
228 final bool isAbstract; | 313 final bool isAbstract; |
229 | 314 |
230 JClass(this.library, this.classIndex, this.name, {this.isAbstract}); | 315 JClass(this.library, this.classIndex, this.name, {this.isAbstract}); |
231 | 316 |
232 @override | 317 @override |
233 bool get isClosure => false; | 318 bool get isClosure => false; |
234 | 319 |
235 String toString() => 'class($name)'; | 320 String toString() => '${jsElementPrefix}class($name)'; |
236 } | 321 } |
237 | 322 |
238 abstract class JMember implements MemberEntity, IndexedMember { | 323 abstract class JMember implements MemberEntity, IndexedMember { |
239 /// Member index used for fast lookup in [JsToFrontendMapImpl]. | 324 /// Member index used for fast lookup in [JsToFrontendMapImpl]. |
240 final int memberIndex; | 325 final int memberIndex; |
241 final JLibrary library; | 326 final JLibrary library; |
242 final JClass enclosingClass; | 327 final JClass enclosingClass; |
243 final Name _name; | 328 final Name _name; |
244 final bool _isStatic; | 329 final bool _isStatic; |
245 | 330 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 bool get isInstanceMember => enclosingClass != null && !_isStatic; | 364 bool get isInstanceMember => enclosingClass != null && !_isStatic; |
280 | 365 |
281 @override | 366 @override |
282 bool get isStatic => enclosingClass != null && _isStatic; | 367 bool get isStatic => enclosingClass != null && _isStatic; |
283 | 368 |
284 @override | 369 @override |
285 bool get isTopLevel => enclosingClass == null; | 370 bool get isTopLevel => enclosingClass == null; |
286 | 371 |
287 String get _kind; | 372 String get _kind; |
288 | 373 |
289 String toString() => | 374 String toString() => '${jsElementPrefix}$_kind' |
290 '$_kind(${enclosingClass != null ? '${enclosingClass.name}.' : ''}$name)'; | 375 '(${enclosingClass != null ? '${enclosingClass.name}.' : ''}$name)'; |
291 } | 376 } |
292 | 377 |
293 abstract class JFunction extends JMember | 378 abstract class JFunction extends JMember |
294 implements FunctionEntity, IndexedFunction { | 379 implements FunctionEntity, IndexedFunction { |
295 final ParameterStructure parameterStructure; | 380 final ParameterStructure parameterStructure; |
296 final bool isExternal; | 381 final bool isExternal; |
297 final AsyncMarker asyncMarker; | 382 final AsyncMarker asyncMarker; |
298 | 383 |
299 JFunction(int memberIndex, JLibrary library, JClass enclosingClass, Name name, | 384 JFunction(int memberIndex, JLibrary library, JClass enclosingClass, Name name, |
300 this.parameterStructure, this.asyncMarker, | 385 this.parameterStructure, this.asyncMarker, |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 String get _kind => 'field'; | 509 String get _kind => 'field'; |
425 } | 510 } |
426 | 511 |
427 class JTypeVariable implements TypeVariableEntity { | 512 class JTypeVariable implements TypeVariableEntity { |
428 final Entity typeDeclaration; | 513 final Entity typeDeclaration; |
429 final String name; | 514 final String name; |
430 final int index; | 515 final int index; |
431 | 516 |
432 JTypeVariable(this.typeDeclaration, this.name, this.index); | 517 JTypeVariable(this.typeDeclaration, this.name, this.index); |
433 | 518 |
434 String toString() => 'type_variable(${typeDeclaration.name}.$name)'; | 519 String toString() => |
| 520 '${jsElementPrefix}type_variable(${typeDeclaration.name}.$name)'; |
435 } | 521 } |
436 | 522 |
437 class JsClosedWorld extends ClosedWorldBase { | 523 class JsClosedWorld extends ClosedWorldBase { |
438 JsClosedWorld( | 524 JsClosedWorld( |
439 {ElementEnvironment elementEnvironment, | 525 {ElementEnvironment elementEnvironment, |
440 DartTypes dartTypes, | 526 DartTypes dartTypes, |
441 CommonElements commonElements, | 527 CommonElements commonElements, |
442 ConstantSystem constantSystem, | 528 ConstantSystem constantSystem, |
443 NativeData nativeData, | 529 NativeData nativeData, |
444 InterceptorData interceptorData, | 530 InterceptorData interceptorData, |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 | 773 |
688 @override | 774 @override |
689 bool get isFunctionApplyUsed => _backendUsage.isFunctionApplyUsed; | 775 bool get isFunctionApplyUsed => _backendUsage.isFunctionApplyUsed; |
690 | 776 |
691 @override | 777 @override |
692 bool get isMirrorsUsed => _backendUsage.isMirrorsUsed; | 778 bool get isMirrorsUsed => _backendUsage.isMirrorsUsed; |
693 | 779 |
694 @override | 780 @override |
695 bool get isNoSuchMethodUsed => _backendUsage.isNoSuchMethodUsed; | 781 bool get isNoSuchMethodUsed => _backendUsage.isNoSuchMethodUsed; |
696 } | 782 } |
OLD | NEW |