diff --git a/CSharp/CSharp.csproj b/CSharp/CSharp.csproj index d74dd02..9d7115b 100644 --- a/CSharp/CSharp.csproj +++ b/CSharp/CSharp.csproj @@ -2,8 +2,8 @@ net6.0 - enable - enable + disable + 10.0 false true @@ -13,6 +13,7 @@ + diff --git a/CSharp/Interpreter/ArcscriptExceptions.cs b/CSharp/Interpreter/ArcscriptExceptions.cs index b3bb46d..acea2c9 100644 --- a/CSharp/Interpreter/ArcscriptExceptions.cs +++ b/CSharp/Interpreter/ArcscriptExceptions.cs @@ -1,23 +1,25 @@ -namespace Arcweave.Interpreter; - -public class RuntimeException : Exception +namespace Arcweave.Interpreter +{ +public class RuntimeException : System.Exception { public RuntimeException(string message) : base(message) { } - public RuntimeException(string message, Exception innerException) : base(message, innerException) + public RuntimeException(string message, System.Exception innerException) : base(message, innerException) { } } -public class ParseException : Exception +public class ParseException : System.Exception { public ParseException(string message) : base(message) { } - public ParseException(string message, Exception innerException) : base(message, innerException) + public ParseException(string message, System.Exception innerException) : base(message, innerException) { } -} \ No newline at end of file +} +} + diff --git a/CSharp/Interpreter/ArcscriptExpression.cs b/CSharp/Interpreter/ArcscriptExpression.cs index eb450ce..0541dbe 100644 --- a/CSharp/Interpreter/ArcscriptExpression.cs +++ b/CSharp/Interpreter/ArcscriptExpression.cs @@ -1,4 +1,4 @@ - +#nullable enable using System; using System.Collections; @@ -6,8 +6,7 @@ namespace Arcweave.Interpreter { public class Expression : ArcscriptExpressionBase, IComparable { - public object Value { get; set; } - public Expression() { Value = null; } + public object Value { get; private set; } public Expression(object value) { Value = value; } public Expression(object value, Type type) { Value = Convert.ChangeType(value, type); } public Expression(Expression expression) { Value = expression.Value; } diff --git a/CSharp/Interpreter/ArcscriptExpressionBase.cs b/CSharp/Interpreter/ArcscriptExpressionBase.cs index 8dc0958..23e41ac 100644 --- a/CSharp/Interpreter/ArcscriptExpressionBase.cs +++ b/CSharp/Interpreter/ArcscriptExpressionBase.cs @@ -1,7 +1,7 @@ using System.Globalization; -namespace Arcweave.Interpreter; - +namespace Arcweave.Interpreter +{ public class ArcscriptExpressionBase { public NumberFormatInfo NumberFormat { get; private set; } @@ -13,4 +13,6 @@ public ArcscriptExpressionBase() NumberGroupSeparator = "," }; } -} \ No newline at end of file +} +} + diff --git a/CSharp/Interpreter/ArcscriptParserBase.cs b/CSharp/Interpreter/ArcscriptParserBase.cs index 2ec1b70..6c33b8a 100644 --- a/CSharp/Interpreter/ArcscriptParserBase.cs +++ b/CSharp/Interpreter/ArcscriptParserBase.cs @@ -92,7 +92,7 @@ public bool assertMention(IList attrC } attrs.Add(attrName, attrValue); } - string[] classList = attrs["class"].Split(" "); + string[] classList = attrs["class"].Split(' '); if ( !classList.Contains("mention") ) { return false; } diff --git a/CSharp/Interpreter/ArcscriptState.cs b/CSharp/Interpreter/ArcscriptState.cs index ed82f41..2e4622f 100644 --- a/CSharp/Interpreter/ArcscriptState.cs +++ b/CSharp/Interpreter/ArcscriptState.cs @@ -1,6 +1,8 @@ +#nullable enable using System.Collections.Generic; using System.Linq; using Arcweave.Interpreter.INodes; +using Arcweave.Project; namespace Arcweave.Interpreter { @@ -28,7 +30,7 @@ public ArcscriptState(string elementId, IProject project, System.Action? } } - public IVariable GetVariable(string name) { + public IVariable? GetVariable(string name) { try { return this.project.Variables.First(variable => variable.Name == name); @@ -56,9 +58,12 @@ public void SetVarValues(string[] names, string[] values) { public void ResetVisits() { - foreach (var projectElement in project.Elements) + foreach (var board in project.Boards) { - projectElement.Value.Visits = 0; + foreach (var element in board.Nodes.OfType()) + { + element.Visits = 0; + } } _emit("resetVisits"); } diff --git a/CSharp/Interpreter/ArcscriptTranspiler.cs b/CSharp/Interpreter/ArcscriptTranspiler.cs index 633c4b6..3f4c2dd 100644 --- a/CSharp/Interpreter/ArcscriptTranspiler.cs +++ b/CSharp/Interpreter/ArcscriptTranspiler.cs @@ -1,10 +1,10 @@ +#nullable enable using Antlr4.Runtime; using System.Collections.Generic; using Arcweave.Interpreter.INodes; namespace Arcweave.Interpreter { - public class AwInterpreter { private IProject Project { get; set; } @@ -64,7 +64,7 @@ public TranspilerOutput RunScript(string code) { tree = this.GetParseTree(code); } - catch (Exception e) + catch (System.Exception e) { throw new ParseException(e.Message, e); } diff --git a/CSharp/Interpreter/ArcscriptVisitor.cs b/CSharp/Interpreter/ArcscriptVisitor.cs index 368bde4..6e5d06d 100644 --- a/CSharp/Interpreter/ArcscriptVisitor.cs +++ b/CSharp/Interpreter/ArcscriptVisitor.cs @@ -1,3 +1,6 @@ +#nullable enable +using System; +using System.Collections.Generic; using Antlr4.Runtime.Misc; using System.Globalization; using Antlr4.Runtime.Tree; @@ -38,7 +41,7 @@ public override object VisitInput([NotNull] ArcscriptParser.InputContext context public override object VisitScript_section([NotNull] ArcscriptParser.Script_sectionContext context) { if ( context == null ) { - return null; + return null!; } var blockquoteContexts = context.blockquote(); @@ -121,7 +124,7 @@ public override object VisitConditional_section([NotNull] ArcscriptParser.Condit return elseSection.Script; } this.state.Outputs.AddScriptOutput(null); - return null; + return null!; } public override object VisitIf_section([NotNull] ArcscriptParser.If_sectionContext context) { @@ -158,12 +161,11 @@ public override object VisitElse_if_clause([NotNull] ArcscriptParser.Else_if_cla public override object VisitStatement_assignment([NotNull] ArcscriptParser.Statement_assignmentContext context) { string variableName = context.VARIABLE().GetText(); - IVariable variable = this.state.GetVariable(variableName); Expression compound_condition_or = (Expression)this.VisitCompound_condition_or(context.compound_condition_or()); if ( context.ASSIGN() != null ) { this.state.SetVarValue(variableName, compound_condition_or.Value); - return null; + return null!; } Expression variableValue = new Expression(this.state.GetVarValue(variableName)); @@ -181,7 +183,7 @@ public override object VisitStatement_assignment([NotNull] ArcscriptParser.State } this.state.SetVarValue(variableName, variableValue.Value); - return null; + return null!; } public override object VisitCompound_condition_or([NotNull] ArcscriptParser.Compound_condition_orContext context) { @@ -356,7 +358,7 @@ public override object VisitUnary_numeric_expression([NotNull] ArcscriptParser.U public override object VisitVoid_function_call([NotNull] ArcscriptParser.Void_function_callContext context) { string fname = ""; - IList argument_list_result = null; + IList? argument_list_result = null; if (context.VFNAME() != null) { fname = context.VFNAME().GetText(); @@ -380,7 +382,7 @@ public override object VisitVoid_function_call([NotNull] ArcscriptParser.Void_fu } public override object VisitFunction_call([NotNull] ArcscriptParser.Function_callContext context) { - IList argument_list_result = null; + IList? argument_list_result = null; if ( context.argument_list() != null ) { argument_list_result = (IList)this.VisitArgument_list(context.argument_list()); } @@ -398,8 +400,11 @@ public override object VisitVariable_list([NotNull] ArcscriptParser.Variable_lis List variables = new List(); foreach (ITerminalNode variable in context.VARIABLE()) { - IVariable varObject = this.state.GetVariable(variable.GetText()); - variables.Add(varObject); + var varObject = this.state.GetVariable(variable.GetText()); + if (varObject != null) + { + variables.Add(varObject); + } } return variables; } @@ -445,7 +450,7 @@ public override object VisitMention_attributes([NotNull] ArcscriptParser.Mention object value = true; if ( ctxvalue != null ) { string strvalue = ctxvalue.GetText(); - if ( ( strvalue.StartsWith('"') && strvalue.EndsWith('"') ) || + if ( ( strvalue.StartsWith("\"") && strvalue.EndsWith("\"") ) || ( strvalue.StartsWith("'") && strvalue.EndsWith("'") ) ) { strvalue = strvalue.Substring(1, strvalue.Length - 2); } diff --git a/CSharp/Interpreter/ErrorListener.cs b/CSharp/Interpreter/ErrorListener.cs index 397d2c1..cd502bd 100644 --- a/CSharp/Interpreter/ErrorListener.cs +++ b/CSharp/Interpreter/ErrorListener.cs @@ -1,7 +1,9 @@ +using System.Collections.Generic; +using System.IO; using Antlr4.Runtime; -namespace Arcweave.Interpreter; - +namespace Arcweave.Interpreter +{ public class ErrorListener: ConsoleErrorListener { public bool HasErrors = false; @@ -14,4 +16,6 @@ public override void SyntaxError(TextWriter output, IRecognizer recognizer, S of Errors.Add($"line {line}:{charPositionInLine} {msg}"); base.SyntaxError(output, recognizer, offendingSymbol, line, charPositionInLine, msg, e); } -} \ No newline at end of file +} +} + diff --git a/CSharp/Interpreter/INodes/IProject.cs b/CSharp/Interpreter/INodes/IProject.cs index aea0557..c53029a 100644 --- a/CSharp/Interpreter/INodes/IProject.cs +++ b/CSharp/Interpreter/INodes/IProject.cs @@ -11,10 +11,11 @@ public interface IProject { #if GODOT public Array Variables { get; } + public Array Boards { get; } #else public List Variables { get; } + public List Boards { get; } #endif - public Dictionary Elements { get; } public Arcweave.Project.Element ElementWithId(string id); public Arcweave.Project.Variable GetVariable(string name); diff --git a/CSharp/Project/Attribute.cs b/CSharp/Project/Attribute.cs index 0857d12..7ddd1e5 100644 --- a/CSharp/Project/Attribute.cs +++ b/CSharp/Project/Attribute.cs @@ -1,11 +1,14 @@ using Arcweave.Interpreter.INodes; -namespace Arcweave.Project; - +namespace Arcweave.Project +{ + public partial class Attribute { public string Name { get; } public IAttribute.DataType Type { get; } public IAttribute.ContainerType containerType { get; } public string containerId { get; } -} \ No newline at end of file +} +} + diff --git a/CSharp/Project/Board.cs b/CSharp/Project/Board.cs new file mode 100644 index 0000000..7422aee --- /dev/null +++ b/CSharp/Project/Board.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using System.Linq; +using Arcweave.Interpreter.INodes; + +namespace Arcweave.Project +{ + public partial class Board + { + public string Id { get; set; } + public List Nodes { get; set; } + + public Board(string id, List nodes) + { + Id = id; + Nodes = nodes; + } + + public T NodeWithID(string id) where T : INode => Nodes.OfType().FirstOrDefault(x => x.Id == id); + } +} \ No newline at end of file diff --git a/CSharp/Project/Component.cs b/CSharp/Project/Component.cs index 35d4a43..5ad89c3 100644 --- a/CSharp/Project/Component.cs +++ b/CSharp/Project/Component.cs @@ -1,5 +1,8 @@ -namespace Arcweave.Project; +using System; +using System.Collections.Generic; +namespace Arcweave.Project +{ public partial class Component { public List Attributes { get; } @@ -7,4 +10,6 @@ public void AddAttribute(Attribute attribute) { throw new NotImplementedException(); } -} \ No newline at end of file +} +} + diff --git a/CSharp/Project/Connection.cs b/CSharp/Project/Connection.cs index 24d9127..2b90df4 100644 --- a/CSharp/Project/Connection.cs +++ b/CSharp/Project/Connection.cs @@ -1,7 +1,8 @@ -using Arcweave.Interpreter.INodes; - -namespace Arcweave.Project; +using System; +using Arcweave.Interpreter.INodes; +namespace Arcweave.Project +{ public partial class Connection { public string Id { get; } @@ -24,4 +25,6 @@ public Path ResolvePath(Path p) { throw new NotImplementedException(); } -} \ No newline at end of file +} +} + diff --git a/CSharp/Project/Element.cs b/CSharp/Project/Element.cs index e25204b..50ae08e 100644 --- a/CSharp/Project/Element.cs +++ b/CSharp/Project/Element.cs @@ -1,9 +1,17 @@ -namespace Arcweave.Project; +using System; +using System.Collections.Generic; +namespace Arcweave.Project +{ public partial class Element { public string Id { get; } public Project Project { get; } + + public Element(string id) + { + Id = id; + } public Path ResolvePath(Path path) { @@ -29,4 +37,6 @@ public Options GetOptions() { throw new NotImplementedException(); } -} \ No newline at end of file +} +} + diff --git a/CSharp/Project/HelperClasses.cs b/CSharp/Project/HelperClasses.cs index 8356bc8..0151cd9 100644 --- a/CSharp/Project/HelperClasses.cs +++ b/CSharp/Project/HelperClasses.cs @@ -1,9 +1,15 @@ -namespace Arcweave.Project; +using System; +using System.Collections.Generic; +using Arcweave.Interpreter.INodes; +namespace Arcweave.Project +{ public partial class Options { public Element Element { get; set; } public List Paths { get; set; } + public bool HasPaths { get; } + public bool HasOptions { get; } } public partial class Path @@ -11,6 +17,9 @@ public partial class Path public string label { get; set; } public Element TargetElement { get; set; } public List _connections { get; set; } + + bool IPath.IsValid => throw new NotImplementedException(); + public void AppendConnection(Connection connection) { throw new NotImplementedException(); @@ -20,4 +29,6 @@ public void ExecuteAppendedConnectionLabels() { throw new NotImplementedException(); } -} \ No newline at end of file +} +} + diff --git a/CSharp/Project/Project.cs b/CSharp/Project/Project.cs index 4ed612a..5b39846 100644 --- a/CSharp/Project/Project.cs +++ b/CSharp/Project/Project.cs @@ -1,26 +1,33 @@ -namespace Arcweave.Project; +using System.Collections.Generic; +using System.Linq; +using Arcweave.Interpreter.INodes; +namespace Arcweave.Project +{ public partial class Project { public List Variables { get; } - public Dictionary Elements { get; } - public Project(List variables, Dictionary elements) + public List Boards { get; } + public Project(List boards, List variables) { Variables = variables; - Elements = elements; - } - public Element ElementWithId(string id) - { - if (Elements.ContainsKey(id)) - { - return Elements[id]; - } - - return null; + Boards = boards; } + public Element ElementWithId(string id) => GetNodeWithID(id); public Variable GetVariable(string name) { return Variables.FirstOrDefault(variable => variable.Name == name); } -} \ No newline at end of file + + public T GetNodeWithID(string id) where T : INode { + T result = default(T); + foreach ( var board in Boards ) { + result = board.NodeWithID(id); + if ( result != null ) { return result; } + } + return result; + } +} +} + diff --git a/CSharp/Project/Variable.cs b/CSharp/Project/Variable.cs index 40455b4..6b98db9 100644 --- a/CSharp/Project/Variable.cs +++ b/CSharp/Project/Variable.cs @@ -1,11 +1,11 @@ -namespace Arcweave.Project; - +namespace Arcweave.Project +{ public partial class Variable { public string Name { get; set; } public object Value { get; set; } public object ObjectValue => Value; - public Type Type { get; } + public System.Type Type { get; } private object _defaultValue; public object DefaultValue => _defaultValue; public Variable(string name, object value) @@ -19,4 +19,5 @@ public void ResetToDefaultValue() { Value = _defaultValue; } -} \ No newline at end of file +} +} diff --git a/CSharp/TestObjects.cs b/CSharp/TestObjects.cs index da16856..95d4a8c 100644 --- a/CSharp/TestObjects.cs +++ b/CSharp/TestObjects.cs @@ -1,5 +1,8 @@ -namespace Arcweave; +using System.Collections.Generic; +namespace Arcweave +{ + public struct TestVariable { public string id; @@ -30,4 +33,6 @@ public struct TestFile { public Dictionary initialVars; public List cases; -} \ No newline at end of file +} +} + diff --git a/CSharp/UnitTests.cs b/CSharp/UnitTests.cs index ffa052c..d34d0e8 100644 --- a/CSharp/UnitTests.cs +++ b/CSharp/UnitTests.cs @@ -1,10 +1,15 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; using NUnit.Framework; using Newtonsoft.Json; using Arcweave.Interpreter; +using Arcweave.Interpreter.INodes; using Arcweave.Project; -namespace Arcweave; - +namespace Arcweave +{ public class Tests { struct TestData @@ -112,29 +117,32 @@ private static TestData LoadJson(string filePath) [TestCaseSource(nameof(GetValidTestData))] public void ValidTests(Dictionary variables, TestCase testCase) { - var elements = new Dictionary(); + var nodes = new List(); if (testCase.visits != null) { foreach (var kvp in testCase.visits) { - elements[kvp.Key] = new Element + var element = new Element(kvp.Key) { Visits = kvp.Value }; + nodes.Add(element); } } + var board = new Board("testBoardId", nodes); + var boards = new List { board }; Console.WriteLine("Testing Case: " + testCase.code); - var project = new Project.Project(variables.Values.ToList(), elements); + var project = new Project.Project(boards, variables.Values.ToList()); List events = new List(); - var onEvent = (string eventName) => + + void OnEvent(string eventName) { - var eventData = new EventData(); - eventData.name = eventName; - eventData.args = new Dictionary(); + var eventData = new EventData { name = eventName, args = new Dictionary() }; events.Add(eventData); - }; - var i = new AwInterpreter(project, testCase.elementId, onEvent); + } + + var i = new AwInterpreter(project, testCase.elementId, OnEvent); var output = i.RunScript(testCase.code); if (testCase.output != null) @@ -164,20 +172,23 @@ public void ValidTests(Dictionary variables, TestCase testCase [TestCaseSource(nameof(GetConditionsTestData))] public void ConditionTests(Dictionary variables, TestCase testCase) { - var elements = new Dictionary(); + var nodes = new List(); if (testCase.visits != null) { foreach (var kvp in testCase.visits) { - elements[kvp.Key] = new Element + var element = new Element(kvp.Key) { Visits = kvp.Value }; + nodes.Add(element); } } + var board = new Board("testBoardId", nodes); + var boards = new List { board }; Console.WriteLine("Testing Case: " + testCase.code); - var project = new Project.Project(variables.Values.ToList(), elements); + var project = new Project.Project(boards, variables.Values.ToList()); var i = new AwInterpreter(project, testCase.elementId); var output = i.RunScript(testCase.code); @@ -188,20 +199,23 @@ public void ConditionTests(Dictionary variables, TestCase test [TestCaseSource(nameof(GetStringConcatTestData))] public void StringConcatTests(Dictionary variables, TestCase testCase) { - var elements = new Dictionary(); + var nodes = new List(); if (testCase.visits != null) { foreach (var kvp in testCase.visits) { - elements[kvp.Key] = new Element + var element = new Element(kvp.Key) { Visits = kvp.Value }; + nodes.Add(element); } } + var board = new Board("testBoardId", nodes); + var boards = new List { board }; Console.WriteLine("Testing Case: " + testCase.code); - var project = new Project.Project(variables.Values.ToList(), elements); + var project = new Project.Project(boards, variables.Values.ToList()); var i = new AwInterpreter(project, testCase.elementId); var output = i.RunScript(testCase.code); @@ -221,43 +235,51 @@ public void StringConcatTests(Dictionary variables, TestCase t [TestCaseSource(nameof(GetRuntimeErrorTestData))] public void RuntimeErrorTests(Dictionary variables, TestCase testCase) { - var Elements = new Dictionary(); + var nodes = new List(); if (testCase.visits != null) { foreach (var kvp in testCase.visits) { - Elements[kvp.Key] = new Element + var element = new Element(kvp.Key) { Visits = kvp.Value }; + nodes.Add(element); } } + var board = new Board("testBoardId", nodes); + var boards = new List { board }; Console.WriteLine("Testing Case: " + testCase.code); - var project = new Project.Project(variables.Values.ToList(), Elements); + var project = new Project.Project(boards, variables.Values.ToList()); var i = new AwInterpreter(project, testCase.elementId); - var ex = Assert.Throws(() => i.RunScript(testCase.code)); + Assert.Throws(() => i.RunScript(testCase.code)); } [Test] [TestCaseSource(nameof(GetParseErrorTestData))] public void ParseErrorTests(Dictionary variables, TestCase testCase) { - var Elements = new Dictionary(); + var nodes = new List(); if (testCase.visits != null) { foreach (var kvp in testCase.visits) { - Elements[kvp.Key] = new Element + var element = new Element(kvp.Key) { Visits = kvp.Value }; + nodes.Add(element); } } + var board = new Board("testBoardId", nodes); + var boards = new List { board }; Console.WriteLine("Testing Case: " + testCase.code); - var project = new Project.Project(variables.Values.ToList(), Elements); + var project = new Project.Project(boards, variables.Values.ToList()); var i = new AwInterpreter(project, testCase.elementId); - var ex = Assert.Throws(() => i.RunScript(testCase.code)); + Assert.Throws(() => i.RunScript(testCase.code)); } -} \ No newline at end of file +} +} +