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

Unified Diff: lib/src/js_ast/nodes.dart

Issue 1879373004: Implement modular compilation (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 8 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 | « lib/src/js_ast/module_transform.dart ('k') | lib/src/js_ast/precedence.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/js_ast/nodes.dart
diff --git a/lib/src/js/nodes.dart b/lib/src/js_ast/nodes.dart
similarity index 97%
rename from lib/src/js/nodes.dart
rename to lib/src/js_ast/nodes.dart
index cd0e807a9542a3cf4c5cb13da93722b2f49473a4..be1e764806eee0f05a38179aba939dda738b9d91 100644
--- a/lib/src/js/nodes.dart
+++ b/lib/src/js_ast/nodes.dart
@@ -311,7 +311,12 @@ class Program extends Node {
/// Top-level statements in the program.
final List<ModuleItem> body;
- Program(this.body, {this.scriptTag});
+ /// The module's own name.
+ ///
+ /// This is not used in ES6, but is provided to allow module lowering.
+ final String name;
+
+ Program(this.body, {this.scriptTag, this.name});
accept(NodeVisitor visitor) => visitor.visitProgram(this);
void visitChildren(NodeVisitor visitor) {
@@ -741,7 +746,10 @@ class LiteralExpression extends Expression {
* AST.
*/
class VariableDeclarationList extends Expression {
- /** The `var` or `let` keyword used for this variable declaration list. */
+ /**
+ * The `var` or `let` or `const` keyword used for this variable declaration
+ * list.
+ */
final String keyword;
final List<VariableInitialization> declarations;
@@ -1733,15 +1741,17 @@ class ImportDeclaration extends ModuleItem {
final LiteralString from;
- ImportDeclaration({this.defaultBinding, this.namedImports, this.from});
+ ImportDeclaration({this.defaultBinding, this.namedImports, this.from}) {
+ assert(from != null);
+ }
/** The `import "name.js"` form of import */
ImportDeclaration.all(LiteralString module) : this(from: module);
/** If this import has `* as name` returns the name, otherwise null. */
- String get importStarAs {
+ Identifier get importStarAs {
if (namedImports != null && namedImports.length == 1 &&
- namedImports[0].name == '*') {
+ namedImports[0].isStar) {
return namedImports[0].asName;
}
return null;
@@ -1780,6 +1790,26 @@ class ExportDeclaration extends ModuleItem {
exported is ExportClause);
}
+ /// Gets the list of names exported by this export declaration, or `null`
+ /// if this is an `export *`.
+ ///
+ /// This can be useful for lowering to other module formats.
+ List<Identifier> get exportedNames {
+ if (isDefault) return [new Identifier('default')];
+
+ var exported = this.exported;
+ if (exported is ClassDeclaration) return [exported.classExpr.name];
+ if (exported is FunctionDeclaration) return [exported.name];
+ if (exported is VariableDeclarationList) {
+ return exported.declarations.map((i) => i.declaration).toList();
+ }
+ if (exported is ExportClause) {
+ if (exported.exportStar) return null;
+ return exported.exports.map((e) => e.name).toList();
+ }
+ throw new StateError('invalid export declaration');
+ }
+
accept(NodeVisitor visitor) => visitor.visitExportDeclaration(this);
visitChildren(NodeVisitor visitor) => exported.accept(visitor);
ExportDeclaration _clone() =>
@@ -1794,10 +1824,10 @@ class ExportClause extends Node {
/** The `export * from 'name.js'` form. */
ExportClause.star(LiteralString from)
- : this([new NameSpecifier('*')], from: from);
+ : this([new NameSpecifier.star()], from: from);
/** True if this is an `export *`. */
- bool get exportStar => exports.length == 1 && exports[0].name == '*';
+ bool get exportStar => exports.length == 1 && exports[0].isStar;
accept(NodeVisitor visitor) => visitor.visitExportClause(this);
void visitChildren(NodeVisitor visitor) {
@@ -1809,11 +1839,14 @@ class ExportClause extends Node {
/** An import or export specifier. */
class NameSpecifier extends Node {
- // TODO(jmesserly): should we wrap this in a node of some sort?
- final String name;
- final String asName; // Can be null.
+ final Identifier name;
+ final Identifier asName; // Can be null.
NameSpecifier(this.name, {this.asName});
+ NameSpecifier.star() : this(null);
+
+ /** True if this is a `* as someName` specifier. */
+ bool get isStar => name == null;
accept(NodeVisitor visitor) => visitor.visitNameSpecifier(this);
void visitChildren(NodeVisitor visitor) {}
« no previous file with comments | « lib/src/js_ast/module_transform.dart ('k') | lib/src/js_ast/precedence.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698