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