Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(541)

Side by Side Diff: pkg/compiler/lib/src/kernel/element_adapter.dart

Issue 2814453005: Merge CommonElements and BackendHelpers! (Closed)
Patch Set: comments and re-merge, take two Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 import 'package:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common/names.dart'; 8 import '../common/names.dart';
9 import '../constants/constructors.dart'; 9 import '../constants/constructors.dart';
10 import '../constants/expressions.dart'; 10 import '../constants/expressions.dart';
11 import '../common_elements.dart'; 11 import '../common_elements.dart';
12 import '../elements/elements.dart'; 12 import '../elements/elements.dart';
13 import '../elements/entities.dart'; 13 import '../elements/entities.dart';
14 import '../elements/types.dart'; 14 import '../elements/types.dart';
15 import '../js_backend/backend_helpers.dart'; 15 import '../js_backend/backend.dart' show JavaScriptBackend;
16 import '../native/native.dart' as native; 16 import '../native/native.dart' as native;
17 import '../universe/call_structure.dart'; 17 import '../universe/call_structure.dart';
18 import '../universe/selector.dart'; 18 import '../universe/selector.dart';
19 import 'kernel_debug.dart'; 19 import 'kernel_debug.dart';
20 20
21 /// Interface that translates between Kernel IR nodes and entities. 21 /// Interface that translates between Kernel IR nodes and entities.
22 abstract class KernelElementAdapter { 22 abstract class KernelElementAdapter {
23 /// Access to the commonly used elements and types. 23 /// Access to the commonly used elements and types.
24 CommonElements get commonElements; 24 CommonElements get commonElements;
25 25
26 // Access to backend helpers.
27 BackendHelpers get helpers;
28
29 /// [ElementEnvironment] for library, class and member lookup. 26 /// [ElementEnvironment] for library, class and member lookup.
30 ElementEnvironment get elementEnvironment; 27 ElementEnvironment get elementEnvironment;
31 28
32 /// Returns the [DartType] corresponding to [type]. 29 /// Returns the [DartType] corresponding to [type].
33 DartType getDartType(ir.DartType type); 30 DartType getDartType(ir.DartType type);
34 31
35 /// Returns the list of [DartType]s corresponding to [types]. 32 /// Returns the list of [DartType]s corresponding to [types].
36 List<DartType> getDartTypes(List<ir.DartType> types); 33 List<DartType> getDartTypes(List<ir.DartType> types);
37 34
38 /// Returns the [InterfaceType] corresponding to [type]. 35 /// Returns the [InterfaceType] corresponding to [type].
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 JS_BUILTIN, 115 JS_BUILTIN,
119 JS_EMBEDDED_GLOBAL, 116 JS_EMBEDDED_GLOBAL,
120 JS_INTERCEPTOR_CONSTANT, 117 JS_INTERCEPTOR_CONSTANT,
121 NONE, 118 NONE,
122 } 119 }
123 120
124 abstract class KernelElementAdapterMixin implements KernelElementAdapter { 121 abstract class KernelElementAdapterMixin implements KernelElementAdapter {
125 DiagnosticReporter get reporter; 122 DiagnosticReporter get reporter;
126 FunctionType getFunctionType(ir.FunctionNode node); 123 FunctionType getFunctionType(ir.FunctionNode node);
127 native.BehaviorBuilder get nativeBehaviorBuilder; 124 native.BehaviorBuilder get nativeBehaviorBuilder;
128 BackendHelpers _helpers;
129
130 @override
131 BackendHelpers get helpers =>
132 _helpers ??= new BackendHelpers(elementEnvironment, commonElements);
133 125
134 @override 126 @override
135 Name getName(ir.Name name) { 127 Name getName(ir.Name name) {
136 return new Name( 128 return new Name(
137 name.name, name.isPrivate ? getLibrary(name.library) : null); 129 name.name, name.isPrivate ? getLibrary(name.library) : null);
138 } 130 }
139 131
140 @override 132 @override
141 CallStructure getCallStructure(ir.Arguments arguments) { 133 CallStructure getCallStructure(ir.Arguments arguments) {
142 int argumentCount = arguments.positional.length + arguments.named.length; 134 int argumentCount = arguments.positional.length + arguments.named.length;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 }); 204 });
213 return metadata; 205 return metadata;
214 } 206 }
215 207
216 /// Returns `true` is [node] has a `@Native(...)` annotation. 208 /// Returns `true` is [node] has a `@Native(...)` annotation.
217 // TODO(johnniwinther): Cache this for later use. 209 // TODO(johnniwinther): Cache this for later use.
218 bool isNativeClass(ir.Class node) { 210 bool isNativeClass(ir.Class node) {
219 for (ir.Expression annotation in node.annotations) { 211 for (ir.Expression annotation in node.annotations) {
220 if (annotation is ir.ConstructorInvocation) { 212 if (annotation is ir.ConstructorInvocation) {
221 FunctionEntity target = getConstructor(annotation.target); 213 FunctionEntity target = getConstructor(annotation.target);
222 if (target.enclosingClass == helpers.nativeAnnotationClass) { 214 if (target.enclosingClass == commonElements.nativeAnnotationClass) {
223 return true; 215 return true;
224 } 216 }
225 } 217 }
226 } 218 }
227 return false; 219 return false;
228 } 220 }
229 221
230 /// Compute the kind of foreign helper function called by [node], if any. 222 /// Compute the kind of foreign helper function called by [node], if any.
231 ForeignKind getForeignKind(ir.StaticInvocation node) { 223 ForeignKind getForeignKind(ir.StaticInvocation node) {
232 if (isForeignLibrary(node.target.enclosingLibrary)) { 224 if (isForeignLibrary(node.target.enclosingLibrary)) {
233 switch (node.target.name.name) { 225 switch (node.target.name.name) {
234 case BackendHelpers.JS: 226 case JavaScriptBackend.JS:
235 return ForeignKind.JS; 227 return ForeignKind.JS;
236 case BackendHelpers.JS_BUILTIN: 228 case JavaScriptBackend.JS_BUILTIN:
237 return ForeignKind.JS_BUILTIN; 229 return ForeignKind.JS_BUILTIN;
238 case BackendHelpers.JS_EMBEDDED_GLOBAL: 230 case JavaScriptBackend.JS_EMBEDDED_GLOBAL:
239 return ForeignKind.JS_EMBEDDED_GLOBAL; 231 return ForeignKind.JS_EMBEDDED_GLOBAL;
240 case BackendHelpers.JS_INTERCEPTOR_CONSTANT: 232 case JavaScriptBackend.JS_INTERCEPTOR_CONSTANT:
241 return ForeignKind.JS_INTERCEPTOR_CONSTANT; 233 return ForeignKind.JS_INTERCEPTOR_CONSTANT;
242 } 234 }
243 } 235 }
244 return ForeignKind.NONE; 236 return ForeignKind.NONE;
245 } 237 }
246 238
247 /// Return `true` if [node] is the `dart:_foreign_helper` library. 239 /// Return `true` if [node] is the `dart:_foreign_helper` library.
248 bool isForeignLibrary(ir.Library node) { 240 bool isForeignLibrary(ir.Library node) {
249 return node.importUri == BackendHelpers.DART_FOREIGN_HELPER; 241 return node.importUri == Uris.dart__foreign_helper;
250 } 242 }
251 243
252 /// Looks up [typeName] for use in the spec-string of a `JS` called. 244 /// Looks up [typeName] for use in the spec-string of a `JS` called.
253 // TODO(johnniwinther): Use this in [native.NativeBehavior] instead of calling 245 // TODO(johnniwinther): Use this in [native.NativeBehavior] instead of calling
254 // the `ForeignResolver`. 246 // the `ForeignResolver`.
255 // TODO(johnniwinther): Cache the result to avoid redundant lookups? 247 // TODO(johnniwinther): Cache the result to avoid redundant lookups?
256 native.TypeLookup typeLookup({bool resolveAsRaw: true}) { 248 native.TypeLookup typeLookup({bool resolveAsRaw: true}) {
257 DartType lookup(String typeName, {bool required}) { 249 DartType lookup(String typeName, {bool required}) {
258 DartType findIn(Uri uri) { 250 DartType findIn(Uri uri) {
259 LibraryEntity library = elementEnvironment.lookupLibrary(uri); 251 LibraryEntity library = elementEnvironment.lookupLibrary(uri);
260 if (library != null) { 252 if (library != null) {
261 ClassEntity cls = elementEnvironment.lookupClass(library, typeName); 253 ClassEntity cls = elementEnvironment.lookupClass(library, typeName);
262 if (cls != null) { 254 if (cls != null) {
263 // TODO(johnniwinther): Align semantics. 255 // TODO(johnniwinther): Align semantics.
264 return resolveAsRaw 256 return resolveAsRaw
265 ? elementEnvironment.getRawType(cls) 257 ? elementEnvironment.getRawType(cls)
266 : elementEnvironment.getThisType(cls); 258 : elementEnvironment.getThisType(cls);
267 } 259 }
268 } 260 }
269 return null; 261 return null;
270 } 262 }
271 263
272 // TODO(johnniwinther): Narrow the set of lookups base on the depending 264 // TODO(johnniwinther): Narrow the set of lookups base on the depending
273 // library. 265 // library.
274 DartType type = findIn(Uris.dart_core); 266 DartType type = findIn(Uris.dart_core);
275 type ??= findIn(BackendHelpers.DART_JS_HELPER); 267 type ??= findIn(Uris.dart__js_helper);
276 type ??= findIn(BackendHelpers.DART_INTERCEPTORS); 268 type ??= findIn(Uris.dart__interceptors);
277 type ??= findIn(BackendHelpers.DART_ISOLATE_HELPER); 269 type ??= findIn(Uris.dart__isolate_helper);
278 type ??= findIn(Uris.dart__native_typed_data); 270 type ??= findIn(Uris.dart__native_typed_data);
279 type ??= findIn(Uris.dart_collection); 271 type ??= findIn(Uris.dart_collection);
280 type ??= findIn(Uris.dart_math); 272 type ??= findIn(Uris.dart_math);
281 type ??= findIn(Uris.dart_html); 273 type ??= findIn(Uris.dart_html);
282 type ??= findIn(Uris.dart_html_common); 274 type ??= findIn(Uris.dart_html_common);
283 type ??= findIn(Uris.dart_svg); 275 type ??= findIn(Uris.dart_svg);
284 type ??= findIn(Uris.dart_web_audio); 276 type ??= findIn(Uris.dart_web_audio);
285 type ??= findIn(Uris.dart_web_gl); 277 type ??= findIn(Uris.dart_web_gl);
286 type ??= findIn(Uris.dart_web_sql); 278 type ??= findIn(Uris.dart_web_sql);
287 type ??= findIn(Uris.dart_indexed_db); 279 type ??= findIn(Uris.dart_indexed_db);
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 } 605 }
614 if (isRedirecting) { 606 if (isRedirecting) {
615 return new RedirectingGenerativeConstantConstructor( 607 return new RedirectingGenerativeConstantConstructor(
616 defaultValues, superConstructorInvocation); 608 defaultValues, superConstructorInvocation);
617 } else { 609 } else {
618 return new GenerativeConstantConstructor( 610 return new GenerativeConstantConstructor(
619 type, defaultValues, fieldMap, superConstructorInvocation); 611 type, defaultValues, fieldMap, superConstructorInvocation);
620 } 612 }
621 } 613 }
622 } 614 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart ('k') | pkg/compiler/lib/src/kernel/world_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698