13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without
33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are
43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met:
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions of source code must retain the above copyright
73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       notice, this list of conditions and the following disclaimer.
83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions in binary form must reproduce the above
93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       copyright notice, this list of conditions and the following
103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       disclaimer in the documentation and/or other materials provided
113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       with the distribution.
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Neither the name of Google Inc. nor the names of its
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       contributors may be used to endorse or promote products derived
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       from this software without specific prior written permission.
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Flags: --harmony-modules
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test basic module interface inference.
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"use strict";
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprint("begin.")
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport let x = print("0")
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module B = A.B
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module A {
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export let x = print("1")
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export let f = function() { return B.x }
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module B {
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    module BB = B
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    export BB, x
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let x = print("2")
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var y = print("3")
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let Ax = A.x
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    try { A.y } catch (e) {}  // throws
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    let Az = A.z  // undefined
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    let Az2 = z  // undefined
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    A.g()  // hoisted
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    g()  // hoisted
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let ABx = A.B.x
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    let ABy = A.B.y
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    let Bx = B.x
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    let By = B.y
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let BBx = BB.x
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    let BBy = BB.y
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let Af = A.f
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    function f(x,y) { return x }
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export let y = print("4")
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  export var z = print("4.1")
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  export function g() {}
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let Ax = A.x
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let Bx = B.x
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let ABx = A.B.x
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  module C {
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    export let z = print("5")
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    export module D = B
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // TODO(rossberg): turn these into proper negative test cases once we have
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // suitable error messages.
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // import C.z  // multiple declarations
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    import x from B
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  module D {
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // TODO(rossberg): Handle import *.
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // import A.*  // invalid forward import
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  module M {}
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // TODO(rossberg): Handle import *.
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // import M.*  // invalid forward import
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let Cz = C.z
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let CDx = C.D.x
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module Imports {
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  module A1 {
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    export module A2 {}
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  module B {
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // TODO(rossberg): Handle import *.
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // import A1.*
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // import A2.*  // unbound variable A2
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module E {
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export let xx = x
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export y, B
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let Bx = B.x
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // TODO(rossberg): Handle import *.
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // import A.*
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  module B = A.B
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  let y = A.y
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module M1 {
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module A2 = M2
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module M2 {
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module A1 = M1
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(rossberg): turn these into proper negative test cases once we have
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// suitable error messages.
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// module W1 = W2.W
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// module W2 = { export module W = W3 }
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// module W3 = W1  // cyclic module definition
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// module W1 = W2.W3
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// module W2 = {
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//   export module W3 = W4
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//   export module W4 = W1
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// }  // cyclic module definition
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(rossberg): Handle import *.
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//module M3B = M3.B
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//export module M3 {
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//  export module B { export let x = "" }
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//  module C1 = { import M3.* }
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//  module C2 = { import M3.B.* }
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//  module C3 = { import M3B.* }
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//  module C4 = { export x import B.* }
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//// TODO(rossberg): turn these into proper negative test cases once we have
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//// suitable error messages.
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//// export module C5 = { import C5.* }  // invalid forward import
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//// export module C6 = { import M3.C6.* }  // invalid forward import
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//}
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module External at "external.js"
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module External1 = External
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//export module ExternalA = External.A
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module InnerExternal {
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  export module E at "external.js"
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochexport module External2 = InnerExternal.E
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//export let xxx = InnerExternal.E.A.x
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprint("end.")
153