diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..18350c6
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,12 @@
+root=true
+# seeing issues caused by the presence of .editorconfig in Visual Studio 2019 16.5.5 (VS, VS Extensions, R#, analyzers),
+# scoping to bash scripts and yml
+
+[*.{sh,yml}]
+indent_style=space
+charset=utf-8
+trim_trailing_whitespace=true
+insert_final_newline=true
+
+[*.yml]
+indent_size=2
diff --git a/AssemblyVersion.cs b/AssemblyVersion.cs
index 0c9d36a..ce24cd1 100644
--- a/AssemblyVersion.cs
+++ b/AssemblyVersion.cs
@@ -1,14 +1,14 @@
-using System.Reflection;
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.9.0")]
-[assembly: AssemblyFileVersion("0.9.0")]
-[assembly: AssemblyInformationalVersion("0.9.0")]
\ No newline at end of file
+using System.Reflection;
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("0.9.0")]
+[assembly: AssemblyFileVersion("0.9.0")]
+[assembly: AssemblyInformationalVersion("0.9.0")]
diff --git a/DotNetCoreBuildTools.sln b/DotNetCoreBuildTools.sln
index f3aaee6..6a29f0f 100644
--- a/DotNetCoreBuildTools.sln
+++ b/DotNetCoreBuildTools.sln
@@ -1,9 +1,36 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26124.0
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 15.0.26124.0
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetCoreBuildTools", "DotNetCoreBuildTools\DotNetCoreBuildTools.csproj", "{01BD78FE-1E0E-42B1-BFD7-A07BA5853D95}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCoreBuildTools", "DotNetCoreBuildTools\DotNetCoreBuildTools.csproj", "{01BD78FE-1E0E-42B1-BFD7-A07BA5853D95}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DA3D082B-16EC-4DE7-ADAD-6F1DB6C2772C}"
+ ProjectSection(SolutionItems) = preProject
+ .DS_Store = .DS_Store
+ .editorconfig = .editorconfig
+ .gitignore = .gitignore
+ AssemblyVersion.cs = AssemblyVersion.cs
+ azure-pipelines.yml = azure-pipelines.yml
+ Directory.Build.props = Directory.Build.props
+ LICENSE = LICENSE
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{4FEA2035-92FA-4EA1-A8C9-8DAE3D8C8C51}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeAnalysis", "CodeAnalysis", "{9B97DA13-A66D-4708-A779-FE02EB6FD69C}"
+ ProjectSection(SolutionItems) = preProject
+ build\CodeAnalysis\AllRules.16.5.WithSonarLint.ruleset = build\CodeAnalysis\AllRules.16.5.WithSonarLint.ruleset
+ build\CodeAnalysis\CustomDictionary.xml = build\CodeAnalysis\CustomDictionary.xml
+ build\CodeAnalysis\Default.Source.16.5.WithSonarLint.ruleset = build\CodeAnalysis\Default.Source.16.5.WithSonarLint.ruleset
+ build\CodeAnalysis\Default.Test.16.5.WithSonarLint.ruleset = build\CodeAnalysis\Default.Test.16.5.WithSonarLint.ruleset
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JetBrains", "JetBrains", "{A3A26E2B-7661-4819-91B7-2669B2EAB7A7}"
+ ProjectSection(SolutionItems) = preProject
+ build\JetBrains\ResharperLayout.Current.xml = build\JetBrains\ResharperLayout.Current.xml
+ build\JetBrains\ResharperLayout.Editing.xml = build\JetBrains\ResharperLayout.Editing.xml
+ EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -14,9 +41,6 @@ Global
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{01BD78FE-1E0E-42B1-BFD7-A07BA5853D95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{01BD78FE-1E0E-42B1-BFD7-A07BA5853D95}.Debug|Any CPU.Build.0 = Debug|Any CPU
@@ -31,4 +55,14 @@ Global
{01BD78FE-1E0E-42B1-BFD7-A07BA5853D95}.Release|x86.ActiveCfg = Release|Any CPU
{01BD78FE-1E0E-42B1-BFD7-A07BA5853D95}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {9B97DA13-A66D-4708-A779-FE02EB6FD69C} = {4FEA2035-92FA-4EA1-A8C9-8DAE3D8C8C51}
+ {A3A26E2B-7661-4819-91B7-2669B2EAB7A7} = {4FEA2035-92FA-4EA1-A8C9-8DAE3D8C8C51}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {92CBFFE7-3870-4BA0-8160-76A5F1C1CE5D}
+ EndGlobalSection
EndGlobal
diff --git a/DotNetCoreBuildTools.sln.DotSettings b/DotNetCoreBuildTools.sln.DotSettings
new file mode 100644
index 0000000..eaadb2d
--- /dev/null
+++ b/DotNetCoreBuildTools.sln.DotSettings
@@ -0,0 +1,1618 @@
+
+ DISABLED
+ False
+ False
+ False
+ False
+ SUGGESTION
+ DO_NOT_SHOW
+ True
+
+ True
+
+ True
+
+ True
+
+ True
+
+ True
+
+ True
+
+ True
+
+ True
+ <?xml version="1.0" encoding="utf-16"?><Profile name="Solution No-Reorder"><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><CSArrangeThisQualifier>True</CSArrangeThisQualifier><CSRemoveCodeRedundancies>True</CSRemoveCodeRedundancies><CSUseVar><BehavourStyle>CAN_CHANGE_BOTH</BehavourStyle><LocalVariableStyle>IMPLICIT_WHEN_INITIALIZER_HAS_TYPE</LocalVariableStyle><ForeachVariableStyle>ALWAYS_EXPLICIT</ForeachVariableStyle></CSUseVar><CSUpdateFileHeader>True</CSUpdateFileHeader><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReorderTypeMembers>True</CSReorderTypeMembers><CssAlphabetizeProperties>True</CssAlphabetizeProperties><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" /><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><JsInsertSemicolon>True</JsInsertSemicolon><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs></Profile>
+ <?xml version="1.0" encoding="utf-16"?><Profile name="Solution Reorder"><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><CSArrangeThisQualifier>True</CSArrangeThisQualifier><CSRemoveCodeRedundancies>True</CSRemoveCodeRedundancies><CSUseVar><BehavourStyle>CAN_CHANGE_BOTH</BehavourStyle><LocalVariableStyle>IMPLICIT_WHEN_INITIALIZER_HAS_TYPE</LocalVariableStyle><ForeachVariableStyle>ALWAYS_IMPLICIT</ForeachVariableStyle></CSUseVar><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSReorderTypeMembers>True</CSReorderTypeMembers><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSEnforceVarKeywordUsageSettings>True</CSEnforceVarKeywordUsageSettings><CSArrangeQualifiers>True</CSArrangeQualifiers><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><JsReformatCode>True</JsReformatCode><JsInsertSemicolon>True</JsInsertSemicolon><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs><CssAlphabetizeProperties>True</CssAlphabetizeProperties><CssReformatCode>True</CssReformatCode><VBOptimizeImports>True</VBOptimizeImports><VBShortenReferences>True</VBShortenReferences><VBReformatCode>True</VBReformatCode><HtmlReformatCode>True</HtmlReformatCode><VBFormatDocComments>True</VBFormatDocComments><CSUpdateFileHeader>True</CSUpdateFileHeader><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" /><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><RemoveCodeRedundanciesVB>True</RemoveCodeRedundanciesVB><XMLReformatCode>True</XMLReformatCode></Profile>
+ Solution Reorder
+ True
+ False
+ 4
+ 4
+ False
+ Required
+ Required
+ Required
+ Required
+ UseKeyword
+ UseKeyword
+ 0
+ MULTILINE
+ 1
+ 1
+ True
+ True
+
+ NEVER
+ NEVER
+
+ False
+
+ True
+ False
+ False
+ True
+ True
+ CHOP_IF_LONG
+ CHOP_IF_LONG
+ True
+ CHOP_IF_LONG
+ CHOP_IF_LONG
+ CHOP_IF_LONG
+ 200
+ WRAP_IF_LONG
+ CHOP_IF_LONG
+ 2
+ 2
+ False
+ 2
+ 2
+ False
+ 2
+ 2
+ False
+ 2
+ 2
+ False
+ False
+ 2
+ 2
+ False
+ 2
+ 2
+ False
+ <Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns">
+ <TypePattern Priority="200" DisplayName="Non-reorderable types" RemoveRegions="All">
+ <TypePattern.Match>
+ <Or>
+ <And>
+ <Kind Is="Interface" />
+ <Or>
+ <HasAttribute Name="System.Runtime.InteropServices.InterfaceTypeAttribute" />
+ <HasAttribute Name="System.Runtime.InteropServices.ComImport" />
+ </Or>
+ </And>
+ <Kind Is="Struct" />
+ <HasAttribute Name="JetBrains.Annotations.NoReorderAttribute" />
+ <HasAttribute Name="JetBrains.Annotations.NoReorder" />
+ <HasAttribute Name="System.Runtime.InteropServices.StructLayoutAttribute" Inherited="True" />
+ </Or>
+ </TypePattern.Match>
+ </TypePattern>
+
+ <TypePattern Priority="95" DisplayName="Spec Flow Bindings" RemoveRegions="All">
+ <TypePattern.Match>
+ <Or>
+ <And>
+ <Kind Is="Class" />
+ <HasAttribute Name="TechTalk.SpecFlow.BindingAttribute" />
+ </And>
+ </Or>
+ </TypePattern.Match>
+ <Entry Priority="150" DisplayName="Delegates">
+ <Entry.Match>
+ <Kind Is="Delegate" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="145" DisplayName="Fields And Constants">
+ <Entry.Match>
+ <Or>
+ <Kind Is="Constant" />
+ <Kind Is="Field" />
+ </Or>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access />
+ <Kind Is="Member" />
+ <Static />
+ <Readonly />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="140" DisplayName="Enumerations">
+ <Entry.Match>
+ <Kind Is="Enum" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="135" DisplayName="Constructors">
+ <Entry.Match>
+ <Kind Is="Constructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="132" DisplayName="Clone">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^Clone$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="125" DisplayName="Dispose">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^Dispose$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="120" DisplayName="ReleaseManagedResources">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^ReleaseManagedResources$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="115" DisplayName="ReleaseUnmanagedResources">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^ReleaseUnmanagedResources$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="110" DisplayName="Destructor">
+ <Entry.Match>
+ <Kind Is="Destructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="105" DisplayName="GetObjectData">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^GetObjectData$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="100" DisplayName="OnSerializing">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="System.Runtime.Serialization.OnSerializingAttribute" Inherited="True" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="95" DisplayName="OnSerialized">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="System.Runtime.Serialization.OnSerializedAttribute" Inherited="True" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="90" DisplayName="OnDeserializing">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="System.Runtime.Serialization.OnDeserializingAttribute" Inherited="True" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="85" DisplayName="OnDeserialized">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="System.Runtime.Serialization.OnDeserializedAttribute" Inherited="True" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="80" DisplayName="Factory Methods">
+ <Entry.Match>
+ <And>
+ <Static />
+ <Kind Is="Method" />
+ <Name Is="^Create$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="75" DisplayName="Events">
+ <Entry.Match>
+ <Kind Is="Event" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="70" DisplayName="Properties">
+ <Entry.Match>
+ <And>
+ <Kind Is="Property" />
+ <Not>
+ <Kind Is="Indexer" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="65" DisplayName="Indexers">
+ <Entry.Match>
+ <Kind Is="Indexer" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="64" DisplayName="BeforeTestRun">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.BeforeTestRunAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="63" DisplayName="BeforeFeature">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.BeforeFeatureAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="62" DisplayName="BeforeScenario">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.BeforeScenarioAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="61" DisplayName="BeforeScenarioBlock">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.BeforeScenarioBlockAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="60" DisplayName="BeforeStep">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.BeforeStepAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="59" DisplayName="AfterStep">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.AfterStepAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="58" DisplayName="AfterScenarioBlock">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.AfterScenarioBlockAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="57" DisplayName="AfterScenario">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.AfterScenarioAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="56" DisplayName="AfterFeatureA">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.AfterFeatureAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry Priority="55" DisplayName="AfterTestRun">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="TechTalk.SpecFlow.AfterTestRunAttribute" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <Entry DisplayName="Methods">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Not>
+ <Kind Is="Destructor" />
+ </Not>
+ <Not>
+ <HandlesEvent />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="45" DisplayName="Event Handlers">
+ <Entry.Match>
+ <And>
+ <HandlesEvent />
+ <Not>
+ <Kind Is="Destructor" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="20" DisplayName="Operators">
+ <Entry.Match>
+ <And>
+ <Kind Is="Operator" />
+ <Not>
+ <Kind Is="Destructor" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Abstract />
+ <Virtual />
+ <Override />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <Entry Priority="10" DisplayName="All other members" />
+ <Entry Priority="1" DisplayName="Nested Classes">
+ <Entry.Match>
+ <Kind Is="Type" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ </TypePattern>
+
+ <TypePattern Priority="90" DisplayName="MSTest/NUnit (BDD)" RemoveRegions="All">
+ <TypePattern.Match>
+ <Or>
+ <And>
+ <Kind Is="Class" />
+ <HasAttribute Name="Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute" Inherited="True" />
+ </And>
+ <And>
+ <Kind Is="Class" />
+ <HasAttribute Name="NUnit.Framework.TestFixtureAttribute" Inherited="True" />
+ </And>
+ </Or>
+ </TypePattern.Match>
+ <!-- Match the default up to but not including Default Methods (Add initialization before methods) -->
+
+ <!--<Region Name="${0} BDD A" Priority="150">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="150" DisplayName="All Delegates">
+ <Entry.Match>
+ <Kind Is="Delegate" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD B" Priority="145">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="145" DisplayName="All Enumerations">
+ <Entry.Match>
+ <Kind Is="Enum" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD C" Priority="140">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="140" DisplayName="All Fields And Constants">
+ <Entry.Match>
+ <Or>
+ <Kind Is="Constant" />
+ <Kind Is="Field" />
+ </Or>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access />
+ <Static />
+ <Kind Is="Member" />
+ <Readonly />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD D" Priority="135">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="135" DisplayName="Constructors">
+ <Entry.Match>
+ <Kind Is="Constructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD E" Priority="130">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="130" DisplayName="Dispose">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^Dispose$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD F" Priority="125">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="125" DisplayName="ReleaseManagedResources">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^ReleaseManagedResources$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD G" Priority="120">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="120" DisplayName="ReleaseUnmanagedResources">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^ReleaseUnmanagedResources$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD H" Priority="115">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="115" DisplayName="Destructor">
+ <Entry.Match>
+ <Kind Is="Destructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD I" Priority="110">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="110" DisplayName="Static Factory Methods">
+ <Entry.Match>
+ <And>
+ <Static />
+ <Kind Is="Method" />
+ <Name Is="^Create$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD J" Priority="100">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="100" DisplayName="Clone">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^Clone$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD K" Priority="95">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="95" DisplayName="GetObjectData">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^GetObjectData$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD L" Priority="90">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="90" DisplayName="Events">
+ <Entry.Match>
+ <Kind Is="Event" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD M" Priority="85">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="85" DisplayName="Properties">
+ <Entry.Match>
+ <And>
+ <Kind Is="Property" />
+ <Not>
+ <Kind Is="Indexer" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD N" Priority="80">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="80" DisplayName="Indexers">
+ <Entry.Match>
+ <And>
+ <Kind Is="Indexer" />
+ <Not>
+ <Kind Is="Property" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--End match default production: break for initialization teardown-->
+ <!-- Start Test Specific -->
+ <!--<Region Name="${0} BDD TEST A" Priority="69">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="69" DisplayName="AssemblyInitialize">
+ <Entry.Match>
+ <Or>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyInitializeAttribute" Inherited="True" />
+ </And>
+ <And>
+ <!-- could improve this to check for no namespace -->
+ <Kind Is="Method" />
+ <HasAttribute Name="NUnit.Framework.OneTimeSetUpAttribute" Inherited="True" />
+ </And>
+ </Or>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST B" Priority="68">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="68" DisplayName="ClassInitialize">
+ <Entry.Match>
+ <Or>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute" Inherited="True" />
+ </And>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="NUnit.Framework.OneTimeSetUpAttribute" Inherited="True" />
+ </And>
+ </Or>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST C" Priority="67">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="67" DisplayName="TestInitialize">
+ <Entry.Match>
+ <Or>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute" Inherited="True" />
+ </And>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="NUnit.Framework.SetUpAttribute" Inherited="True" />
+ </And>
+ </Or>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST D" Priority="66">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="66" DisplayName="TestBase.InitializeTestMethod">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^InitializeTestMethod$" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST E" Priority="65">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="65" DisplayName="TestBase.TeardownTestMethod">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^TeardownTestMethod$" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST F" Priority="64">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="64" DisplayName="TestCleanup">
+ <Entry.Match>
+ <Or>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute" Inherited="True" />
+ </And>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="NUnit.Framework.TearDownAttribute" Inherited="True" />
+ </And>
+ </Or>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST G" Priority="63">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="63" DisplayName="ClassCleanup">
+ <Entry.Match>
+ <Or>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute" Inherited="True" />
+ </And>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="NUnit.Framework.OneTimeTearDownAttribute" Inherited="True" />
+ </And>
+ </Or>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST H" Priority="62">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="62" DisplayName="AssemblyCleanup">
+ <Entry.Match>
+ <Or>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyCleanupAttribute" Inherited="True" />
+ </And>
+ <And>
+ <!-- could improve this to check for no namespace -->
+ <Kind Is="Method" />
+ <HasAttribute Name="NUnit.Framework.OneTimeTearDownAttribute" Inherited="True" />
+ </And>
+ </Or>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST K" Priority="59">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="59" DisplayName="ArrangeMethod">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^ArrangeMethod$" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST L" Priority="58">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="58" DisplayName="ActMethod">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^ActMethod$" />
+ </And>
+ </Entry.Match>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD TEST M" Priority="57">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority ="57" DisplayName="Test Methods">
+ <Entry.Match>
+ <Or>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute" Inherited="True" />
+ </And>
+ <And>
+ <Kind Is="Method" />
+ <HasAttribute Name="NUnit.Framework.TestAttribute" Inherited="True" />
+ </And>
+ </Or>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--End Test Specific -->
+
+ <!--Continue matching default pattern-->
+
+ <!--<Region Name="${0} BDD O" Priority="50">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="50" DisplayName="Interface Implementations" >
+ <Entry.Match>
+ <And>
+ <Kind Is="Member" />
+ <ImplementsInterface />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <ImplementsInterface Immediate="true" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD P" Priority="45">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority ="45" DisplayName="Non Test/Non Interface Methods">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Not>
+ <Kind Is="Destructor" />
+ </Not>
+ <Not>
+ <HandlesEvent />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD Q" Priority="40">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="40" DisplayName="Event Handlers">
+ <Entry.Match>
+ <Or>
+ <HandlesEvent/>
+ </Or>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD R" Priority="35">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="35" DisplayName="Operators">
+ <Entry.Match>
+ <And>
+ <Kind Is="Operator" />
+ <Not>
+ <Kind Is="Destructor" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Abstract />
+ <Virtual />
+ <Override />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD S" Priority="30">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="30" DisplayName="All Test Hooks" >
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="\bTestHook*" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Abstract />
+ <Virtual />
+ <Override />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} BDD T All Other Members" Priority="20">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="20" DisplayName="All other members" />
+ <!--</Region>-->
+
+ <!--<Region Name="${0} U Nested Types" Priority="15">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="15" DisplayName="Nested Types">
+ <Entry.Match>
+ <Kind Is="Type" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+ </TypePattern>
+
+ <TypePattern Priority="0" DisplayName="Default Pattern" RemoveRegions="All">
+ <!--<Region Name="${0} A" Priority="150">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="150" DisplayName="All Delegates">
+ <Entry.Match>
+ <Kind Is="Delegate" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} B" Priority="145">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="145" DisplayName="All Enumerations">
+ <Entry.Match>
+ <Kind Is="Enum" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} C" Priority="140">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="140" DisplayName="All Fields And Constants">
+ <Entry.Match>
+ <Or>
+ <Kind Is="Constant" />
+ <Kind Is="Field" />
+ </Or>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access />
+ <Static />
+ <Kind Is="Member" />
+ <Readonly />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} D" Priority="135">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="135" DisplayName="Constructors">
+ <Entry.Match>
+ <Kind Is="Constructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} E" Priority="130">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="130" DisplayName="Dispose">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^Dispose$" />
+ <Not>
+ <!--
+ Resharper was treating event handlers for INotifyDisposed.OnDisposed
+ as if they were dispose methods, ignoring the Name constraint above.
+ This kludge fixes the problem.
+ -->
+ <HandlesEvent/>
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} F" Priority="125">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+
+ <Entry Priority="125" DisplayName="ReleaseManagedResources">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^ReleaseManagedResources$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} G" Priority="120">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="120" DisplayName="ReleaseUnmanagedResources">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^ReleaseUnmanagedResources$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} H" Priority="115">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="115" DisplayName="Destructor">
+ <Entry.Match>
+ <Kind Is="Destructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} I" Priority="110">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="110" DisplayName="Static Factory Methods">
+ <Entry.Match>
+ <And>
+ <Static />
+ <Kind Is="Method" />
+ <Name Is="^Create$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} J" Priority="100">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="100" DisplayName="Clone">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^Clone$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} K" Priority="85">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="85" DisplayName="GetObjectData">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^GetObjectData$" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} L" Priority="80">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="80" DisplayName="Events">
+ <Entry.Match>
+ <Kind Is="Event" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} M" Priority="75">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="75" DisplayName="Properties">
+ <Entry.Match>
+ <And>
+ <Kind Is="Property" />
+ <Not>
+ <Kind Is="Indexer" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} N" Priority="70">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="70" DisplayName="Indexers">
+ <Entry.Match>
+ <And>
+ <Kind Is="Indexer" />
+ <Not>
+ <Kind Is="Property" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!-- INSERT MS TEST BDD Entries HERE -->
+ <!-- Methods is altered int MS Test pattern, the rest are the same-->
+
+ <!--<Region Name="${0} O" Priority="65">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="55" DisplayName="Interface Implementations" >
+ <Entry.Match>
+ <And>
+ <Kind Is="Member" />
+ <ImplementsInterface />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <ImplementsInterface Immediate="true" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} P" Priority="11">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority ="11" DisplayName="Methods">
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Not>
+ <Kind Is="Destructor" />
+ </Not>
+ <Not>
+ <HandlesEvent />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} Q" Priority="80">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+
+ <Entry Priority="50" DisplayName="Event Handlers">
+ <Entry.Match>
+ <Or>
+ <HandlesEvent/>
+ </Or>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Static />
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} R" Priority="55">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="45" DisplayName="Operators">
+ <Entry.Match>
+ <And>
+ <Kind Is="Operator" />
+ <Not>
+ <Kind Is="Destructor" />
+ </Not>
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Abstract />
+ <Virtual />
+ <Override />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} S" Priority="15">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="40" DisplayName="All Test Hooks" >
+ <Entry.Match>
+ <And>
+ <Kind Is="Method" />
+ <Name Is="^TestHook*" />
+ </And>
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Abstract />
+ <Virtual />
+ <Override />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+
+ <!--<Region Name="${0} T All Other Members" Priority="10">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="10" DisplayName="All other members" />
+ <!--</Region>-->
+
+ <!--<Region Name="${0} U Nested Types" Priority="10">
+ <Region.GroupBy>
+ <Name />
+ </Region.GroupBy>-->
+ <Entry Priority="10" DisplayName="Nested Types">
+ <Entry.Match>
+ <Kind Is="Type" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+ <!--</Region>-->
+ </TypePattern>
+</Patterns>
+
+ True
+ True
+ True
+ True
+ True
+ IO
+ False
+ <Policy Inspect="True" Prefix="t_" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="t_" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
+ False
+ OUTLINE
+ False
+ TEMP_FOLDER
+ OnlyFullLine
+ True
+ False
+ DO_NOTHING
+ DO_NOTHING
+ LIVE_MONITOR
+ LIVE_MONITOR
+ DO_NOTHING
+ DO_NOTHING
+ LIVE_MONITOR
+ LIVE_MONITOR
+ DO_NOTHING
+ LIVE_MONITOR
+ DO_NOTHING
+ DO_NOTHING
+ LIVE_MONITOR
+ DO_NOTHING
+
+ True
+ AUTO_FIX
+ AUTO_FIX
+
+ True
+
+ True
+ AUTO_FIX
+ AUTO_FIX
+
+ True
+ AUTO_FIX
+
+ True
+
+ True
+ AUTO_FIX
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ Check-In-Non-Ide, Nightly, Manual
+ 8
+ False
+ True
+ True
+ <data />
+ <data><IncludeFilters /><ExcludeFilters><Filter ModuleMask="*.Tests" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /><Filter ModuleMask="*.tests" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /></ExcludeFilters></data>
+ 30
+ True
+ WindowText
+ True
+ Note
+ (?<=\W|^)(?<TAG>NOTE)(\W|$)(.*)
+ Normal
+ True
+ True
+ True
+ True
+ True
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+
+ True
+ True
+ True
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
\ No newline at end of file
diff --git a/DotNetCoreBuildTools/Attributes/DisplayInMapAttribute.cs b/DotNetCoreBuildTools/Attributes/DisplayInMapAttribute.cs
index 004ea0f..6a5cc61 100644
--- a/DotNetCoreBuildTools/Attributes/DisplayInMapAttribute.cs
+++ b/DotNetCoreBuildTools/Attributes/DisplayInMapAttribute.cs
@@ -1,9 +1,8 @@
-using System;
-
-namespace ProjectOrder.Attributes
-{
- public class DisplayInMapAttribute : Attribute
- {
-
- }
-}
\ No newline at end of file
+namespace ProjectOrder.Attributes
+{
+ using System;
+
+ public class DisplayInMapAttribute : Attribute
+ {
+ }
+}
diff --git a/DotNetCoreBuildTools/DotNetCoreBuildMap.cs b/DotNetCoreBuildTools/DotNetCoreBuildMap.cs
index c696517..edd8006 100644
--- a/DotNetCoreBuildTools/DotNetCoreBuildMap.cs
+++ b/DotNetCoreBuildTools/DotNetCoreBuildMap.cs
@@ -1,223 +1,224 @@
-using System;
-using System.IO;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Diagnostics.CodeAnalysis;
-using System.Reflection;
-using ProjectOrder.Attributes;
-using ProjectOrder.Helpers;
-using ProjectOrder.Model;
-using ProjectOrder.Parsers;
-
-namespace ProjectOrder
-{
- public class CreateOrder // : IComparer>>
- {
- //public int InternalCompare(KeyValuePair> x, KeyValuePair> y)
- //{
- // if (y.Value.Contains(x.Key))
- // {
- // return 1;
- // }
- // if (x.Value.Contains(y.Key))
- // {
- // return -1;
- // }
- // return x.Key.CompareTo(y.Key);
- //}
- //public int Compare(KeyValuePair> x, KeyValuePair> y)
- //{
- // var result = InternalCompare(x,y);
- // if (result == 0)
- // {
- // Console.WriteLine($"{x.Key.ToString().ToUpperInvariant()}={y.Key.ToString().ToUpperInvariant()}");
- // }
- // else if (result < 0)
- // {
- // Console.WriteLine($"{x.Key.ToString().ToUpperInvariant()}<{y.Key.ToString().ToUpperInvariant()}");
- // }
- // else
- // {
- // Console.WriteLine($"{x.Key.ToString().ToUpperInvariant()}>{y.Key.ToString().ToUpperInvariant()}");
- // }
- // return result;
- //}
-
- public static void Main(string[] args)
- {
- Console.Error.WriteLine("Dot Net Build Mapping Tool");
- Console.Error.WriteLine($"Version: {Assembly.GetExecutingAssembly().GetName().Version}");
- var me = new CreateOrder();
- var runParameters = new RunParameters();
- foreach (var arg in args)
- {
- runParameters.PathList.Add(arg);
- }
-
- if (Console.IsInputRedirected)
- {
- using (var reader = new StreamReader(Console.OpenStandardInput()))
- {
- while (!reader.EndOfStream)
- {
- runParameters.PathList.Add(reader.ReadLine());
- }
- }
- }
-
- me.Run(runParameters);
- }
-
- private List SolutionFileParsers = new List();
- private List ProjectFiles = new List();
- private Dictionary MasterProjectList = new Dictionary();
-
- public void AssemblyProjectList(RunParameters runParameters)
- {
- foreach (var path in runParameters.PathList)
- {
- string workingPath = XPlatHelper.FullyNormalizePath(Directory.GetCurrentDirectory(), path);
- if (workingPath.EndsWith(".sln", StringComparison.OrdinalIgnoreCase))
- {
- this.SolutionFileParsers.Add(new SolutionFileParser(workingPath));
- }
- else
- {
- this.ProjectFiles.Add(new ProjectFileReference(workingPath));
- }
- }
- }
-
- public void AddIndependentProjectFiles()
- {
- foreach (var projectFileReference in this.ProjectFiles)
- {
- if (!this.MasterProjectList.ContainsKey(projectFileReference.FilePath))
- {
- this.MasterProjectList.Add(projectFileReference.FilePath, new ProjectFile(projectFileReference));
- }
- }
- }
-
- public void ParseSolutionFiles()
- {
- foreach (var parser in SolutionFileParsers)
- {
- Dictionary> solutionFilesById = new Dictionary>();
- var projectFilesInSolution = parser.Parse();
- // TWO passes are needed here to ensure all dependencies are tracked.
- // The first pass simply find all projects in the solution by their ID.
- foreach (var projectFileReference in projectFilesInSolution.ProjectFiles)
- {
- var projectFile = new ProjectFile(projectFileReference) { Solution = parser.SolutionFile.Name};
- var tuple = new Tuple(projectFileReference, projectFile);
- solutionFilesById.Add(projectFileReference.Id, tuple);
- this.MasterProjectList.Add(projectFileReference.FilePath, projectFile);
- }
- // The second pass creates the solution file object and associates any Solution dependencies
- foreach (var projectFileTuple in solutionFilesById)
- {
- foreach (var projectId in projectFileTuple.Value.Item1.DependentOnIds)
- {
- projectFileTuple.Value.Item2.DependentOn.Add(solutionFilesById[projectId].Item2);
- }
- }
- }
- }
-
- public void ResolveAllProjectReferences()
- {
- foreach (var projectItem in MasterProjectList)
- {
- projectItem.Value.ParseAndResolve(this.MasterProjectList);
- }
- }
-
- public void WriteProjectListOutput()
- {
- Type projectFileType = typeof(ProjectFile);
- var properties = projectFileType.GetProperties().Where(p => p.GetCustomAttribute(typeof(DisplayInMapAttribute)) != null);
- int i = 0;
- foreach (var property in properties)
- {
- Console.Write($":{i}>{property.Name}<{i++}");
- Console.WriteLine(":");
- }
- foreach (var projectFile in MasterProjectList.Values.OrderBy(x => x.BuildGroup))
- {
- i = 0;
- foreach (var property in properties)
- {
- Console.Write($"|{i}>{property.GetValue(projectFile)}<{i++}");
- }
-// Console.Write($"|{i}>{projectFile.Id}<{i++}");
-// Console.Write($"|{i}>{projectFile.ProjectType}<{i++}");
-// Console.Write($"|{i}>{projectFile.Name}<{i++}");
-// Console.Write($"|{i}>{projectFile.Solution}<{i++}");
-// Console.Write($"|{i}>{projectFile.FilePath}<{i++}");
- Console.WriteLine("|");
- }
-
- foreach (var projectFile in MasterProjectList.Values.OrderBy(x => x.BuildGroup))
- {
- if (projectFile.DependentOn?.Count > 0)
- {
- foreach (var dependentOn in projectFile.DependentOn)
- {
- Console.WriteLine($"*{projectFile.FilePath}|{dependentOn.FilePath}*");
- }
- }
- }
- }
-
- public void DetermineProjectBuildGroups()
- {
- foreach (var projectFile in MasterProjectList.Values.OrderBy(x => x.DependentOn.Count))
- {
- if (projectFile.DependentOn.Any())
- {
- projectFile.BuildGroup = projectFile.DependentOn.Max(p => p.BuildGroup) + 1;
- }
- }
- }
-
- public void Run(RunParameters runParameters)
- {
- AssemblyProjectList(runParameters);
- ParseSolutionFiles();
- AddIndependentProjectFiles();
- ResolveAllProjectReferences();
- DetermineProjectBuildGroups();
- WriteProjectListOutput();
-
- //Dictionary> orderMap = new Dictionary>();
- //using (var stream = File.OpenRead(args[0]))
- //using (var reader = new StreamReader(stream))
- //{
- // while (!reader.EndOfStream)
- // {
- // var line = reader.ReadLine();
- // var parts = line.Split("->");
- // var project = Guid.Parse(parts[0]);
- // var dependency = Guid.Parse(parts[1]);
- // if (!orderMap.TryGetValue(project, out var dependencies))
- // {
- // dependencies = new List();
- // orderMap.Add(project, dependencies);
- // }
- // dependencies.Add(dependency);
- // }
- //}
- //var ordered = orderMap.ToList();
- //ordered.Sort(this);
- //foreach (var pair in ordered)
- //{
- // foreach(var item in pair.Value)
- // {
- // Console.WriteLine($"{pair.Key.ToString().ToUpperInvariant()}->{item.ToString().ToUpperInvariant()}");
- // }
- //}
- }
- }
-}
\ No newline at end of file
+namespace ProjectOrder
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Linq;
+ using System.Reflection;
+ using ProjectOrder.Attributes;
+ using ProjectOrder.Helpers;
+ using ProjectOrder.Model;
+ using ProjectOrder.Parsers;
+
+ public class CreateOrder // : IComparer>>
+ {
+ private Dictionary MasterProjectList = new Dictionary();
+ private List ProjectFiles = new List();
+
+ private List SolutionFileParsers = new List();
+ //public int InternalCompare(KeyValuePair> x, KeyValuePair> y)
+ //{
+ // if (y.Value.Contains(x.Key))
+ // {
+ // return 1;
+ // }
+ // if (x.Value.Contains(y.Key))
+ // {
+ // return -1;
+ // }
+ // return x.Key.CompareTo(y.Key);
+ //}
+ //public int Compare(KeyValuePair> x, KeyValuePair> y)
+ //{
+ // var result = InternalCompare(x,y);
+ // if (result == 0)
+ // {
+ // Console.WriteLine($"{x.Key.ToString().ToUpperInvariant()}={y.Key.ToString().ToUpperInvariant()}");
+ // }
+ // else if (result < 0)
+ // {
+ // Console.WriteLine($"{x.Key.ToString().ToUpperInvariant()}<{y.Key.ToString().ToUpperInvariant()}");
+ // }
+ // else
+ // {
+ // Console.WriteLine($"{x.Key.ToString().ToUpperInvariant()}>{y.Key.ToString().ToUpperInvariant()}");
+ // }
+ // return result;
+ //}
+
+ public static void Main(string[] args)
+ {
+ Console.Error.WriteLine("Dot Net Build Mapping Tool");
+ Console.Error.WriteLine($"Version: {Assembly.GetExecutingAssembly().GetName().Version}");
+ var me = new CreateOrder();
+ var runParameters = new RunParameters();
+ foreach (var arg in args)
+ {
+ runParameters.PathList.Add(arg);
+ }
+
+ if (Console.IsInputRedirected)
+ {
+ using (var reader = new StreamReader(Console.OpenStandardInput()))
+ {
+ while (!reader.EndOfStream)
+ {
+ runParameters.PathList.Add(reader.ReadLine());
+ }
+ }
+ }
+
+ me.Run(runParameters);
+ }
+
+ public void AddIndependentProjectFiles()
+ {
+ foreach (var projectFileReference in ProjectFiles)
+ {
+ if (!MasterProjectList.ContainsKey(projectFileReference.FilePath))
+ {
+ MasterProjectList.Add(projectFileReference.FilePath, new ProjectFile(projectFileReference));
+ }
+ }
+ }
+
+ public void AssemblyProjectList(RunParameters runParameters)
+ {
+ foreach (var path in runParameters.PathList)
+ {
+ var workingPath = XPlatHelper.FullyNormalizePath(Directory.GetCurrentDirectory(), path);
+ if (workingPath.EndsWith(".sln", StringComparison.OrdinalIgnoreCase))
+ {
+ SolutionFileParsers.Add(new SolutionFileParser(workingPath));
+ }
+ else
+ {
+ ProjectFiles.Add(new ProjectFileReference(workingPath));
+ }
+ }
+ }
+
+ public void DetermineProjectBuildGroups()
+ {
+ foreach (var projectFile in MasterProjectList.Values.OrderBy(x => x.DependentOn.Count))
+ {
+ if (projectFile.DependentOn.Any())
+ {
+ projectFile.BuildGroup = projectFile.DependentOn.Max(p => p.BuildGroup) + 1;
+ }
+ }
+ }
+
+ public void ParseSolutionFiles()
+ {
+ foreach (var parser in SolutionFileParsers)
+ {
+ var solutionFilesById = new Dictionary>();
+ var projectFilesInSolution = parser.Parse();
+ // TWO passes are needed here to ensure all dependencies are tracked.
+ // The first pass simply find all projects in the solution by their ID.
+ foreach (var projectFileReference in projectFilesInSolution.ProjectFiles)
+ {
+ var projectFile = new ProjectFile(projectFileReference) { Solution = parser.SolutionFile.Name };
+ var tuple = new Tuple(projectFileReference, projectFile);
+ solutionFilesById.Add(projectFileReference.Id, tuple);
+ MasterProjectList.Add(projectFileReference.FilePath, projectFile);
+ }
+
+ // The second pass creates the solution file object and associates any Solution dependencies
+ foreach (var projectFileTuple in solutionFilesById)
+ {
+ foreach (var projectId in projectFileTuple.Value.Item1.DependentOnIds)
+ {
+ projectFileTuple.Value.Item2.DependentOn.Add(solutionFilesById[projectId].Item2);
+ }
+ }
+ }
+ }
+
+ public void ResolveAllProjectReferences()
+ {
+ foreach (var projectItem in MasterProjectList)
+ {
+ projectItem.Value.ParseAndResolve(MasterProjectList);
+ }
+ }
+
+ public void Run(RunParameters runParameters)
+ {
+ AssemblyProjectList(runParameters);
+ ParseSolutionFiles();
+ AddIndependentProjectFiles();
+ ResolveAllProjectReferences();
+ DetermineProjectBuildGroups();
+ WriteProjectListOutput();
+
+ //Dictionary> orderMap = new Dictionary>();
+ //using (var stream = File.OpenRead(args[0]))
+ //using (var reader = new StreamReader(stream))
+ //{
+ // while (!reader.EndOfStream)
+ // {
+ // var line = reader.ReadLine();
+ // var parts = line.Split("->");
+ // var project = Guid.Parse(parts[0]);
+ // var dependency = Guid.Parse(parts[1]);
+ // if (!orderMap.TryGetValue(project, out var dependencies))
+ // {
+ // dependencies = new List();
+ // orderMap.Add(project, dependencies);
+ // }
+ // dependencies.Add(dependency);
+ // }
+ //}
+ //var ordered = orderMap.ToList();
+ //ordered.Sort(this);
+ //foreach (var pair in ordered)
+ //{
+ // foreach(var item in pair.Value)
+ // {
+ // Console.WriteLine($"{pair.Key.ToString().ToUpperInvariant()}->{item.ToString().ToUpperInvariant()}");
+ // }
+ //}
+ }
+
+ public void WriteProjectListOutput()
+ {
+ var projectFileType = typeof(ProjectFile);
+ var properties = projectFileType.GetProperties().Where(p => p.GetCustomAttribute(typeof(DisplayInMapAttribute)) != null);
+ var i = 0;
+ foreach (var property in properties)
+ {
+ Console.Write($":{i}>{property.Name}<{i++}");
+ Console.WriteLine(":");
+ }
+
+ foreach (var projectFile in MasterProjectList.Values.OrderBy(x => x.BuildGroup))
+ {
+ i = 0;
+ foreach (var property in properties)
+ {
+ Console.Write($"|{i}>{property.GetValue(projectFile)}<{i++}");
+ }
+
+ // Console.Write($"|{i}>{projectFile.Id}<{i++}");
+ // Console.Write($"|{i}>{projectFile.ProjectType}<{i++}");
+ // Console.Write($"|{i}>{projectFile.Name}<{i++}");
+ // Console.Write($"|{i}>{projectFile.Solution}<{i++}");
+ // Console.Write($"|{i}>{projectFile.FilePath}<{i++}");
+ Console.WriteLine("|");
+ }
+
+ foreach (var projectFile in MasterProjectList.Values.OrderBy(x => x.BuildGroup))
+ {
+ if (projectFile.DependentOn?.Count > 0)
+ {
+ foreach (var dependentOn in projectFile.DependentOn)
+ {
+ Console.WriteLine($"*{projectFile.FilePath}|{dependentOn.FilePath}*");
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/DotNetCoreBuildTools/DotNetCoreBuildTools.csproj b/DotNetCoreBuildTools/DotNetCoreBuildTools.csproj
index 96c0fea..3deb521 100644
--- a/DotNetCoreBuildTools/DotNetCoreBuildTools.csproj
+++ b/DotNetCoreBuildTools/DotNetCoreBuildTools.csproj
@@ -4,14 +4,21 @@
Exe
false
netcoreapp3.1
+ 7.2
True
Landorphan.DotNetCoreBuildTools
$(BUILD_VERSION)
Timothy Stockstill, Landorphan LLC, Michael Prochaska
Landorphan LLC
+ ..\build\CodeAnalysis\Default.Source.16.5.WithSonarLint.ruleset
true
+ ProjectOrder
+
+
+
+
@@ -23,4 +30,4 @@
-
+
\ No newline at end of file
diff --git a/DotNetCoreBuildTools/Helpers/XPlatHelper.cs b/DotNetCoreBuildTools/Helpers/XPlatHelper.cs
index bd5fab2..62f7892 100644
--- a/DotNetCoreBuildTools/Helpers/XPlatHelper.cs
+++ b/DotNetCoreBuildTools/Helpers/XPlatHelper.cs
@@ -1,19 +1,18 @@
-using System.IO;
-
-namespace ProjectOrder.Helpers
-{
- public static class XPlatHelper
- {
- public static string ConvertPath(string path)
- {
- return path.Replace("\\", "/");
- }
-
- public static string FullyNormalizePath(string root, string path)
- {
- return Path.GetFullPath(Path.Combine(root, ConvertPath(path)))
- .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
-
- }
- }
-}
\ No newline at end of file
+namespace ProjectOrder.Helpers
+{
+ using System.IO;
+
+ public static class XPlatHelper
+ {
+ public static string ConvertPath(string path)
+ {
+ return path.Replace("\\", "/");
+ }
+
+ public static string FullyNormalizePath(string root, string path)
+ {
+ return Path.GetFullPath(Path.Combine(root, ConvertPath(path)))
+ .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
+ }
+ }
+}
diff --git a/DotNetCoreBuildTools/Model/ProjectFile.cs b/DotNetCoreBuildTools/Model/ProjectFile.cs
index 52265a0..7acdd8d 100644
--- a/DotNetCoreBuildTools/Model/ProjectFile.cs
+++ b/DotNetCoreBuildTools/Model/ProjectFile.cs
@@ -1,128 +1,129 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Xml.Linq;
-using System.Xml.XPath;
-using ProjectOrder.Attributes;
-using ProjectOrder.Helpers;
-
-namespace ProjectOrder.Model
-{
- public class ProjectFile : ProjectFileBase, IComparable, IComparer
- {
- [DisplayInMap]
- public int BuildGroup { get; set; }
-
- public enum TypeOfProject
- {
- Unknown,
- Library,
- Application,
- Web,
- Test
- }
-
- public enum PackageType
- {
- None,
- PackageOnBuild,
- PackageStepNeeded
- }
-
- [DisplayInMap]
- public TypeOfProject ProjectType { get; set; }
-
- [DisplayInMap]
- public PackageType Package { get; set; }
-
- [DisplayInMap]
- public string Solution { get; set; }
-
- public ProjectFile() : base()
- {
- }
-
- public ProjectFile(string path) : base(path)
- {
- }
-
- public ProjectFile(ProjectFileReference original) : base(original)
- {
- }
-
- public const string WebSdk = "Microsoft.NET.Sdk.Web";
- public const string TestSdk = "Microsoft.NET.Test.Sdk";
- public const string Exe = "Exe";
-
- public List DependentOn { get; set; } = new List();
-
- public void ParseAndResolve(Dictionary masterProjectList)
- {
- XDocument xDocument = XDocument.Load(this.FilePath);
- string sdk = ((xDocument.XPathEvaluate("/Project/@Sdk") as IEnumerable