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

Unified Diff: pkg/compiler/lib/src/kernel/world_builder.dart

Issue 2675103003: Refactor BackendHelpers to be reusageable with KernelWorldBuilder (Closed)
Patch Set: Updated cf. comments Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/kernel/world_builder.dart
diff --git a/pkg/compiler/lib/src/kernel/world_builder.dart b/pkg/compiler/lib/src/kernel/world_builder.dart
index cd4d70365c57b9832982092b3fb9c628bef296a7..3f3b29c8bb69b14f69a9dd4666f1e02008593788 100644
--- a/pkg/compiler/lib/src/kernel/world_builder.dart
+++ b/pkg/compiler/lib/src/kernel/world_builder.dart
@@ -46,7 +46,8 @@ class KernelWorldBuilder extends KernelElementAdapterMixin {
KernelWorldBuilder(this.reporter, ir.Program program)
: _env = new KEnv(program) {
- _commonElements = new KernelCommonElements(this);
+ _commonElements =
+ new KernelCommonElements(new KernelElementEnvironment(this));
_typeConverter = new DartTypeConverter(this);
}
@@ -65,12 +66,32 @@ class KernelWorldBuilder extends KernelElementAdapterMixin {
});
}
+ MemberEntity lookupLibraryMember(KLibrary library, String name,
+ {bool setter: false}) {
+ KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex];
+ ir.Member member = libraryEnv.lookupMember(name, setter: setter);
+ return member != null ? getMember(member) : null;
+ }
+
ClassEntity lookupClass(KLibrary library, String name) {
KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex];
KClassEnv classEnv = libraryEnv.lookupClass(name);
return _getClass(classEnv.cls, classEnv);
}
+ MemberEntity lookupClassMember(KClass cls, String name,
+ {bool setter: false}) {
+ KClassEnv classEnv = _classEnvs[cls.classIndex];
+ ir.Member member = classEnv.lookupMember(name, setter: setter);
+ return member != null ? getMember(member) : null;
+ }
+
+ ConstructorEntity lookupConstructor(KClass cls, String name) {
+ KClassEnv classEnv = _classEnvs[cls.classIndex];
+ ir.Member member = classEnv.lookupConstructor(name);
+ return member != null ? getConstructor(member) : null;
+ }
+
KClass _getClass(ir.Class node, [KClassEnv classEnv]) {
return _classMap.putIfAbsent(node, () {
if (classEnv == null) {
@@ -301,6 +322,7 @@ class KLibraryEnv {
final ir.Library library;
Map<String, KClassEnv> _classMap;
+ Map<String, ir.Member> _memberMap;
KLibraryEnv(this.library);
@@ -314,6 +336,18 @@ class KLibraryEnv {
}
return _classMap[name];
}
+
+ /// Return the [ir.Member] for the member [name] in [library].
+ ir.Member lookupMember(String name, {bool setter: false}) {
+ if (_memberMap == null) {
+ _memberMap = <String, ir.Member>{};
+ for (ir.Member member in library.members) {
+ // TODO(johnniwinther): Support setter vs. getter.
+ _memberMap[member.name.name] = member;
+ }
+ }
+ return _memberMap[name];
+ }
}
/// Environment for fast lookup of class members.
@@ -321,18 +355,53 @@ class KLibraryEnv {
class KClassEnv {
final ir.Class cls;
+ Map<String, ir.Member> _constructorMap;
+ Map<String, ir.Member> _memberMap;
+
KClassEnv(this.cls);
+
+ void _ensureMaps() {
+ if (_memberMap == null) {
+ _memberMap = <String, ir.Member>{};
+ _constructorMap = <String, ir.Member>{};
+ for (ir.Member member in cls.members) {
+ if (member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) {
+ _constructorMap[member.name.name] = member;
+ } else {
+ // TODO(johnniwinther): Support setter vs. getter.
+ _memberMap[member.name.name] = member;
+ }
+ }
+ for (ir.Member member in cls.constructors) {
+ _constructorMap[member.name.name] = member;
+ }
+ }
+ }
+
+ /// Return the [ir.Member] for the member [name] in [library].
+ ir.Member lookupMember(String name, {bool setter: false}) {
+ return _memberMap[name];
+ }
+
+ /// Return the [ir.Member] for the member [name] in [library].
+ ir.Member lookupConstructor(String name, {bool setter: false}) {
+ return _constructorMap[name];
+ }
}
-/// [CommonElements] implementation based on [KernelWorldBuilder].
-class KernelCommonElements extends CommonElementsMixin {
+class KernelElementEnvironment implements ElementEnvironment {
final KernelWorldBuilder worldBuilder;
- KernelCommonElements(this.worldBuilder);
+ KernelElementEnvironment(this.worldBuilder);
@override
- LibraryEntity get coreLibrary {
- return worldBuilder.lookupLibrary(Uris.dart_core);
+ InterfaceType getThisType(ClassEntity cls) {
+ return worldBuilder.getThisType(cls);
+ }
+
+ @override
+ InterfaceType getRawType(ClassEntity cls) {
+ return worldBuilder.getRawType(cls);
}
@override
@@ -342,32 +411,71 @@ class KernelCommonElements extends CommonElementsMixin {
}
@override
- InterfaceType getRawType(ClassEntity cls) {
- return worldBuilder.getRawType(cls);
+ ConstructorEntity lookupConstructor(ClassEntity cls, String name,
+ {bool required: false}) {
+ ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name);
+ if (constructor == null && required) {
+ throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
+ "The constructor $name was not found in class '${cls.name}'.");
+ }
+ return constructor;
}
@override
- FunctionEntity findConstructor(ClassEntity cls, String name,
- {bool required: true}) {
- throw new UnimplementedError('KernelCommonElements.findConstructor');
+ MemberEntity lookupClassMember(ClassEntity cls, String name,
+ {bool setter: false, bool required: false}) {
+ MemberEntity member =
+ worldBuilder.lookupClassMember(cls, name, setter: setter);
+ if (member == null && required) {
+ throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
+ "The member '$name' was not found in ${cls.name}.");
+ }
+ return member;
}
@override
- MemberEntity findClassMember(ClassEntity cls, String name,
- {bool required: true}) {
- throw new UnimplementedError('KernelCommonElements.findClassMember');
+ MemberEntity lookupLibraryMember(LibraryEntity library, String name,
+ {bool setter: false, bool required: false}) {
+ MemberEntity member =
+ worldBuilder.lookupLibraryMember(library, name, setter: setter);
+ if (member == null && required) {
+ throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
+ "The member '${name}' was not found in library '${library.name}'.");
+ }
+ return member;
}
@override
- MemberEntity findLibraryMember(LibraryEntity library, String name,
- {bool required: true}) {
- throw new UnimplementedError('KernelCommonElements.findLibraryMember');
+ ClassEntity lookupClass(LibraryEntity library, String name,
+ {bool required: false}) {
+ ClassEntity cls = worldBuilder.lookupClass(library, name);
+ if (cls == null && required) {
+ throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
+ "The class '$name' was not found in library '${library.name}'.");
+ }
+ return cls;
}
@override
- ClassEntity findClass(LibraryEntity library, String name,
- {bool required: true}) {
- return worldBuilder.lookupClass(library, name);
+ LibraryEntity lookupLibrary(Uri uri, {bool required: false}) {
+ LibraryEntity library = worldBuilder.lookupLibrary(uri);
+ if (library == null && required) {
+ throw new SpannableAssertionFailure(
+ CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found.");
+ }
+ return library;
+ }
+}
+
+/// [CommonElements] implementation based on [KernelWorldBuilder].
+class KernelCommonElements extends CommonElementsMixin {
+ final ElementEnvironment environment;
+
+ KernelCommonElements(this.environment);
+
+ @override
+ LibraryEntity get coreLibrary {
+ return environment.lookupLibrary(Uris.dart_core, required: true);
}
@override
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart ('k') | pkg/compiler/lib/src/native/enqueue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698