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

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart

Issue 64033002: Version 0.8.10.8 (Closed) Base URL: http://dart.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 1 month 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: dart/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
===================================================================
--- dart/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart (revision 30037)
+++ dart/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart (working copy)
@@ -172,6 +172,83 @@
}
}
+bool isMixinApplication(Mirror mirror) {
+ return mirror is ClassMirror && mirror.mixin != mirror;
+}
+
+/**
+ * Returns the superclass of [cls] skipping unnamed mixin applications.
+ *
+ * For instance, for all of the following definitions this method returns [:B:].
+ *
+ * class A extends B {}
+ * class A extends B with C1, C2 {}
+ * class A extends B implements D1, D2 {}
+ * class A extends B with C1, C2 implements D1, D2 {}
+ * class A = B with C1, C2;
+ * abstract class A = B with C1, C2 implements D1, D2;
+ */
+ClassMirror getSuperclass(ClassMirror cls) {
+ ClassMirror superclass = cls.superclass;
+ while (isMixinApplication(superclass) && superclass.isNameSynthetic) {
+ superclass = superclass.superclass;
+ }
+ return superclass;
+}
+
+/**
+ * Returns the mixins directly applied to [cls].
+ *
+ * For instance, for all of the following definitions this method returns
+ * [:C1, C2:].
+ *
+ * class A extends B with C1, C2 {}
+ * class A extends B with C1, C2 implements D1, D2 {}
+ * class A = B with C1, C2;
+ * abstract class A = B with C1, C2 implements D1, D2;
+ */
+Iterable<ClassMirror> getAppliedMixins(ClassMirror cls) {
+ List<ClassMirror> mixins = <ClassMirror>[];
+ ClassMirror superclass = cls.superclass;
+ while (isMixinApplication(superclass) && superclass.isNameSynthetic) {
+ mixins.add(superclass.mixin);
+ superclass = superclass.superclass;
+ }
+ if (mixins.length > 1) {
+ mixins = new List<ClassMirror>.from(mixins.reversed);
+ }
+ if (isMixinApplication(cls)) {
+ mixins.add(cls.mixin);
+ }
+ return mixins;
+}
+
+/**
+ * Returns the superinterfaces directly and explicitly implemented by [cls].
+ *
+ * For instance, for all of the following definitions this method returns
+ * [:D1, D2:].
+ *
+ * class A extends B implements D1, D2 {}
+ * class A extends B with C1, C2 implements D1, D2 {}
+ * abstract class A = B with C1, C2 implements D1, D2;
+ */
+Iterable<ClassMirror> getExplicitInterfaces(ClassMirror cls) {
+ if (isMixinApplication(cls)) {
+ bool first = true;
+ ClassMirror mixin = cls.mixin;
+ bool filter(ClassMirror superinterface) {
+ if (first && superinterface == mixin) {
+ first = false;
+ return false;
+ }
+ return true;
+ }
+ return cls.superinterfaces.where(filter);
+ }
+ return cls.superinterfaces;
+}
+
final RegExp _singleLineCommentStart = new RegExp(r'^///? ?(.*)');
final RegExp _multiLineCommentStartEnd =
new RegExp(r'^/\*\*? ?([\s\S]*)\*/$', multiLine: true);
@@ -220,12 +297,12 @@
* Looks up [name] in the scope [declaration].
*
* If [name] is of the form 'a.b.c', 'a' is looked up in the scope of
- * [declaration] and if unresolved 'a.b' is looked in the scope of
+ * [declaration] and if unresolved 'a.b' is looked in the scope of
* [declaration]. Each identifier of the remaining suffix, 'c' or 'b.c', is
* then looked up in the local scope of the previous result.
- *
+ *
* For instance, assumming that [:Iterable:] is imported into the scope of
- * [declaration] via the prefix 'col', 'col.Iterable.E' finds the type
+ * [declaration] via the prefix 'col', 'col.Iterable.E' finds the type
* variable of [:Iterable:] and 'col.Iterable.contains.element' finds the
* [:element:] parameter of the [:contains:] method on [:Iterable:].
*/
@@ -233,7 +310,7 @@
String name) {
// TODO(11653): Support lookup of constructors using the [:new Foo:]
// syntax.
- int offset = 1;
+ int offset = 1;
List<String> parts = name.split('.');
DeclarationMirror result = declaration.lookupInScope(parts[0]);
if (result == null && parts.length > 1) {

Powered by Google App Engine
This is Rietveld 408576698