1414using PatchManager . Shared ;
1515using UniLinq ;
1616using Unity . VisualScripting ;
17+ using UnityEngine ;
1718
1819namespace PatchManager . SassyPatching . Execution
1920{
@@ -34,10 +35,10 @@ public class Universe
3435
3536
3637 /// <summary>
37- /// This contains all the constant text based libraries that have been registered
38+ /// This contains all the constant text based libraries that have been registered
3839 /// </summary>
3940 public static readonly Dictionary < string , string > AllRawLibraries = new ( ) ;
40-
41+
4142 private static List < string > _preloadedLabels ;
4243
4344 static Universe ( )
@@ -235,7 +236,7 @@ private void LoadAllRawPatches()
235236 }
236237 }
237238 }
238-
239+
239240 /// <summary>
240241 /// Loads all patches from a directory
241242 /// </summary>
@@ -247,12 +248,12 @@ public void LoadPatchesInDirectory(DirectoryInfo directory, string modId)
247248 var tokenTransformer = new Transformer ( msg => throw new LoadException ( msg ) ) ;
248249 foreach ( var library in directory . EnumerateFiles ( "_*.patch" , SearchOption . AllDirectories ) )
249250 {
250- LoadSingleLibrary ( modId , library , tokenTransformer ) ;
251+ LoadSingleLibrary ( modId , library . Name , CharStreams . fromPath ( library . FullName ) , tokenTransformer ) ;
251252 }
252253
253254 foreach ( var patch in directory . EnumerateFiles ( "*.patch" , SearchOption . AllDirectories ) )
254255 {
255- LoadSinglePatch ( modId , patch , tokenTransformer ) ;
256+ LoadSinglePatch ( modId , patch . Name , CharStreams . fromPath ( patch . FullName ) , tokenTransformer ) ;
256257 }
257258 }
258259
@@ -262,40 +263,66 @@ public void LoadPatchesInDirectory(DirectoryInfo directory, string modId)
262263 /// <param name="patch">The file info of the patch file</param>
263264 /// <param name="cwd">The working directory to generate the patch mod id against</param>
264265 public void LoadSinglePatchFile ( FileInfo patch , DirectoryInfo cwd )
265- {
266+ {
266267 var tokenTransformer = new Transformer ( msg => throw new LoadException ( msg ) ) ;
267268 var name = Path . GetFileNameWithoutExtension ( patch . FullName ) ;
268269 var id = patch . Directory ! . FullName . MakeRelativePathTo ( cwd . FullName ) . Replace ( "\\ " , "-" ) ;
269270 if ( name . StartsWith ( "_" ) )
270271 {
271- LoadSingleLibrary ( id , patch , tokenTransformer ) ;
272+ LoadSingleLibrary ( id , name , CharStreams . fromPath ( patch . FullName ) , tokenTransformer ) ;
273+ }
274+ else
275+ {
276+ LoadSinglePatch ( id , name , CharStreams . fromPath ( patch . FullName ) , tokenTransformer ) ;
277+ }
278+ }
279+
280+ /// <summary>
281+ /// Loads a single patch
282+ /// </summary>
283+ /// <param name="asset">The text asset to load</param>
284+ /// <param name="modId">Mod ID</param>
285+ public void LoadPatchAsset ( TextAsset asset , string modId )
286+ {
287+ var tokenTransformer = new Transformer ( msg => throw new LoadException ( msg ) ) ;
288+ if ( asset . name . StartsWith ( "_" ) )
289+ {
290+ LoadSingleLibrary ( modId , asset . name , CharStreams . fromString ( asset . text ) , tokenTransformer ) ;
272291 }
273292 else
274293 {
275- LoadSinglePatch ( id , patch , tokenTransformer ) ;
294+ LoadSinglePatch ( modId , asset . name , CharStreams . fromString ( asset . text ) , tokenTransformer ) ;
276295 }
277296 }
278297
279- private void LoadSinglePatch ( string modId , FileInfo patch , Transformer tokenTransformer )
298+ private void LoadSinglePatch ( string modId , string name , ICharStream charStream , Transformer tokenTransformer )
280299 {
281- if ( patch . Name . StartsWith ( "_" ) )
300+ if ( name . StartsWith ( "_" ) )
301+ {
282302 return ;
303+ }
304+
283305 try
284306 {
285- MessageLogger . Invoke ( $ "Loading patch { modId } :{ patch . Name } ") ;
286- var charStream = CharStreams . fromPath ( patch . FullName ) ;
307+ MessageLogger . Invoke ( $ "Loading patch { modId } :{ name } ") ;
287308 var lexer = new sassy_lexer ( charStream ) ;
288- var lexerErrorGenerator = new LexerListener ( $ "{ modId } :{ patch . Name } ", ErrorLogger ) ;
309+ var lexerErrorGenerator = new LexerListener ( $ "{ modId } :{ name } ", ErrorLogger ) ;
289310 lexer . AddErrorListener ( lexerErrorGenerator ) ;
290311 if ( lexerErrorGenerator . Errored )
312+ {
291313 throw new LoadException ( "lexer errors detected" ) ;
314+ }
315+
292316 var tokenStream = new CommonTokenStream ( lexer ) ;
293317 var parser = new sassy_parser ( tokenStream ) ;
294- var parserErrorGenerator = new ParserListener ( $ "{ modId } :{ patch . Name } ", ErrorLogger ) ;
318+ var parserErrorGenerator = new ParserListener ( $ "{ modId } :{ name } ", ErrorLogger ) ;
295319 parser . AddErrorListener ( parserErrorGenerator ) ;
296320 var patchContext = parser . patch ( ) ;
297321 if ( parserErrorGenerator . Errored )
322+ {
298323 throw new LoadException ( "parser errors detected" ) ;
324+ }
325+
299326 tokenTransformer . Errored = false ;
300327 // var gEnv = new GlobalEnvironment(this, modId);
301328 // var env = new Environment(gEnv);
@@ -305,37 +332,42 @@ private void LoadSinglePatch(string modId, FileInfo patch, Transformer tokenTran
305332 }
306333 catch ( Exception e )
307334 {
308- ErrorLogger ( $ "Could not run patch: { modId } :{ patch . Name } due to: { e } ") ;
335+ ErrorLogger ( $ "Could not run patch: { modId } :{ name } due to: { e } ") ;
309336 }
310337 }
311338
312- private void LoadSingleLibrary ( string modId , FileInfo library , Transformer tokenTransformer )
339+ private void LoadSingleLibrary ( string modId , string name , ICharStream charStream , Transformer tokenTransformer )
313340 {
314- string name = modId + ":" + library . Name . Replace ( ".patch" , "" ) . TrimFirst ( ) ;
341+ string libName = modId + ":" + name . Replace ( ".patch" , "" ) . TrimFirst ( ) ;
315342 try
316343 {
317- MessageLogger . Invoke ( $ "Loading library { name } ") ;
318- var charStream = CharStreams . fromPath ( library . FullName ) ;
319- var lexerErrorGenerator = new LexerListener ( name , ErrorLogger ) ;
344+ MessageLogger . Invoke ( $ "Loading library { libName } ") ;
345+ var lexerErrorGenerator = new LexerListener ( libName , ErrorLogger ) ;
320346 var lexer = new sassy_lexer ( charStream ) ;
321347 lexer . AddErrorListener ( lexerErrorGenerator ) ;
322348 if ( lexerErrorGenerator . Errored )
349+ {
323350 throw new LoadException ( "lexer errors detected" ) ;
351+ }
352+
324353 var tokenStream = new CommonTokenStream ( lexer ) ;
325354 var parser = new sassy_parser ( tokenStream ) ;
326- var parserErrorGenerator = new ParserListener ( name , ErrorLogger ) ;
355+ var parserErrorGenerator = new ParserListener ( libName , ErrorLogger ) ;
327356 parser . AddErrorListener ( parserErrorGenerator ) ;
328357 if ( parserErrorGenerator . Errored )
358+ {
329359 throw new LoadException ( "parser errors detected" ) ;
360+ }
361+
330362 var patchContext = parser . patch ( ) ;
331363 tokenTransformer . Errored = false ;
332364 var patch = tokenTransformer . Visit ( patchContext ) as SassyPatch ;
333365 var lib = new SassyPatchLibrary ( patch ) ;
334- AllLibraries [ name ] = lib ;
366+ AllLibraries [ libName ] = lib ;
335367 }
336368 catch ( Exception e )
337369 {
338- ErrorLogger ( $ "Could not load library: { name } due to: { e . Message } ") ;
370+ ErrorLogger ( $ "Could not load library: { libName } due to: { e . Message } ") ;
339371 }
340372 }
341373
0 commit comments