Skip to content

Commit 25b433d

Browse files
committed
Support 'import * as' directives, see #27
1 parent f2eb64c commit 25b433d

9 files changed

+213
-51
lines changed

dist/assemblyscript.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/assemblyscript.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ast.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -602,15 +602,15 @@ export abstract class Node {
602602
}
603603

604604
static createExportStatement(
605-
members: ExportMember[],
605+
members: ExportMember[] | null,
606606
path: StringLiteralExpression | null,
607607
flags: CommonFlags,
608608
range: Range
609609
): ExportStatement {
610610
var stmt = new ExportStatement();
611611
stmt.range = range;
612612
stmt.flags = flags;
613-
stmt.members = members; setParent(members, stmt);
613+
stmt.members = members; if (members) setParent(members, stmt);
614614
stmt.path = path;
615615
if (path) {
616616
let normalizedPath = normalizePath(path.value);
@@ -1627,8 +1627,8 @@ export class ExportMember extends Node {
16271627
export class ExportStatement extends Statement {
16281628
kind = NodeKind.EXPORT;
16291629

1630-
/** Array of members. */
1631-
members: ExportMember[];
1630+
/** Array of members if a set of named exports, or `null` if a filespace export. */
1631+
members: ExportMember[] | null;
16321632
/** Path being exported from, if applicable. */
16331633
path: StringLiteralExpression | null;
16341634
/** Normalized path, if `path` is set. */

src/compiler.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,16 +1097,17 @@ export class Compiler extends DiagnosticEmitter {
10971097

10981098
compileExportStatement(statement: ExportStatement): void {
10991099
var module = this.module;
1100-
var exports = this.program.fileLevelExports;
1100+
var fileLevelExports = this.program.fileLevelExports;
11011101
var members = statement.members;
1102+
if (!members) return; // filespace
11021103
for (let i = 0, k = members.length; i < k; ++i) {
11031104
let member = members[i];
11041105
let internalExportName = (
11051106
statement.range.source.internalPath +
11061107
PATH_DELIMITER +
11071108
member.externalName.text
11081109
);
1109-
let element = exports.get(internalExportName);
1110+
let element = fileLevelExports.get(internalExportName);
11101111
if (!element) continue; // reported in Program#initialize
11111112
switch (element.kind) {
11121113
case ElementKind.CLASS_PROTOTYPE: {

src/parser.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1915,6 +1915,7 @@ export class Parser extends DiagnosticEmitter {
19151915

19161916
// at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?
19171917

1918+
var path: StringLiteralExpression | null = null;
19181919
if (tn.skip(Token.OPENBRACE)) {
19191920
let members = new Array<ExportMember>();
19201921
while (!tn.skip(Token.CLOSEBRACE)) {
@@ -1933,7 +1934,6 @@ export class Parser extends DiagnosticEmitter {
19331934
}
19341935
}
19351936
}
1936-
let path: StringLiteralExpression | null = null;
19371937
if (tn.skip(Token.FROM)) {
19381938
if (tn.skip(Token.STRINGLITERAL)) {
19391939
path = Node.createStringLiteralExpression(tn.readString(), tn.range());
@@ -1953,6 +1953,30 @@ export class Parser extends DiagnosticEmitter {
19531953
}
19541954
tn.skip(Token.SEMICOLON);
19551955
return ret;
1956+
} else if (tn.skip(Token.ASTERISK)) {
1957+
if (tn.skip(Token.FROM)) {
1958+
if (tn.skip(Token.STRINGLITERAL)) {
1959+
path = Node.createStringLiteralExpression(tn.readString(), tn.range());
1960+
let ret = Node.createExportStatement(null, path, flags, tn.range(startPos, tn.pos));
1961+
let internalPath = ret.internalPath;
1962+
if (internalPath !== null && !this.seenlog.has(internalPath)) {
1963+
this.backlog.push(internalPath);
1964+
this.seenlog.add(internalPath);
1965+
}
1966+
tn.skip(Token.SEMICOLON);
1967+
return ret;
1968+
} else {
1969+
this.error(
1970+
DiagnosticCode.String_literal_expected,
1971+
tn.range()
1972+
);
1973+
}
1974+
} else {
1975+
this.error(
1976+
DiagnosticCode._0_expected,
1977+
tn.range(), "from"
1978+
);
1979+
}
19561980
} else {
19571981
this.error(
19581982
DiagnosticCode._0_expected,
@@ -2805,8 +2829,8 @@ export class Parser extends DiagnosticEmitter {
28052829
return Node.createFalseExpression(tn.range());
28062830
}
28072831

2808-
var p = determinePrecedenceStart(token);
2809-
if (p != Precedence.INVALID) {
2832+
var precedence = determinePrecedenceStart(token);
2833+
if (precedence != Precedence.INVALID) {
28102834
let operand: Expression | null;
28112835

28122836
// TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)
@@ -2830,7 +2854,7 @@ export class Parser extends DiagnosticEmitter {
28302854
}
28312855
return null;
28322856
} else {
2833-
operand = this.parseExpression(tn, p);
2857+
operand = this.parseExpression(tn, precedence);
28342858
if (!operand) return null;
28352859
}
28362860

@@ -3328,7 +3352,7 @@ export const enum Precedence {
33283352
}
33293353

33303354
/** Determines the precedence of a starting token. */
3331-
function determinePrecedenceStart(kind: Token): i32 {
3355+
function determinePrecedenceStart(kind: Token): Precedence {
33323356
switch (kind) {
33333357
case Token.DOT_DOT_DOT: return Precedence.SPREAD;
33343358
case Token.YIELD: return Precedence.YIELD;
@@ -3347,7 +3371,7 @@ function determinePrecedenceStart(kind: Token): i32 {
33473371
}
33483372

33493373
/** Determines the precende of a non-starting token. */
3350-
function determinePrecedence(kind: Token): i32 {
3374+
function determinePrecedence(kind: Token): Precedence {
33513375
switch (kind) {
33523376
case Token.COMMA: return Precedence.COMMA;
33533377
case Token.EQUALS:

0 commit comments

Comments
 (0)