mte/unikernel/duniverse/dune_/test/blackbox-tests/test-cases/melange/root-module.t

88 lines
1.8 KiB
Perl
Raw Normal View History

2025-11-11 02:07:51 +01:00
A library can be shadowed by an internal module name:
$ cat >dune-project <<EOF
> (lang dune 3.8)
> (using melange 0.1)
> EOF
$ mkdir lib1 lib2
$ cat >lib1/dune <<EOF
> (library
> (name lib1)
> (modes melange))
> EOF
$ cat >lib1/lib1.ml <<EOF
> let greeting = "Hello World"
> EOF
$ cat >lib2/dune <<EOF
> (library
> (libraries lib1)
> (name lib2)
> (modes melange))
> EOF
Now we shadow lib1:
$ cat >lib2/lib1.ml <<EOF
> let greeting = ()
> EOF
$ cat >lib2/lib2.ml <<EOF
> print_endline Lib1.greeting
> EOF
$ dune build lib2/.lib2.objs/melange/lib2.cmj
File "lib2/lib2.ml", line 1, characters 14-27:
1 | print_endline Lib1.greeting
^^^^^^^^^^^^^
Error: The value Lib1.greeting has type unit
but an expression was expected of type string
[1]
We can use root_module to use lib1 with a different name:
$ cat >lib2/dune <<EOF
> (library
> (libraries lib1)
> (root_module root)
> (name lib2)
> (modes melange))
> EOF
$ cat >lib2/lib2.ml <<EOF
> let () = print_endline Root.Lib1.greeting
> EOF
$ dune build lib2/.lib2.objs/melange/lib2.cmj
The same for melange.emit:
$ cat > dune <<EOF
> (melange.emit
> (alias mel)
> (target output)
> (libraries lib1)
> (emit_stdlib false)
> (root_module root))
> EOF
$ cat > lib1.ml <<EOF
> let greeting = ()
> EOF
$ cat >foo.ml <<EOF
> print_endline Lib1.greeting
> EOF
$ dune build output/foo.js
File "foo.ml", line 1, characters 14-27:
1 | print_endline Lib1.greeting
^^^^^^^^^^^^^
Error: The value Lib1.greeting has type unit
but an expression was expected of type string
[1]
Use root_module to fix:
$ cat >foo.ml <<EOF
> print_endline Root.Lib1.greeting
> EOF
$ dune build @mel
$ node _build/default/output/foo.js
Hello World