// |jit-test| --enable-import-attributes
load(libdir + "match.js" );
load(libdir + "asserts.js" );
var { Pattern, MatchError } = Match;
program = (elts) => Pattern({
type: "Program" ,
body: elts
})
exportDeclaration = (declaration, specifiers, moduleRequest, isDefault) => Pattern({
type: "ExportDeclaration" ,
declaration: declaration,
specifiers: specifiers,
moduleRequest: moduleRequest,
isDefault: isDefault
});
moduleRequest = (specifier, attributes) => Pattern({
type: "ModuleRequest" ,
source: specifier,
attributes: attributes
});
importAttribute = (key, value) => Pattern({
type: "ImportAttribute" ,
key: key,
value : value
});
exportSpecifier = (id, name) => Pattern({
type: "ExportSpecifier" ,
id: id,
name: name
});
exportBatchSpecifier = () => Pattern({
type: "ExportBatchSpecifier"
});
blockStatement = (body) => Pattern({
type: "BlockStatement" ,
body: body
});
functionDeclaration = (id, params, body) => Pattern({
type: "FunctionDeclaration" ,
id: id,
params: params,
defaults: [],
body: body,
rest: null ,
generator: false
});
classDeclaration = (name) => Pattern({
type: "ClassStatement" ,
id: name
});
variableDeclaration = (decls) => Pattern({
type: "VariableDeclaration" ,
kind: "var" ,
declarations: decls
});
constDeclaration = (decls) => Pattern({
type: "VariableDeclaration" ,
kind: "const" ,
declarations: decls
});
letDeclaration = (decls) => Pattern({
type: "VariableDeclaration" ,
kind: "let" ,
declarations: decls
});
ident = (name) => Pattern({
type: "Identifier" ,
name: name
});
lit = (val) => Pattern({
type: "Literal" ,
value: val
});
function parseAsModule(source)
{
return Reflect.parse(source, {target: "module" });
}
program([
exportDeclaration(
null ,
[],
null ,
false
)
]).assert (parseAsModule("export {}" ));
program([
letDeclaration([
{
id: ident("a" ),
init: lit(1)
}
]),
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("a" )
)
],
null ,
false
)
]).assert (parseAsModule("let a = 1; export { a }" ));
program([
letDeclaration([
{
id: ident("a" ),
init: lit(1)
}
]),
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("b" )
)
],
null ,
false
)
]).assert (parseAsModule("let a = 1; export { a as b }" ));
program([
letDeclaration([
{
id: ident("as" ),
init: lit(1)
}
]),
exportDeclaration(
null ,
[
exportSpecifier(
ident("as" ),
ident("as" )
)
],
null ,
false
)
]).assert (parseAsModule("let as = 1; export { as as as }" ));
program([
letDeclaration([
{
id: ident("a" ),
init: lit(1)
}
]),
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("true" )
)
],
null ,
false
)
]).assert (parseAsModule("let a = 1; export { a as true }" ));
program([
letDeclaration([
{
id: ident("a" ),
init: lit(1)
},
{
id: ident("b" ),
init: lit(2)
}
]),
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("a" )
),
exportSpecifier(
ident("b" ),
ident("b" )
),
],
null ,
false
)
]).assert (parseAsModule("let a = 1, b = 2; export { a, b }" ));
program([
letDeclaration([
{
id: ident("a" ),
init: lit(1)
},
{
id: ident("c" ),
init: lit(2)
}
]),
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("b" )
),
exportSpecifier(
ident("c" ),
ident("d" )
),
],
null ,
false
)
]).assert (parseAsModule("let a = 1, c = 2; export { a as b, c as d }" ));
program([
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("a" )
)
],
moduleRequest(
lit("b" ),
[],
),
false
)
]).assert (parseAsModule("export { a } from 'b'" ));
program([
exportDeclaration(
null ,
[
exportBatchSpecifier()
],
moduleRequest(
lit("a" ),
[],
),
false
)
]).assert (parseAsModule("export * from 'a'" ));
program([
exportDeclaration(
functionDeclaration(
ident("f" ),
[],
blockStatement([])
),
null ,
null ,
false
)
]).assert (parseAsModule("export function f() {}" ));
program([
exportDeclaration(
classDeclaration(
ident("Foo" )
),
null ,
null ,
false
)
]).assert (parseAsModule("export class Foo { constructor() {} }" ));
program([
exportDeclaration(
variableDeclaration([
{
id: ident("a" ),
init: lit(1)
}, {
id: ident("b" ),
init: lit(2)
}
]),
null ,
null ,
false
)
]).assert (parseAsModule("export var a = 1, b = 2;" ));
program([
exportDeclaration(
constDeclaration([
{
id: ident("a" ),
init: lit(1)
}, {
id: ident("b" ),
init: lit(2)
}
]),
null ,
null ,
false
)
]).assert (parseAsModule("export const a = 1, b = 2;" ));
program([
exportDeclaration(
letDeclaration([
{
id: ident("a" ),
init: lit(1)
}, {
id: ident("b" ),
init: lit(2)
}
]),
null ,
null ,
false
)
]).assert (parseAsModule("export let a = 1, b = 2;" ));
program([
exportDeclaration(
functionDeclaration(
ident("default" ),
[],
blockStatement([])
),
null ,
null ,
true
)
]).assert (parseAsModule("export default function() {}" ));
program([
exportDeclaration(
functionDeclaration(
ident("foo" ),
[],
blockStatement([])
),
null ,
null ,
true
)
]).assert (parseAsModule("export default function foo() {}" ));
program([
exportDeclaration(
classDeclaration(
ident("default" )
),
null ,
null ,
true
)
]).assert (parseAsModule("export default class { constructor() {} }" ));
program([
exportDeclaration(
classDeclaration(
ident("Foo" )
),
null ,
null ,
true
)
]).assert (parseAsModule("export default class Foo { constructor() {} }" ));
program([
exportDeclaration(
lit(1234),
null ,
null ,
true
)
]).assert (parseAsModule("export default 1234" ));
if (getRealmConfiguration("importAttributes" )) {
program([
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("a" )
)
],
moduleRequest(
lit("b" ),
[
importAttribute(ident('type' ), lit('js' )),
]
),
false
)
]).assert (parseAsModule("export { a } from 'b' with { type: 'js' } " ));
program([
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("a" )
)
],
moduleRequest(
lit("b" ),
[
importAttribute(ident('foo' ), lit('bar' )),
],
),
false
)
]).assert (parseAsModule("export { a } from 'b' with { foo: 'bar', } " ));
program([
exportDeclaration(
null ,
[
exportSpecifier(
ident("a" ),
ident("a" )
)
],
moduleRequest(
lit("b" ),
[
importAttribute(ident('type' ), lit('js' )),
importAttribute(ident('foo' ), lit('bar' )),
importAttribute(ident('test' ), lit('123' )),
]
),
false
)
]).assert (parseAsModule("export { a } from 'b' with { type: 'js', foo: 'bar', 'test': '123' } " ));
assertThrowsInstanceOf(function () {
parseAsModule("export { a } from 'b' with { type: type }" );
}, SyntaxError);
}
assertThrowsInstanceOf(function () {
parseAsModule("export default 1234 5678" );
}, SyntaxError);
var loc = parseAsModule("export { a as b } from 'c'" , {
loc: true
}).body[0].loc;
assertEq(loc.start.line, 1);
assertEq(loc.start.column, 1);
assertEq(loc.start.line, 1);
assertEq(loc.end.column, 27);
assertThrowsInstanceOf(function () {
parseAsModule("function f() { export a }" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("if (true) export a" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export {" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export {} from" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export {,} from 'a'" );
}, SyntaxError);
program([
exportDeclaration(
null ,
[
exportSpecifier(
ident("true" ),
ident("true" )
),
],
moduleRequest(
lit("b" ),
[],
),
false
)
]).assert (parseAsModule("export { true } from 'b'" ));
program([
exportDeclaration(
null ,
[
exportSpecifier(
ident("true" ),
ident("name" )
),
],
moduleRequest(
lit("b" ),
[],
),
false
)
]).assert (parseAsModule("export { true as name } from 'b'" ));
assertThrowsInstanceOf(function () {
parseAsModule("export { true }" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export { true as name }" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export { static }" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export { static as name }" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export { name } from 'b' f();" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export *" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export * from 'b' f();" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export {}\nfrom ()" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("function() {}" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("class() { constructor() {} }" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export x" );
}, SyntaxError);
assertThrowsInstanceOf(function () {
parseAsModule("export foo = 5" );
}, SyntaxError);
Messung V0.5 C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland