From 217fd90568281c51fd8553bf5ab68138e37be50f Mon Sep 17 00:00:00 2001 From: GreemDev Date: Sun, 27 Jul 2025 17:35:06 -0500 Subject: [PATCH] Use a single parser execution per text box update Before it would: parse, compile, then execute for getting the formatted result, then run the suggestions function which did parsing on its own. It has now been moved to the new ParseAndGetCompletions function which returns the used ParserResult, saving some work. --- Directory.Packages.props | 2 +- .../Starscript/StarscriptTextBox.axaml.cs | 12 +---- .../Starscript/StarscriptTextBoxViewModel.cs | 51 +++++++++++-------- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1310a8ae4..3017e8569 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -55,7 +55,7 @@ - + diff --git a/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs b/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs index 8a772d134..5797c3f4a 100644 --- a/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs +++ b/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs @@ -1,6 +1,5 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Input; using Avalonia.Styling; using FluentAvalonia.UI.Controls; using Humanizer; @@ -8,6 +7,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Starscript; +using Starscript.Internal; using System; using System.Collections.Generic; using System.Text; @@ -20,7 +20,7 @@ namespace Ryujinx.Ava.Systems.Starscript { public IReadOnlyList CurrentSuggestions => ViewModel.CurrentSuggestions; - public string CurrentScriptSource => ViewModel.CurrentScriptSource; + public ParserResult CurrentScriptSource => ViewModel.CurrentScriptSource; public Exception Exception => ViewModel.Exception; public Script CurrentScript => ViewModel.CurrentScript; public StringSegment CurrentScriptResult => ViewModel.CurrentScriptResult; @@ -28,8 +28,6 @@ namespace Ryujinx.Ava.Systems.Starscript public StarscriptTextBox() { InitializeComponent(); - - InputBox.TextInput += HandleTextChanged; InputBox.AsyncPopulator = GetSuggestionsAsync; InputBox.MinimumPopulateDelay = 0.Seconds(); @@ -70,12 +68,6 @@ namespace Ryujinx.Ava.Systems.Starscript private Task> GetSuggestionsAsync(string input, CancellationToken token) => Task.FromResult(ViewModel.GetSuggestions(input, token)); - private void HandleTextChanged(object sender, TextInputEventArgs eventArgs) - { - if (sender is AutoCompleteBox) - ViewModel.CurrentScriptSource = eventArgs.Text; - } - public static StarscriptTextBox Create(StarscriptHypervisor hv) => new() { ViewModel = new StarscriptTextBoxViewModel(hv) }; diff --git a/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs b/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs index 3a2cd591c..5a4929dee 100644 --- a/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs +++ b/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs @@ -5,6 +5,7 @@ using Starscript.Internal; using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using System.Threading; namespace Ryujinx.Ava.Systems.Starscript @@ -24,7 +25,7 @@ namespace Ryujinx.Ava.Systems.Starscript [ObservableProperty] private StringSegment _currentScriptResult; [ObservableProperty] private string _errorMessage; private Exception _exception; - private string _currentScriptSource; + private ParserResult _currentScriptSource; private Script _currentScript; public Exception Exception @@ -38,12 +39,14 @@ namespace Ryujinx.Ava.Systems.Starscript StarscriptException se => se.Message, _ => string.Empty }; + + HasError = value is not null; OnPropertyChanged(); } } - public string CurrentScriptSource + public ParserResult CurrentScriptSource { get => _currentScriptSource; set @@ -55,23 +58,11 @@ namespace Ryujinx.Ava.Systems.Starscript CurrentScript = null; CurrentScriptResult = null; Exception = null; - HasError = false; return; } - - try - { - CurrentScript = Compiler.DirectCompile(CurrentScriptSource); - Exception = null; - HasError = false; - } - catch (ParseException pe) - { - CurrentScript = null; - CurrentScriptResult = null; - Exception = pe; - HasError = true; - } + + CurrentScript = Compiler.SingleCompile(value); + Exception = null; OnPropertyChanged(); } @@ -87,25 +78,41 @@ namespace Ryujinx.Ava.Systems.Starscript CurrentScriptResult = value?.Execute(_hv)!; _currentScript = value; Exception = null; - HasError = false; } catch (StarscriptException se) { _currentScript = null; CurrentScriptResult = null; Exception = se; - HasError = true; } OnPropertyChanged(); } } + public void ReExecuteScript() + { + if (_currentScript is null) return; + + try + { + CurrentScriptResult = _currentScript.Execute(_hv)!; + } + catch (StarscriptException se) + { + CurrentScriptResult = null; + Exception = se; + } + } + public IEnumerable GetSuggestions(string input, CancellationToken token) { - CurrentScriptSource = input; - - _hv.GetCompletions(CurrentScriptSource, CurrentScriptSource.Length, CreateCallback(), token); + CurrentScriptSource = _hv.ParseAndGetCompletions(input, input.Length, CreateCallback(), token); + + if (CurrentScriptSource.HasErrors) + { + Exception = new ParseException(CurrentScriptSource.Errors.First()); + } OnPropertyChanged(nameof(CurrentSuggestions));