Allow trailing commas in import and export statements (#114)

This commit is contained in:
Alan Pierce 2018-05-22 03:08:01 -07:00 committed by Daniel Wirtz
parent 33b10e347b
commit edf4aaa966
4 changed files with 52 additions and 22 deletions

View File

@ -710,7 +710,10 @@ export class ASTBuilder {
sb.push(";\n"); sb.push(";\n");
} else { } else {
let last = sb[sb.length - 1]; let last = sb[sb.length - 1];
if (last.length && last.charCodeAt(last.length - 1) == CharCode.CLOSEBRACE) { if (last.length && (
last.charCodeAt(last.length - 1) == CharCode.CLOSEBRACE ||
last.charCodeAt(last.length - 1) == CharCode.SEMICOLON)
) {
sb.push("\n"); sb.push("\n");
} else { } else {
sb.push(";\n"); sb.push(";\n");
@ -892,11 +895,15 @@ export class ASTBuilder {
var numMembers = members.length; var numMembers = members.length;
if (numMembers) { if (numMembers) {
sb.push("export {\n"); sb.push("export {\n");
let indentLevel = ++this.indentLevel;
indent(sb, indentLevel);
this.visitExportMember(node.members[0]); this.visitExportMember(node.members[0]);
for (let i = 1; i < numMembers; ++i) { for (let i = 1; i < numMembers; ++i) {
sb.push(",\n"); sb.push(",\n");
indent(sb, indentLevel);
this.visitExportMember(node.members[i]); this.visitExportMember(node.members[i]);
} }
--this.indentLevel;
sb.push("\n}"); sb.push("\n}");
} else { } else {
sb.push("export {}"); sb.push("export {}");
@ -906,6 +913,7 @@ export class ASTBuilder {
sb.push(" from "); sb.push(" from ");
this.visitStringLiteralExpression(path); this.visitStringLiteralExpression(path);
} }
sb.push(";");
} }
visitExpressionStatement(node: ExpressionStatement): void { visitExpressionStatement(node: ExpressionStatement): void {

View File

@ -1878,18 +1878,20 @@ export class Parser extends DiagnosticEmitter {
if (tn.skip(Token.OPENBRACE)) { if (tn.skip(Token.OPENBRACE)) {
let members = new Array<ExportMember>(); let members = new Array<ExportMember>();
if (!tn.skip(Token.CLOSEBRACE)) { while (!tn.skip(Token.CLOSEBRACE)) {
do {
let member = this.parseExportMember(tn); let member = this.parseExportMember(tn);
if (!member) return null; if (!member) return null;
members.push(member); members.push(member);
} while (tn.skip(Token.COMMA)); if (!tn.skip(Token.COMMA)) {
if (!tn.skip(Token.CLOSEBRACE)) { if (tn.skip(Token.CLOSEBRACE)) {
this.error( break;
DiagnosticCode._0_expected, } else {
tn.range(), "}" this.error(
); DiagnosticCode._0_expected,
return null; tn.range(), "}"
);
return null;
}
} }
} }
let path: StringLiteralExpression | null = null; let path: StringLiteralExpression | null = null;
@ -1971,18 +1973,20 @@ export class Parser extends DiagnosticEmitter {
var skipFrom = false; var skipFrom = false;
if (tn.skip(Token.OPENBRACE)) { if (tn.skip(Token.OPENBRACE)) {
members = new Array(); members = new Array();
if (!tn.skip(Token.CLOSEBRACE)) { while (!tn.skip(Token.CLOSEBRACE)) {
do { let member = this.parseImportDeclaration(tn);
let member = this.parseImportDeclaration(tn); if (!member) return null;
if (!member) return null; members.push(member);
members.push(member); if (!tn.skip(Token.COMMA)) {
} while (tn.skip(Token.COMMA)); if (tn.skip(Token.CLOSEBRACE)) {
if (!tn.skip(Token.CLOSEBRACE)) { break;
this.error( } else {
DiagnosticCode._0_expected, this.error(
tn.range(), "}" DiagnosticCode._0_expected,
); tn.range(), "}"
return null; );
return null;
}
} }
} }
} else if (tn.skip(Token.ASTERISK)) { } else if (tn.skip(Token.ASTERISK)) {

View File

@ -1,3 +1,8 @@
import {
a,
b,
} from "c";
enum Foo { enum Foo {
A, A,
B, B,
@ -31,3 +36,8 @@ export function compute(): i32 {
2, 2,
); );
} }
export {
a,
b,
};

View File

@ -1,3 +1,7 @@
import {
a,
b
} from "c";
enum Foo { enum Foo {
A, A,
B B
@ -11,3 +15,7 @@ export function compute(): i32 {
parameterized<i8, i32>(0, 0); parameterized<i8, i32>(0, 0);
return add(1, 2); return add(1, 2);
} }
export {
a,
b
};