1bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
2bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Redistribution and use in source and binary forms, with or without
3bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// modification, are permitted provided that the following conditions are
4bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// met:
5bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//
6bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//     * Redistributions of source code must retain the above copyright
7bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//       notice, this list of conditions and the following disclaimer.
8bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//     * Redistributions in binary form must reproduce the above
9bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//       copyright notice, this list of conditions and the following
10bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//       disclaimer in the documentation and/or other materials provided
11bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//       with the distribution.
12bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//     * Neither the name of Google Inc. nor the names of its
13bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//       contributors may be used to endorse or promote products derived
14bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//       from this software without specific prior written permission.
15bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//
16bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
28bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Flags: --harmony-modules --harmony-scoping
29bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
30bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Test basic module interface inference.
31bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
32bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com"use strict";
33bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
34bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comprint("begin.")
35bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
3681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
37bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport let x = print("0")
38bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
39bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module B = A.B
40bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
41bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module A {
42bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export let x = print("1")
43bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export let f = function() { return B.x }
44bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export module B {
45bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    module BB = B
46bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    export BB, x
47bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    let x = print("2")
4881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    var y = print("3")
49bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    let Ax = A.x
5081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    try { A.y } catch (e) {}  // throws
5181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    let Az = A.z  // undefined
5281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    let Az2 = z  // undefined
5381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    A.g()  // hoisted
5481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    g()  // hoisted
55bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    let ABx = A.B.x
5681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    let ABy = A.B.y
5781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    let Bx = B.x
5881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    let By = B.y
59bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    let BBx = BB.x
6081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    let BBy = BB.y
61bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    let Af = A.f
62bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    function f(x,y) { return x }
63bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
64bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export let y = print("4")
6581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  export var z = print("4.1")
6681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  export function g() {}
67bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  let Ax = A.x
68bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  let Bx = B.x
69bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  let ABx = A.B.x
70bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  module C {
71bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    export let z = print("5")
72bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    export module D = B
73bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // TODO(rossberg): turn these into proper negative test cases once we have
74bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // suitable error messages.
75bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // import C.z  // multiple declarations
76bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    import x from B
77bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
78bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  module D {
79bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // TODO(rossberg): Handle import *.
80bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // import A.*  // invalid forward import
81bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
82bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  module M {}
83bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  // TODO(rossberg): Handle import *.
84bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  // import M.*  // invalid forward import
85bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  let Cz = C.z
86bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  let CDx = C.D.x
87bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
88bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
89bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module Imports {
90bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  module A1 {
91bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    export module A2 {}
92bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
93bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  module B {
94bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // TODO(rossberg): Handle import *.
95bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // import A1.*
96bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // import A2.*  // unbound variable A2
97bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
98bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
99bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
100bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module E {
101bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export let xx = x
102bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export y, B
103bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  let Bx = B.x
104bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  // TODO(rossberg): Handle import *.
105bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  // import A.*
10681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  module B = A.B
10781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  let y = A.y
108bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
109bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
110bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module M1 {
111bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export module A2 = M2
112bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
113bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module M2 {
114bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export module A1 = M1
115bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
116bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
117bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// TODO(rossberg): turn these into proper negative test cases once we have
118bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// suitable error messages.
119bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// module W1 = W2.W
120bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// module W2 = { export module W = W3 }
121bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// module W3 = W1  // cyclic module definition
122bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
123bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// module W1 = W2.W3
124bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// module W2 = {
125bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//   export module W3 = W4
126bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//   export module W4 = W1
127bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// }  // cyclic module definition
128bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
129bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// TODO(rossberg): Handle import *.
130bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//module M3B = M3.B
131bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//export module M3 {
132bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//  export module B { export let x = "" }
133bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//  module C1 = { import M3.* }
134bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//  module C2 = { import M3.B.* }
135bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//  module C3 = { import M3B.* }
136bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//  module C4 = { export x import B.* }
137bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//// TODO(rossberg): turn these into proper negative test cases once we have
138bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//// suitable error messages.
139bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//// export module C5 = { import C5.* }  // invalid forward import
140bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//// export module C6 = { import M3.C6.* }  // invalid forward import
141bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//}
142bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
143bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module External at "external.js"
144bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module External1 = External
145ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com//export module ExternalA = External.A
146bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module InnerExternal {
147bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  export module E at "external.js"
148bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
149bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comexport module External2 = InnerExternal.E
150bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com//export let xxx = InnerExternal.E.A.x
151bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
152bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comprint("end.")
153