From 2e023f1a4ece5f32bbdfc0d644724abde7a37f26 Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Thu, 17 Nov 2022 14:07:29 +0100 Subject: [PATCH] Add empty cwl command --- YesNt.Interpreter/Runtime/YesNtInterpreter.cs | 425 +++++++++--------- .../Statements/ConsoleStatements.cs | 83 ++-- 2 files changed, 256 insertions(+), 252 deletions(-) diff --git a/YesNt.Interpreter/Runtime/YesNtInterpreter.cs b/YesNt.Interpreter/Runtime/YesNtInterpreter.cs index 67940ae..81974a0 100644 --- a/YesNt.Interpreter/Runtime/YesNtInterpreter.cs +++ b/YesNt.Interpreter/Runtime/YesNtInterpreter.cs @@ -9,279 +9,278 @@ using YesNt.Interpreter.Attributes; using YesNt.Interpreter.Enums; using YesNt.Interpreter.Utilities; -namespace YesNt.Interpreter.Runtime +namespace YesNt.Interpreter.Runtime; + +public class YesNtInterpreter { - public class YesNtInterpreter + private readonly RuntimeInformation runtimeInfo = new RuntimeInformation(); + private Dictionary> statements = new(); + private List> staticStatements = new(); + + public ReadOnlyCollection StatementInformation { - private readonly RuntimeInformation runtimeInfo = new RuntimeInformation(); - private Dictionary> statements = new(); - private List> staticStatements = new(); - - public ReadOnlyCollection StatementInformation + get { - get + List informations = statements.Select(s => { - List informations = statements.Select(s => + return new StatementInformation() { - return new StatementInformation() - { - Name = s.Key.Name, - SearchMode = s.Key.SearchMode, - SpaceAround = s.Key.SpaceAround, - Color = s.Key.Color, - IgnoreSyntaxHighlighting = s.Key.IgnoreSyntaxHighlighting, - Seperator = s.Key.Seperator - }; - }).ToList(); + Name = s.Key.Name, + SearchMode = s.Key.SearchMode, + SpaceAround = s.Key.SpaceAround, + Color = s.Key.Color, + IgnoreSyntaxHighlighting = s.Key.IgnoreSyntaxHighlighting, + Seperator = s.Key.Seperator + }; + }).ToList(); - return new ReadOnlyCollection(informations); - } + return new ReadOnlyCollection(informations); } + } - public event Action OnLineExecuted; + public event Action OnLineExecuted; - public event Action OnDebugOutput; + public event Action OnDebugOutput; - public void Stop() + public void Stop() + { + runtimeInfo.Exit("Terminated by external process", true); + } + + public void Initialize() + { + Assembly assembly = Assembly.GetExecutingAssembly(); + Type[] types = assembly.GetTypes(); + + IEnumerable statementRuntimeInfos = types.Where(t => t.IsSubclassOf(typeof(StatementRuntimeInformation))); + + statements.Clear(); + + foreach (Type type in statementRuntimeInfos) { - runtimeInfo.Exit("Terminated by external process", true); - } + object statementInfo = Activator.CreateInstance(type); - public void Initialize() - { - Assembly assembly = Assembly.GetExecutingAssembly(); - Type[] types = assembly.GetTypes(); + MethodInfo[] methodInfos = statementInfo.GetType().GetMethods(); - IEnumerable statementRuntimeInfos = types.Where(t => t.IsSubclassOf(typeof(StatementRuntimeInformation))); + StatementRuntimeInformation statementRuntimeInfo = statementInfo as StatementRuntimeInformation; + statementRuntimeInfo.RuntimeInfo = runtimeInfo; - statements.Clear(); - - foreach (Type type in statementRuntimeInfos) + foreach (MethodInfo methodInfo in methodInfos) { - object statementInfo = Activator.CreateInstance(type); - - MethodInfo[] methodInfos = statementInfo.GetType().GetMethods(); - - StatementRuntimeInformation statementRuntimeInfo = statementInfo as StatementRuntimeInformation; - statementRuntimeInfo.RuntimeInfo = runtimeInfo; - - foreach (MethodInfo methodInfo in methodInfos) + StatementAttribute statementAttribute = methodInfo.GetCustomAttribute(); + if (statementAttribute is not null) { - StatementAttribute statementAttribute = methodInfo.GetCustomAttribute(); - if (statementAttribute is not null) - { - Action method = methodInfo.CreateDelegate(typeof(Action), statementInfo) as Action; - statements.Add(statementAttribute, method); - } + Action method = methodInfo.CreateDelegate(typeof(Action), statementInfo) as Action; + statements.Add(statementAttribute, method); + } - StaticStatementAttribute staticStatementAttribute = methodInfo.GetCustomAttribute(); - if (staticStatementAttribute is not null) - { - Action method = methodInfo.CreateDelegate(typeof(Action), statementInfo) as Action; - staticStatements.Add(new(staticStatementAttribute, method)); - } + StaticStatementAttribute staticStatementAttribute = methodInfo.GetCustomAttribute(); + if (staticStatementAttribute is not null) + { + Action method = methodInfo.CreateDelegate(typeof(Action), statementInfo) as Action; + staticStatements.Add(new(staticStatementAttribute, method)); } } - - statements = statements.OrderBy(s => s.Key.Priority).ToDictionary(x => x.Key, x => x.Value); - staticStatements = staticStatements.OrderBy(s => s.Key.Priority).ToList(); - - runtimeInfo.OnDebugOutput += (s) => OnDebugOutput?.Invoke(s); - runtimeInfo.OnLineExecuted += (DebugEventArgs e) => OnLineExecuted?.Invoke(e); } - public void Execute(string path, bool isDebugMode = false) + statements = statements.OrderBy(s => s.Key.Priority).ToDictionary(x => x.Key, x => x.Value); + staticStatements = staticStatements.OrderBy(s => s.Key.Priority).ToList(); + + runtimeInfo.OnDebugOutput += (s) => OnDebugOutput?.Invoke(s); + runtimeInfo.OnLineExecuted += (DebugEventArgs e) => OnLineExecuted?.Invoke(e); + } + + public void Execute(string path, bool isDebugMode = false) + { + runtimeInfo.Reset(); + runtimeInfo.IsDebugMode = isDebugMode; + if (LoadFile(path)) { - runtimeInfo.Reset(); - runtimeInfo.IsDebugMode = isDebugMode; - if (LoadFile(path)) - { - Execute(); - } - } - - public void Execute(List lines, bool isDebugMode = false) - { - runtimeInfo.Reset(); - runtimeInfo.IsDebugMode = isDebugMode; - - for (int i = 0; i < lines.Count; i++) - { - runtimeInfo.Lines.Add(new Line(lines[i], Path.GetFileName("#Memory#"), i)); - } - Execute(); } + } - internal void Execute(List lines, Dictionary gloablVariables, int startLine, RuntimeInformation parentRuntimeInformation) + public void Execute(List lines, bool isDebugMode = false) + { + runtimeInfo.Reset(); + runtimeInfo.IsDebugMode = isDebugMode; + + for (int i = 0; i < lines.Count; i++) { - runtimeInfo.Reset(); - runtimeInfo.IsDebugMode = parentRuntimeInformation.IsDebugMode; - runtimeInfo.Lines = lines; - runtimeInfo.LineNumber = startLine; - runtimeInfo.ParentRuntimeInformation = parentRuntimeInformation; - runtimeInfo.GloablVariables = gloablVariables; - if (parentRuntimeInformation.StopAllTasks) - { - runtimeInfo.Exit($"Parent task was terminated!", parentRuntimeInformation.StopAllTasks); - return; - } - Execute(); + runtimeInfo.Lines.Add(new Line(lines[i], Path.GetFileName("#Memory#"), i)); } - private void Execute() + Execute(); + } + + internal void Execute(List lines, Dictionary gloablVariables, int startLine, RuntimeInformation parentRuntimeInformation) + { + runtimeInfo.Reset(); + runtimeInfo.IsDebugMode = parentRuntimeInformation.IsDebugMode; + runtimeInfo.Lines = lines; + runtimeInfo.LineNumber = startLine; + runtimeInfo.ParentRuntimeInformation = parentRuntimeInformation; + runtimeInfo.GloablVariables = gloablVariables; + if (parentRuntimeInformation.StopAllTasks) { - for (; runtimeInfo.LineNumber < runtimeInfo.Lines.Count; runtimeInfo.LineNumber++) + runtimeInfo.Exit($"Parent task was terminated!", parentRuntimeInformation.StopAllTasks); + return; + } + Execute(); + } + + private void Execute() + { + for (; runtimeInfo.LineNumber < runtimeInfo.Lines.Count; runtimeInfo.LineNumber++) + { + if (runtimeInfo.Stop) { + break; + } + + runtimeInfo.CurrentLine = runtimeInfo.Lines[runtimeInfo.LineNumber].Content.TrimEnd().Replace("\r", string.Empty); + + if (string.IsNullOrWhiteSpace(runtimeInfo.CurrentLine) || runtimeInfo.CurrentLine.StartsWith('#')) + { + continue; + } + + DebugEventArgs debugEventArgs = new DebugEventArgs() + { + LineNumber = runtimeInfo.LineNumber + 1, + OriginalLine = runtimeInfo.CurrentLine.FromSafeString(), + IsTask = runtimeInfo.IsTask, + TaskId = runtimeInfo.TaskId + }; + + foreach (KeyValuePair staticStatement in staticStatements) + { + StaticStatementAttribute staticStatementAttribute = staticStatement.Key; + if (!staticStatementAttribute.ExecuteInSearchMode && runtimeInfo.IsSearching) + { + continue; + } + + staticStatement.Value.Invoke(); + } + + bool statementFound = false; + bool notSearchingLabel = !runtimeInfo.IsSearching; + + foreach (KeyValuePair> statement in statements) + { + StatementAttribute statementAttribute = statement.Key; + + if (!statementAttribute.ExecuteInSearchMode && runtimeInfo.IsSearching) + { + statementFound = true; + continue; + } + if (runtimeInfo.Stop) { break; } - runtimeInfo.CurrentLine = runtimeInfo.Lines[runtimeInfo.LineNumber].Content.TrimEnd().Replace("\r", string.Empty); - - if (string.IsNullOrWhiteSpace(runtimeInfo.CurrentLine) || runtimeInfo.CurrentLine.StartsWith('#')) + string name = statementAttribute.SpaceAround switch { - continue; - } - - DebugEventArgs debugEventArgs = new DebugEventArgs() - { - LineNumber = runtimeInfo.LineNumber + 1, - OriginalLine = runtimeInfo.CurrentLine.FromSafeString(), - IsTask = runtimeInfo.IsTask, - TaskId = runtimeInfo.TaskId + SpaceAround.StartEnd => $" {statementAttribute.Name.Trim()} ", + SpaceAround.Start => $" {statementAttribute.Name.Trim()}", + SpaceAround.End => $"{statementAttribute.Name.Trim()} ", + _ => statementAttribute.Name }; - foreach (KeyValuePair staticStatement in staticStatements) + if (statementAttribute.Seperator is null || runtimeInfo.CurrentLine.Contains(statementAttribute.Seperator)) { - StaticStatementAttribute staticStatementAttribute = staticStatement.Key; - if (!staticStatementAttribute.ExecuteInSearchMode && runtimeInfo.IsSearching) - { - continue; - } - - staticStatement.Value.Invoke(); - } - - bool statementFound = false; - bool notSearchingLabel = !runtimeInfo.IsSearching; - - foreach (KeyValuePair> statement in statements) - { - StatementAttribute statementAttribute = statement.Key; - - if (!statementAttribute.ExecuteInSearchMode && runtimeInfo.IsSearching) + if (statementAttribute.SearchMode == SearchMode.StartOfLine && runtimeInfo.CurrentLine.StartsWith(name)) { + string copyLine = statementAttribute.KeepStatementInArgs ? runtimeInfo.CurrentLine : runtimeInfo.CurrentLine.Remove(0, name.Length); + statement.Value.Invoke(copyLine); statementFound = true; - continue; } - - if (runtimeInfo.Stop) + else if (statementAttribute.SearchMode == SearchMode.Contains && $" {runtimeInfo.CurrentLine} ".Contains(name)) { - break; + bool leadingWhitespace = runtimeInfo.CurrentLine.StartsWith(' '); + + runtimeInfo.CurrentLine = $" {runtimeInfo.CurrentLine} "; + string copyLine = statementAttribute.KeepStatementInArgs ? runtimeInfo.CurrentLine : runtimeInfo.CurrentLine.Replace(name, string.Empty); + statement.Value.Invoke(copyLine); + statementFound = true; + + runtimeInfo.CurrentLine = !leadingWhitespace ? runtimeInfo.CurrentLine.Trim() : runtimeInfo.CurrentLine.TrimEnd(); } - - string name = statementAttribute.SpaceAround switch + else if (statementAttribute.SearchMode == SearchMode.EndOfLine && runtimeInfo.CurrentLine.EndsWith(name)) { - SpaceAround.StartEnd => $" {statementAttribute.Name.Trim()} ", - SpaceAround.Start => $" {statementAttribute.Name.Trim()}", - SpaceAround.End => $"{statementAttribute.Name.Trim()} ", - _ => statementAttribute.Name - }; - - if (statementAttribute.Seperator is null || runtimeInfo.CurrentLine.Contains(statementAttribute.Seperator)) + string copyLine = statementAttribute.KeepStatementInArgs ? runtimeInfo.CurrentLine : runtimeInfo.CurrentLine.Remove(runtimeInfo.CurrentLine.Length - name.Length); + statement.Value.Invoke(copyLine); + statementFound = true; + } + else if (statementAttribute.SearchMode == SearchMode.Exact && runtimeInfo.CurrentLine.Equals(name)) { - if (statementAttribute.SearchMode == SearchMode.StartOfLine && runtimeInfo.CurrentLine.StartsWith(name)) - { - string copyLine = statementAttribute.KeepStatementInArgs ? runtimeInfo.CurrentLine : runtimeInfo.CurrentLine.Remove(0, name.Length); - statement.Value.Invoke(copyLine); - statementFound = true; - } - else if (statementAttribute.SearchMode == SearchMode.Contains && $" {runtimeInfo.CurrentLine} ".Contains(name)) - { - bool leadingWhitespace = runtimeInfo.CurrentLine.StartsWith(' '); - - runtimeInfo.CurrentLine = $" {runtimeInfo.CurrentLine} "; - string copyLine = statementAttribute.KeepStatementInArgs ? runtimeInfo.CurrentLine : runtimeInfo.CurrentLine.Replace(name, string.Empty); - statement.Value.Invoke(copyLine); - statementFound = true; - - runtimeInfo.CurrentLine = !leadingWhitespace ? runtimeInfo.CurrentLine.Trim() : runtimeInfo.CurrentLine.TrimEnd(); - } - else if (statementAttribute.SearchMode == SearchMode.EndOfLine && runtimeInfo.CurrentLine.EndsWith(name)) - { - string copyLine = statementAttribute.KeepStatementInArgs ? runtimeInfo.CurrentLine : runtimeInfo.CurrentLine.Remove(runtimeInfo.CurrentLine.Length - name.Length); - statement.Value.Invoke(copyLine); - statementFound = true; - } - else if (statementAttribute.SearchMode == SearchMode.Exact && runtimeInfo.CurrentLine.Equals(name)) - { - statement.Value.Invoke(runtimeInfo.CurrentLine); - statementFound = true; - } + statement.Value.Invoke(runtimeInfo.CurrentLine); + statementFound = true; } - } - - if (!statementFound) - { - runtimeInfo.Exit("Invalid statement", true); - } - if (runtimeInfo.IsDebugMode && notSearchingLabel) - { - debugEventArgs.CurrentLine = runtimeInfo.CurrentLine.FromSafeString(); - runtimeInfo.LineExecuted(debugEventArgs); } } - if (!runtimeInfo.Stop) + if (!statementFound) { - if (!string.IsNullOrWhiteSpace(runtimeInfo.SearchLabel)) - { - runtimeInfo.Exit($"Label \"{runtimeInfo.SearchLabel}\" not found", true); - } - else if (!string.IsNullOrWhiteSpace(runtimeInfo.SearchFunction)) - { - runtimeInfo.Exit($"Function \"{runtimeInfo.SearchFunction}\" not found", true); - } - else - { - runtimeInfo.Exit("End of file", false); - } - - if (runtimeInfo.IsDebugMode) - { - runtimeInfo.LineExecuted(null); - } + runtimeInfo.Exit("Invalid statement", true); + } + if (runtimeInfo.IsDebugMode && notSearchingLabel) + { + debugEventArgs.CurrentLine = runtimeInfo.CurrentLine.FromSafeString(); + runtimeInfo.LineExecuted(debugEventArgs); } } - private bool LoadFile(string path) + if (!runtimeInfo.Stop) { - path = Path.GetFullPath(path); - - if (!File.Exists(path)) + if (!string.IsNullOrWhiteSpace(runtimeInfo.SearchLabel)) { - Console.WriteLine($"File \"{path}\" not found!"); - return false; + runtimeInfo.Exit($"Label \"{runtimeInfo.SearchLabel}\" not found", true); + } + else if (!string.IsNullOrWhiteSpace(runtimeInfo.SearchFunction)) + { + runtimeInfo.Exit($"Function \"{runtimeInfo.SearchFunction}\" not found", true); + } + else + { + runtimeInfo.Exit("End of file", false); } - string[] lines = File.ReadAllLines(path); - - if (lines.Length <= 0) + if (runtimeInfo.IsDebugMode) { - Console.WriteLine($"File \"{path}\" is empty!"); - return false; + runtimeInfo.LineExecuted(null); } - - runtimeInfo.WorkingDirectory = Path.GetDirectoryName(path); - - for (int i = 0; i < lines.Length; i++) - { - runtimeInfo.Lines.Add(new Line(lines[i], Path.GetFileName(path), i)); - } - - return true; } } + + private bool LoadFile(string path) + { + path = Path.GetFullPath(path); + + if (!File.Exists(path)) + { + Console.WriteLine($"File \"{path}\" not found!"); + return false; + } + + string[] lines = File.ReadAllLines(path); + + if (lines.Length <= 0) + { + Console.WriteLine($"File \"{path}\" is empty!"); + return false; + } + + runtimeInfo.WorkingDirectory = Path.GetDirectoryName(path); + + for (int i = 0; i < lines.Length; i++) + { + runtimeInfo.Lines.Add(new Line(lines[i], Path.GetFileName(path), i)); + } + + return true; + } } \ No newline at end of file diff --git a/YesNt.Interpreter/Statements/ConsoleStatements.cs b/YesNt.Interpreter/Statements/ConsoleStatements.cs index 574df89..d0bd322 100644 --- a/YesNt.Interpreter/Statements/ConsoleStatements.cs +++ b/YesNt.Interpreter/Statements/ConsoleStatements.cs @@ -6,56 +6,61 @@ using YesNt.Interpreter.Enums; using YesNt.Interpreter.Runtime; using YesNt.Interpreter.Utilities; -namespace YesNt.Interpreter.Statements +namespace YesNt.Interpreter.Statements; + +internal class ConsoleStatements : StatementRuntimeInformation { - internal class ConsoleStatements : StatementRuntimeInformation + [Statement("cwl", SearchMode.Exact, SpaceAround.None, ConsoleColor.DarkGreen, Priority = Priority.VeryLow)] + public void WriteLineEmpty(string _) { - [Statement("cwl", SearchMode.StartOfLine, SpaceAround.End, ConsoleColor.DarkGreen, Priority = Priority.VeryLow)] - public void WriteLine(string args) - { - RuntimeInfo.WriteLine(args); - } + RuntimeInfo.WriteLine(string.Empty); + } - [Statement("cw", SearchMode.StartOfLine, SpaceAround.End, ConsoleColor.DarkGreen, Priority = Priority.VeryLow)] - public void Write(string args) - { - RuntimeInfo.Write(args); - } + [Statement("cwl", SearchMode.StartOfLine, SpaceAround.End, ConsoleColor.DarkGreen, Priority = Priority.VeryLow)] + public void WriteLine(string args) + { + RuntimeInfo.WriteLine(args); + } - [Statement("%crl", SearchMode.Contains, SpaceAround.End, ConsoleColor.DarkGreen, KeepStatementInArgs = true, Priority = Priority.Highest)] - public void ReadLine(string args) + [Statement("cw", SearchMode.StartOfLine, SpaceAround.End, ConsoleColor.DarkGreen, Priority = Priority.VeryLow)] + public void Write(string args) + { + RuntimeInfo.Write(args); + } + + [Statement("%crl", SearchMode.Contains, SpaceAround.End, ConsoleColor.DarkGreen, KeepStatementInArgs = true, Priority = Priority.Highest)] + public void ReadLine(string args) + { + args += " "; + while (args.Contains("%crl ")) { - args += " "; - while (args.Contains("%crl ")) + string input = Console.ReadLine(); + if (input is null) { - string input = Console.ReadLine(); - if (input is null) - { - RuntimeInfo.Exit("Terminated by external process", true); - return; - } - args = args.ReplaceFirstOccurrence("%crl ", input.ToSafeString() + " "); + RuntimeInfo.Exit("Terminated by external process", true); + return; } - RuntimeInfo.CurrentLine = args.TrimEnd(); + args = args.ReplaceFirstOccurrence("%crl ", input.ToSafeString() + " "); } + RuntimeInfo.CurrentLine = args.TrimEnd(); + } - [Statement("%cr", SearchMode.Contains, SpaceAround.End, ConsoleColor.DarkGreen, KeepStatementInArgs = true, Priority = Priority.Highest)] - public void ReadKey(string args) + [Statement("%cr", SearchMode.Contains, SpaceAround.End, ConsoleColor.DarkGreen, KeepStatementInArgs = true, Priority = Priority.Highest)] + public void ReadKey(string args) + { + args += " "; + while (args.Contains("%cr ")) { - args += " "; - while (args.Contains("%cr ")) - { - string input = ConsoleExtentions.ReadKey(RuntimeInfo).ToString(); - args = args.ReplaceFirstOccurrence("%cr ", input.ToSafeString() + " "); - } - RuntimeInfo.CurrentLine = args.TrimEnd(); + string input = ConsoleExtentions.ReadKey(RuntimeInfo).ToString(); + args = args.ReplaceFirstOccurrence("%cr ", input.ToSafeString() + " "); } + RuntimeInfo.CurrentLine = args.TrimEnd(); + } - [Statement("cls", SearchMode.Exact, SpaceAround.None, ConsoleColor.Magenta)] - [SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "Won't work if static")] - public void Clear(string _) - { - Console.Clear(); - } + [Statement("cls", SearchMode.Exact, SpaceAround.None, ConsoleColor.Magenta)] + [SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "Won't work if static")] + public void Clear(string _) + { + Console.Clear(); } } \ No newline at end of file