diff --git a/Docs/Posts-Of-Interest.md b/Docs/Posts-Of-Interest.md index dc5b6b40..f4bfab32 100644 --- a/Docs/Posts-Of-Interest.md +++ b/Docs/Posts-Of-Interest.md @@ -8,6 +8,7 @@ * [CppCon 2019: Boris Kolpackov “Practical C++ Modules”](https://www.youtube.com/watch?v=szHV6RdQdg8) * [CppCon 2019: Nathan Sidwell “Converting to C++20 Modules”](https://www.youtube.com/watch?v=KVsWIEw3TTw) * [CppCon 2019: Michael Spencer “Building Modules”](https://www.youtube.com/watch?v=L0SHHkBenss) +* [C++ MODULES: A BRIEF TOUR](https://accu.org/journals/overload/28/159/sidwell/) ## Hooking OS Calls * [Detours](https://www.microsoft.com/en-us/research/project/detours/?from=http%3A%2F%2Fresearch.microsoft.com%2Fsn%2Fdetours) diff --git a/Source/GenerateSharp/Directory.Build.props b/Source/Directory.Build.props similarity index 75% rename from Source/GenerateSharp/Directory.Build.props rename to Source/Directory.Build.props index a1bd8b69..5e63c5fc 100644 --- a/Source/GenerateSharp/Directory.Build.props +++ b/Source/Directory.Build.props @@ -1,8 +1,9 @@ - $(MSBuildThisFileDirectory.TrimEnd('\')) - $([System.IO.Path]::GetDirectoryName($(GenerateSharpDirectory))) + $(MSBuildThisFileDirectory.TrimEnd('\')) + $(RootDirectory)\GenerateSharp + $(RootDirectory)\GenerateSharp $([System.IO.Path]::GetDirectoryName($(SourceDirectory))) $(RootDirectory)\out\msbuild $(OutDirectory)\obj @@ -28,10 +29,10 @@ - + - $(GenerateSharpDirectory)\Soup.Rules.ruleset + $(SourceDirectory)\Soup.Rules.ruleset diff --git a/Source/GenerateSharp/Generate/BuildTaskManager.cs b/Source/GenerateSharp/Generate/BuildTaskManager.cs index 00e19577..16905997 100644 --- a/Source/GenerateSharp/Generate/BuildTaskManager.cs +++ b/Source/GenerateSharp/Generate/BuildTaskManager.cs @@ -155,12 +155,6 @@ public void Execute(BuildState state, Path soupTargetDirectory) Log.Info("TaskDone: " + currentTask.Name); - // Write the output from the task to be used for debugging - var activeStateFile = soupTargetDirectory + new Path($"ActiveState_{currentTask.Name}.bvt"); - var sharedStateFile = soupTargetDirectory + new Path($"SharedState_{currentTask.Name}.bvt"); - ValueTableManager.SaveState(activeStateFile, state.ActiveState); - ValueTableManager.SaveState(sharedStateFile, state.SharedState); - // Build the task info var taskInfo = new ValueTable(); taskInfo.Add("ActiveState", new Value(state.ActiveStateImpl.Clone())); @@ -178,7 +172,7 @@ public void Execute(BuildState state, Path soupTargetDirectory) generateInfoTable.Add("TaskInfo", new Value(taskInfoTable)); // Save the runtime information - var generateInfoStateFile = soupTargetDirectory + new Path($"GenerateInfo.bvt"); + var generateInfoStateFile = soupTargetDirectory + BuildConstants.GenerateTaskInfoFileName; ValueTableManager.SaveState(generateInfoStateFile, generateInfoTable); } diff --git a/Source/GenerateSharp/GenerateSharp.sln b/Source/GenerateSharp/GenerateSharp.sln index 33d1f553..91e70b8f 100644 --- a/Source/GenerateSharp/GenerateSharp.sln +++ b/Source/GenerateSharp/GenerateSharp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30907.101 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.31911.260 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soup.Build.Generate", "Generate\Soup.Build.Generate.csproj", "{E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}" EndProject @@ -52,195 +52,383 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|arm64 = Debug|arm64 Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|arm64 = Release|arm64 Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Debug|arm64.ActiveCfg = Debug|Any CPU + {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Debug|arm64.Build.0 = Debug|Any CPU {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Debug|x64.ActiveCfg = Debug|x64 {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Debug|x64.Build.0 = Debug|x64 + {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Debug|x86.ActiveCfg = Debug|Any CPU + {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Debug|x86.Build.0 = Debug|Any CPU {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Release|Any CPU.ActiveCfg = Release|Any CPU {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Release|Any CPU.Build.0 = Release|Any CPU + {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Release|arm64.ActiveCfg = Release|Any CPU + {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Release|arm64.Build.0 = Release|Any CPU {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Release|x64.ActiveCfg = Release|x64 {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Release|x64.Build.0 = Release|x64 + {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Release|x86.ActiveCfg = Release|Any CPU + {E2C26B2D-EA0C-4E3D-B58D-EAFFFDC11F43}.Release|x86.Build.0 = Release|Any CPU {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Debug|arm64.ActiveCfg = Debug|Any CPU + {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Debug|arm64.Build.0 = Debug|Any CPU {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Debug|x64.ActiveCfg = Debug|x64 {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Debug|x64.Build.0 = Debug|x64 + {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Debug|x86.ActiveCfg = Debug|Any CPU + {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Debug|x86.Build.0 = Debug|Any CPU {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Release|Any CPU.ActiveCfg = Release|Any CPU {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Release|Any CPU.Build.0 = Release|Any CPU + {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Release|arm64.ActiveCfg = Release|Any CPU + {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Release|arm64.Build.0 = Release|Any CPU {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Release|x64.ActiveCfg = Release|x64 {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Release|x64.Build.0 = Release|x64 + {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Release|x86.ActiveCfg = Release|Any CPU + {76A76C21-BFB1-4DDC-83F7-35F1E176EF22}.Release|x86.Build.0 = Release|Any CPU {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|arm64.ActiveCfg = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|arm64.Build.0 = Debug|Any CPU {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|x64.ActiveCfg = Debug|x64 {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|x64.Build.0 = Debug|x64 + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|x86.ActiveCfg = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|x86.Build.0 = Debug|Any CPU {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|Any CPU.ActiveCfg = Release|Any CPU {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|Any CPU.Build.0 = Release|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|arm64.ActiveCfg = Release|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|arm64.Build.0 = Release|Any CPU {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|x64.ActiveCfg = Release|x64 {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|x64.Build.0 = Release|x64 + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|x86.ActiveCfg = Release|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|x86.Build.0 = Release|Any CPU {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Debug|arm64.ActiveCfg = Debug|Any CPU + {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Debug|arm64.Build.0 = Debug|Any CPU {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Debug|x64.ActiveCfg = Debug|x64 {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Debug|x64.Build.0 = Debug|x64 + {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Debug|x86.ActiveCfg = Debug|Any CPU + {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Debug|x86.Build.0 = Debug|Any CPU {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Release|Any CPU.ActiveCfg = Release|Any CPU {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Release|Any CPU.Build.0 = Release|Any CPU + {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Release|arm64.ActiveCfg = Release|Any CPU + {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Release|arm64.Build.0 = Release|Any CPU {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Release|x64.ActiveCfg = Release|x64 {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Release|x64.Build.0 = Release|x64 + {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Release|x86.ActiveCfg = Release|Any CPU + {0589B4F1-3A9B-4B35-BE92-3EF34D43EEB3}.Release|x86.Build.0 = Release|Any CPU {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Debug|arm64.ActiveCfg = Debug|Any CPU + {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Debug|arm64.Build.0 = Debug|Any CPU {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Debug|x64.ActiveCfg = Debug|x64 {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Debug|x64.Build.0 = Debug|x64 + {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Debug|x86.ActiveCfg = Debug|Any CPU + {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Debug|x86.Build.0 = Debug|Any CPU {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Release|Any CPU.Build.0 = Release|Any CPU + {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Release|arm64.ActiveCfg = Release|Any CPU + {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Release|arm64.Build.0 = Release|Any CPU {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Release|x64.ActiveCfg = Release|x64 {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Release|x64.Build.0 = Release|x64 + {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Release|x86.ActiveCfg = Release|Any CPU + {6B7849BF-3087-4E4D-91C6-BC4E89AE0268}.Release|x86.Build.0 = Release|Any CPU {4545B940-4076-4EE3-9597-B9254C1E2997}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4545B940-4076-4EE3-9597-B9254C1E2997}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4545B940-4076-4EE3-9597-B9254C1E2997}.Debug|arm64.ActiveCfg = Debug|Any CPU + {4545B940-4076-4EE3-9597-B9254C1E2997}.Debug|arm64.Build.0 = Debug|Any CPU {4545B940-4076-4EE3-9597-B9254C1E2997}.Debug|x64.ActiveCfg = Debug|x64 {4545B940-4076-4EE3-9597-B9254C1E2997}.Debug|x64.Build.0 = Debug|x64 + {4545B940-4076-4EE3-9597-B9254C1E2997}.Debug|x86.ActiveCfg = Debug|Any CPU + {4545B940-4076-4EE3-9597-B9254C1E2997}.Debug|x86.Build.0 = Debug|Any CPU {4545B940-4076-4EE3-9597-B9254C1E2997}.Release|Any CPU.ActiveCfg = Release|Any CPU {4545B940-4076-4EE3-9597-B9254C1E2997}.Release|Any CPU.Build.0 = Release|Any CPU + {4545B940-4076-4EE3-9597-B9254C1E2997}.Release|arm64.ActiveCfg = Release|Any CPU + {4545B940-4076-4EE3-9597-B9254C1E2997}.Release|arm64.Build.0 = Release|Any CPU {4545B940-4076-4EE3-9597-B9254C1E2997}.Release|x64.ActiveCfg = Release|x64 {4545B940-4076-4EE3-9597-B9254C1E2997}.Release|x64.Build.0 = Release|x64 + {4545B940-4076-4EE3-9597-B9254C1E2997}.Release|x86.ActiveCfg = Release|Any CPU + {4545B940-4076-4EE3-9597-B9254C1E2997}.Release|x86.Build.0 = Release|Any CPU {B1040AA7-40A3-4586-9358-4784BC657471}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B1040AA7-40A3-4586-9358-4784BC657471}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1040AA7-40A3-4586-9358-4784BC657471}.Debug|arm64.ActiveCfg = Debug|Any CPU + {B1040AA7-40A3-4586-9358-4784BC657471}.Debug|arm64.Build.0 = Debug|Any CPU {B1040AA7-40A3-4586-9358-4784BC657471}.Debug|x64.ActiveCfg = Debug|x64 {B1040AA7-40A3-4586-9358-4784BC657471}.Debug|x64.Build.0 = Debug|x64 + {B1040AA7-40A3-4586-9358-4784BC657471}.Debug|x86.ActiveCfg = Debug|Any CPU + {B1040AA7-40A3-4586-9358-4784BC657471}.Debug|x86.Build.0 = Debug|Any CPU {B1040AA7-40A3-4586-9358-4784BC657471}.Release|Any CPU.ActiveCfg = Release|Any CPU {B1040AA7-40A3-4586-9358-4784BC657471}.Release|Any CPU.Build.0 = Release|Any CPU + {B1040AA7-40A3-4586-9358-4784BC657471}.Release|arm64.ActiveCfg = Release|Any CPU + {B1040AA7-40A3-4586-9358-4784BC657471}.Release|arm64.Build.0 = Release|Any CPU {B1040AA7-40A3-4586-9358-4784BC657471}.Release|x64.ActiveCfg = Release|x64 {B1040AA7-40A3-4586-9358-4784BC657471}.Release|x64.Build.0 = Release|x64 + {B1040AA7-40A3-4586-9358-4784BC657471}.Release|x86.ActiveCfg = Release|Any CPU + {B1040AA7-40A3-4586-9358-4784BC657471}.Release|x86.Build.0 = Release|Any CPU {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Debug|Any CPU.Build.0 = Debug|Any CPU + {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Debug|arm64.ActiveCfg = Debug|Any CPU + {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Debug|arm64.Build.0 = Debug|Any CPU {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Debug|x64.ActiveCfg = Debug|x64 {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Debug|x64.Build.0 = Debug|x64 + {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Debug|x86.ActiveCfg = Debug|Any CPU + {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Debug|x86.Build.0 = Debug|Any CPU {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Release|Any CPU.ActiveCfg = Release|Any CPU {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Release|Any CPU.Build.0 = Release|Any CPU + {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Release|arm64.ActiveCfg = Release|Any CPU + {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Release|arm64.Build.0 = Release|Any CPU {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Release|x64.ActiveCfg = Release|x64 {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Release|x64.Build.0 = Release|x64 + {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Release|x86.ActiveCfg = Release|Any CPU + {267A6951-97FD-4270-93B3-A2FAAE9D1A38}.Release|x86.Build.0 = Release|Any CPU {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Debug|arm64.ActiveCfg = Debug|Any CPU + {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Debug|arm64.Build.0 = Debug|Any CPU {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Debug|x64.ActiveCfg = Debug|x64 {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Debug|x64.Build.0 = Debug|x64 + {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Debug|x86.ActiveCfg = Debug|Any CPU + {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Debug|x86.Build.0 = Debug|Any CPU {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Release|Any CPU.ActiveCfg = Release|Any CPU {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Release|Any CPU.Build.0 = Release|Any CPU + {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Release|arm64.ActiveCfg = Release|Any CPU + {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Release|arm64.Build.0 = Release|Any CPU {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Release|x64.ActiveCfg = Release|x64 {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Release|x64.Build.0 = Release|x64 + {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Release|x86.ActiveCfg = Release|Any CPU + {4ECFAFBA-B418-4082-8584-E8EF642E31ED}.Release|x86.Build.0 = Release|Any CPU {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|arm64.ActiveCfg = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|arm64.Build.0 = Debug|Any CPU {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|x64.ActiveCfg = Debug|x64 {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|x64.Build.0 = Debug|x64 + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|x86.ActiveCfg = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|x86.Build.0 = Debug|Any CPU {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|Any CPU.ActiveCfg = Release|Any CPU {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|Any CPU.Build.0 = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|arm64.ActiveCfg = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|arm64.Build.0 = Release|Any CPU {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|x64.ActiveCfg = Release|x64 {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|x64.Build.0 = Release|x64 + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|x86.ActiveCfg = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|x86.Build.0 = Release|Any CPU {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|arm64.ActiveCfg = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|arm64.Build.0 = Debug|Any CPU {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|x64.ActiveCfg = Debug|x64 {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|x64.Build.0 = Debug|x64 + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|x86.ActiveCfg = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|x86.Build.0 = Debug|Any CPU {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|Any CPU.ActiveCfg = Release|Any CPU {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|Any CPU.Build.0 = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|arm64.ActiveCfg = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|arm64.Build.0 = Release|Any CPU {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|x64.ActiveCfg = Release|x64 {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|x64.Build.0 = Release|x64 + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|x86.ActiveCfg = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|x86.Build.0 = Release|Any CPU {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|arm64.ActiveCfg = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|arm64.Build.0 = Debug|Any CPU {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|x64.ActiveCfg = Debug|x64 {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|x64.Build.0 = Debug|x64 + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|x86.ActiveCfg = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|x86.Build.0 = Debug|Any CPU {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|Any CPU.ActiveCfg = Release|Any CPU {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|Any CPU.Build.0 = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|arm64.ActiveCfg = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|arm64.Build.0 = Release|Any CPU {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|x64.ActiveCfg = Release|x64 {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|x64.Build.0 = Release|x64 + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|x86.ActiveCfg = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|x86.Build.0 = Release|Any CPU {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Debug|Any CPU.Build.0 = Debug|Any CPU + {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Debug|arm64.ActiveCfg = Debug|Any CPU + {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Debug|arm64.Build.0 = Debug|Any CPU {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Debug|x64.ActiveCfg = Debug|x64 {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Debug|x64.Build.0 = Debug|x64 + {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Debug|x86.ActiveCfg = Debug|Any CPU + {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Debug|x86.Build.0 = Debug|Any CPU {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Release|Any CPU.ActiveCfg = Release|Any CPU {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Release|Any CPU.Build.0 = Release|Any CPU + {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Release|arm64.ActiveCfg = Release|Any CPU + {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Release|arm64.Build.0 = Release|Any CPU {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Release|x64.ActiveCfg = Release|x64 {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Release|x64.Build.0 = Release|x64 + {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Release|x86.ActiveCfg = Release|Any CPU + {66FA6F08-F50B-4CB1-B172-94E7596AE830}.Release|x86.Build.0 = Release|Any CPU {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Debug|arm64.ActiveCfg = Debug|Any CPU + {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Debug|arm64.Build.0 = Debug|Any CPU {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Debug|x64.ActiveCfg = Debug|x64 {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Debug|x64.Build.0 = Debug|x64 + {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Debug|x86.ActiveCfg = Debug|Any CPU + {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Debug|x86.Build.0 = Debug|Any CPU {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Release|Any CPU.ActiveCfg = Release|Any CPU {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Release|Any CPU.Build.0 = Release|Any CPU + {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Release|arm64.ActiveCfg = Release|Any CPU + {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Release|arm64.Build.0 = Release|Any CPU {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Release|x64.ActiveCfg = Release|x64 {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Release|x64.Build.0 = Release|x64 + {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Release|x86.ActiveCfg = Release|Any CPU + {5DEF6E0F-0B23-46E4-8419-7B08D6A45627}.Release|x86.Build.0 = Release|Any CPU {3DC9C67E-940B-4051-917C-77888E4029F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DC9C67E-940B-4051-917C-77888E4029F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DC9C67E-940B-4051-917C-77888E4029F0}.Debug|arm64.ActiveCfg = Debug|Any CPU + {3DC9C67E-940B-4051-917C-77888E4029F0}.Debug|arm64.Build.0 = Debug|Any CPU {3DC9C67E-940B-4051-917C-77888E4029F0}.Debug|x64.ActiveCfg = Debug|x64 {3DC9C67E-940B-4051-917C-77888E4029F0}.Debug|x64.Build.0 = Debug|x64 + {3DC9C67E-940B-4051-917C-77888E4029F0}.Debug|x86.ActiveCfg = Debug|Any CPU + {3DC9C67E-940B-4051-917C-77888E4029F0}.Debug|x86.Build.0 = Debug|Any CPU {3DC9C67E-940B-4051-917C-77888E4029F0}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DC9C67E-940B-4051-917C-77888E4029F0}.Release|Any CPU.Build.0 = Release|Any CPU + {3DC9C67E-940B-4051-917C-77888E4029F0}.Release|arm64.ActiveCfg = Release|Any CPU + {3DC9C67E-940B-4051-917C-77888E4029F0}.Release|arm64.Build.0 = Release|Any CPU {3DC9C67E-940B-4051-917C-77888E4029F0}.Release|x64.ActiveCfg = Release|x64 {3DC9C67E-940B-4051-917C-77888E4029F0}.Release|x64.Build.0 = Release|x64 + {3DC9C67E-940B-4051-917C-77888E4029F0}.Release|x86.ActiveCfg = Release|Any CPU + {3DC9C67E-940B-4051-917C-77888E4029F0}.Release|x86.Build.0 = Release|Any CPU {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Debug|arm64.ActiveCfg = Debug|Any CPU + {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Debug|arm64.Build.0 = Debug|Any CPU {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Debug|x64.ActiveCfg = Debug|x64 {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Debug|x64.Build.0 = Debug|x64 + {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Debug|x86.ActiveCfg = Debug|Any CPU + {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Debug|x86.Build.0 = Debug|Any CPU {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Release|Any CPU.Build.0 = Release|Any CPU + {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Release|arm64.ActiveCfg = Release|Any CPU + {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Release|arm64.Build.0 = Release|Any CPU {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Release|x64.ActiveCfg = Release|x64 {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Release|x64.Build.0 = Release|x64 + {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Release|x86.ActiveCfg = Release|Any CPU + {8C55ACD1-23F1-42E2-9EBE-38E8F6F25A65}.Release|x86.Build.0 = Release|Any CPU {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Debug|arm64.ActiveCfg = Debug|Any CPU + {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Debug|arm64.Build.0 = Debug|Any CPU {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Debug|x64.ActiveCfg = Debug|x64 {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Debug|x64.Build.0 = Debug|x64 + {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Debug|x86.Build.0 = Debug|Any CPU {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Release|Any CPU.Build.0 = Release|Any CPU + {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Release|arm64.ActiveCfg = Release|Any CPU + {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Release|arm64.Build.0 = Release|Any CPU {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Release|x64.ActiveCfg = Release|x64 {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Release|x64.Build.0 = Release|x64 + {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Release|x86.ActiveCfg = Release|Any CPU + {00F65850-77EA-4CE5-AFFD-826CA34476AE}.Release|x86.Build.0 = Release|Any CPU {770620D6-444F-4FE9-80F7-08217CCBFD59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {770620D6-444F-4FE9-80F7-08217CCBFD59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {770620D6-444F-4FE9-80F7-08217CCBFD59}.Debug|arm64.ActiveCfg = Debug|Any CPU + {770620D6-444F-4FE9-80F7-08217CCBFD59}.Debug|arm64.Build.0 = Debug|Any CPU {770620D6-444F-4FE9-80F7-08217CCBFD59}.Debug|x64.ActiveCfg = Debug|Any CPU {770620D6-444F-4FE9-80F7-08217CCBFD59}.Debug|x64.Build.0 = Debug|Any CPU + {770620D6-444F-4FE9-80F7-08217CCBFD59}.Debug|x86.ActiveCfg = Debug|Any CPU + {770620D6-444F-4FE9-80F7-08217CCBFD59}.Debug|x86.Build.0 = Debug|Any CPU {770620D6-444F-4FE9-80F7-08217CCBFD59}.Release|Any CPU.ActiveCfg = Release|Any CPU {770620D6-444F-4FE9-80F7-08217CCBFD59}.Release|Any CPU.Build.0 = Release|Any CPU + {770620D6-444F-4FE9-80F7-08217CCBFD59}.Release|arm64.ActiveCfg = Release|Any CPU + {770620D6-444F-4FE9-80F7-08217CCBFD59}.Release|arm64.Build.0 = Release|Any CPU {770620D6-444F-4FE9-80F7-08217CCBFD59}.Release|x64.ActiveCfg = Release|Any CPU {770620D6-444F-4FE9-80F7-08217CCBFD59}.Release|x64.Build.0 = Release|Any CPU + {770620D6-444F-4FE9-80F7-08217CCBFD59}.Release|x86.ActiveCfg = Release|Any CPU + {770620D6-444F-4FE9-80F7-08217CCBFD59}.Release|x86.Build.0 = Release|Any CPU {7B533719-1983-4851-B9A8-788F032BD2AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7B533719-1983-4851-B9A8-788F032BD2AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B533719-1983-4851-B9A8-788F032BD2AA}.Debug|arm64.ActiveCfg = Debug|Any CPU + {7B533719-1983-4851-B9A8-788F032BD2AA}.Debug|arm64.Build.0 = Debug|Any CPU {7B533719-1983-4851-B9A8-788F032BD2AA}.Debug|x64.ActiveCfg = Debug|Any CPU {7B533719-1983-4851-B9A8-788F032BD2AA}.Debug|x64.Build.0 = Debug|Any CPU + {7B533719-1983-4851-B9A8-788F032BD2AA}.Debug|x86.ActiveCfg = Debug|Any CPU + {7B533719-1983-4851-B9A8-788F032BD2AA}.Debug|x86.Build.0 = Debug|Any CPU {7B533719-1983-4851-B9A8-788F032BD2AA}.Release|Any CPU.ActiveCfg = Release|Any CPU {7B533719-1983-4851-B9A8-788F032BD2AA}.Release|Any CPU.Build.0 = Release|Any CPU + {7B533719-1983-4851-B9A8-788F032BD2AA}.Release|arm64.ActiveCfg = Release|Any CPU + {7B533719-1983-4851-B9A8-788F032BD2AA}.Release|arm64.Build.0 = Release|Any CPU {7B533719-1983-4851-B9A8-788F032BD2AA}.Release|x64.ActiveCfg = Release|Any CPU {7B533719-1983-4851-B9A8-788F032BD2AA}.Release|x64.Build.0 = Release|Any CPU + {7B533719-1983-4851-B9A8-788F032BD2AA}.Release|x86.ActiveCfg = Release|Any CPU + {7B533719-1983-4851-B9A8-788F032BD2AA}.Release|x86.Build.0 = Release|Any CPU {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|arm64.ActiveCfg = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|arm64.Build.0 = Debug|Any CPU {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|x64.ActiveCfg = Debug|x64 {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|x64.Build.0 = Debug|x64 + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|x86.ActiveCfg = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|x86.Build.0 = Debug|Any CPU {CD73104E-C7DE-4400-89F2-A04950649235}.Release|Any CPU.ActiveCfg = Release|Any CPU {CD73104E-C7DE-4400-89F2-A04950649235}.Release|Any CPU.Build.0 = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|arm64.ActiveCfg = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|arm64.Build.0 = Release|Any CPU {CD73104E-C7DE-4400-89F2-A04950649235}.Release|x64.ActiveCfg = Release|x64 {CD73104E-C7DE-4400-89F2-A04950649235}.Release|x64.Build.0 = Release|x64 + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|x86.ActiveCfg = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|x86.Build.0 = Release|Any CPU {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|arm64.ActiveCfg = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|arm64.Build.0 = Debug|Any CPU {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|x64.ActiveCfg = Debug|x64 {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|x64.Build.0 = Debug|x64 + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|x86.ActiveCfg = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|x86.Build.0 = Debug|Any CPU {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|Any CPU.ActiveCfg = Release|Any CPU {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|Any CPU.Build.0 = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|arm64.ActiveCfg = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|arm64.Build.0 = Release|Any CPU {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|x64.ActiveCfg = Release|x64 {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|x64.Build.0 = Release|x64 + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|x86.ActiveCfg = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|x86.Build.0 = Release|Any CPU {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Debug|arm64.ActiveCfg = Debug|Any CPU + {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Debug|arm64.Build.0 = Debug|Any CPU {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Debug|x64.ActiveCfg = Debug|Any CPU {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Debug|x64.Build.0 = Debug|Any CPU + {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Debug|x86.ActiveCfg = Debug|Any CPU + {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Debug|x86.Build.0 = Debug|Any CPU {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Release|Any CPU.ActiveCfg = Release|Any CPU {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Release|Any CPU.Build.0 = Release|Any CPU + {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Release|arm64.ActiveCfg = Release|Any CPU + {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Release|arm64.Build.0 = Release|Any CPU {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Release|x64.ActiveCfg = Release|Any CPU {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Release|x64.Build.0 = Release|Any CPU + {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Release|x86.ActiveCfg = Release|Any CPU + {2FBD7ED6-C001-4DC8-86B6-CAE7358B4A62}.Release|x86.Build.0 = Release|Any CPU {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|arm64.ActiveCfg = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|arm64.Build.0 = Debug|Any CPU {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|x64.ActiveCfg = Debug|x64 {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|x64.Build.0 = Debug|x64 + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|x86.ActiveCfg = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|x86.Build.0 = Debug|Any CPU {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|Any CPU.ActiveCfg = Release|Any CPU {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|Any CPU.Build.0 = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|arm64.ActiveCfg = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|arm64.Build.0 = Release|Any CPU {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|x64.ActiveCfg = Release|x64 {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|x64.Build.0 = Release|x64 + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|x86.ActiveCfg = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Source/GenerateSharp/SoupView.sln b/Source/GenerateSharp/SoupView.sln new file mode 100644 index 00000000..adb000d1 --- /dev/null +++ b/Source/GenerateSharp/SoupView.sln @@ -0,0 +1,171 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.31911.260 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soup.Utilities", "Utilities\Soup.Utilities.csproj", "{274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Opal", "Opal\Opal.csproj", "{D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Opal.UnitTests", "Opal.UnitTests\Opal.UnitTests.csproj", "{0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soup.Build.Runtime", "Runtime\Soup.Build.Runtime.csproj", "{32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soup.Build", "Build\Soup.Build.csproj", "{CD73104E-C7DE-4400-89F2-A04950649235}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soup.Build.Extensions", "Build.Extensions\Soup.Build.Extensions.csproj", "{C81003D5-1FA4-464C-AE8F-38F79305FEDA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soup.Build.Runtime.UnitTests", "Runtime.UnitTests\Soup.Build.Runtime.UnitTests.csproj", "{C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SoupView", "SoupView\SoupView.csproj", "{2B65A2B3-2342-4030-A194-5B1394BFCE6D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|arm64 = Debug|arm64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|arm64 = Release|arm64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|arm64.ActiveCfg = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|arm64.Build.0 = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|x64.ActiveCfg = Debug|x64 + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|x64.Build.0 = Debug|x64 + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|x86.ActiveCfg = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Debug|x86.Build.0 = Debug|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|Any CPU.Build.0 = Release|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|arm64.ActiveCfg = Release|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|arm64.Build.0 = Release|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|x64.ActiveCfg = Release|x64 + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|x64.Build.0 = Release|x64 + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|x86.ActiveCfg = Release|Any CPU + {274AD7F0-D11F-4B6B-8BFC-51DEBFE40DF8}.Release|x86.Build.0 = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|arm64.ActiveCfg = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|arm64.Build.0 = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|x64.ActiveCfg = Debug|x64 + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|x64.Build.0 = Debug|x64 + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|x86.ActiveCfg = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Debug|x86.Build.0 = Debug|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|Any CPU.Build.0 = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|arm64.ActiveCfg = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|arm64.Build.0 = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|x64.ActiveCfg = Release|x64 + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|x64.Build.0 = Release|x64 + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|x86.ActiveCfg = Release|Any CPU + {D01AC47E-1A6A-4EDE-97F5-2D05D1BC7120}.Release|x86.Build.0 = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|arm64.ActiveCfg = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|arm64.Build.0 = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|x64.ActiveCfg = Debug|x64 + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|x64.Build.0 = Debug|x64 + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|x86.ActiveCfg = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Debug|x86.Build.0 = Debug|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|Any CPU.Build.0 = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|arm64.ActiveCfg = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|arm64.Build.0 = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|x64.ActiveCfg = Release|x64 + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|x64.Build.0 = Release|x64 + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|x86.ActiveCfg = Release|Any CPU + {0DD0DB83-90BE-4FDC-B470-6A25C11C1DE9}.Release|x86.Build.0 = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|arm64.ActiveCfg = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|arm64.Build.0 = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|x64.ActiveCfg = Debug|x64 + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|x64.Build.0 = Debug|x64 + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|x86.ActiveCfg = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Debug|x86.Build.0 = Debug|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|Any CPU.Build.0 = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|arm64.ActiveCfg = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|arm64.Build.0 = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|x64.ActiveCfg = Release|x64 + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|x64.Build.0 = Release|x64 + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|x86.ActiveCfg = Release|Any CPU + {32DB1BF4-77A3-4A49-8AC2-DE250D2CFCCE}.Release|x86.Build.0 = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|arm64.ActiveCfg = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|arm64.Build.0 = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|x64.ActiveCfg = Debug|x64 + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|x64.Build.0 = Debug|x64 + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|x86.ActiveCfg = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Debug|x86.Build.0 = Debug|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|Any CPU.Build.0 = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|arm64.ActiveCfg = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|arm64.Build.0 = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|x64.ActiveCfg = Release|x64 + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|x64.Build.0 = Release|x64 + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|x86.ActiveCfg = Release|Any CPU + {CD73104E-C7DE-4400-89F2-A04950649235}.Release|x86.Build.0 = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|arm64.ActiveCfg = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|arm64.Build.0 = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|x64.ActiveCfg = Debug|x64 + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|x64.Build.0 = Debug|x64 + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|x86.ActiveCfg = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Debug|x86.Build.0 = Debug|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|Any CPU.Build.0 = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|arm64.ActiveCfg = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|arm64.Build.0 = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|x64.ActiveCfg = Release|x64 + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|x64.Build.0 = Release|x64 + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|x86.ActiveCfg = Release|Any CPU + {C81003D5-1FA4-464C-AE8F-38F79305FEDA}.Release|x86.Build.0 = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|arm64.ActiveCfg = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|arm64.Build.0 = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|x64.ActiveCfg = Debug|x64 + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|x64.Build.0 = Debug|x64 + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|x86.ActiveCfg = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Debug|x86.Build.0 = Debug|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|Any CPU.Build.0 = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|arm64.ActiveCfg = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|arm64.Build.0 = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|x64.ActiveCfg = Release|x64 + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|x64.Build.0 = Release|x64 + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|x86.ActiveCfg = Release|Any CPU + {C2D73DDF-AEA8-43CF-B634-BC7F1D4E2F16}.Release|x86.Build.0 = Release|Any CPU + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|Any CPU.ActiveCfg = Debug|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|Any CPU.Build.0 = Debug|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|Any CPU.Deploy.0 = Debug|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|arm64.ActiveCfg = Debug|arm64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|arm64.Build.0 = Debug|arm64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|x64.ActiveCfg = Debug|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|x64.Build.0 = Debug|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|x86.ActiveCfg = Debug|x86 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Debug|x86.Build.0 = Debug|x86 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|Any CPU.ActiveCfg = Release|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|Any CPU.Build.0 = Release|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|Any CPU.Deploy.0 = Release|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|arm64.ActiveCfg = Release|arm64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|arm64.Build.0 = Release|arm64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|x64.ActiveCfg = Release|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|x64.Build.0 = Release|x64 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|x86.ActiveCfg = Release|x86 + {2B65A2B3-2342-4030-A194-5B1394BFCE6D}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6974AB2C-3FEE-4C5B-8775-A4C9DFB8D635} + EndGlobalSection +EndGlobal diff --git a/Source/GenerateSharp/SoupView/App.xaml b/Source/GenerateSharp/SoupView/App.xaml new file mode 100644 index 00000000..0f46d0bb --- /dev/null +++ b/Source/GenerateSharp/SoupView/App.xaml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/Source/GenerateSharp/SoupView/App.xaml.cs b/Source/GenerateSharp/SoupView/App.xaml.cs new file mode 100644 index 00000000..211d7f56 --- /dev/null +++ b/Source/GenerateSharp/SoupView/App.xaml.cs @@ -0,0 +1,49 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Microsoft.UI.Xaml; +using Opal; +using Opal.System; +using SoupView.View; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. +namespace SoupView +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + public partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + // Register the runtime services + Log.RegisterListener(new ConsoleTraceListener()); + LifetimeManager.RegisterSingleton(); + + this.InitializeComponent(); + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(LaunchActivatedEventArgs args) + { + m_window = new MainWindow(); + + //m_window.ExtendsContentIntoTitleBar = true; + // m_window.SetTitleBar(new TextBlock()); + + m_window.Activate(); + } + + private Window m_window; + } +} diff --git a/Source/GenerateSharp/SoupView/Assets/LockScreenLogo.scale-200.png b/Source/GenerateSharp/SoupView/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 00000000..c755b25a Binary files /dev/null and b/Source/GenerateSharp/SoupView/Assets/LockScreenLogo.scale-200.png differ diff --git a/Source/GenerateSharp/SoupView/Assets/Soup.ico b/Source/GenerateSharp/SoupView/Assets/Soup.ico new file mode 100644 index 00000000..0a536e0a Binary files /dev/null and b/Source/GenerateSharp/SoupView/Assets/Soup.ico differ diff --git a/Source/GenerateSharp/SoupView/Assets/SplashScreen.scale-200.png b/Source/GenerateSharp/SoupView/Assets/SplashScreen.scale-200.png new file mode 100644 index 00000000..7f40b29f Binary files /dev/null and b/Source/GenerateSharp/SoupView/Assets/SplashScreen.scale-200.png differ diff --git a/Source/GenerateSharp/SoupView/Assets/Square150x150Logo.scale-200.png b/Source/GenerateSharp/SoupView/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 00000000..85eb4d18 Binary files /dev/null and b/Source/GenerateSharp/SoupView/Assets/Square150x150Logo.scale-200.png differ diff --git a/Source/GenerateSharp/SoupView/Assets/Square44x44Logo.scale-200.png b/Source/GenerateSharp/SoupView/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 00000000..ac30edea Binary files /dev/null and b/Source/GenerateSharp/SoupView/Assets/Square44x44Logo.scale-200.png differ diff --git a/Source/GenerateSharp/SoupView/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/Source/GenerateSharp/SoupView/Assets/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 00000000..3d36669e Binary files /dev/null and b/Source/GenerateSharp/SoupView/Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/Source/GenerateSharp/SoupView/Assets/StoreLogo.png b/Source/GenerateSharp/SoupView/Assets/StoreLogo.png new file mode 100644 index 00000000..a01f46fa Binary files /dev/null and b/Source/GenerateSharp/SoupView/Assets/StoreLogo.png differ diff --git a/Source/GenerateSharp/SoupView/Assets/Wide310x150Logo.scale-200.png b/Source/GenerateSharp/SoupView/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 00000000..ec71c7ba Binary files /dev/null and b/Source/GenerateSharp/SoupView/Assets/Wide310x150Logo.scale-200.png differ diff --git a/Source/GenerateSharp/SoupView/Package.appxmanifest b/Source/GenerateSharp/SoupView/Package.appxmanifest new file mode 100644 index 00000000..f4ca696f --- /dev/null +++ b/Source/GenerateSharp/SoupView/Package.appxmanifest @@ -0,0 +1,48 @@ + + + + + + + + Soup View + Soup Build + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/GenerateSharp/SoupView/Properties/launchSettings.json b/Source/GenerateSharp/SoupView/Properties/launchSettings.json new file mode 100644 index 00000000..f80f2546 --- /dev/null +++ b/Source/GenerateSharp/SoupView/Properties/launchSettings.json @@ -0,0 +1,15 @@ +{ + "profiles": { + "SoupView (Package)": { + "commandName": "MsixPackage" + }, + "SoupView (Unpackaged)": { + "commandName": "Project" + }, + "WSL": { + "commandName": "WSL2", + "environmentVariables": {}, + "distributionName": "" + } + } +} \ No newline at end of file diff --git a/Source/GenerateSharp/SoupView/SoupView.csproj b/Source/GenerateSharp/SoupView/SoupView.csproj new file mode 100644 index 00000000..c71648a0 --- /dev/null +++ b/Source/GenerateSharp/SoupView/SoupView.csproj @@ -0,0 +1,57 @@ + + + WinExe + net6.0-windows10.0.19041.0 + 10.0.17763.0 + SoupView + app.manifest + x86;x64;arm64 + win10-x86;win10-x64;win10-arm64 + win10-$(Platform).pubxml + true + true + + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + + + + MSBuild:Compile + + + $(DefaultXamlRuntime) + + + diff --git a/Source/GenerateSharp/SoupView/Themes/Generic.xaml b/Source/GenerateSharp/SoupView/Themes/Generic.xaml new file mode 100644 index 00000000..f71ccb70 --- /dev/null +++ b/Source/GenerateSharp/SoupView/Themes/Generic.xaml @@ -0,0 +1,111 @@ + + + + + + diff --git a/Source/GenerateSharp/SoupView/View/DependencyGraphPage.xaml b/Source/GenerateSharp/SoupView/View/DependencyGraphPage.xaml new file mode 100644 index 00000000..5798e33e --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/DependencyGraphPage.xaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/GenerateSharp/SoupView/View/DependencyGraphPage.xaml.cs b/Source/GenerateSharp/SoupView/View/DependencyGraphPage.xaml.cs new file mode 100644 index 00000000..21333bf4 --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/DependencyGraphPage.xaml.cs @@ -0,0 +1,26 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; +using SoupView.ViewModel; + +namespace SoupView.View +{ + /// + /// The dependency graph page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class DependencyGraphPage : Page + { + public DependencyGraphPage() + { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + DataContext = (DependencyGraphPageModel)e.Parameter; + } + } +} diff --git a/Source/GenerateSharp/SoupView/View/GraphViewer.cs b/Source/GenerateSharp/SoupView/View/GraphViewer.cs new file mode 100644 index 00000000..72918b61 --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/GraphViewer.cs @@ -0,0 +1,223 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using System; +using System.Collections.Generic; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Shapes; +using SoupView.ViewModel; +using Windows.Foundation; +using Windows.UI; + +namespace SoupView.View +{ + public sealed class GraphViewer : Control + { + private static int NodeWidth = 200; + private static int NodeHeight = 50; + + private static int NodeSpacingHorizontal = 80; + private static int NodeSpacingVertical = 50; + + private static int InternalPadding = 20; + + /// + /// Identifies the dependency property. + /// + public static readonly DependencyProperty GraphProperty = DependencyProperty.Register( + nameof(Graph), + typeof(IList>), + typeof(GraphViewer), + new PropertyMetadata(null, new PropertyChangedCallback(OnPropertyChanged))); + + /// + /// Identifies the dependency property. + /// + public static readonly DependencyProperty SelectedNodeProperty = DependencyProperty.Register( + nameof(SelectedNode), + typeof(GraphNode), + typeof(GraphViewer), + new PropertyMetadata(null)); + + public GraphViewer() + { + this.DefaultStyleKey = typeof(GraphViewer); + this.SizeChanged += GraphViewer_SizeChanged; + } + + /// + /// Gets or sets the Graph + /// + public IList> Graph + { + get { return (IList>)GetValue(GraphProperty); } + set { SetValue(GraphProperty, value); } + } + + /// + /// Gets or sets the Selected Node + /// + public GraphNode SelectedNode + { + get { return (GraphNode)GetValue(SelectedNodeProperty); } + set { SetValue(SelectedNodeProperty, value); } + } + + private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + ((GraphViewer)d).LayoutGraph(); + } + + private void GraphViewer_SizeChanged(object sender, SizeChangedEventArgs e) + { + this.LayoutGraph(); + } + + protected override void OnApplyTemplate() + { + this.LayoutGraph(); + base.OnApplyTemplate(); + } + + private void LayoutGraph() + { + var canvas = this.GetTemplateChild("RootCanvas") as Canvas; + if (canvas is null) + return; + + canvas.Children.Clear(); + + if (this.Graph is null) + return; + + int maxHeight = 0; + int currentOffsetX = 0; + int currentOffsetY; + var nodeState = new Dictionary(); + foreach (var column in this.Graph) + { + // Reset vertical offset for each column + currentOffsetY = 0; + + // Update X offset for the current column location + if (currentOffsetX == 0) + currentOffsetX += InternalPadding; + else + currentOffsetX += NodeSpacingHorizontal; + + foreach (var value in column) + { + // Update Y for the current row location + if (currentOffsetY == 0) + currentOffsetY += InternalPadding; + else + currentOffsetY += NodeSpacingVertical; + + if (value is not null) + { + var node = new GraphViewerItem() + { + Title = value.Title, + Width = NodeWidth, + Height = NodeHeight, + }; + node.DataContext = value; + node.Click += Node_Click; + + Canvas.SetLeft(node, currentOffsetX); + Canvas.SetTop(node, currentOffsetY); + + canvas.Children.Add(node); + + // Save the node state + var inConnect = new Point(currentOffsetX, currentOffsetY + (NodeHeight / 2)); + var outConnect = new Point(currentOffsetX + NodeWidth, currentOffsetY + (NodeHeight / 2)); + nodeState.Add(value.Id, (node, inConnect, outConnect)); + } + + // Update for the next row location + currentOffsetY += NodeHeight; + } + + // Update for the next column location + currentOffsetX += NodeWidth; + + // Check the max height + maxHeight = Math.Max(maxHeight, currentOffsetY); + } + + // Connect all the known nodes + foreach (var column in Graph) + { + foreach (var value in column) + { + if (value is not null) + { + var startNode = nodeState[value.Id]; + foreach (var child in value.ChildNodes) + { + var endNode = nodeState[child]; + var path = ConnectNodes(startNode.OutConnect, endNode.InConnect); + canvas.Children.Add(path); + } + } + } + } + + // Add the final internal padding to get the total size + canvas.Width = currentOffsetX + InternalPadding; + canvas.Height = maxHeight + InternalPadding; + } + + private void Node_Click(object sender, RoutedEventArgs e) + { + var node = (GraphViewerItem)sender; + this.SelectedNode = (GraphNode)node.DataContext; + } + + private Path ConnectNodes(Point start, Point end) + { + var control1 = new Point( + start.X + (NodeSpacingHorizontal / 2), + start.Y); + var control2 = new Point( + end.X - (NodeSpacingHorizontal / 2), + end.Y); + + return CreateBezier(start, control1, control2, end); + } + + private Path CreateBezier(Point start, Point control1, Point control2, Point end) + { + var path = new Path() + { + Stroke = new SolidColorBrush((Color)Resources["SystemBaseLowColor"]), + StrokeThickness = 1, + Data = new PathGeometry() + { + Figures = new PathFigureCollection() + { + new PathFigure() + { + StartPoint = start, + Segments = new PathSegmentCollection() + { + new BezierSegment() + { + Point1 = control1, + Point2 = control2, + Point3 = end, + } + }, + }, + }, + }, + }; + + return path; + } + } +} diff --git a/Source/GenerateSharp/SoupView/View/GraphViewerItem.cs b/Source/GenerateSharp/SoupView/View/GraphViewerItem.cs new file mode 100644 index 00000000..4fc88788 --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/GraphViewerItem.cs @@ -0,0 +1,35 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace SoupView.View +{ + public sealed class GraphViewerItem : Button + { + /// + /// Identifies the dependency property. + /// + public static readonly DependencyProperty TitleProperty = DependencyProperty.Register( + nameof(Title), + typeof(string), + typeof(GraphViewerItem), + new PropertyMetadata(string.Empty)); + + public GraphViewerItem() + { + this.DefaultStyleKey = typeof(GraphViewerItem); + } + + /// + /// Gets or sets the title + /// + public string Title + { + get { return (string)GetValue(TitleProperty); } + set { SetValue(TitleProperty, value); } + } + } +} diff --git a/Source/GenerateSharp/SoupView/View/MainWindow.xaml b/Source/GenerateSharp/SoupView/View/MainWindow.xaml new file mode 100644 index 00000000..cd53e64a --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/MainWindow.xaml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/GenerateSharp/SoupView/View/MainWindow.xaml.cs b/Source/GenerateSharp/SoupView/View/MainWindow.xaml.cs new file mode 100644 index 00000000..d99ede13 --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/MainWindow.xaml.cs @@ -0,0 +1,105 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using System; +using System.Threading.Tasks; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Opal; +using SoupView.ViewModel; +using Windows.Storage.Pickers; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. +namespace SoupView.View +{ + /// + /// An main window that can be used on its own or navigated to within a Frame. + /// + public sealed partial class MainWindow : Window + { + private MainWindowModel ViewModel => (MainWindowModel)this.Root.DataContext; + + public MainWindow() + { + this.InitializeComponent(); + + this.ExtendsContentIntoTitleBar = true; + this.SetTitleBar(AppTitleBar); + + this.Title = "Soup View"; + LoadIcon("Assets/Soup.ico"); + + Navigation.SelectedItem = DependencyGraphNavigationItem; + } + + private void LoadIcon(string iconName) + { + // Get the Window's HWND + var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this); + var iconHandle = PInvoke.User32.LoadImage( + IntPtr.Zero, + iconName, + PInvoke.User32.ImageType.IMAGE_ICON, + 32, + 32, + PInvoke.User32.LoadImageFlags.LR_LOADFROMFILE); + + PInvoke.User32.SendMessage(hwnd, PInvoke.User32.WindowMessage.WM_SETICON, (IntPtr)0, iconHandle); + } + + private async void NavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args) + { + if (args.IsSettingsSelected) + { + ContentFrame.Navigate(typeof(SettingsPage)); + } + else + { + var selectedItem = (NavigationViewItem)args.SelectedItem; + if (selectedItem == DependencyGraphNavigationItem) + { + ContentFrame.Navigate(typeof(DependencyGraphPage), ViewModel.DependencyGraph); + } + else if (selectedItem == TaskGraphNavigationItem) + { + ContentFrame.Navigate(typeof(TaskGraphPage), ViewModel.TaskGraph); + } + else if (selectedItem == OperationGraphNavigationItem) + { + ContentFrame.Navigate(typeof(OperationGraphPage), ViewModel.OperationGraph); + } + else if (selectedItem == OpenFileNavigationItem) + { + await LoadFileAsync(); + this.Navigation.SelectedItem = DependencyGraphNavigationItem; + } + else + { + throw new InvalidOperationException("Unknown selection."); + } + } + } + + private async Task LoadFileAsync() + { + var filePicker = new FileOpenPicker(); + + // Get the current window's HWND by passing in the Window object + var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this); + + // Associate the HWND with the file picker + WinRT.Interop.InitializeWithWindow.Initialize(filePicker, hwnd); + + // Use file picker like normal! + filePicker.FileTypeFilter.Add(".toml"); + var file = await filePicker.PickSingleFileAsync(); + + if (file != null) + { + ViewModel.RecipeFile = new Path(file.Path); + } + } + } +} diff --git a/Source/GenerateSharp/SoupView/View/OperationGraphPage.xaml b/Source/GenerateSharp/SoupView/View/OperationGraphPage.xaml new file mode 100644 index 00000000..cdddcb03 --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/OperationGraphPage.xaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/GenerateSharp/SoupView/View/OperationGraphPage.xaml.cs b/Source/GenerateSharp/SoupView/View/OperationGraphPage.xaml.cs new file mode 100644 index 00000000..667e6a4f --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/OperationGraphPage.xaml.cs @@ -0,0 +1,26 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; +using SoupView.ViewModel; + +namespace SoupView.View +{ + /// + /// The operation graph page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class OperationGraphPage : Page + { + public OperationGraphPage() + { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + DataContext = (OperationGraphPageModel)e.Parameter; + } + } +} diff --git a/Source/GenerateSharp/SoupView/View/SettingsPage.xaml b/Source/GenerateSharp/SoupView/View/SettingsPage.xaml new file mode 100644 index 00000000..9d5590a8 --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/SettingsPage.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/Source/GenerateSharp/SoupView/View/SettingsPage.xaml.cs b/Source/GenerateSharp/SoupView/View/SettingsPage.xaml.cs new file mode 100644 index 00000000..3f4d18b3 --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/SettingsPage.xaml.cs @@ -0,0 +1,19 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Microsoft.UI.Xaml.Controls; + +namespace SoupView.View +{ + /// + /// The settings page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class SettingsPage : Page + { + public SettingsPage() + { + this.InitializeComponent(); + } + } +} diff --git a/Source/GenerateSharp/SoupView/View/TaskGraphPage.xaml b/Source/GenerateSharp/SoupView/View/TaskGraphPage.xaml new file mode 100644 index 00000000..aabfacaa --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/TaskGraphPage.xaml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/GenerateSharp/SoupView/View/TaskGraphPage.xaml.cs b/Source/GenerateSharp/SoupView/View/TaskGraphPage.xaml.cs new file mode 100644 index 00000000..8fc092c0 --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/TaskGraphPage.xaml.cs @@ -0,0 +1,28 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; +using SoupView.ViewModel; + +namespace SoupView.View +{ + /// + /// The task graph page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class TaskGraphPage : Page + { + public TaskGraphPage() + { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + DataContext = (TaskGraphPageModel)e.Parameter; + } + + private TaskGraphPageModel ViewModel => (TaskGraphPageModel)DataContext; + } +} diff --git a/Source/GenerateSharp/SoupView/View/ValueTableItemTemplateSelector.cs b/Source/GenerateSharp/SoupView/View/ValueTableItemTemplateSelector.cs new file mode 100644 index 00000000..171404ce --- /dev/null +++ b/Source/GenerateSharp/SoupView/View/ValueTableItemTemplateSelector.cs @@ -0,0 +1,34 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using System; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using SoupView.ViewModel; + +namespace SoupView.View +{ + internal class ValueTableItemTemplateSelector : DataTemplateSelector + { + public DataTemplate TableTemplate { get; set; } + public DataTemplate ListTemplate { get; set; } + public DataTemplate ValueTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item) + { + var explorerItem = (ValueTableItemViewModel)item; + switch (explorerItem.Type) + { + case ValueTableItemType.Table: + return TableTemplate; + case ValueTableItemType.List: + return ListTemplate; + case ValueTableItemType.Value: + return ValueTemplate; + default: + throw new InvalidOperationException("Unknown ValueTableItemType"); + } + } + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/DependencyGraphPageModel.cs b/Source/GenerateSharp/SoupView/ViewModel/DependencyGraphPageModel.cs new file mode 100644 index 00000000..e16aae1e --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/DependencyGraphPageModel.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Microsoft.Toolkit.Mvvm.Input; +using Opal; +using Opal.System; +using Soup.Build; +using Soup.Build.Utilities; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Input; + +namespace SoupView.ViewModel +{ + internal class DependencyGraphPageModel : Observable + { + private GraphNode selectedNode = null; + private ProjectDetailsViewModel selectedProject = null; + private string errorBarMessage = string.Empty; + private bool isErrorBarOpen = false; + private IList> graph = null; + private uint uniqueId = 0; + private Dictionary projectDetailsLookup = new Dictionary(); + + public string ErrorBarMessage + { + get { return errorBarMessage; } + set + { + if (value != errorBarMessage) + { + errorBarMessage = value; + NotifyPropertyChanged(); + } + } + } + + public IList> Graph + { + get { return graph; } + set + { + if (value != graph) + { + graph = value; + NotifyPropertyChanged(); + } + } + } + + public GraphNode SelectedNode + { + get { return selectedNode; } + set + { + if (value != selectedNode) + { + selectedNode = value; + NotifyPropertyChanged(); + SelectedProject = this.projectDetailsLookup[selectedNode.Id]; + } + } + } + + public bool IsErrorBarOpen + { + get { return isErrorBarOpen; } + set + { + if (value != isErrorBarOpen) + { + isErrorBarOpen = value; + NotifyPropertyChanged(); + } + } + } + + public ProjectDetailsViewModel SelectedProject + { + get { return selectedProject; } + set + { + if (value != selectedProject) + { + selectedProject = value; + NotifyPropertyChanged(); + } + } + } + + public async Task LoadProjectAsync(Path recipeFilePath) + { + this.uniqueId = 1; + this.projectDetailsLookup.Clear(); + var activeGraph = new List>(); + var recipeFiles = new List<(Path Path, uint Id)>() + { + (recipeFilePath, this.uniqueId++), + }; + await BuildGraphAsync(recipeFiles, activeGraph); + Graph = activeGraph; + } + + private void NotifyError(string message) + { + ErrorBarMessage = message; + IsErrorBarOpen = true; + } + + private async Task BuildGraphAsync(IList<(Path Path, uint Id)> recipeFiles, IList> activeGraph) + { + var column = new List(); + var childRecipeFiles = new List<(Path Path, uint Id)>(); + foreach (var recipeFile in recipeFiles) + { + var loadResult = await RecipeExtensions.TryLoadRecipeFromFileAsync(recipeFile.Path); + if (!loadResult.IsSuccess) + { + NotifyError($"Failed to load Recipe file: {recipeFile.Path}"); + } + + var packageFolder = recipeFile.Path.GetParent(); + var recipe = loadResult.Result; + + var currentChildRecipes = new List<(Path Path, uint Id)>(); + if (recipe.HasBuildDependencies) + AddRecipeFiles(recipe.BuildDependencies, recipe.Language, packageFolder, currentChildRecipes); + if (recipe.HasTestDependencies) + AddRecipeFiles(recipe.TestDependencies, recipe.Language, packageFolder, currentChildRecipes); + if (recipe.HasRuntimeDependencies) + AddRecipeFiles(recipe.RuntimeDependencies, recipe.Language, packageFolder, currentChildRecipes); + + column.Add(new GraphNode(recipe.Name, recipeFile.Id) + { + ChildNodes = currentChildRecipes.Select(value => value.Id).ToList(), + }); + + this.projectDetailsLookup.Add( + recipeFile.Id, + new ProjectDetailsViewModel( + recipe, + packageFolder)); + + childRecipeFiles.AddRange(currentChildRecipes); + } + + activeGraph.Add(column); + + if (childRecipeFiles.Count > 0) + { + await BuildGraphAsync(childRecipeFiles, activeGraph); + } + } + + private void AddRecipeFiles( + IEnumerable packageReferences, + string recipeLanguage, + Path packageFolder, + IList<(Path Path, uint Id)> recipeFiles) + { + foreach (var packageReference in packageReferences) + { + if (packageReference.IsLocal) + { + var recipeFile = packageReference.Path + BuildConstants.RecipeFileName; + if (!recipeFile.HasRoot) + { + recipeFile = packageFolder + recipeFile; + } + + recipeFiles.Add((recipeFile, this.uniqueId++)); + } + else + { + var packagesDirectory = LifetimeManager.Get().GetUserProfileDirectory() + + new Path(".soup/packages/"); + var languageRootFolder = packagesDirectory + new Path(recipeLanguage); + var packageRootFolder = languageRootFolder + new Path(packageReference.GetName); + var packageVersionFolder = packageRootFolder + new Path(packageReference.Version.ToString()) + new Path("/"); + var recipeFile = packageVersionFolder + BuildConstants.RecipeFileName; + + recipeFiles.Add((recipeFile, this.uniqueId++)); + } + } + } + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/GraphNode.cs b/Source/GenerateSharp/SoupView/ViewModel/GraphNode.cs new file mode 100644 index 00000000..456f6785 --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/GraphNode.cs @@ -0,0 +1,21 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using System.Collections.Generic; + +namespace SoupView.ViewModel +{ + public class GraphNode + { + public GraphNode(string title, uint id) + { + this.Title = title; + this.Id = id; + } + + public string Title { get; set; } = string.Empty; + public uint Id { get; set; } = 0; + public IList ChildNodes { get; set;} = new List(); + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/MainWindowModel.cs b/Source/GenerateSharp/SoupView/ViewModel/MainWindowModel.cs new file mode 100644 index 00000000..cdf6fd17 --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/MainWindowModel.cs @@ -0,0 +1,51 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Opal; + +namespace SoupView.ViewModel +{ + internal class MainWindowModel : Observable + { + private Path recipeFile = new Path(); + + public Path RecipeFile + { + get { return recipeFile; } + set + { + if (value != recipeFile) + { + recipeFile = value; + NotifyPropertyChanged(); + NotifyPropertyChanged("Title"); + _ = DependencyGraph.LoadProjectAsync(recipeFile); + _ = TaskGraph.LoadProjectAsync(recipeFile); + _ = OperationGraph.LoadProjectAsync(recipeFile); + } + } + } + + public string Title + { + get + { + if (RecipeFile == null || RecipeFile.IsEmpty) + { + return string.Empty; + } + else + { + + + return RecipeFile.ToString(); + } + } + } + + public DependencyGraphPageModel DependencyGraph { get; private set; } = new DependencyGraphPageModel(); + public TaskGraphPageModel TaskGraph { get; private set; } = new TaskGraphPageModel(); + public OperationGraphPageModel OperationGraph { get; private set; } = new OperationGraphPageModel(); + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/Observable.cs b/Source/GenerateSharp/SoupView/ViewModel/Observable.cs new file mode 100644 index 00000000..8c3f3643 --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/Observable.cs @@ -0,0 +1,22 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace SoupView.ViewModel +{ + internal class Observable : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null) + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/OperationDetailsViewModel.cs b/Source/GenerateSharp/SoupView/ViewModel/OperationDetailsViewModel.cs new file mode 100644 index 00000000..81e237d7 --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/OperationDetailsViewModel.cs @@ -0,0 +1,28 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Soup.Build.Runtime; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace SoupView.ViewModel +{ + internal class OperationDetailsViewModel : Observable + { + private ObservableCollection properties = new ObservableCollection(); + + public OperationDetailsViewModel(OperationInfo operation) + { + properties.Clear(); + properties.Add(new PropertyValue("Title", operation.Title)); + properties.Add(new PropertyValue("Id", operation.Id.ToString())); + properties.Add(new PropertyValue("DependencyCount", operation.DependencyCount.ToString())); + properties.Add(new PropertyValue("Executable", operation.Command.Executable.ToString())); + properties.Add(new PropertyValue("WorkingDirectory", operation.Command.WorkingDirectory.ToString())); + properties.Add(new PropertyValue("Arguments", operation.Command.Arguments)); + } + + public IList Properties => properties; + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/OperationGraphPageModel.cs b/Source/GenerateSharp/SoupView/ViewModel/OperationGraphPageModel.cs new file mode 100644 index 00000000..ca6f2105 --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/OperationGraphPageModel.cs @@ -0,0 +1,207 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Opal; +using Soup.Build.Runtime; +using Soup.Build.Utilities; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; + +namespace SoupView.ViewModel +{ + internal class OperationGraphPageModel : Observable + { + private GraphNode selectedNode = null; + private OperationDetailsViewModel selectedOperation = null; + private string errorBarMessage = string.Empty; + private bool isErrorBarOpen = false; + private IList> graph = null; + private Dictionary operationDetailsLookup = new Dictionary(); + + public string ErrorBarMessage + { + get { return errorBarMessage; } + set + { + if (value != errorBarMessage) + { + errorBarMessage = value; + NotifyPropertyChanged(); + } + } + } + + public IList> Graph + { + get { return graph; } + set + { + if (value != graph) + { + graph = value; + NotifyPropertyChanged(); + } + } + } + + public GraphNode SelectedNode + { + get { return selectedNode; } + set + { + if (value != selectedNode) + { + selectedNode = value; + NotifyPropertyChanged(); + SelectedOperation = this.operationDetailsLookup[selectedNode.Id]; + } + } + } + + public OperationDetailsViewModel SelectedOperation + { + get { return selectedOperation; } + set + { + if (value != selectedOperation) + { + selectedOperation = value; + NotifyPropertyChanged(); + } + } + } + + public bool IsErrorBarOpen + { + get { return isErrorBarOpen; } + set + { + if (value != isErrorBarOpen) + { + isErrorBarOpen = value; + NotifyPropertyChanged(); + } + } + } + + public async Task LoadProjectAsync(Path recipeFilePath) + { + var loadResult = await RecipeExtensions.TryLoadRecipeFromFileAsync(recipeFilePath); + if (loadResult.IsSuccess) + { + var packageDirectory = recipeFilePath.GetParent(); + var targetPath = await GetTargetPathAsync(packageDirectory); + + var soupTargetDirectory = targetPath + new Path(".soup/"); + + var evaluateGraphFile = soupTargetDirectory + BuildConstants.GenerateEvaluateOperationGraphFileName; + var fileSystemState = new FileSystemState(); + if (!OperationGraphManager.TryLoadState(evaluateGraphFile, fileSystemState, out var evaluateGraph)) + { + NotifyError($"Failed to load Operation Graph: {evaluateGraphFile}"); + return; + } + + Graph = BuildGraph(evaluateGraph); + } + else + { + NotifyError($"Failed to load Recipe file: {recipeFilePath}"); + } + } + + private void NotifyError(string message) + { + ErrorBarMessage = message; + IsErrorBarOpen = true; + } + + private IList> BuildGraph(OperationGraph evaluateGraph) + { + this.operationDetailsLookup.Clear(); + var activeIds = evaluateGraph.GetRootOperationIds(); + var activeGraph = new List>(); + var knownIds = new HashSet(); + BuildGraphColumn(evaluateGraph, activeGraph, activeIds, knownIds); + + return activeGraph; + } + + private void BuildGraphColumn( + OperationGraph evaluateGraph, + IList> activeGraph, + IList activeIds, + HashSet knownIds) + { + // Build up the total set of nodes in the next level + var nextIds = new List(); + foreach (var operationId in activeIds) + { + var operation = evaluateGraph.GetOperationInfo(operationId); + foreach (var childId in operation.Children) + { + nextIds.Add(childId); + } + } + + // Find the depest level first + if (nextIds.Count > 0) + { + BuildGraphColumn(evaluateGraph, activeGraph, nextIds, knownIds); + } + + // Build up all the nodes at this level that have not already been added + var column = new List(); + foreach (var operationId in activeIds) + { + if (!knownIds.Contains(operationId)) + { + var operation = evaluateGraph.GetOperationInfo(operationId); + + var node = new GraphNode(operation.Title, operationId.value) + { + ChildNodes = operation.Children.Select(value => value.value).ToList(), + }; + + knownIds.Add(operationId); + column.Add(node); + + this.operationDetailsLookup.Add(operationId.value, new OperationDetailsViewModel(operation)); + } + } + + // Add the new column at the start + activeGraph.Insert(0, column); + } + + private async Task GetTargetPathAsync(Path packageDirectory) + { + var processInfo = new ProcessStartInfo("soup.exe", $"target {packageDirectory}") + { + RedirectStandardOutput = true, + CreateNoWindow = true, + }; + var process = new Process() + { + StartInfo = processInfo, + }; + + process.Start(); + + await process.WaitForExitAsync(); + + if (process.ExitCode != 0) + { + NotifyError($"Soup process exited with error: {process.ExitCode}"); + throw new InvalidOperationException(); + } + + var output = await process.StandardOutput.ReadToEndAsync(); + return new Path(output); + } + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/ProjectDetailsViewModel.cs b/Source/GenerateSharp/SoupView/ViewModel/ProjectDetailsViewModel.cs new file mode 100644 index 00000000..a4c72399 --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/ProjectDetailsViewModel.cs @@ -0,0 +1,27 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Opal; +using Soup.Build.Utilities; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace SoupView.ViewModel +{ + internal class ProjectDetailsViewModel : Observable + { + private ObservableCollection properties = new ObservableCollection(); + + public ProjectDetailsViewModel(Recipe recipe, Path path) + { + properties.Clear(); + properties.Add(new PropertyValue("Name", recipe.Name)); + properties.Add(new PropertyValue("Version", recipe.Version.ToString())); + properties.Add(new PropertyValue("Language", recipe.Language)); + properties.Add(new PropertyValue("Path", path.ToString())); + } + + public IList Properties => properties; + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/PropertyValue.cs b/Source/GenerateSharp/SoupView/ViewModel/PropertyValue.cs new file mode 100644 index 00000000..3943f2a7 --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/PropertyValue.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +namespace SoupView.ViewModel +{ + public class PropertyValue + { + public PropertyValue(string name, string value) + { + this.Name = name; + this.Value = value; + } + + public string Name { get; set; } = string.Empty; + public string Value { get; set; } = string.Empty; + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/TaskDetailsViewModel.cs b/Source/GenerateSharp/SoupView/ViewModel/TaskDetailsViewModel.cs new file mode 100644 index 00000000..47826e4d --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/TaskDetailsViewModel.cs @@ -0,0 +1,121 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Soup.Build; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using ValueType = Soup.Build.ValueType; + +namespace SoupView.ViewModel +{ + internal class TaskDetailsViewModel : Observable + { + private ObservableCollection properties = new ObservableCollection(); + + public TaskDetailsViewModel(string name, IValueTable taskInfo) + { + properties.Clear(); + properties.Add(new PropertyValue("Name", name)); + + State = new ObservableCollection(); + BuildValueTable(taskInfo, State); + } + + public IList Properties => properties; + + + public ObservableCollection State { get; init; } + + private void BuildValueTable( + IValueTable table, + ObservableCollection viewModelList) + { + viewModelList.Clear(); + foreach (var value in table) + { + var viewModel = new ValueTableItemViewModel(); + + switch (value.Value.Type) + { + case ValueType.Boolean: + viewModel.Title = $"{value.Key} - {value.Value.AsBoolean()}"; + viewModel.Type = ValueTableItemType.Value; + break; + case ValueType.String: + viewModel.Title = $"{value.Key} - {value.Value.AsString()}"; + viewModel.Type = ValueTableItemType.Value; + break; + case ValueType.Float: + viewModel.Title = $"{value.Key} - {value.Value.AsFloat()}"; + viewModel.Type = ValueTableItemType.Value; + break; + case ValueType.Integer: + viewModel.Title = $"{value.Key} - {value.Value.AsInteger()}"; + viewModel.Type = ValueTableItemType.Value; + break; + case ValueType.List: + viewModel.Title = $"{value.Key}"; + viewModel.Type = ValueTableItemType.List; + BuildValueList(value.Value.AsList(), viewModel.Children); + break; + case ValueType.Table: + viewModel.Title = $"{value.Key}"; + viewModel.Type = ValueTableItemType.Table; + BuildValueTable(value.Value.AsTable(), viewModel.Children); + break; + default: + throw new InvalidOperationException("Unknown Value type"); + } + + viewModelList.Add(viewModel); + } + } + + private void BuildValueList( + IValueList list, + ObservableCollection viewModelList) + { + viewModelList.Clear(); + foreach (var value in list) + { + var viewModel = new ValueTableItemViewModel(); + + switch (value.Type) + { + case ValueType.Boolean: + viewModel.Title = $"{value.AsBoolean()}"; + viewModel.Type = ValueTableItemType.Value; + break; + case ValueType.String: + viewModel.Title = $"{value.AsString()}"; + viewModel.Type = ValueTableItemType.Value; + break; + case ValueType.Float: + viewModel.Title = $"{value.AsFloat()}"; + viewModel.Type = ValueTableItemType.Value; + break; + case ValueType.Integer: + viewModel.Title = $"{value.AsInteger()}"; + viewModel.Type = ValueTableItemType.Value; + break; + case ValueType.List: + viewModel.Title = string.Empty; + viewModel.Type = ValueTableItemType.List; + BuildValueList(value.AsList(), viewModel.Children); + break; + case ValueType.Table: + viewModel.Title = string.Empty; + viewModel.Type = ValueTableItemType.Table; + BuildValueTable(value.AsTable(), viewModel.Children); + break; + default: + throw new InvalidOperationException("Unknown Value type"); + } + + viewModelList.Add(viewModel); + } + } + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/TaskGraphPageModel.cs b/Source/GenerateSharp/SoupView/ViewModel/TaskGraphPageModel.cs new file mode 100644 index 00000000..dc42dc3d --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/TaskGraphPageModel.cs @@ -0,0 +1,197 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using Opal; +using Soup.Build; +using Soup.Build.Utilities; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading.Tasks; + +namespace SoupView.ViewModel +{ + internal class TaskGraphPageModel : Observable + { + private GraphNode selectedNode = null; + private TaskDetailsViewModel selectedTask = null; + private string errorBarMessage = string.Empty; + private uint uniqueId = 0; + private bool isErrorBarOpen = false; + private IList> graph = null; + private Dictionary taskDetailsLookup = new Dictionary(); + + public string ErrorBarMessage + { + get { return errorBarMessage; } + set + { + if (value != errorBarMessage) + { + errorBarMessage = value; + NotifyPropertyChanged(); + } + } + } + + public IList> Graph + { + get { return graph; } + set + { + if (value != graph) + { + graph = value; + NotifyPropertyChanged(); + } + } + } + + public GraphNode SelectedNode + { + get { return selectedNode; } + set + { + if (value != selectedNode) + { + selectedNode = value; + NotifyPropertyChanged(); + SelectedTask = this.taskDetailsLookup[selectedNode.Id]; + } + } + } + + public TaskDetailsViewModel SelectedTask + { + get { return selectedTask; } + set + { + if (value != selectedTask) + { + selectedTask = value; + NotifyPropertyChanged(); + } + } + } + + public bool IsErrorBarOpen + { + get { return isErrorBarOpen; } + set + { + if (value != isErrorBarOpen) + { + isErrorBarOpen = value; + NotifyPropertyChanged(); + } + } + } + + public async Task LoadProjectAsync(Path recipeFilePath) + { + var loadResult = await RecipeExtensions.TryLoadRecipeFromFileAsync(recipeFilePath); + if (loadResult.IsSuccess) + { + var packageDirectory = recipeFilePath.GetParent(); + var targetPath = await GetTargetPathAsync(packageDirectory); + + var soupTargetDirectory = targetPath + new Path(".soup/"); + + var generateInfoStateFile = soupTargetDirectory + BuildConstants.GenerateTaskInfoFileName; + if (!ValueTableManager.TryLoadState(generateInfoStateFile, out var generateInfoTable)) + { + NotifyError($"Failed to load Value Table: {generateInfoStateFile}"); + return; + } + + Graph = BuildGraph(generateInfoTable); + } + else + { + NotifyError($"Failed to load Recipe file: {recipeFilePath}"); + } + } + + private void NotifyError(string message) + { + ErrorBarMessage = message; + IsErrorBarOpen = true; + } + + private IList> BuildGraph(IValueTable generateInfoTable) + { + var activeGraph = new List>(); + this.taskDetailsLookup.Clear(); + this.uniqueId = 1; + + if (!generateInfoTable.TryGetValue("RuntimeOrder", out var runtimeOrderList) || runtimeOrderList.Type != Soup.Build.ValueType.List) + { + NotifyError($"Generate Info Table missing RuntimeOrder List"); + return activeGraph; + } + + if (!generateInfoTable.TryGetValue("TaskInfo", out var taskInfoTable) || taskInfoTable.Type != Soup.Build.ValueType.Table) + { + NotifyError($"Generate Info Table missing TaskInfo Table"); + return activeGraph; + } + + BuildGraph(runtimeOrderList.AsList(), taskInfoTable.AsTable(), activeGraph); + + return activeGraph; + } + + private void BuildGraph( + IValueList runtimeOrderList, + IValueTable taskInfoTable, + IList> activeGraph) + { + // Add each task to its own column + foreach (var taskNameValue in runtimeOrderList) + { + var taskName = taskNameValue.AsString(); + + var node = new GraphNode(taskName, this.uniqueId++); + + // Find the Task Info + var taskInfo = taskInfoTable[taskName].AsTable(); + + this.taskDetailsLookup.Add(node.Id, new TaskDetailsViewModel(taskName, taskInfo)); + + // Add the new column at the start + var column = new List() + { + node + }; + activeGraph.Add(column); + } + } + + private async Task GetTargetPathAsync(Path packageDirectory) + { + var processInfo = new ProcessStartInfo("soup.exe", $"target {packageDirectory}") + { + RedirectStandardOutput = true, + CreateNoWindow = true, + }; + var process = new Process() + { + StartInfo = processInfo, + }; + + process.Start(); + + await process.WaitForExitAsync(); + + if (process.ExitCode != 0) + { + NotifyError($"Soup process exited with error: {process.ExitCode}"); + throw new InvalidOperationException(); + } + + var output = await process.StandardOutput.ReadToEndAsync(); + return new Path(output); + } + } +} diff --git a/Source/GenerateSharp/SoupView/ViewModel/ValueTableItemViewModel.cs b/Source/GenerateSharp/SoupView/ViewModel/ValueTableItemViewModel.cs new file mode 100644 index 00000000..3e0ca93a --- /dev/null +++ b/Source/GenerateSharp/SoupView/ViewModel/ValueTableItemViewModel.cs @@ -0,0 +1,57 @@ +// +// Copyright (c) Soup. All rights reserved. +// + +using System.Collections.ObjectModel; + +namespace SoupView.ViewModel +{ + public enum ValueTableItemType + { + Table, + List, + Value, + }; + + class ValueTableItemViewModel : Observable + { + public string Title { get; set; } + + public ValueTableItemType Type { get; set; } + + private ObservableCollection m_children = new ObservableCollection(); + public ObservableCollection Children + { + get { return m_children; } + set { m_children = value; } + } + + private bool m_isExpanded; + public bool IsExpanded + { + get { return m_isExpanded; } + set + { + if (m_isExpanded != value) + { + m_isExpanded = value; + NotifyPropertyChanged(); + } + } + } + + private bool m_isSelected; + public bool IsSelected + { + get { return m_isSelected; } + set + { + if (m_isSelected != value) + { + m_isSelected = value; + NotifyPropertyChanged(); + } + } + } + } +} diff --git a/Source/GenerateSharp/SoupView/app.manifest b/Source/GenerateSharp/SoupView/app.manifest new file mode 100644 index 00000000..e7f41e80 --- /dev/null +++ b/Source/GenerateSharp/SoupView/app.manifest @@ -0,0 +1,15 @@ + + + + + + + + true/PM + PerMonitorV2, PerMonitor + + + diff --git a/Source/GenerateSharp/Utilities/BuildConstants.cs b/Source/GenerateSharp/Utilities/BuildConstants.cs index a551edfa..05a502ce 100644 --- a/Source/GenerateSharp/Utilities/BuildConstants.cs +++ b/Source/GenerateSharp/Utilities/BuildConstants.cs @@ -40,5 +40,10 @@ public static class BuildConstants /// Gets the Generate Parameters Value Table file name /// public static Path GenerateEvaluateOperationGraphFileName => new Path("GenerateEvaluateGraph.bog"); + + /// + /// Gets the Generate task info Value Table file name + /// + public static Path GenerateTaskInfoFileName => new Path("GenerateTaskInfo.bvt"); } } diff --git a/Source/GenerateSharp/Generate/OperationGraph/OperationGraphManager.cs b/Source/GenerateSharp/Utilities/OperationGraph/OperationGraphManager.cs similarity index 94% rename from Source/GenerateSharp/Generate/OperationGraph/OperationGraphManager.cs rename to Source/GenerateSharp/Utilities/OperationGraph/OperationGraphManager.cs index b887b15c..1ffe3e32 100644 --- a/Source/GenerateSharp/Generate/OperationGraph/OperationGraphManager.cs +++ b/Source/GenerateSharp/Utilities/OperationGraph/OperationGraphManager.cs @@ -4,29 +4,28 @@ using Opal; using Soup.Build.Runtime; -using Soup.Build.Utilities; -using System; using System.Collections.Generic; -namespace Soup.Build.Generate +namespace Soup.Build.Utilities { /// /// The operation state manager /// - internal static class OperationGraphManager + public static class OperationGraphManager { /// /// Load the operation state from the provided directory /// public static bool TryLoadState( Path operationGraphFile, - OperationGraph result, - FileSystemState fileSystemState) + FileSystemState fileSystemState, + out OperationGraph result) { // Verify the requested file exists if (!System.IO.File.Exists(operationGraphFile.ToString())) { Log.Info("Operation graph file does not exist"); + result = new OperationGraph(); return false; } @@ -67,6 +66,7 @@ public static bool TryLoadState( catch { Log.Error("Failed to parse operation graph"); + result = new OperationGraph(); return false; } } diff --git a/Source/GenerateSharp/Generate/OperationGraph/OperationGraphReader.cs b/Source/GenerateSharp/Utilities/OperationGraph/OperationGraphReader.cs similarity index 96% rename from Source/GenerateSharp/Generate/OperationGraph/OperationGraphReader.cs rename to Source/GenerateSharp/Utilities/OperationGraph/OperationGraphReader.cs index ba8c3ee7..1d4e5ad3 100644 --- a/Source/GenerateSharp/Generate/OperationGraph/OperationGraphReader.cs +++ b/Source/GenerateSharp/Utilities/OperationGraph/OperationGraphReader.cs @@ -7,7 +7,7 @@ using System; using System.Collections.Generic; -namespace Soup.Build.Generate +namespace Soup.Build.Utilities { /// /// The operation graph state reader @@ -83,7 +83,7 @@ public static OperationGraph Deserialize(System.IO.BinaryReader reader) var operations = new List(); for (var i = 0; i < operationCount; i++) { - operations[i] = ReadOperationInfo(reader); + operations.Add(ReadOperationInfo(reader)); } if (reader.BaseStream.Position != reader.BaseStream.Length) @@ -180,7 +180,7 @@ private static List ReadFileIdList(System.IO.BinaryReader reader) var result = new List((int)size); for (var i = 0; i < size; i++) { - result[i] = new FileId(reader.ReadUInt32()); + result.Add(new FileId(reader.ReadUInt32())); } return result; @@ -192,7 +192,7 @@ private static List ReadOperationIdList(System.IO.BinaryReader read var result = new List((int)size); for (var i = 0; i < size; i++) { - result[i] = new OperationId(reader.ReadUInt32()); + result.Add(new OperationId(reader.ReadUInt32())); } return result; diff --git a/Source/GenerateSharp/Generate/OperationGraph/OperationGraphWriter.cs b/Source/GenerateSharp/Utilities/OperationGraph/OperationGraphWriter.cs similarity index 99% rename from Source/GenerateSharp/Generate/OperationGraph/OperationGraphWriter.cs rename to Source/GenerateSharp/Utilities/OperationGraph/OperationGraphWriter.cs index 1fcbb37d..d106aba3 100644 --- a/Source/GenerateSharp/Generate/OperationGraph/OperationGraphWriter.cs +++ b/Source/GenerateSharp/Utilities/OperationGraph/OperationGraphWriter.cs @@ -5,7 +5,7 @@ using Soup.Build.Runtime; using System.Collections.Generic; -namespace Soup.Build.Generate +namespace Soup.Build.Utilities { /// /// The operation graph state writer diff --git a/Source/GenerateSharp/Utilities/Recipe/RecipeExtensions.cs b/Source/GenerateSharp/Utilities/Recipe/RecipeExtensions.cs index 25aa4db8..771faffe 100644 --- a/Source/GenerateSharp/Utilities/Recipe/RecipeExtensions.cs +++ b/Source/GenerateSharp/Utilities/Recipe/RecipeExtensions.cs @@ -17,7 +17,7 @@ public static class RecipeExtensions /// /// Attempt to load from file /// - public static async Task<(bool IsSuccess, Recipe result)> TryLoadRecipeFromFileAsync(Path recipeFile) + public static async Task<(bool IsSuccess, Recipe Result)> TryLoadRecipeFromFileAsync(Path recipeFile) { // Verify the requested file exists Log.Diag("Load Recipe: " + recipeFile.ToString()); diff --git a/Source/GenerateSharp/Utilities/ValueTable/ValueTableTomlUtilities.cs b/Source/GenerateSharp/Utilities/ValueTable/ValueTableTomlUtilities.cs index c5a23291..030b9054 100644 --- a/Source/GenerateSharp/Utilities/ValueTable/ValueTableTomlUtilities.cs +++ b/Source/GenerateSharp/Utilities/ValueTable/ValueTableTomlUtilities.cs @@ -4,7 +4,6 @@ using Opal; using Soup.Build.Runtime; -using System; using System.Threading.Tasks; using Tomlyn; using Tomlyn.Syntax; diff --git a/Source/GenerateSharp/Soup.Rules.ruleset b/Source/Soup.Rules.ruleset similarity index 100% rename from Source/GenerateSharp/Soup.Rules.ruleset rename to Source/Soup.Rules.ruleset diff --git a/Source/GenerateSharp/stylecop.json b/Source/stylecop.json similarity index 100% rename from Source/GenerateSharp/stylecop.json rename to Source/stylecop.json