From 9ff9b1e72ef11f04a57ac4120a3eb1f93a5a1e4c Mon Sep 17 00:00:00 2001 From: Christian Siewert Date: Thu, 2 Oct 2025 16:33:11 +0200 Subject: [PATCH] Create `States` more properly --- global.json | 6 ----- src/Moryx.Cli.Commands/AddStates.cs | 20 ++++++++++----- .../Components/ProjectFileManipulation.cs | 6 ++++- src/Moryx.Cli.Commands/ExecCommand.cs | 1 - .../Components/CSharpFile.cs | 25 +++++++++++++------ .../StateBaseTemplate.Constructor.cs | 3 ++- .../StateBaseTemplate/StateBaseTemplate.cs | 7 +++--- .../StateTemplate/StateTemplate.cs | 23 ++++++++--------- src/Moryx.Cli.Templates/Template.cs | 2 +- 9 files changed, 53 insertions(+), 40 deletions(-) delete mode 100644 global.json diff --git a/global.json b/global.json deleted file mode 100644 index 1a058b2..0000000 --- a/global.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "sdk": { - "version": "8.0.300", - "rollForward": "disable" - } -} diff --git a/src/Moryx.Cli.Commands/AddStates.cs b/src/Moryx.Cli.Commands/AddStates.cs index 4ebb4fe..b8677b2 100644 --- a/src/Moryx.Cli.Commands/AddStates.cs +++ b/src/Moryx.Cli.Commands/AddStates.cs @@ -19,15 +19,15 @@ internal static CommandResult Exec(Template template, string resource, IEnumerab private static CommandResult Add(Template template, string resource, IEnumerable states) { - var resourceFile = FindResource(template.Settings, resource); - if (string.IsNullOrEmpty(resourceFile)) + var resourceFileName = FindResource(template.Settings, resource); + if (string.IsNullOrEmpty(resourceFileName)) { return CommandResult.WithError($"`{resource}` not found. Make sure that a type `{resource}` exists in the project."); } - + var resourceFile = CSharpFile.FromFile(resourceFileName); var dictionary = template.StateBaseFile(resource); - var targetPath = Path.Combine(Path.GetDirectoryName(resourceFile)!, "States"); + var targetPath = Path.Combine(Path.GetDirectoryName(resourceFileName)!, "States"); var newStateBaseFileName = Path.Combine( targetPath, Path.GetFileName(dictionary.FirstOrDefault().Value)); @@ -38,9 +38,11 @@ private static CommandResult Add(Template template, string resource, IEnumerable { var files = template.WriteFilesToDisk(dictionary); + var stateBaseVars = template.ReplaceVariables(template.Configuration.Add.StateBase, "", new Dictionary{ { Template.ResourceKey, resource} }); Template.ReplacePlaceHoldersInsideFiles( files, - template.Configuration.Add.StateBase.Replacements); + stateBaseVars + ); if (!states.Any()) { @@ -81,13 +83,18 @@ private static CommandResult Add(Template template, string resource, IEnumerable if (!File.Exists(filename)) { var files = template.WriteFilesToDisk(stateFiles); + var stateVars = template.ReplaceVariables(template.Configuration.Add.State, state, new Dictionary { { Template.ResourceKey, resource } }); Template.ReplacePlaceHoldersInsideFiles( files, - template.Configuration.Add.State.Replacements); + stateVars); stateBaseTemplate = stateBaseTemplate.AddState(stateType); + var stateTemplate = StateTemplate.FromFile(filename); + stateTemplate.NamespaceName = resourceFile.NamespaceName + ".States"; + stateTemplate.SaveToFile(filename); + msg.Add($"Successfully added {stateType} state"); } else @@ -101,6 +108,7 @@ private static CommandResult Add(Template template, string resource, IEnumerable } } + stateBaseTemplate.NamespaceName = resourceFile.NamespaceName + ".States"; stateBaseTemplate.SaveToFile(newStateBaseFileName); UpdateResource( diff --git a/src/Moryx.Cli.Commands/Components/ProjectFileManipulation.cs b/src/Moryx.Cli.Commands/Components/ProjectFileManipulation.cs index 83ae00b..670f00d 100644 --- a/src/Moryx.Cli.Commands/Components/ProjectFileManipulation.cs +++ b/src/Moryx.Cli.Commands/Components/ProjectFileManipulation.cs @@ -10,8 +10,12 @@ internal class ProjectFileManipulation public static void AddProjectReference(string targetProjectFileName, string referenceProjectFileName) { + var targetProjectDirectory = Path.GetDirectoryName(targetProjectFileName); + var referenceProjectDirectory = Path.GetDirectoryName(referenceProjectFileName); + if(targetProjectDirectory == null || referenceProjectDirectory == null) + return; - var referencePath = Path.GetRelativePath(Path.GetDirectoryName(targetProjectFileName), Path.GetDirectoryName(referenceProjectFileName)); + var referencePath = Path.GetRelativePath(targetProjectDirectory, referenceProjectDirectory); referencePath = Path.Combine(referencePath, Path.GetFileName(referenceProjectFileName)); var projectFile = LoadXml(targetProjectFileName); diff --git a/src/Moryx.Cli.Commands/ExecCommand.cs b/src/Moryx.Cli.Commands/ExecCommand.cs index 1752360..9b2fa8b 100644 --- a/src/Moryx.Cli.Commands/ExecCommand.cs +++ b/src/Moryx.Cli.Commands/ExecCommand.cs @@ -1,6 +1,5 @@ using System.Net; using Moryx.Cli.Commands.Options; -using System.Net; using System.Net.Http.Json; namespace Moryx.Cli.Commands diff --git a/src/Moryx.Cli.Templates/Components/CSharpFile.cs b/src/Moryx.Cli.Templates/Components/CSharpFile.cs index 791f244..74f8e7d 100644 --- a/src/Moryx.Cli.Templates/Components/CSharpFile.cs +++ b/src/Moryx.Cli.Templates/Components/CSharpFile.cs @@ -8,7 +8,7 @@ public class CSharpFile : CSharpFileBase { private SyntaxNode _root; - private NamespaceDeclarationSyntax? _namespaceDeclaration; + private BaseNamespaceDeclarationSyntax? _namespaceDeclaration; public List Types { get; private set; } @@ -23,7 +23,7 @@ public string NamespaceName } - public CSharpFile(string content) : base(content) + public CSharpFile(string content) : base(content) { _root = _syntaxTree.GetRoot(); Types = ScanTypes(); @@ -31,13 +31,17 @@ public CSharpFile(string content) : base(content) } public static CSharpFile FromFile(string fileName) + { + return new CSharpFile(ReadContent(fileName)); + } + + protected static string ReadContent(string fileName) { if (!File.Exists(fileName)) { throw new FileNotFoundException(fileName); } - var content = File.ReadAllText(fileName); - return new CSharpFile(content); + return File.ReadAllText(fileName); } public List ScanTypes() @@ -49,18 +53,23 @@ public List ScanTypes() .ToList(); } - private NamespaceDeclarationSyntax? ScanNamespace() + private BaseNamespaceDeclarationSyntax? ScanNamespace() { var root = _syntaxTree.GetRoot() as CompilationUnitSyntax; - - return root?.DescendantNodes().OfType().FirstOrDefault(); + var nds = root?.DescendantNodes().OfType().FirstOrDefault(); + if(nds != null) + { + return nds; + } + return root?.DescendantNodes().OfType().FirstOrDefault(); } private void UpdateNamespace(string @namespace) { if (_namespaceDeclaration != null) { - var newNamespace = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(@namespace)).NormalizeWhitespace(); + var newName = SyntaxFactory.ParseName(@namespace); + var newNamespace = _namespaceDeclaration.WithName(newName); _root = _root.ReplaceNode(_namespaceDeclaration, newNamespace); _content = _root.ToFullString(); } diff --git a/src/Moryx.Cli.Templates/StateBaseTemplate/StateBaseTemplate.Constructor.cs b/src/Moryx.Cli.Templates/StateBaseTemplate/StateBaseTemplate.Constructor.cs index d00b59a..cb241bd 100644 --- a/src/Moryx.Cli.Templates/StateBaseTemplate/StateBaseTemplate.Constructor.cs +++ b/src/Moryx.Cli.Templates/StateBaseTemplate/StateBaseTemplate.Constructor.cs @@ -1,4 +1,5 @@ -namespace Moryx.Cli.Templates.StateBaseTemplate + +namespace Moryx.Cli.Templates.StateBaseTemplate { public partial class StateBaseTemplate { diff --git a/src/Moryx.Cli.Templates/StateBaseTemplate/StateBaseTemplate.cs b/src/Moryx.Cli.Templates/StateBaseTemplate/StateBaseTemplate.cs index 392a699..44687e1 100644 --- a/src/Moryx.Cli.Templates/StateBaseTemplate/StateBaseTemplate.cs +++ b/src/Moryx.Cli.Templates/StateBaseTemplate/StateBaseTemplate.cs @@ -7,7 +7,7 @@ namespace Moryx.Cli.Templates.StateBaseTemplate { - public partial class StateBaseTemplate : CSharpFileBase + public partial class StateBaseTemplate : CSharpFile { private const string StateDefinitionAttributeName = "StateDefinition"; private const string IsInitialParameterName = "IsInitial"; @@ -19,10 +19,9 @@ public StateBaseTemplate(string content) : base(content) public IEnumerable StateDeclarations { get; private set; } = []; - public static StateBaseTemplate FromFile(string fileName) + public new static StateBaseTemplate FromFile(string fileName) { - var content = File.ReadAllText(fileName); - return new StateBaseTemplate(content); + return new StateBaseTemplate(ReadContent(fileName)); } private void Parse(SyntaxTree syntaxTree) diff --git a/src/Moryx.Cli.Templates/StateTemplate/StateTemplate.cs b/src/Moryx.Cli.Templates/StateTemplate/StateTemplate.cs index b1268b3..5bb139e 100644 --- a/src/Moryx.Cli.Templates/StateTemplate/StateTemplate.cs +++ b/src/Moryx.Cli.Templates/StateTemplate/StateTemplate.cs @@ -8,7 +8,7 @@ namespace Moryx.Cli.Templates.StateTemplate { - public class StateTemplate : CSharpFileBase + public class StateTemplate : CSharpFile { private const string StateContextInterface = "IStateContext"; @@ -16,14 +16,9 @@ public StateTemplate(string content) : base(content) { } - public static StateTemplate FromFile(string fileName) + public static new StateTemplate FromFile(string fileName) { - if (!File.Exists(fileName)) - { - throw new FileNotFoundException(fileName); - } - var content = File.ReadAllText(fileName); - return new StateTemplate(content); + return new StateTemplate(ReadContent(fileName)); } public StateTemplate ImplementIStateContext(string resource) @@ -43,7 +38,7 @@ public StateTemplate ImplementIStateContext(string resource) return new StateTemplate(root.ToFullString()); } - + private SyntaxNode TryToAddInitializing(SyntaxNode root, string context) { @@ -91,8 +86,12 @@ private SyntaxNode AddStateProperty(SyntaxNode root, string context) var stateProperty = SyntaxFactory .PropertyDeclaration(SyntaxFactory.ParseTypeName(context.StateBase()), "State") .AddModifiers(SyntaxFactory.Token(SyntaxKind.InternalKeyword)) - .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)) - .WithExpressionBody(SyntaxFactory.ArrowExpressionClause(SyntaxFactory.ParseExpression($"({context.StateBase()})CurrentState"))) + .AddAccessorListAccessors( + SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration) + .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)), + SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration) + .AddModifiers(SyntaxFactory.Token(SyntaxKind.PrivateKeyword)) + .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))) .NormalizeWhitespace() ; @@ -103,7 +102,7 @@ private SyntaxNode AddStateProperty(SyntaxNode root, string context) private static SyntaxNode UpdateClassDefinition(SyntaxNode root, string context) { var contextClass = root.FindClass(context); - if(contextClass == null) + if (contextClass == null) return root; if (!contextClass.BaseList?.Types.Any(t => ((IdentifierNameSyntax)t.Type).Identifier.ValueText == StateContextInterface) ?? false) diff --git a/src/Moryx.Cli.Templates/Template.cs b/src/Moryx.Cli.Templates/Template.cs index 625ceee..b0180b1 100644 --- a/src/Moryx.Cli.Templates/Template.cs +++ b/src/Moryx.Cli.Templates/Template.cs @@ -32,7 +32,7 @@ namespace Moryx.Cli.Templates public class Template { private const string IdentifierKey = "{id}"; - private const string ResourceKey = "{resource}"; + public const string ResourceKey = "{resource}"; private const string SolutionNameKey = "{solutionname}"; private const string TemplateFileExtension = ".moryxtpl"; private readonly List _fileNames;