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