Skip to content

Commit 2595589

Browse files
committed
(Luau Require) Resolve Lua file path relative to the current directory
and unrelated to Rust source file location. When a Lua file is required inside a Rust file (in a chunk), we should resolve the Lua file relative to the current directory, instead of relative to the Rust chunk path. The Rust file location is an internal information that does not exist when the compiled binary runs. Fixes #605
1 parent 3f0c69b commit 2595589

File tree

2 files changed

+30
-18
lines changed

2 files changed

+30
-18
lines changed

src/luau/require.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,11 @@ impl Require for TextRequirer {
200200
let chunk_path = Self::normalize_path(chunk_name.as_ref());
201201

202202
if chunk_path.extension() == Some("rs".as_ref()) {
203+
// Special case for Rust source files, reset to the current directory
204+
let chunk_filename = chunk_path.file_name().unwrap();
203205
let cwd = env::current_dir().map_err(|_| NavigateError::NotFound)?;
204-
self.abs_path = Self::normalize_path(&cwd.join(&chunk_path));
205-
self.rel_path = chunk_path;
206+
self.abs_path = Self::normalize_path(&cwd.join(chunk_filename));
207+
self.rel_path = ([Component::CurDir, Component::Normal(chunk_filename)].into_iter()).collect();
206208
self.module_path = PathBuf::new();
207209

208210
return Ok(());

tests/luau/require.rs

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,63 +105,69 @@ fn test_require_without_config() {
105105
let lua = Lua::new();
106106

107107
// RequireSimpleRelativePath
108-
let res = run_require(&lua, "./require/without_config/dependency").unwrap();
108+
let res = run_require(&lua, "./tests/luau/require/without_config/dependency").unwrap();
109109
assert_eq!("result from dependency", get_str(&res, 1));
110110

111111
// RequireSimpleRelativePathWithinPcall
112-
let res = run_require_pcall(&lua, "./require/without_config/dependency").unwrap();
112+
let res = run_require_pcall(&lua, "./tests/luau/require/without_config/dependency").unwrap();
113113
assert!(res[0].as_boolean().unwrap());
114114
assert_eq!("result from dependency", get_str(&res[1], 1));
115115

116116
// RequireRelativeToRequiringFile
117-
let res = run_require(&lua, "./require/without_config/module").unwrap();
117+
let res = run_require(&lua, "./tests/luau/require/without_config/module").unwrap();
118118
assert_eq!("result from dependency", get_str(&res, 1));
119119
assert_eq!("required into module", get_str(&res, 2));
120120

121121
// RequireLua
122-
let res = run_require(&lua, "./require/without_config/lua_dependency").unwrap();
122+
let res = run_require(&lua, "./tests/luau/require/without_config/lua_dependency").unwrap();
123123
assert_eq!("result from lua_dependency", get_str(&res, 1));
124124

125125
// RequireInitLuau
126-
let res = run_require(&lua, "./require/without_config/luau").unwrap();
126+
let res = run_require(&lua, "./tests/luau/require/without_config/luau").unwrap();
127127
assert_eq!("result from init.luau", get_str(&res, 1));
128128

129129
// RequireInitLua
130-
let res = run_require(&lua, "./require/without_config/lua").unwrap();
130+
let res = run_require(&lua, "./tests/luau/require/without_config/lua").unwrap();
131131
assert_eq!("result from init.lua", get_str(&res, 1));
132132

133133
// RequireSubmoduleUsingSelfIndirectly
134-
let res = run_require(&lua, "./require/without_config/nested_module_requirer").unwrap();
134+
let res = run_require(&lua, "./tests/luau/require/without_config/nested_module_requirer").unwrap();
135135
assert_eq!("result from submodule", get_str(&res, 1));
136136

137137
// RequireSubmoduleUsingSelfDirectly
138-
let res = run_require(&lua, "./require/without_config/nested").unwrap();
138+
let res = run_require(&lua, "./tests/luau/require/without_config/nested").unwrap();
139139
assert_eq!("result from submodule", get_str(&res, 1));
140140

141141
// CannotRequireInitLuauDirectly
142-
let res = run_require(&lua, "./require/without_config/nested/init");
142+
let res = run_require(&lua, "./tests/luau/require/without_config/nested/init");
143143
assert!(res.is_err());
144144
assert!((res.unwrap_err().to_string()).contains("could not resolve child component \"init\""));
145145

146146
// RequireNestedInits
147-
let res = run_require(&lua, "./require/without_config/nested_inits_requirer").unwrap();
147+
let res = run_require(&lua, "./tests/luau/require/without_config/nested_inits_requirer").unwrap();
148148
assert_eq!("result from nested_inits/init", get_str(&res, 1));
149149
assert_eq!("required into module", get_str(&res, 2));
150150

151151
// RequireWithFileAmbiguity
152-
let res = run_require(&lua, "./require/without_config/ambiguous_file_requirer");
152+
let res = run_require(
153+
&lua,
154+
"./tests/luau/require/without_config/ambiguous_file_requirer",
155+
);
153156
assert!(res.is_err());
154157
assert!((res.unwrap_err().to_string())
155158
.contains("could not resolve child component \"dependency\" (ambiguous)"));
156159

157160
// RequireWithDirectoryAmbiguity
158-
let res = run_require(&lua, "./require/without_config/ambiguous_directory_requirer");
161+
let res = run_require(
162+
&lua,
163+
"./tests/luau/require/without_config/ambiguous_directory_requirer",
164+
);
159165
assert!(res.is_err());
160166
assert!((res.unwrap_err().to_string())
161167
.contains("could not resolve child component \"dependency\" (ambiguous)"));
162168

163169
// CheckCachedResult
164-
let res = run_require(&lua, "./require/without_config/validate_cache").unwrap();
170+
let res = run_require(&lua, "./tests/luau/require/without_config/validate_cache").unwrap();
165171
assert!(res.is_table());
166172
}
167173

@@ -170,15 +176,19 @@ fn test_require_with_config() {
170176
let lua = Lua::new();
171177

172178
// RequirePathWithAlias
173-
let res = run_require(&lua, "./require/with_config/src/alias_requirer").unwrap();
179+
let res = run_require(&lua, "./tests/luau/require/with_config/src/alias_requirer").unwrap();
174180
assert_eq!("result from dependency", get_str(&res, 1));
175181

176182
// RequirePathWithParentAlias
177-
let res = run_require(&lua, "./require/with_config/src/parent_alias_requirer").unwrap();
183+
let res = run_require(&lua, "./tests/luau/require/with_config/src/parent_alias_requirer").unwrap();
178184
assert_eq!("result from other_dependency", get_str(&res, 1));
179185

180186
// RequirePathWithAliasPointingToDirectory
181-
let res = run_require(&lua, "./require/with_config/src/directory_alias_requirer").unwrap();
187+
let res = run_require(
188+
&lua,
189+
"./tests/luau/require/with_config/src/directory_alias_requirer",
190+
)
191+
.unwrap();
182192
assert_eq!("result from subdirectory_dependency", get_str(&res, 1));
183193

184194
// RequireAliasThatDoesNotExist

0 commit comments

Comments
 (0)