Skip to content

Commit 2e64c87

Browse files
committed
Allow for patch libraries to be defined with addressables
1 parent 1c487f8 commit 2e64c87

File tree

3 files changed

+79
-8
lines changed

3 files changed

+79
-8
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System;
2+
using Antlr4.Runtime;
3+
using KSP.Game;
4+
using PatchManager.SassyPatching.Nodes;
5+
using SassyPatchGrammar;
6+
using UnityEngine;
7+
8+
namespace PatchManager.SassyPatching.Execution
9+
{
10+
internal class AddressablesPatchLibrary : PatchLibrary
11+
{
12+
public string Key;
13+
14+
public AddressablesPatchLibrary(string key)
15+
{
16+
Key = key;
17+
}
18+
19+
private SassyPatch? _patch;
20+
21+
public override void RegisterInto(Environment environment)
22+
{
23+
if (_patch == null)
24+
{
25+
var universe = environment.GlobalEnvironment.Universe;
26+
universe.MessageLogger.Invoke(
27+
$"Loading library from addressables {Key}");
28+
var handle = GameManager.Instance.Assets.LoadAssetAsync<TextAsset>(Key);
29+
handle.WaitForCompletion();
30+
var text = handle.Result;
31+
if (text != null)
32+
{
33+
var patchText = text.text;
34+
var charStream = CharStreams.fromString(patchText);
35+
var lexerErrorGenerator = new Universe.LexerListener(Key, universe.ErrorLogger);
36+
var lexer = new sassy_lexer(charStream);
37+
lexer.AddErrorListener(lexerErrorGenerator);
38+
if (lexerErrorGenerator.Errored)
39+
{
40+
throw new Exception("lexer errors detected");
41+
}
42+
var tokenStream = new CommonTokenStream(lexer);
43+
var parser = new sassy_parser(tokenStream);
44+
var parserErrorGenerator = new Universe.ParserListener(Key, universe.ErrorLogger);
45+
parser.AddErrorListener(parserErrorGenerator);
46+
var patchContext = parser.patch();
47+
if (parserErrorGenerator.Errored)
48+
{
49+
throw new Exception("parser errors detected");
50+
}
51+
var tokenTransformer = new Transformer(msg => throw new Exception(msg));
52+
_patch = tokenTransformer.Visit(patchContext) as SassyPatch;
53+
}
54+
else
55+
{
56+
throw new Exception("Addressables patch not found!");
57+
}
58+
}
59+
_patch?.ExecuteIn(environment);
60+
}
61+
}
62+
}

Runtime/SassyPatching/Execution/AddressablesPatchLibrary.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/SassyPatching/Execution/Universe.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using PatchManager.SassyPatching.Utility;
1414
using PatchManager.Shared;
1515
using UniLinq;
16+
using Unity.VisualScripting;
1617

1718
namespace PatchManager.SassyPatching.Execution
1819
{
@@ -109,7 +110,7 @@ public void AddConfigUpdater(long priority, string label, string? name, Expressi
109110
/// <summary>
110111
/// This logs errors in this universe
111112
/// </summary>
112-
private readonly Action<string> _errorLogger;
113+
public readonly Action<string> ErrorLogger;
113114

114115

115116
/// <summary>
@@ -133,7 +134,7 @@ public void AddConfigUpdater(long priority, string label, string? name, Expressi
133134
public Universe(Action<ITextPatcher> registerPatcher, Action<string> errorLogger, Action<string> messageLogger, Action<ITextAssetGenerator> registerGenerator, List<string> allMods)
134135
{
135136
RegisterPatcher = registerPatcher;
136-
_errorLogger = errorLogger;
137+
ErrorLogger = errorLogger;
137138
MessageLogger = messageLogger;
138139
RegisterGenerator = registerGenerator;
139140
LoadedLabels = new List<string>(_preloadedLabels);
@@ -243,13 +244,13 @@ private void LoadSinglePatch(string modId, FileInfo patch, Transformer tokenTran
243244
MessageLogger.Invoke($"Loading patch {modId}:{patch.Name}");
244245
var charStream = CharStreams.fromPath(patch.FullName);
245246
var lexer = new sassy_lexer(charStream);
246-
var lexerErrorGenerator = new LexerListener($"{modId}:{patch.Name}", _errorLogger);
247+
var lexerErrorGenerator = new LexerListener($"{modId}:{patch.Name}", ErrorLogger);
247248
lexer.AddErrorListener(lexerErrorGenerator);
248249
if (lexerErrorGenerator.Errored)
249250
throw new LoadException("lexer errors detected");
250251
var tokenStream = new CommonTokenStream(lexer);
251252
var parser = new sassy_parser(tokenStream);
252-
var parserErrorGenerator = new ParserListener($"{modId}:{patch.Name}", _errorLogger);
253+
var parserErrorGenerator = new ParserListener($"{modId}:{patch.Name}", ErrorLogger);
253254
parser.AddErrorListener(parserErrorGenerator);
254255
var patchContext = parser.patch();
255256
if (parserErrorGenerator.Errored)
@@ -263,7 +264,7 @@ private void LoadSinglePatch(string modId, FileInfo patch, Transformer tokenTran
263264
}
264265
catch (Exception e)
265266
{
266-
_errorLogger($"Could not run patch: {modId}:{patch.Name} due to: {e}");
267+
ErrorLogger($"Could not run patch: {modId}:{patch.Name} due to: {e}");
267268
}
268269
}
269270

@@ -274,14 +275,14 @@ private void LoadSingleLibrary(string modId, FileInfo library, Transformer token
274275
{
275276
MessageLogger.Invoke($"Loading library {name}");
276277
var charStream = CharStreams.fromPath(library.FullName);
277-
var lexerErrorGenerator = new LexerListener(name, _errorLogger);
278+
var lexerErrorGenerator = new LexerListener(name, ErrorLogger);
278279
var lexer = new sassy_lexer(charStream);
279280
lexer.AddErrorListener(lexerErrorGenerator);
280281
if (lexerErrorGenerator.Errored)
281282
throw new LoadException("lexer errors detected");
282283
var tokenStream = new CommonTokenStream(lexer);
283284
var parser = new sassy_parser(tokenStream);
284-
var parserErrorGenerator = new ParserListener(name, _errorLogger);
285+
var parserErrorGenerator = new ParserListener(name, ErrorLogger);
285286
parser.AddErrorListener(parserErrorGenerator);
286287
if (parserErrorGenerator.Errored)
287288
throw new LoadException("parser errors detected");
@@ -293,7 +294,7 @@ private void LoadSingleLibrary(string modId, FileInfo library, Transformer token
293294
}
294295
catch (Exception e)
295296
{
296-
_errorLogger($"Could not load library: {name} due to: {e.Message}");
297+
ErrorLogger($"Could not load library: {name} due to: {e.Message}");
297298
}
298299
}
299300

@@ -469,5 +470,10 @@ private void SetupBasePriorities(List<string> modLoadOrder)
469470
LastImplicitGlobal = lastPost;
470471
MessageLogger($"Last implicit global: {lastPost}");
471472
}
473+
474+
public static void RegisterAddressablesLibrary(string modId, string name, string key)
475+
{
476+
AllManagedLibraries.Add($"{modId}:{name}", new AddressablesPatchLibrary(key));
477+
}
472478
}
473479
}

0 commit comments

Comments
 (0)