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

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

Issue 2859133003: Find native classes with mixins in NativeClassFinder (Closed)
Patch Set: Created 3 years, 7 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
« no previous file with comments | « pkg/compiler/lib/src/js_backend/backend.dart ('k') | pkg/compiler/lib/src/native/enqueue.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/element_map.dart
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 1178dfd607e7471fac827610d59ed0d1bfee6502..3c9ff85802d66857481463663f3f28397c04794c 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -505,6 +505,12 @@ class KernelToElementMap extends KernelElementAdapterMixin {
return env.supertype;
}
+ bool _isUnnamedMixinApplication(KClass cls) {
+ _KClassEnv env = _classEnvs[cls.classIndex];
+ _ensureSupertypes(cls, env);
+ return env.isUnnamedMixinApplication;
+ }
+
void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) {
_KClassEnv env = _classEnvs[cls.classIndex];
_ensureSupertypes(cls, env);
@@ -985,8 +991,16 @@ class KernelElementEnvironment implements ElementEnvironment {
}
@override
- ClassEntity getSuperClass(ClassEntity cls) {
- return elementMap._getSuperType(cls)?.element;
+ ClassEntity getSuperClass(ClassEntity cls,
+ {bool skipUnnamedMixinApplications: false}) {
+ ClassEntity superclass = elementMap._getSuperType(cls)?.element;
+ if (skipUnnamedMixinApplications) {
+ while (superclass != null &&
+ elementMap._isUnnamedMixinApplication(superclass)) {
+ superclass = elementMap._getSuperType(superclass)?.element;
+ }
+ }
+ return superclass;
}
@override
@@ -1266,27 +1280,26 @@ class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase {
// Interface for testing equivalence of Kernel-based entities.
class WorldDeconstructionForTesting {
- final KernelToElementMap builder;
+ final KernelToElementMap elementMap;
- WorldDeconstructionForTesting(this.builder);
+ WorldDeconstructionForTesting(this.elementMap);
KClass getSuperclassForClass(KClass cls) {
- _KClassEnv env = builder._classEnvs[cls.classIndex];
+ _KClassEnv env = elementMap._classEnvs[cls.classIndex];
ir.Supertype supertype = env.cls.supertype;
if (supertype == null) return null;
- return builder.getClass(supertype.classNode);
+ return elementMap.getClass(supertype.classNode);
}
bool isUnnamedMixinApplication(KClass cls) {
- _KClassEnv env = builder._classEnvs[cls.classIndex];
- return env.isUnnamedMixinApplication;
+ return elementMap._isUnnamedMixinApplication(cls);
}
InterfaceType getMixinTypeForClass(KClass cls) {
- _KClassEnv env = builder._classEnvs[cls.classIndex];
+ _KClassEnv env = elementMap._classEnvs[cls.classIndex];
ir.Supertype mixedInType = env.cls.mixedInType;
if (mixedInType == null) return null;
- return builder.createInterfaceType(
+ return elementMap.createInterfaceType(
mixedInType.classNode, mixedInType.typeArguments);
}
}
« no previous file with comments | « pkg/compiler/lib/src/js_backend/backend.dart ('k') | pkg/compiler/lib/src/native/enqueue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698