Index: pkg/kernel/lib/transformations/reify/transformation/binding.dart |
diff --git a/pkg/kernel/lib/transformations/reify/transformation/binding.dart b/pkg/kernel/lib/transformations/reify/transformation/binding.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e53492f569d1a103d3fac1e183ee9e8df5aba568 |
--- /dev/null |
+++ b/pkg/kernel/lib/transformations/reify/transformation/binding.dart |
@@ -0,0 +1,180 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library kernel.transformations.reify.transformation.binding; |
+ |
+import 'package:kernel/ast.dart'; |
+ |
+class RuntimeLibrary { |
+ final Library typesLibrary; |
+ final Library declarationsLibrary; |
+ final Library interceptorsLibrary; |
+ |
+ final Constructor dynamicTypeConstructor; |
+ final Constructor interfaceTypeConstructor; |
+ final Constructor declarationClassConstructor; |
+ final Constructor functionTypeConstructor; |
+ final Constructor voidTypeConstructor; |
+ |
+ // The class used to mark instances that implement `$type`. |
+ final Class markerClass; |
+ final Class declarationClass; |
+ final Class reifiedTypeClass; |
+ |
+ DartType get typeType => reifiedTypeClass.rawType; |
+ |
+ final Name variablesFieldName = new Name("variables"); |
+ |
+ /// The name of the field to create for the type information. This name is |
+ /// extracted from the class `HasRuntimeTypeGetter`. |
+ final Name runtimeTypeName; |
+ |
+ final Procedure asInstanceOfFunction; |
+ final Procedure isSubtypeOfFunction; |
+ final Procedure typeArgumentsFunction; |
+ final Procedure allocateDeclarationsFunction; |
+ final Procedure initFunction; |
+ final Procedure interceptorFunction; |
+ final Procedure reifyFunction; |
+ final Procedure attachTypeFunction; |
+ |
+ factory RuntimeLibrary(Library typesLibrary, Library declarationsLibrary, |
+ Library interceptorsLibrary) { |
+ Class dynamicTypeClass; |
+ Class interfaceTypeClass; |
+ Class declarationClass; |
+ Class functionTypeClass; |
+ Class voidTypeClass; |
+ Class markerClass; |
+ Class reifiedTypeClass; |
+ |
+ Procedure allocateDeclarationsFunction; |
+ Procedure initFunction; |
+ Procedure interceptorFunction; |
+ Procedure reifyFunction; |
+ Procedure attachTypeFunction; |
+ Procedure asInstanceOfFunction; |
+ Procedure isSubtypeOfFunction; |
+ Procedure typeArgumentsFunction; |
+ |
+ for (Procedure p in interceptorsLibrary.procedures) { |
+ if (p.name.name == "type") { |
+ interceptorFunction = p; |
+ } else if (p.name.name == "reify") { |
+ reifyFunction = p; |
+ } else if (p.name.name == "attachType") { |
+ attachTypeFunction = p; |
+ } |
+ } |
+ for (Class c in interceptorsLibrary.classes) { |
+ if (c.name == "HasRuntimeTypeGetter") { |
+ markerClass = c; |
+ } |
+ } |
+ for (Class c in typesLibrary.classes) { |
+ if (c.name == 'Dynamic') { |
+ dynamicTypeClass = c; |
+ } else if (c.name == 'Interface') { |
+ interfaceTypeClass = c; |
+ } else if (c.name == 'FunctionType') { |
+ functionTypeClass = c; |
+ } else if (c.name == 'Void') { |
+ voidTypeClass = c; |
+ } else if (c.name == 'ReifiedType') { |
+ reifiedTypeClass = c; |
+ } |
+ } |
+ for (Procedure p in typesLibrary.procedures) { |
+ if (p.name.name == "asInstanceOf") { |
+ asInstanceOfFunction = p; |
+ } else if (p.name.name == "isSubtypeOf") { |
+ isSubtypeOfFunction = p; |
+ } else if (p.name.name == "getTypeArguments") { |
+ typeArgumentsFunction = p; |
+ } |
+ } |
+ for (Procedure p in declarationsLibrary.procedures) { |
+ if (p.name.name == "allocateDeclarations") { |
+ allocateDeclarationsFunction = p; |
+ } else if (p.name.name == "init") { |
+ initFunction = p; |
+ } |
+ } |
+ for (Class c in declarationsLibrary.classes) { |
+ if (c.name == 'Class') { |
+ declarationClass = c; |
+ } |
+ } |
+ |
+ assert(dynamicTypeClass != null); |
+ assert(declarationClass != null); |
+ assert(interfaceTypeClass != null); |
+ assert(functionTypeClass != null); |
+ assert(voidTypeClass != null); |
+ assert(markerClass != null); |
+ assert(declarationClass != null); |
+ assert(reifiedTypeClass != null); |
+ assert(allocateDeclarationsFunction != null); |
+ assert(initFunction != null); |
+ assert(interceptorFunction != null); |
+ assert(reifyFunction != null); |
+ assert(attachTypeFunction != null); |
+ assert(asInstanceOfFunction != null); |
+ assert(isSubtypeOfFunction != null); |
+ assert(typeArgumentsFunction != null); |
+ |
+ return new RuntimeLibrary._( |
+ markerClass.procedures.single.name, |
+ typesLibrary, |
+ declarationsLibrary, |
+ interceptorsLibrary, |
+ markerClass, |
+ declarationClass, |
+ reifiedTypeClass, |
+ dynamicTypeClass.constructors.single, |
+ interfaceTypeClass.constructors.single, |
+ declarationClass.constructors.single, |
+ functionTypeClass.constructors.single, |
+ voidTypeClass.constructors.single, |
+ allocateDeclarationsFunction, |
+ initFunction, |
+ interceptorFunction, |
+ reifyFunction, |
+ attachTypeFunction, |
+ asInstanceOfFunction, |
+ isSubtypeOfFunction, |
+ typeArgumentsFunction); |
+ } |
+ |
+ RuntimeLibrary._( |
+ this.runtimeTypeName, |
+ this.typesLibrary, |
+ this.declarationsLibrary, |
+ this.interceptorsLibrary, |
+ this.markerClass, |
+ this.declarationClass, |
+ this.reifiedTypeClass, |
+ this.dynamicTypeConstructor, |
+ this.interfaceTypeConstructor, |
+ this.declarationClassConstructor, |
+ this.functionTypeConstructor, |
+ this.voidTypeConstructor, |
+ this.allocateDeclarationsFunction, |
+ this.initFunction, |
+ this.interceptorFunction, |
+ this.reifyFunction, |
+ this.attachTypeFunction, |
+ this.asInstanceOfFunction, |
+ this.isSubtypeOfFunction, |
+ this.typeArgumentsFunction); |
+ |
+ /// Returns `true` if [node] is defined in the runtime library. |
+ bool contains(TreeNode node) { |
+ while (node is! Library) { |
+ node = node.parent; |
+ if (node == null) return false; |
+ } |
+ return node == typesLibrary || node == declarationsLibrary; |
+ } |
+} |