Fork of daniellemaywood.uk/gleam — Wasm codegen work
2.6 kB
90 lines
1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2026 The Gleam contributors
3
4use std::collections::HashSet;
5
6use camino::Utf8Path;
7use ecow::EcoString;
8
9use crate::{
10 Error,
11 build::{
12 self, NullTelemetry, Outcome, PackageCompiler, StaleTracker, Target,
13 TargetCodegenConfiguration, Telemetry, package_compiler::Compiled,
14 },
15 config::PackageConfig,
16 error::DefinedModuleOrigin,
17 io::{FileSystemWriter, memory::InMemoryFileSystem},
18 uid::UniqueIdGenerator,
19 warning::WarningEmitter,
20};
21
22fn compile_modules(
23 package_name: &str,
24 module: &str,
25 existing_modules: Vec<(&str, &str)>,
26) -> Outcome<Compiled, Error> {
27 let mut fs = InMemoryFileSystem::new();
28 fs.write(
29 Utf8Path::new(&format!("/src/{module}.gleam")),
30 "pub fn main() -> Nil { Nil }",
31 )
32 .expect("write module");
33
34 let mut config = PackageConfig::default();
35 config.name = package_name.into();
36
37 let compiler = PackageCompiler::new(
38 &config,
39 build::Mode::Dev,
40 Utf8Path::new("/"),
41 Utf8Path::new("/out"),
42 Utf8Path::new("/lib"),
43 &TargetCodegenConfiguration::Erlang { app_file: None },
44 UniqueIdGenerator::new(),
45 fs,
46 );
47
48 let mut already_defined_modules = existing_modules
49 .into_iter()
50 .map(|(package_name, module_name)| {
51 (
52 EcoString::from(module_name),
53 DefinedModuleOrigin {
54 package_name: EcoString::from(package_name),
55 path: Utf8Path::new(&format!("{package_name}/{module_name}.gleam"))
56 .to_path_buf(),
57 },
58 )
59 })
60 .collect();
61
62 compiler.compile(
63 &WarningEmitter::null(),
64 &mut im::HashMap::new(),
65 &mut already_defined_modules,
66 &mut StaleTracker::default(),
67 &mut HashSet::new(),
68 &NullTelemetry,
69 )
70}
71
72#[test]
73pub fn different_packages_defining_duplicate_module() {
74 let output = compile_modules("a_package", "a_module", vec![("dep1", "a_module")])
75 .into_result()
76 .expect_err("should produce an error")
77 .pretty_string();
78
79 insta::assert_snapshot!(insta::internals::AutoName, output);
80}
81
82#[test]
83pub fn same_package_defining_duplicate_module() {
84 let output = compile_modules("a_package", "a_module", vec![("a_package", "a_module")])
85 .into_result()
86 .expect_err("should produce an error")
87 .pretty_string();
88
89 insta::assert_snapshot!(insta::internals::AutoName, output);
90}