13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// Redistribution and use in source and binary forms, with or without
3592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// modification, are permitted provided that the following conditions are
4592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// met:
5592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//
6592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//     * Redistributions of source code must retain the above copyright
7592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//       notice, this list of conditions and the following disclaimer.
8592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//     * Redistributions in binary form must reproduce the above
9592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//       copyright notice, this list of conditions and the following
10592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//       disclaimer in the documentation and/or other materials provided
11592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//       with the distribution.
12592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//     * Neither the name of Google Inc. nor the names of its
13592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//       contributors may be used to endorse or promote products derived
14592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//       from this software without specific prior written permission.
15592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch//
16592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --harmony-modules
29592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test basic module syntax, with and without automatic semicolon insertion.
31592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule A {}
3385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule A1 = A
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule A2 = A;
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule A3 = A2
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule B {
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export vx
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export vy, lz, c, f
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var vx
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var vx, vy;
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var vx = 0, vy
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let lx, ly
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let lz = 1
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const c = 9
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  function f() {}
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  module C0 {}
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module C {
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let x
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    export module D { export let x }
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let y
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let zz = ""
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export var x0
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export var x1, x2 = 6, x3
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export let y0
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export let y1 = 0, y2
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export const z0 = 0
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export const z1 = 2, z2 = 3
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export function f0() {}
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module M1 {}
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module M2 = C.D
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module M3 at "http://where"
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  import i0 from I
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  import i1, i2, i3, M from I
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  //import i4, i5 from "http://where"
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule I {
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export let i0, i1, i2, i3;
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module M {}
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule C1 = B.C;
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule D1 = B.C.D
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule D2 = C1.D
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule D3 = D2
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule E1 at "http://where"
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule E2 at "http://where";
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochmodule E3 = E1
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Check that ASI does not interfere.
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule X
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch{
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochlet x
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule Y
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch=
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochX
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule Z
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochat
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"file://local"
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochimport
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvx
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch,
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvy
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfrom
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochB
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule Wrap {
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochx
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch,
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochy
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochx
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch,
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochy
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochv1 = 1
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochlet
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochv2 = 2
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochv3 = 3
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch)
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch{
14285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch}
143592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule V
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch{
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport A, A1, A2, A3, B, I, C1, D1, D2, D3, E1, E2, E3, X, Y, Z, Wrap, x, y, UU
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Check that 'module' still works as an identifier.
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar module
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule = {}
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule["a"] = 6
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction module() {}
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f(module) { return module }
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtry {} catch (module) {}
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochmodule
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochv = 20
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Check that module declarations are rejected in eval or local scope.
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochmodule M { export let x; }
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("export x;", SyntaxError);  // It's using eval, so should throw.
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("export let x;", SyntaxError);
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("import x from M;", SyntaxError);
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("module M {};", SyntaxError);
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("{ export x; }", SyntaxError);
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("{ export let x; }", SyntaxError);
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("{ import x from M; }", SyntaxError);
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("{ module M {}; }", SyntaxError);
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("function f() { export x; }", SyntaxError);
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("function f() { export let x; }", SyntaxError);
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("function f() { import x from M; }", SyntaxError);
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("function f() { module M {}; }", SyntaxError);
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("function f() { { export x; } }", SyntaxError);
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("function f() { { export let x; } }", SyntaxError);
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("function f() { { import x from M; } }", SyntaxError);
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows("function f() { { module M {}; } }", SyntaxError);
191