@@ -163,15 +163,36 @@ pub enum CompileConstant {
163
163
String ( String ) ,
164
164
}
165
165
166
- #[ cfg( feature = "luau" ) ]
167
- impl From < & ' static str > for CompileConstant {
168
- fn from ( s : & ' static str ) -> Self {
169
- CompileConstant :: String ( s. to_string ( ) )
166
+ #[ cfg( any( feature = "luau" , doc) ) ]
167
+ impl From < bool > for CompileConstant {
168
+ fn from ( b : bool ) -> Self {
169
+ CompileConstant :: Boolean ( b)
170
+ }
171
+ }
172
+
173
+ #[ cfg( any( feature = "luau" , doc) ) ]
174
+ impl From < crate :: Number > for CompileConstant {
175
+ fn from ( n : crate :: Number ) -> Self {
176
+ CompileConstant :: Number ( n)
170
177
}
171
178
}
172
179
173
180
#[ cfg( any( feature = "luau" , doc) ) ]
174
- type LibraryMemberConstantMap = std:: sync:: Arc < HashMap < ( String , String ) , CompileConstant > > ;
181
+ impl From < crate :: Vector > for CompileConstant {
182
+ fn from ( v : crate :: Vector ) -> Self {
183
+ CompileConstant :: Vector ( v)
184
+ }
185
+ }
186
+
187
+ #[ cfg( any( feature = "luau" , doc) ) ]
188
+ impl From < & str > for CompileConstant {
189
+ fn from ( s : & str ) -> Self {
190
+ CompileConstant :: String ( s. to_owned ( ) )
191
+ }
192
+ }
193
+
194
+ #[ cfg( any( feature = "luau" , doc) ) ]
195
+ type LibraryMemberConstantMap = HashMap < ( String , String ) , CompileConstant > ;
175
196
176
197
/// Luau compiler
177
198
#[ cfg( any( feature = "luau" , doc) ) ]
@@ -288,49 +309,75 @@ impl Compiler {
288
309
self
289
310
}
290
311
312
+ /// Adds a mutable global.
313
+ ///
314
+ /// It disables the import optimization for fields accessed through it.
315
+ #[ must_use]
316
+ pub fn add_mutable_global ( mut self , global : impl Into < StdString > ) -> Self {
317
+ self . mutable_globals . push ( global. into ( ) ) ;
318
+ self
319
+ }
320
+
291
321
/// Sets a list of globals that are mutable.
292
322
///
293
323
/// It disables the import optimization for fields accessed through these.
294
324
#[ must_use]
295
- pub fn set_mutable_globals < S : Into < String > > ( mut self , globals : Vec < S > ) -> Self {
325
+ pub fn set_mutable_globals < S : Into < StdString > > ( mut self , globals : impl IntoIterator < Item = S > ) -> Self {
296
326
self . mutable_globals = globals. into_iter ( ) . map ( |s| s. into ( ) ) . collect ( ) ;
297
327
self
298
328
}
299
329
330
+ /// Adds a userdata type to the list that will be included in the type information.
331
+ #[ must_use]
332
+ pub fn add_userdata_type ( mut self , r#type : impl Into < StdString > ) -> Self {
333
+ self . userdata_types . push ( r#type. into ( ) ) ;
334
+ self
335
+ }
336
+
300
337
/// Sets a list of userdata types that will be included in the type information.
301
338
#[ must_use]
302
- pub fn set_userdata_types < S : Into < String > > ( mut self , types : Vec < S > ) -> Self {
339
+ pub fn set_userdata_types < S : Into < StdString > > ( mut self , types : impl IntoIterator < Item = S > ) -> Self {
303
340
self . userdata_types = types. into_iter ( ) . map ( |s| s. into ( ) ) . collect ( ) ;
304
341
self
305
342
}
306
343
307
- /// Sets constants for known library members .
344
+ /// Adds a constant for a known library member .
308
345
///
309
346
/// The constants are used by the compiler to optimize the generated bytecode.
310
347
/// Optimization level must be at least 2 for this to have any effect.
311
348
///
312
349
/// The first element of the tuple is the library name,the second is the member name, and the
313
350
/// third is the constant value.
314
351
#[ must_use]
315
- pub fn set_library_constants < L , M > ( mut self , constants : Vec < ( L , M , CompileConstant ) > ) -> Self
316
- where
317
- L : Into < String > ,
318
- M : Into < String > ,
319
- {
320
- let map = constants
321
- . into_iter ( )
322
- . map ( |( lib, member, cons) | ( ( lib. into ( ) , member. into ( ) ) , cons) )
323
- . collect :: < HashMap < _ , _ > > ( ) ;
324
- self . library_constants = Some ( std:: sync:: Arc :: new ( map) ) ;
325
- self . libraries_with_known_members = ( self . library_constants . clone ( ) )
326
- . map ( |map| map. keys ( ) . map ( |( lib, _) | lib. clone ( ) ) . collect ( ) )
327
- . unwrap_or_default ( ) ;
352
+ pub fn add_library_constant (
353
+ mut self ,
354
+ lib : impl Into < StdString > ,
355
+ member : impl Into < StdString > ,
356
+ r#const : impl Into < CompileConstant > ,
357
+ ) -> Self {
358
+ let ( lib, member) = ( lib. into ( ) , member. into ( ) ) ;
359
+ if !self . libraries_with_known_members . contains ( & lib) {
360
+ self . libraries_with_known_members . push ( lib. clone ( ) ) ;
361
+ }
362
+ self . library_constants
363
+ . get_or_insert_with ( HashMap :: new)
364
+ . insert ( ( lib, member) , r#const. into ( ) ) ;
365
+ self
366
+ }
367
+
368
+ /// Adds a builtin that should be disabled.
369
+ #[ must_use]
370
+ pub fn add_disabled_builtin ( mut self , builtin : impl Into < StdString > ) -> Self {
371
+ self . disabled_builtins . push ( builtin. into ( ) ) ;
328
372
self
329
373
}
330
374
331
375
/// Sets a list of builtins that should be disabled.
332
376
#[ must_use]
333
- pub fn set_disabled_builtins < S : Into < String > > ( mut self , builtins : Vec < S > ) -> Self {
377
+ pub fn set_disabled_builtins < S : Into < StdString > > (
378
+ mut self ,
379
+ builtins : impl IntoIterator < Item = S > ,
380
+ ) -> Self {
334
381
self . disabled_builtins = builtins. into_iter ( ) . map ( |s| s. into ( ) ) . collect ( ) ;
335
382
self
336
383
}
0 commit comments