Index: pkg/kernel/lib/ast.dart |
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart |
index c1b6670b5cf8fd0152b0a4382d768d3b0ea3403d..01daa37834255a4d48acc57ce16705ceae4bba48 100644 |
--- a/pkg/kernel/lib/ast.dart |
+++ b/pkg/kernel/lib/ast.dart |
@@ -264,7 +264,7 @@ class Library extends NamedNode implements Comparable<Library> { |
bool isExternal; |
String name; |
- final List<DeferredImport> deferredImports; |
+ final List<LibraryDependency> dependencies; |
final List<Typedef> typedefs; |
final List<Class> classes; |
final List<Procedure> procedures; |
@@ -273,20 +273,20 @@ class Library extends NamedNode implements Comparable<Library> { |
Library(this.importUri, |
{this.name, |
this.isExternal: false, |
- List<DeferredImport> imports, |
+ List<LibraryDependency> dependencies, |
List<Typedef> typedefs, |
List<Class> classes, |
List<Procedure> procedures, |
List<Field> fields, |
this.fileUri, |
Reference reference}) |
- : this.deferredImports = imports ?? <DeferredImport>[], |
+ : this.dependencies = dependencies ?? <LibraryDependency>[], |
this.typedefs = typedefs ?? <Typedef>[], |
this.classes = classes ?? <Class>[], |
this.procedures = procedures ?? <Procedure>[], |
this.fields = fields ?? <Field>[], |
super(reference) { |
- setParents(this.deferredImports, this); |
+ setParents(this.dependencies, this); |
setParents(this.typedefs, this); |
setParents(this.classes, this); |
setParents(this.procedures, this); |
@@ -338,10 +338,14 @@ class Library extends NamedNode implements Comparable<Library> { |
} |
} |
+ void addDependency(LibraryDependency node) { |
+ dependencies.add(node..parent = this); |
+ } |
+ |
accept(TreeVisitor v) => v.visitLibrary(this); |
visitChildren(Visitor v) { |
- visitList(deferredImports, v); |
+ visitList(dependencies, v); |
visitList(typedefs, v); |
visitList(classes, v); |
visitList(procedures, v); |
@@ -349,7 +353,7 @@ class Library extends NamedNode implements Comparable<Library> { |
} |
transformChildren(Transformer v) { |
- transformList(deferredImports, v, this); |
+ transformList(dependencies, v, this); |
transformList(typedefs, v, this); |
transformList(classes, v, this); |
transformList(procedures, v, this); |
@@ -370,23 +374,104 @@ class Library extends NamedNode implements Comparable<Library> { |
} |
} |
-/// An import of form: `import <url> deferred as <name>;`. |
-class DeferredImport extends TreeNode { |
+/// An import or export declaration in a library. |
+/// |
+/// It can represent any of the following forms, |
+/// |
+/// import <url>; |
+/// import <url> as <name>; |
+/// import <url> deferred as <name>; |
+/// export <url>; |
+/// |
+/// optionally with metadata and [Combinators]. |
+class LibraryDependency extends TreeNode { |
+ int flags; |
+ |
+ final List<Expression> annotations; |
+ |
Reference importedLibraryReference; |
+ |
+ /// The name of the import prefix, if any, or `null` if this is not an import |
+ /// with a prefix. |
+ /// |
+ /// Must be non-null for deferred imports, and must be null for exports. |
String name; |
- DeferredImport(Library importedLibrary, String name) |
- : this.byReference(importedLibrary.reference, name); |
+ final List<Combinator> combinators; |
- DeferredImport.byReference(this.importedLibraryReference, this.name); |
+ LibraryDependency(int flags, List<Expression> annotations, |
+ Library importedLibrary, String name, List<Combinator> combinators) |
+ : this.byReference( |
+ flags, annotations, importedLibrary.reference, name, combinators); |
+ |
+ LibraryDependency.deferredImport(Library importedLibrary, String name, |
+ {List<Combinator> combinators, List<Expression> annotations}) |
+ : this.byReference(DeferredFlag, annotations ?? <Expression>[], |
+ importedLibrary.reference, name, combinators ?? <Combinator>[]); |
+ |
+ LibraryDependency.import(Library importedLibrary, |
+ {String name, List<Combinator> combinators, List<Expression> annotations}) |
+ : this.byReference(0, annotations ?? <Expression>[], |
+ importedLibrary.reference, name, combinators ?? <Combinator>[]); |
+ |
+ LibraryDependency.export(Library importedLibrary, |
+ {List<Combinator> combinators, List<Expression> annotations}) |
+ : this.byReference(ExportFlag, annotations ?? <Expression>[], |
+ importedLibrary.reference, null, combinators ?? <Combinator>[]); |
+ |
+ LibraryDependency.byReference(this.flags, this.annotations, |
+ this.importedLibraryReference, this.name, this.combinators) { |
+ setParents(annotations, this); |
+ setParents(combinators, this); |
+ } |
Library get enclosingLibrary => parent; |
- Library get importedLibrary => importedLibraryReference.asLibrary; |
+ Library get targetLibrary => importedLibraryReference.asLibrary; |
+ |
+ static const int ExportFlag = 1 << 0; |
+ static const int DeferredFlag = 1 << 1; |
+ |
+ bool get isExport => flags & ExportFlag != 0; |
+ bool get isImport => !isExport; |
+ bool get isDeferred => flags & DeferredFlag != 0; |
+ |
+ void addAnnotation(Expression annotation) { |
+ annotations.add(annotation..parent = this); |
+ } |
+ |
+ accept(TreeVisitor v) => v.visitLibraryDependency(this); |
+ |
+ visitChildren(Visitor v) { |
+ visitList(annotations, v); |
+ visitList(combinators, v); |
+ } |
+ |
+ transformChildren(Transformer v) { |
+ transformList(annotations, v, this); |
+ transformList(combinators, v, this); |
+ } |
+} |
+ |
+/// A `show` or `hide` clause for an import or export. |
+class Combinator extends TreeNode { |
+ bool isShow; |
+ final List<String> names; |
+ |
+ LibraryDependency get dependency => parent; |
+ |
+ Combinator(this.isShow, this.names); |
+ Combinator.show(this.names) : isShow = true; |
+ Combinator.hide(this.names) : isShow = false; |
- accept(TreeVisitor v) => v.visitDeferredImport(this); |
+ bool get isHide => !isShow; |
+ @override |
+ accept(TreeVisitor v) => v.visitCombinator(this); |
+ |
+ @override |
visitChildren(Visitor v) {} |
+ @override |
transformChildren(Transformer v) {} |
} |
@@ -2793,7 +2878,7 @@ class Let extends Expression { |
/// to mark the deferred import as 'loaded' and return a future. |
class LoadLibrary extends Expression { |
/// Reference to a deferred import in the enclosing library. |
- DeferredImport import; |
+ LibraryDependency import; |
LoadLibrary(this.import); |
@@ -2811,7 +2896,7 @@ class LoadLibrary extends Expression { |
/// Checks that the given deferred import has been marked as 'loaded'. |
class CheckLibraryIsLoaded extends Expression { |
/// Reference to a deferred import in the enclosing library. |
- DeferredImport import; |
+ LibraryDependency import; |
CheckLibraryIsLoaded(this.import); |