/ tests / tests / compiler / modules / complex.adl
complex.adl
 1  program all_module_features.alpha {
 2      struct Nested {
 3          a: alpha::SharedName,
 4          b: beta::SharedName::[beta::X],
 5          c: gamma::Inner,
 6      }
 7  
 8      transition main() -> u32 {
 9          // Constant name shadowing (alpha::X vs beta::X vs gamma::X)
10          let x1 = alpha::X;
11          let x2 = beta::X;
12          let x3 = gamma::X;
13  
14          // Struct name shadowing (SharedName)
15          let s1 = alpha::SharedName {
16              val: 1,
17          };
18          let s2 = beta::SharedName::[beta::X] {
19              val: [2; beta::X],
20          };
21  
22          // Cross-module inline chaining via main
23          let g = gamma::make_inner(alpha::X + beta::X);
24          let result = gamma::consume_inner(g);
25  
26          // Struct with field type from another module
27          let composed = Nested {
28              a: s1,
29              b: s2,
30              c: g,
31          };
32  
33          // Inline function call that takes struct from another module
34          return x1 + x2 + x3
35               + s2.val[1]
36               + result;
37      }
38  }
39  
40  // --- Next Module: alpha.leo --- //
41  
42  // Constant named X
43  const X: u32 = 2;
44  
45  // Struct with same name as in beta (to test shadowing)
46  struct SharedName {
47      val: u32,
48  }
49  
50  // Inline returning its own struct
51  inline make() -> SharedName {
52      return SharedName { val: 99 };
53  }
54  
55  // --- Next Module: beta.leo --- //
56  
57  // Constant shadowing X from alpha
58  const X: u32 = 3;
59  
60  // Struct with same name but generic
61  struct SharedName::[N: u32] {
62      val: [u32; N],
63  }
64  
65  // Inline using generic struct
66  inline make() -> SharedName::[X] {
67      return SharedName::[X] {
68          val: [5; X],
69      };
70  }
71  
72  // --- Next Module: gamma.leo --- //
73  
74  // Constant shadowing again
75  const X: u32 = 4;
76  
77  // Struct referencing another module’s const and struct in main
78  struct Inner {
79      n: u32,
80  }
81  
82  // Inline returning struct defined here
83  inline make_inner(n: u32) -> Inner {
84      return Inner { n };
85  }
86  
87  inline consume_inner(inner: Inner) -> u32 {
88      return inner.n + X;
89  }