diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index faf8675270..bc4a691968 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -43,7 +43,6 @@ jobs: - name: Build Release run: | dotnet-gitversion /updateprojectfiles - dotnet build ./Analyzers/Terminal.Gui.Analyzers.Internal --no-incremental --nologo --force --configuration Release dotnet build --no-incremental --nologo --force --configuration Release - name: Pack diff --git a/Analyzers.slnf b/Analyzers.slnf deleted file mode 100644 index 974c5a9654..0000000000 --- a/Analyzers.slnf +++ /dev/null @@ -1,10 +0,0 @@ -{ - "solution": { - "path": "Terminal.sln", - "projects": [ - "Analyzers\\Terminal.Gui.Analyzers.Internal.Debugging\\Terminal.Gui.Analyzers.Internal.Debugging.csproj", - "Analyzers\\Terminal.Gui.Analyzers.Internal.Tests\\Terminal.Gui.Analyzers.Internal.Tests.csproj", - "Analyzers\\Terminal.Gui.Analyzers.Internal\\Terminal.Gui.Analyzers.Internal.csproj", - ] - } -} \ No newline at end of file diff --git a/Analyzers/Directory.Build.props b/Analyzers/Directory.Build.props deleted file mode 100644 index 6a6ec15896..0000000000 --- a/Analyzers/Directory.Build.props +++ /dev/null @@ -1,23 +0,0 @@ - - - enable - latest-recommended - 8 - UTF-8 - true - true - $(DefineConstants);JETBRAINS_ANNOTATIONS;CONTRACTS_FULL;CODE_ANALYSIS - True - True - - - - - - - - - - - - \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Debugging/Program.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Debugging/Program.cs deleted file mode 100644 index 559424a1b6..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Debugging/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Debugging; - -static class Program -{ - static void Main (string [] args) - { - - } -} - -[GenerateEnumExtensionMethods] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "It's not that deep")] -public enum TestEnum -{ - Zero = 0, - One, - Two = 2, - Three, - Six = 6 -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Debugging/Terminal.Gui.Analyzers.Internal.Debugging.csproj b/Analyzers/Terminal.Gui.Analyzers.Internal.Debugging/Terminal.Gui.Analyzers.Internal.Debugging.csproj deleted file mode 100644 index 5594dd0da7..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Debugging/Terminal.Gui.Analyzers.Internal.Debugging.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - Exe - net8.0 - enable - - - - - - - - - - - - - all - Analyzer - true - - - - - - - - diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/EnumMemberValues.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/EnumMemberValues.cs deleted file mode 100644 index 0846f8e90c..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/EnumMemberValues.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; -internal sealed class SignedEnumMemberValues -{ - internal const int Bit31 = ~0b_01111111_11111111_11111111_11111111; - internal const int Bit30 = 0b_01000000_00000000_00000000_00000000; - internal const int Bit29 = 0b_00100000_00000000_00000000_00000000; - internal const int Bit28 = 0b_00010000_00000000_00000000_00000000; - internal const int Bit27 = 0b_00001000_00000000_00000000_00000000; - internal const int Bit26 = 0b_00000100_00000000_00000000_00000000; - internal const int Bit25 = 0b_00000010_00000000_00000000_00000000; - internal const int Bit24 = 0b_00000001_00000000_00000000_00000000; - internal const int Bit23 = 0b_00000000_10000000_00000000_00000000; - internal const int Bit22 = 0b_00000000_01000000_00000000_00000000; - internal const int Bit21 = 0b_00000000_00100000_00000000_00000000; - internal const int Bit20 = 0b_00000000_00010000_00000000_00000000; - internal const int Bit19 = 0b_00000000_00001000_00000000_00000000; - internal const int Bit18 = 0b_00000000_00000100_00000000_00000000; - internal const int Bit17 = 0b_00000000_00000010_00000000_00000000; - internal const int Bit16 = 0b_00000000_00000001_00000000_00000000; - internal const int Bit15 = 0b_00000000_00000000_10000000_00000000; - internal const int Bit14 = 0b_00000000_00000000_01000000_00000000; - internal const int Bit13 = 0b_00000000_00000000_00100000_00000000; - internal const int Bit12 = 0b_00000000_00000000_00010000_00000000; - internal const int Bit11 = 0b_00000000_00000000_00001000_00000000; - internal const int Bit10 = 0b_00000000_00000000_00000100_00000000; - internal const int Bit09 = 0b_00000000_00000000_00000010_00000000; - internal const int Bit08 = 0b_00000000_00000000_00000001_00000000; - internal const int Bit07 = 0b_00000000_00000000_00000000_10000000; - internal const int Bit06 = 0b_00000000_00000000_00000000_01000000; - internal const int Bit05 = 0b_00000000_00000000_00000000_00100000; - internal const int Bit04 = 0b_00000000_00000000_00000000_00010000; - internal const int Bit03 = 0b_00000000_00000000_00000000_00001000; - internal const int Bit02 = 0b_00000000_00000000_00000000_00000100; - internal const int Bit01 = 0b_00000000_00000000_00000000_00000010; - internal const int Bit00 = 0b_00000000_00000000_00000000_00000001; - internal const int All_0 = 0; - internal const int All_1 = ~All_0; - internal const int Alternating_01 = 0b_01010101_01010101_01010101_01010101; - internal const int Alternating_10 = ~Alternating_01; - internal const int EvenBytesHigh = 0b_00000000_11111111_00000000_11111111; - internal const int OddBytesHigh = ~EvenBytesHigh; -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum.cs deleted file mode 100644 index 0fb09b8d96..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Same as , but with applied. -/// -[GenerateEnumExtensionMethods] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterEnum -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = 0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = 0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = 0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = ~All_0, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = ~Alternating_01, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, - OddBytesHigh = ~EvenBytesHigh, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitInt.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitInt.cs deleted file mode 100644 index 535f0448f7..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitInt.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Same as , but with applied. -/// -[GenerateEnumExtensionMethods] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterEnum_ExplicitInt -{ - Bit31 = BasicEnum_ExplicitInt.Bit31, - Bit30 = BasicEnum_ExplicitInt.Bit30, - Bit29 = BasicEnum_ExplicitInt.Bit29, - Bit28 = BasicEnum_ExplicitInt.Bit28, - Bit27 = BasicEnum_ExplicitInt.Bit27, - Bit26 = BasicEnum_ExplicitInt.Bit26, - Bit25 = BasicEnum_ExplicitInt.Bit25, - Bit24 = BasicEnum_ExplicitInt.Bit24, - Bit23 = BasicEnum_ExplicitInt.Bit23, - Bit22 = BasicEnum_ExplicitInt.Bit22, - Bit21 = BasicEnum_ExplicitInt.Bit21, - Bit20 = BasicEnum_ExplicitInt.Bit20, - Bit19 = BasicEnum_ExplicitInt.Bit19, - Bit18 = BasicEnum_ExplicitInt.Bit18, - Bit17 = BasicEnum_ExplicitInt.Bit17, - Bit16 = BasicEnum_ExplicitInt.Bit16, - Bit15 = BasicEnum_ExplicitInt.Bit15, - Bit14 = BasicEnum_ExplicitInt.Bit14, - Bit13 = BasicEnum_ExplicitInt.Bit13, - Bit12 = BasicEnum_ExplicitInt.Bit12, - Bit11 = BasicEnum_ExplicitInt.Bit11, - Bit10 = BasicEnum_ExplicitInt.Bit10, - Bit09 = BasicEnum_ExplicitInt.Bit09, - Bit08 = BasicEnum_ExplicitInt.Bit08, - Bit07 = BasicEnum_ExplicitInt.Bit07, - Bit06 = BasicEnum_ExplicitInt.Bit06, - Bit05 = BasicEnum_ExplicitInt.Bit05, - Bit04 = BasicEnum_ExplicitInt.Bit04, - Bit03 = BasicEnum_ExplicitInt.Bit03, - Bit02 = BasicEnum_ExplicitInt.Bit02, - Bit01 = BasicEnum_ExplicitInt.Bit01, - Bit00 = BasicEnum_ExplicitInt.Bit00, - All_0 = BasicEnum_ExplicitInt.All_0, - All_1 = BasicEnum_ExplicitInt.All_1, - Alternating_01 = BasicEnum_ExplicitInt.Alternating_01, - Alternating_10 = BasicEnum_ExplicitInt.Alternating_10, - EvenBytesHigh = BasicEnum_ExplicitInt.EvenBytesHigh, - OddBytesHigh = BasicEnum_ExplicitInt.OddBytesHigh -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitInt_NoFastIsDefined.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitInt_NoFastIsDefined.cs deleted file mode 100644 index 3b193b54cd..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitInt_NoFastIsDefined.cs +++ /dev/null @@ -1,52 +0,0 @@ -// ReSharper disable EnumUnderlyingTypeIsInt -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Same as , but with = . -/// -[GenerateEnumExtensionMethods (FastIsDefined = false)] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterEnum_ExplicitInt_NoFastIsDefined : int -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = 0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = 0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = 0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = ~All_0, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = ~Alternating_01, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, - OddBytesHigh = ~EvenBytesHigh, -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitUInt.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitUInt.cs deleted file mode 100644 index ca24165ef6..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitUInt.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Same as , but with applied. -/// -[GenerateEnumExtensionMethods] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterEnum_ExplicitUInt : uint -{ - Bit31 = 0b_10000000_00000000_00000000_00000000u, - Bit30 = 0b_01000000_00000000_00000000_00000000u, - Bit29 = 0b_00100000_00000000_00000000_00000000u, - Bit28 = 0b_00010000_00000000_00000000_00000000u, - Bit27 = 0b_00001000_00000000_00000000_00000000u, - Bit26 = 0b_00000100_00000000_00000000_00000000u, - Bit25 = 0b_00000010_00000000_00000000_00000000u, - Bit24 = 0b_00000001_00000000_00000000_00000000u, - Bit23 = 0b_00000000_10000000_00000000_00000000u, - Bit22 = 0b_00000000_01000000_00000000_00000000u, - Bit21 = 0b_00000000_00100000_00000000_00000000u, - Bit20 = 0b_00000000_00010000_00000000_00000000u, - Bit19 = 0b_00000000_00001000_00000000_00000000u, - Bit18 = 0b_00000000_00000100_00000000_00000000u, - Bit17 = 0b_00000000_00000010_00000000_00000000u, - Bit16 = 0b_00000000_00000001_00000000_00000000u, - Bit15 = 0b_00000000_00000000_10000000_00000000u, - Bit14 = 0b_00000000_00000000_01000000_00000000u, - Bit13 = 0b_00000000_00000000_00100000_00000000u, - Bit12 = 0b_00000000_00000000_00010000_00000000u, - Bit11 = 0b_00000000_00000000_00001000_00000000u, - Bit10 = 0b_00000000_00000000_00000100_00000000u, - Bit09 = 0b_00000000_00000000_00000010_00000000u, - Bit08 = 0b_00000000_00000000_00000001_00000000u, - Bit07 = 0b_00000000_00000000_00000000_10000000u, - Bit06 = 0b_00000000_00000000_00000000_01000000u, - Bit05 = 0b_00000000_00000000_00000000_00100000u, - Bit04 = 0b_00000000_00000000_00000000_00010000u, - Bit03 = 0b_00000000_00000000_00000000_00001000u, - Bit02 = 0b_00000000_00000000_00000000_00000100u, - Bit01 = 0b_00000000_00000000_00000000_00000010u, - Bit00 = 0b_00000000_00000000_00000000_00000001u, - All_0 = 0, - All_1 = ~All_0, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = ~Alternating_01, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, - OddBytesHigh = ~EvenBytesHigh, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitUInt_NoFastIsDefined.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitUInt_NoFastIsDefined.cs deleted file mode 100644 index 01edea7a54..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_ExplicitUInt_NoFastIsDefined.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Same as , but with = . -/// -[GenerateEnumExtensionMethods (FastIsDefined = false)] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterEnum_ExplicitUInt_NoFastIsDefined : uint -{ - Bit31 = 0b_10000000_00000000_00000000_00000000u, - Bit30 = 0b_01000000_00000000_00000000_00000000u, - Bit29 = 0b_00100000_00000000_00000000_00000000u, - Bit28 = 0b_00010000_00000000_00000000_00000000u, - Bit27 = 0b_00001000_00000000_00000000_00000000u, - Bit26 = 0b_00000100_00000000_00000000_00000000u, - Bit25 = 0b_00000010_00000000_00000000_00000000u, - Bit24 = 0b_00000001_00000000_00000000_00000000u, - Bit23 = 0b_00000000_10000000_00000000_00000000u, - Bit22 = 0b_00000000_01000000_00000000_00000000u, - Bit21 = 0b_00000000_00100000_00000000_00000000u, - Bit20 = 0b_00000000_00010000_00000000_00000000u, - Bit19 = 0b_00000000_00001000_00000000_00000000u, - Bit18 = 0b_00000000_00000100_00000000_00000000u, - Bit17 = 0b_00000000_00000010_00000000_00000000u, - Bit16 = 0b_00000000_00000001_00000000_00000000u, - Bit15 = 0b_00000000_00000000_10000000_00000000u, - Bit14 = 0b_00000000_00000000_01000000_00000000u, - Bit13 = 0b_00000000_00000000_00100000_00000000u, - Bit12 = 0b_00000000_00000000_00010000_00000000u, - Bit11 = 0b_00000000_00000000_00001000_00000000u, - Bit10 = 0b_00000000_00000000_00000100_00000000u, - Bit09 = 0b_00000000_00000000_00000010_00000000u, - Bit08 = 0b_00000000_00000000_00000001_00000000u, - Bit07 = 0b_00000000_00000000_00000000_10000000u, - Bit06 = 0b_00000000_00000000_00000000_01000000u, - Bit05 = 0b_00000000_00000000_00000000_00100000u, - Bit04 = 0b_00000000_00000000_00000000_00010000u, - Bit03 = 0b_00000000_00000000_00000000_00001000u, - Bit02 = 0b_00000000_00000000_00000000_00000100u, - Bit01 = 0b_00000000_00000000_00000000_00000010u, - Bit00 = 0b_00000000_00000000_00000000_00000001u, - All_0 = 0, - All_1 = ~All_0, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = ~Alternating_01, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, - OddBytesHigh = ~EvenBytesHigh, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_NoFastIsDefined.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_NoFastIsDefined.cs deleted file mode 100644 index 04f6580ad8..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterEnum_NoFastIsDefined.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Same as , but with = . -/// -[GenerateEnumExtensionMethods (FastIsDefined = false)] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterEnum_NoFastIsDefined -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = 0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = 0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = 0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = ~All_0, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = ~Alternating_01, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, - OddBytesHigh = ~EvenBytesHigh, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum.cs deleted file mode 100644 index 2e468941cc..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Same as , but with applied. -/// -[Flags] -[GenerateEnumExtensionMethods] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterFlagsEnum -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = -0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = -0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = -0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = ~All_0, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = ~Alternating_01, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, - OddBytesHigh = ~EvenBytesHigh, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum_ExplicitInt.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum_ExplicitInt.cs deleted file mode 100644 index 00b1b9487f..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum_ExplicitInt.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// -/// Same as , but with applied. -/// -[Flags] -[GenerateEnumExtensionMethods] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterFlagsEnum_ExplicitInt : int -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = -0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = -0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = -0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = ~All_0, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = ~Alternating_01, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, - OddBytesHigh = ~EvenBytesHigh, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum_ExplicitUInt.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum_ExplicitUInt.cs deleted file mode 100644 index 9edb067d84..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithGenerator/BetterFlagsEnum_ExplicitUInt.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Same as , but with applied. -/// -[Flags] -[GenerateEnumExtensionMethods] -[SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BetterFlagsEnum_ExplicitUInt : uint -{ - Bit31 = 0b_10000000_00000000_00000000_00000000u, - Bit30 = 0b_01000000_00000000_00000000_00000000u, - Bit29 = 0b_00100000_00000000_00000000_00000000u, - Bit28 = 0b_00010000_00000000_00000000_00000000u, - Bit27 = 0b_00001000_00000000_00000000_00000000u, - Bit26 = 0b_00000100_00000000_00000000_00000000u, - Bit25 = 0b_00000010_00000000_00000000_00000000u, - Bit24 = 0b_00000001_00000000_00000000_00000000u, - Bit23 = 0b_00000000_10000000_00000000_00000000u, - Bit22 = 0b_00000000_01000000_00000000_00000000u, - Bit21 = 0b_00000000_00100000_00000000_00000000u, - Bit20 = 0b_00000000_00010000_00000000_00000000u, - Bit19 = 0b_00000000_00001000_00000000_00000000u, - Bit18 = 0b_00000000_00000100_00000000_00000000u, - Bit17 = 0b_00000000_00000010_00000000_00000000u, - Bit16 = 0b_00000000_00000001_00000000_00000000u, - Bit15 = 0b_00000000_00000000_10000000_00000000u, - Bit14 = 0b_00000000_00000000_01000000_00000000u, - Bit13 = 0b_00000000_00000000_00100000_00000000u, - Bit12 = 0b_00000000_00000000_00010000_00000000u, - Bit11 = 0b_00000000_00000000_00001000_00000000u, - Bit10 = 0b_00000000_00000000_00000100_00000000u, - Bit09 = 0b_00000000_00000000_00000010_00000000u, - Bit08 = 0b_00000000_00000000_00000001_00000000u, - Bit07 = 0b_00000000_00000000_00000000_10000000u, - Bit06 = 0b_00000000_00000000_00000000_01000000u, - Bit05 = 0b_00000000_00000000_00000000_00100000u, - Bit04 = 0b_00000000_00000000_00000000_00010000u, - Bit03 = 0b_00000000_00000000_00000000_00001000u, - Bit02 = 0b_00000000_00000000_00000000_00000100u, - Bit01 = 0b_00000000_00000000_00000000_00000010u, - Bit00 = 0b_00000000_00000000_00000000_00000001u, - All_0 = 0, - All_1 = ~All_0, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = ~Alternating_01, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, - OddBytesHigh = ~EvenBytesHigh, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum.cs deleted file mode 100644 index bfb743df6a..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Basic enum without explicitly-defined backing type and no attributes on the enum or any of its members. -/// -[SuppressMessage ("Naming", "CA1707:Identifiers should not contain underscores", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BasicEnum -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = 0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = 0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = 0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = -1, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = unchecked((int)0b_10101010_10101010_10101010_10101010), - OddBytesHigh = unchecked((int)0b_11111111_00000000_11111111_00000000), - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum_ExplicitInt.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum_ExplicitInt.cs deleted file mode 100644 index 8a400ab147..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum_ExplicitInt.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Basic enum with explicitly-defined backing type of int and no attributes on the enum or any of its members. -/// -[SuppressMessage ("Naming", "CA1707:Identifiers should not contain underscores", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BasicEnum_ExplicitInt : int -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = 0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = 0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = 0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = -1, - Alternating_01 = 0b_01010101_01010101_01010101_01010101, - Alternating_10 = unchecked((int)0b_10101010_10101010_10101010_10101010), - OddBytesHigh = unchecked((int)0b_11111111_00000000_11111111_00000000), - EvenBytesHigh = unchecked((int)0b_00000000_11111111_00000000_11111111), -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum_ExplicitUint.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum_ExplicitUint.cs deleted file mode 100644 index 911e64c9ca..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/BasicEnum_ExplicitUint.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Basic enum with explicitly-defined backing type of uint and no attributes on the enum or any of its members. -/// -[SuppressMessage ("Naming", "CA1707:Identifiers should not contain underscores", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum BasicEnum_ExplicitUInt : uint -{ - Bit31 = 0b_10000000_00000000_00000000_00000000u, - Bit30 = 0b_01000000_00000000_00000000_00000000u, - Bit29 = 0b_00100000_00000000_00000000_00000000u, - Bit28 = 0b_00010000_00000000_00000000_00000000u, - Bit27 = 0b_00001000_00000000_00000000_00000000u, - Bit26 = 0b_00000100_00000000_00000000_00000000u, - Bit25 = 0b_00000010_00000000_00000000_00000000u, - Bit24 = 0b_00000001_00000000_00000000_00000000u, - Bit23 = 0b_00000000_10000000_00000000_00000000u, - Bit22 = 0b_00000000_01000000_00000000_00000000u, - Bit21 = 0b_00000000_00100000_00000000_00000000u, - Bit20 = 0b_00000000_00010000_00000000_00000000u, - Bit19 = 0b_00000000_00001000_00000000_00000000u, - Bit18 = 0b_00000000_00000100_00000000_00000000u, - Bit17 = 0b_00000000_00000010_00000000_00000000u, - Bit16 = 0b_00000000_00000001_00000000_00000000u, - Bit15 = 0b_00000000_00000000_10000000_00000000u, - Bit14 = 0b_00000000_00000000_01000000_00000000u, - Bit13 = 0b_00000000_00000000_00100000_00000000u, - Bit12 = 0b_00000000_00000000_00010000_00000000u, - Bit11 = 0b_00000000_00000000_00001000_00000000u, - Bit10 = 0b_00000000_00000000_00000100_00000000u, - Bit09 = 0b_00000000_00000000_00000010_00000000u, - Bit08 = 0b_00000000_00000000_00000001_00000000u, - Bit07 = 0b_00000000_00000000_00000000_10000000u, - Bit06 = 0b_00000000_00000000_00000000_01000000u, - Bit05 = 0b_00000000_00000000_00000000_00100000u, - Bit04 = 0b_00000000_00000000_00000000_00010000u, - Bit03 = 0b_00000000_00000000_00000000_00001000u, - Bit02 = 0b_00000000_00000000_00000000_00000100u, - Bit01 = 0b_00000000_00000000_00000000_00000010u, - Bit00 = 0b_00000000_00000000_00000000_00000001u, - All_0 = 0b_00000000_00000000_00000000_00000000u, - All_1 = 0b_11111111_11111111_11111111_11111111u, - Alternating_01 = 0b_01010101_01010101_01010101_01010101u, - Alternating_10 = 0b_10101010_10101010_10101010_10101010u, - OddBytesHigh = 0b_11111111_00000000_11111111_00000000u, - EvenBytesHigh = 0b_00000000_11111111_00000000_11111111u, -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum.cs deleted file mode 100644 index b69fcd057e..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Flags enum without explicitly-defined backing type and only a on the enum declaration No other attributes on the enum or its members.. -/// -[Flags] -[SuppressMessage ("Naming", "CA1707:Identifiers should not contain underscores", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum FlagsEnum -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = -0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = -0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = -0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = -1 -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum_ExplicitInt.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum_ExplicitInt.cs deleted file mode 100644 index a01174e713..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum_ExplicitInt.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Flags enum with explicitly-defined backing type of int and only a on the enum declaration No other attributes on the enum or its members.. -/// -[Flags] -[SuppressMessage ("Naming", "CA1707:Identifiers should not contain underscores", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum FlagsEnum_ExplicitInt : int -{ - Bit31 = -0b_10000000_00000000_00000000_00000000, - Bit30 = 0b_01000000_00000000_00000000_00000000, - Bit29 = 0b_00100000_00000000_00000000_00000000, - Bit28 = 0b_00010000_00000000_00000000_00000000, - Bit27 = 0b_00001000_00000000_00000000_00000000, - Bit26 = 0b_00000100_00000000_00000000_00000000, - Bit25 = 0b_00000010_00000000_00000000_00000000, - Bit24 = 0b_00000001_00000000_00000000_00000000, - Bit23 = -0b_00000000_10000000_00000000_00000000, - Bit22 = 0b_00000000_01000000_00000000_00000000, - Bit21 = 0b_00000000_00100000_00000000_00000000, - Bit20 = 0b_00000000_00010000_00000000_00000000, - Bit19 = 0b_00000000_00001000_00000000_00000000, - Bit18 = 0b_00000000_00000100_00000000_00000000, - Bit17 = 0b_00000000_00000010_00000000_00000000, - Bit16 = 0b_00000000_00000001_00000000_00000000, - Bit15 = -0b_00000000_00000000_10000000_00000000, - Bit14 = 0b_00000000_00000000_01000000_00000000, - Bit13 = 0b_00000000_00000000_00100000_00000000, - Bit12 = 0b_00000000_00000000_00010000_00000000, - Bit11 = 0b_00000000_00000000_00001000_00000000, - Bit10 = 0b_00000000_00000000_00000100_00000000, - Bit09 = 0b_00000000_00000000_00000010_00000000, - Bit08 = 0b_00000000_00000000_00000001_00000000, - Bit07 = -0b_00000000_00000000_00000000_10000000, - Bit06 = 0b_00000000_00000000_00000000_01000000, - Bit05 = 0b_00000000_00000000_00000000_00100000, - Bit04 = 0b_00000000_00000000_00000000_00010000, - Bit03 = 0b_00000000_00000000_00000000_00001000, - Bit02 = 0b_00000000_00000000_00000000_00000100, - Bit01 = 0b_00000000_00000000_00000000_00000010, - Bit00 = 0b_00000000_00000000_00000000_00000001, - All_0 = 0, - All_1 = -1 -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum_ExplicitUInt.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum_ExplicitUInt.cs deleted file mode 100644 index 39285e26da..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumDefinitions/WithoutGenerator/FlagsEnum_ExplicitUInt.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions.EnumDefinitions; - -/// -/// Flags enum with explicitly-defined backing type of uint and only a on the enum declaration No other attributes on the enum or its members.. -/// -[Flags] -[SuppressMessage ("Naming", "CA1707:Identifiers should not contain underscores", Justification = "Naming is intentional.")] -[SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Justification = "Order is intentional.")] -public enum FlagsEnum_ExplicitUInt : uint -{ - Bit31 = 0b_10000000_00000000_00000000_00000000u, - Bit30 = 0b_01000000_00000000_00000000_00000000u, - Bit29 = 0b_00100000_00000000_00000000_00000000u, - Bit28 = 0b_00010000_00000000_00000000_00000000u, - Bit27 = 0b_00001000_00000000_00000000_00000000u, - Bit26 = 0b_00000100_00000000_00000000_00000000u, - Bit25 = 0b_00000010_00000000_00000000_00000000u, - Bit24 = 0b_00000001_00000000_00000000_00000000u, - Bit23 = 0b_00000000_10000000_00000000_00000000u, - Bit22 = 0b_00000000_01000000_00000000_00000000u, - Bit21 = 0b_00000000_00100000_00000000_00000000u, - Bit20 = 0b_00000000_00010000_00000000_00000000u, - Bit19 = 0b_00000000_00001000_00000000_00000000u, - Bit18 = 0b_00000000_00000100_00000000_00000000u, - Bit17 = 0b_00000000_00000010_00000000_00000000u, - Bit16 = 0b_00000000_00000001_00000000_00000000u, - Bit15 = 0b_00000000_00000000_10000000_00000000u, - Bit14 = 0b_00000000_00000000_01000000_00000000u, - Bit13 = 0b_00000000_00000000_00100000_00000000u, - Bit12 = 0b_00000000_00000000_00010000_00000000u, - Bit11 = 0b_00000000_00000000_00001000_00000000u, - Bit10 = 0b_00000000_00000000_00000100_00000000u, - Bit09 = 0b_00000000_00000000_00000010_00000000u, - Bit08 = 0b_00000000_00000000_00000001_00000000u, - Bit07 = 0b_00000000_00000000_00000000_10000000u, - Bit06 = 0b_00000000_00000000_00000000_01000000u, - Bit05 = 0b_00000000_00000000_00000000_00100000u, - Bit04 = 0b_00000000_00000000_00000000_00010000u, - Bit03 = 0b_00000000_00000000_00000000_00001000u, - Bit02 = 0b_00000000_00000000_00000000_00000100u, - Bit01 = 0b_00000000_00000000_00000000_00000010u, - Bit00 = 0b_00000000_00000000_00000000_00000001u, - All_0 = 0b_00000000_00000000_00000000_00000000u, - All_1 = 0b_11111111_11111111_11111111_11111111u -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumExtensionMethodsIncrementalGeneratorTests.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumExtensionMethodsIncrementalGeneratorTests.cs deleted file mode 100644 index c134ab9fa2..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Generators/EnumExtensions/EnumExtensionMethodsIncrementalGeneratorTests.cs +++ /dev/null @@ -1,306 +0,0 @@ -using System.Collections.Concurrent; -using System.Collections.ObjectModel; -using System.Reflection; -using NUnit.Framework.Interfaces; -using NUnit.Framework.Internal; -using Terminal.Gui.Analyzers.Internal.Attributes; -using Terminal.Gui.Analyzers.Internal.Generators.EnumExtensions; -// ReSharper disable InconsistentNaming - -namespace Terminal.Gui.Analyzers.Internal.Tests.Generators.EnumExtensions; - -[TestFixture] -[Category ("Source Generators")] -[TestOf (typeof (EnumExtensionMethodsIncrementalGenerator))] -[Parallelizable (ParallelScope.Children)] -[SuppressMessage ("ReSharper", "ExceptionNotDocumented")] -public class EnumExtensionMethodsIncrementalGeneratorTests -{ - private static bool _isInitialized; - - /// All enum types declared in the test assembly. - private static readonly ObservableCollection _allEnumTypes = []; - - /// - /// All enum types without a , - /// - private static readonly HashSet _boringEnumTypes = []; - - /// All extension classes generated for enums with our attribute. - private static readonly ObservableCollection _enumExtensionClasses = []; - - private static readonly ConcurrentDictionary _extendedEnumTypeMappings = []; - private static IEnumerable ExtendedEnumTypes => _extendedEnumTypeMappings.Keys; - - private static readonly ReaderWriterLockSlim _initializationLock = new (); - - private static IEnumerable GetAssemblyExtendedEnumTypeAttributes () => - Assembly.GetExecutingAssembly () - .GetCustomAttributes (); - - private static IEnumerable Get_AssemblyExtendedEnumTypeAttribute_EnumHasGeneratorAttribute_Cases () - { - return GetAssemblyExtendedEnumTypeAttributes () - .Select ( - static attr => new TestCaseData (attr) - { - TestName = $"{nameof (AssemblyExtendedEnumTypeAttribute_EnumHasGeneratorAttribute)}({attr.EnumType.Name},{attr.ExtensionClass.Name})", - HasExpectedResult = true, - ExpectedResult = true - }); - } - - [Test] - [Category ("Attributes")] - [TestCaseSource (nameof (Get_AssemblyExtendedEnumTypeAttribute_EnumHasGeneratorAttribute_Cases))] - public bool AssemblyExtendedEnumTypeAttribute_EnumHasGeneratorAttribute (AssemblyExtendedEnumTypeAttribute attr) - { - Assume.That (attr, Is.Not.Null); - Assume.That (attr.EnumType, Is.Not.Null); - Assume.That (attr.EnumType.IsEnum); - - return attr.EnumType.IsDefined (typeof (GenerateEnumExtensionMethodsAttribute)); - } - - [Test] - [Category("Attributes")] - public void AssemblyExtendedEnumTypeAttribute_ExtensionClassHasExpectedReverseMappingAttribute ([ValueSource(nameof(GetAssemblyExtendedEnumTypeAttributes))]AssemblyExtendedEnumTypeAttribute attr) - { - Assume.That (attr, Is.Not.Null); - Assume.That (attr.ExtensionClass, Is.Not.Null); - Assume.That (attr.ExtensionClass.IsClass); - Assume.That (attr.ExtensionClass.IsSealed); - - Assert.That (attr.ExtensionClass.IsDefined (typeof (ExtensionsForEnumTypeAttribute<>))); - } - - [Test] - [Category("Attributes")] - public void ExtendedEnum_AssemblyHasMatchingAttribute ([ValueSource(nameof(GetExtendedEnum_EnumData))]EnumData enumData) - { - Assume.That (enumData, Is.Not.Null); - Assume.That (enumData.EnumType, Is.Not.Null); - Assume.That (enumData.EnumType.IsEnum); - - Assert.That (enumData.EnumType, Has.Attribute ()); - } - - [Test] - public void BoringEnum_DoesNotHaveExtensions ([ValueSource (nameof (_boringEnumTypes))] Type enumType) - { - Assume.That (enumType.IsEnum); - - Assert.That (enumType, Has.No.Attribute ()); - } - - [Test] - public void ExtendedEnum_FastIsDefinedFalse_DoesNotHaveFastIsDefined ([ValueSource (nameof (GetExtendedEnumTypes_FastIsDefinedFalse))] EnumData enumData) - { - Assume.That (enumData.EnumType.IsEnum); - Assume.That (enumData.EnumType, Has.Attribute ()); - Assume.That (enumData.GeneratorAttribute, Is.Not.Null); - Assume.That (enumData.GeneratorAttribute, Is.EqualTo (enumData.EnumType.GetCustomAttribute ())); - Assume.That (enumData.GeneratorAttribute, Has.Property ("FastIsDefined").False); - Assume.That (enumData.ExtensionClass, Is.Not.Null); - - Assert.That (enumData.ExtensionClass!.GetMethod ("FastIsDefined"), Is.Null); - } - - [Test] - public void ExtendedEnum_StaticExtensionClassExists ([ValueSource (nameof (ExtendedEnumTypes))] Type enumType) - { - Assume.That (enumType.IsEnum); - Assume.That (enumType, Has.Attribute ()); - Assume.That (enumType, Has.Attribute ()); - } - - [Test] - public void ExtendedEnum_FastIsDefinedTrue_HasFastIsDefined ([ValueSource (nameof (GetExtendedEnumTypes_FastIsDefinedTrue))] EnumData enumData) - { - Assume.That (enumData.EnumType, Is.Not.Null); - Assume.That (enumData.EnumType.IsEnum); - Assume.That (enumData.EnumType, Has.Attribute ()); - Assume.That (enumData.ExtensionClass, Is.Not.Null); - TypeWrapper extensionClassTypeInfo = new(enumData.ExtensionClass!); - Assume.That (extensionClassTypeInfo.IsStaticClass); - Assume.That (enumData.GeneratorAttribute, Is.Not.Null); - Assume.That (enumData.GeneratorAttribute, Is.EqualTo (enumData.EnumType.GetCustomAttribute ())); - Assume.That (enumData.GeneratorAttribute, Has.Property ("FastIsDefined").True); - - MethodInfo? fastIsDefinedMethod = enumData.ExtensionClass!.GetMethod ("FastIsDefined"); - - Assert.That (fastIsDefinedMethod, Is.Not.Null); - Assert.That (fastIsDefinedMethod, Has.Attribute ()); - extensionClassTypeInfo.GetMethodsWithAttribute (false); - - - } - - private static IEnumerable GetExtendedEnum_EnumData () - { - _initializationLock.EnterUpgradeableReadLock (); - - try - { - if (!_isInitialized) - { - Initialize (); - } - - return _extendedEnumTypeMappings.Values; - } - finally - { - _initializationLock.ExitUpgradeableReadLock (); - } - } - - private static IEnumerable GetExtendedEnumTypes_FastIsDefinedFalse () - { - _initializationLock.EnterUpgradeableReadLock (); - - try - { - if (!_isInitialized) - { - Initialize (); - } - - return _extendedEnumTypeMappings.Values.Where (static t => t.GeneratorAttribute?.FastIsDefined is false); - } - finally - { - _initializationLock.ExitUpgradeableReadLock (); - } - } - - private static IEnumerable GetExtendedEnumTypes_FastIsDefinedTrue () - { - _initializationLock.EnterUpgradeableReadLock (); - - try - { - if (!_isInitialized) - { - Initialize (); - } - - return _extendedEnumTypeMappings.Values.Where (static t => t.GeneratorAttribute?.FastIsDefined is true); - } - finally - { - _initializationLock.ExitUpgradeableReadLock (); - } - } - - private static void Initialize () - { - if (!_initializationLock.IsUpgradeableReadLockHeld || !_initializationLock.TryEnterWriteLock (5000)) - { - return; - } - - try - { - if (_isInitialized) - { - return; - } - - _allEnumTypes.CollectionChanged += AllEnumTypes_CollectionChanged; - _enumExtensionClasses.CollectionChanged += EnumExtensionClasses_OnCollectionChanged; - - Type [] allAssemblyTypes = Assembly - .GetExecutingAssembly () - .GetTypes (); - - foreach (Type type in allAssemblyTypes.Where (IsDefinedEnum)) - { - _allEnumTypes.Add (type); - } - - foreach (Type type in allAssemblyTypes.Where (HasExtensionForEnumTypeAttribute)) - { - _enumExtensionClasses.Add (type); - } - - _isInitialized = true; - } - finally - { - _initializationLock.ExitWriteLock (); - } - - return; - - static bool IsDefinedEnum (Type t) { return t is { IsEnum: true, IsGenericType: false, IsConstructedGenericType: false, IsTypeDefinition: true }; } - - static void AllEnumTypes_CollectionChanged (object? sender, NotifyCollectionChangedEventArgs e) - { - if (e.Action is not NotifyCollectionChangedAction.Add and not NotifyCollectionChangedAction.Replace || e.NewItems is null) - { - return; - } - - foreach (Type enumType in e.NewItems.OfType ()) - { - if (enumType.GetCustomAttribute () is not { } generatorAttribute) - { - _boringEnumTypes.Add (enumType); - - continue; - } - - _extendedEnumTypeMappings.AddOrUpdate ( - enumType, - CreateNewEnumData, - UpdateGeneratorAttributeProperty, - generatorAttribute); - } - } - - static EnumData CreateNewEnumData (Type tEnum, GenerateEnumExtensionMethodsAttribute attr) { return new (tEnum, attr); } - - static EnumData UpdateGeneratorAttributeProperty (Type tEnum, EnumData data, GenerateEnumExtensionMethodsAttribute attr) - { - data.GeneratorAttribute ??= attr; - - return data; - } - - static void EnumExtensionClasses_OnCollectionChanged (object? sender, NotifyCollectionChangedEventArgs e) - { - if (e.Action != NotifyCollectionChangedAction.Add) - { - return; - } - - foreach (Type extensionClassType in e.NewItems!.OfType ()) - { - if (extensionClassType.GetCustomAttribute (typeof (ExtensionsForEnumTypeAttribute<>), false) is not IExtensionsForEnumTypeAttributes - { - EnumType.IsEnum: true - } extensionForAttribute) - { - continue; - } - - _extendedEnumTypeMappings [extensionForAttribute.EnumType].ExtensionClass ??= extensionClassType; - } - } - } - - private static bool HasExtensionForEnumTypeAttribute (Type t) => t.IsClass && t.IsDefined (typeof (ExtensionsForEnumTypeAttribute<>)); - - public sealed record EnumData ( - Type EnumType, - GenerateEnumExtensionMethodsAttribute? GeneratorAttribute = null, - Type? ExtensionClass = null, - IExtensionsForEnumTypeAttributes? ExtensionForEnumTypeAttribute = null) - { - public Type? ExtensionClass { get; set; } = ExtensionClass; - - public IExtensionsForEnumTypeAttributes? ExtensionForEnumTypeAttribute { get; set; } = ExtensionForEnumTypeAttribute; - public GenerateEnumExtensionMethodsAttribute? GeneratorAttribute { get; set; } = GeneratorAttribute; - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/GlobalSuppressions.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/GlobalSuppressions.cs deleted file mode 100644 index aba37def08..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/GlobalSuppressions.cs +++ /dev/null @@ -1,3 +0,0 @@ -[assembly: SuppressMessage ("Naming", "CA1707:Identifiers should not contain underscores", Scope = "module", Justification = "Naming is intentional.")] -[assembly: SuppressMessage ("Roslynator", "RCS1154:Sort enum members", Scope = "module", Justification = "Order is intentional.")] -[assembly: SuppressMessage ("Naming", "CA1711:Identifiers should not have incorrect suffix", Scope = "module", Justification = "Naming is intentional.")] diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/IndentedTextWriterExtensionsTests.cs b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/IndentedTextWriterExtensionsTests.cs deleted file mode 100644 index 250971d58b..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/IndentedTextWriterExtensionsTests.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System.CodeDom.Compiler; -using System.Text; - -namespace Terminal.Gui.Analyzers.Internal.Tests; - -[TestFixture] -[Category ("Extension Methods")] -[TestOf (typeof (IndentedTextWriterExtensions))] -[Parallelizable (ParallelScope.Children)] -public class IndentedTextWriterExtensionsTests -{ - [Test] - public void Pop_Decrements () - { - StringBuilder sb = new (0); - using var sw = new StringWriter (sb); - using var writer = new IndentedTextWriter (sw); - writer.Indent = 5; - - Assume.That (writer.Indent, Is.EqualTo (5)); - - writer.Pop (); - Assert.That (writer.Indent, Is.EqualTo (4)); - } - - [Test] - public void Pop_WithClosing_WritesAndPops ([Values ("}", ")", "]")] string scopeClosing) - { - StringBuilder sb = new (256); - using var sw = new StringWriter (sb); - using var writer = new IndentedTextWriter (sw, " "); - writer.Indent = 5; - writer.Flush (); - Assume.That (writer.Indent, Is.EqualTo (5)); - Assume.That (sb.Length, Is.Zero); - - // Need to write something first, or IndentedTextWriter won't emit the indentation for the first call. - // So we'll write an empty line. - writer.WriteLine (); - - for (ushort indentCount = 5; indentCount > 0;) - { - writer.Pop (scopeClosing); - Assert.That (writer.Indent, Is.EqualTo (--indentCount)); - } - - writer.Flush (); - var result = sb.ToString (); - - Assert.That ( - result, - Is.EqualTo ( - $""" - - {scopeClosing} - {scopeClosing} - {scopeClosing} - {scopeClosing} - {scopeClosing} - - """)); - } - - [Test] - public void Push_Increments () - { - StringBuilder sb = new (32); - using var sw = new StringWriter (sb); - using var writer = new IndentedTextWriter (sw, " "); - - for (int indentCount = 0; indentCount < 5; indentCount++) - { - writer.Push (); - Assert.That (writer.Indent, Is.EqualTo (indentCount + 1)); - } - } - - [Test] - public void Push_WithOpening_WritesAndPushes ([Values ('{', '(', '[')] char scopeOpening) - { - StringBuilder sb = new (256); - using var sw = new StringWriter (sb); - using var writer = new IndentedTextWriter (sw, " "); - - for (ushort indentCount = 0; indentCount < 5;) - { - writer.Push ("Opening UninterestingEnum", scopeOpening); - Assert.That (writer.Indent, Is.EqualTo (++indentCount)); - } - - writer.Flush (); - var result = sb.ToString (); - - Assert.That ( - result, - Is.EqualTo ( - $""" - Opening UninterestingEnum - {scopeOpening} - Opening UninterestingEnum - {scopeOpening} - Opening UninterestingEnum - {scopeOpening} - Opening UninterestingEnum - {scopeOpening} - Opening UninterestingEnum - {scopeOpening} - - """)); - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Terminal.Gui.Analyzers.Internal.Tests.csproj b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Terminal.Gui.Analyzers.Internal.Tests.csproj deleted file mode 100644 index 42445111d7..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Terminal.Gui.Analyzers.Internal.Tests.csproj +++ /dev/null @@ -1,52 +0,0 @@ - - - - net8.0 - enable - 12 - false - true - true - portable - $(DefineConstants);JETBRAINS_ANNOTATIONS;CONTRACTS_FULL;CODE_ANALYSIS - enable - true - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - Analyzer - true - - - - - - - - - - - - - - - - diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Terminal.Gui.Analyzers.Internal.Tests.csproj.DotSettings b/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Terminal.Gui.Analyzers.Internal.Tests.csproj.DotSettings deleted file mode 100644 index cd5ef68b8e..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal.Tests/Terminal.Gui.Analyzers.Internal.Tests.csproj.DotSettings +++ /dev/null @@ -1,3 +0,0 @@ - - True - True \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/AccessibilityExtensions.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/AccessibilityExtensions.cs deleted file mode 100644 index fb80ebe877..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/AccessibilityExtensions.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Microsoft.CodeAnalysis; - -namespace Terminal.Gui.Analyzers.Internal; - -internal static class AccessibilityExtensions -{ - internal static string ToCSharpString (this Accessibility value) - { - return value switch - { - Accessibility.Public => "public", - Accessibility.Internal => "internal", - Accessibility.Private => "private", - Accessibility.Protected => "protected", - Accessibility.ProtectedAndInternal => "private protected", - Accessibility.ProtectedOrInternal => "protected internal", - _ => string.Empty - }; - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/AnalyzerReleases.Shipped.md b/Analyzers/Terminal.Gui.Analyzers.Internal/AnalyzerReleases.Shipped.md deleted file mode 100644 index 9316c42e0d..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/AnalyzerReleases.Shipped.md +++ /dev/null @@ -1,8 +0,0 @@ -## Release 1.0 - -### New Rules - -Rule ID | Category | Severity | Notes ---------|----------|----------|-------------------- -TG0001 | Usage | Error | TG0001_GlobalNamespaceNotSupported -TG0002 | Usage | Error | TG0002_UnderlyingTypeNotSupported \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/AnalyzerReleases.Unshipped.md b/Analyzers/Terminal.Gui.Analyzers.Internal/AnalyzerReleases.Unshipped.md deleted file mode 100644 index cb4c8a8b91..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/AnalyzerReleases.Unshipped.md +++ /dev/null @@ -1,4 +0,0 @@ -### New Rules - -Rule ID | Category | Severity | Notes ---------|----------|----------|-------------------- diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Analyzers/GenerateEnumExtensionMethodsAttributeAnalyzer.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Analyzers/GenerateEnumExtensionMethodsAttributeAnalyzer.cs deleted file mode 100644 index d49fd37d1c..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Analyzers/GenerateEnumExtensionMethodsAttributeAnalyzer.cs +++ /dev/null @@ -1,117 +0,0 @@ -#define JETBRAINS_ANNOTATIONS -using System.Collections.Immutable; -using System.Linq; -using JetBrains.Annotations; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Diagnostics; -using Terminal.Gui.Analyzers.Internal.Attributes; -using Terminal.Gui.Analyzers.Internal.Generators.EnumExtensions; - -namespace Terminal.Gui.Analyzers.Internal.Analyzers; - -/// -/// Design-time analyzer that checks for proper use of . -/// -[DiagnosticAnalyzer (LanguageNames.CSharp)] -[UsedImplicitly] -internal sealed class GenerateEnumExtensionMethodsAttributeAnalyzer : DiagnosticAnalyzer -{ - // ReSharper disable once InconsistentNaming - private static readonly DiagnosticDescriptor TG0001_GlobalNamespaceNotSupported = new ( - // ReSharper restore InconsistentNaming - "TG0001", - $"{nameof (GenerateEnumExtensionMethodsAttribute)} not supported on global enums", - "{0} is in the global namespace, which is not supported by the source generator ({1}) used by {2}. Move the enum to a namespace or remove the attribute.", - "Usage", - DiagnosticSeverity.Error, - true, - null, - null, - WellKnownDiagnosticTags.NotConfigurable, - WellKnownDiagnosticTags.Compiler); - - // ReSharper disable once InconsistentNaming - private static readonly DiagnosticDescriptor TG0002_UnderlyingTypeNotSupported = new ( - "TG0002", - $"{nameof (GenerateEnumExtensionMethodsAttribute)} not supported for this enum type", - "{0} has an underlying type of {1}, which is not supported by the source generator ({2}) used by {3}. Only enums backed by int or uint are supported.", - "Usage", - DiagnosticSeverity.Error, - true, - null, - null, - WellKnownDiagnosticTags.NotConfigurable, - WellKnownDiagnosticTags.Compiler); - - /// - public override ImmutableArray SupportedDiagnostics { get; } = - [ - TG0001_GlobalNamespaceNotSupported, - TG0002_UnderlyingTypeNotSupported - ]; - - /// - public override void Initialize (AnalysisContext context) - { - context.ConfigureGeneratedCodeAnalysis (GeneratedCodeAnalysisFlags.None); - context.EnableConcurrentExecution (); - - context.RegisterSyntaxNodeAction (CheckAttributeLocations, SyntaxKind.EnumDeclaration); - - return; - - static void CheckAttributeLocations (SyntaxNodeAnalysisContext analysisContext) - { - ISymbol? symbol = analysisContext.SemanticModel.GetDeclaredSymbol (analysisContext.Node) as INamedTypeSymbol; - - if (symbol is not INamedTypeSymbol { EnumUnderlyingType: { } } enumSymbol) - { - // Somehow not even an enum declaration. - // Skip it. - return; - } - - // Check attributes for those we care about and react accordingly. - foreach (AttributeData attributeData in enumSymbol.GetAttributes ()) - { - if (attributeData.AttributeClass?.Name != nameof (GenerateEnumExtensionMethodsAttribute)) - { - // Just skip - not an interesting attribute. - continue; - } - - // Check enum underlying type for supported types (int and uint, currently) - // Report TG0002 if unsupported underlying type. - if (enumSymbol.EnumUnderlyingType is not { SpecialType: SpecialType.System_Int32 or SpecialType.System_UInt32 }) - { - analysisContext.ReportDiagnostic ( - Diagnostic.Create ( - TG0002_UnderlyingTypeNotSupported, - enumSymbol.Locations.FirstOrDefault (), - enumSymbol.Name, - enumSymbol.EnumUnderlyingType.Name, - nameof (EnumExtensionMethodsIncrementalGenerator), - nameof (GenerateEnumExtensionMethodsAttribute) - ) - ); - } - - // Check enum namespace (only non-global supported, currently) - // Report TG0001 if in the global namespace. - if (enumSymbol.ContainingSymbol is not INamespaceSymbol { IsGlobalNamespace: false }) - { - analysisContext.ReportDiagnostic ( - Diagnostic.Create ( - TG0001_GlobalNamespaceNotSupported, - enumSymbol.Locations.FirstOrDefault (), - enumSymbol.Name, - nameof (EnumExtensionMethodsIncrementalGenerator), - nameof (GenerateEnumExtensionMethodsAttribute) - ) - ); - } - } - } - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/ApiCompatExcludedAttributes.txt b/Analyzers/Terminal.Gui.Analyzers.Internal/ApiCompatExcludedAttributes.txt deleted file mode 100644 index 503f1f0bb1..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/ApiCompatExcludedAttributes.txt +++ /dev/null @@ -1,3 +0,0 @@ -N:System.Runtime.CompilerServices -N:System.Diagnostics.CodeAnalysis -N:System.Numerics \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/AssemblyExtendedEnumTypeAttribute.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/AssemblyExtendedEnumTypeAttribute.cs deleted file mode 100644 index da340e0759..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/AssemblyExtendedEnumTypeAttribute.cs +++ /dev/null @@ -1,27 +0,0 @@ -// ReSharper disable ClassNeverInstantiated.Global -// ReSharper disable once RedundantNullableDirective -#nullable enable - -namespace Terminal.Gui.Analyzers.Internal.Attributes; - -/// Assembly attribute declaring a known pairing of an type to an extension class. -/// This attribute should only be written by internal source generators for Terminal.Gui. No other usage of any kind is supported. -[System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple = true)] -internal sealed class AssemblyExtendedEnumTypeAttribute : System.Attribute -{ - /// Creates a new instance of from the provided parameters. - /// The of an decorated with a . - /// The of the decorated with an referring to the same type as . - public AssemblyExtendedEnumTypeAttribute (System.Type enumType, System.Type extensionClass) - { - EnumType = enumType; - ExtensionClass = extensionClass; - } - ///An type that has been extended by Terminal.Gui source generators. - public System.Type EnumType { get; init; } - ///A class containing extension methods for . - public System.Type ExtensionClass { get; init; } - - /// - public override string ToString () => $"{EnumType.Name},{ExtensionClass.Name}"; -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/ExtensionsForEnumTypeAttribute.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/ExtensionsForEnumTypeAttribute.cs deleted file mode 100644 index be4b6eef42..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/ExtensionsForEnumTypeAttribute.cs +++ /dev/null @@ -1,37 +0,0 @@ -// ReSharper disable RedundantNameQualifier -// ReSharper disable RedundantNullableDirective -// ReSharper disable UnusedType.Global -#pragma warning disable IDE0001, IDE0240 -#nullable enable - -namespace Terminal.Gui.Analyzers.Internal.Attributes; - -/// -/// Attribute written by the source generator for extension classes, for easier analysis and reflection. -/// -/// -/// Properties are just convenient shortcuts to properties of . -/// -[System.AttributeUsage (System.AttributeTargets.Class | System.AttributeTargets.Interface)] -internal sealed class ExtensionsForEnumTypeAttribute: System.Attribute, IExtensionsForEnumTypeAttributes where TEnum : struct, System.Enum -{ - /// - /// The namespace-qualified name of . - /// - public string EnumFullName => EnumType.FullName!; - - /// - /// The unqualified name of . - /// - public string EnumName => EnumType.Name; - - /// - /// The namespace containing . - /// - public string EnumNamespace => EnumType.Namespace!; - - /// - /// The given by (). - /// - public System.Type EnumType => typeof (TEnum); -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/GenerateEnumExtensionMethodsAttribute.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/GenerateEnumExtensionMethodsAttribute.cs deleted file mode 100644 index 507c45102c..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/GenerateEnumExtensionMethodsAttribute.cs +++ /dev/null @@ -1,110 +0,0 @@ -// ReSharper disable RedundantNullableDirective -// ReSharper disable RedundantUsingDirective -// ReSharper disable ClassNeverInstantiated.Global - -#nullable enable -using System; -using Attribute = System.Attribute; -using AttributeUsageAttribute = System.AttributeUsageAttribute; -using AttributeTargets = System.AttributeTargets; - -namespace Terminal.Gui.Analyzers.Internal.Attributes; - -/// -/// Used to enable source generation of a common set of extension methods for enum types. -/// -[AttributeUsage (AttributeTargets.Enum)] -internal sealed class GenerateEnumExtensionMethodsAttribute : Attribute -{ - /// - /// The name of the generated static class. - /// - /// - /// If unspecified, null, empty, or only whitespace, defaults to the name of the enum plus "Extensions".
- /// No other validation is performed, so illegal values will simply result in compiler errors. - /// - /// Explicitly specifying a default value is unnecessary and will result in unnecessary processing. - /// - ///
- public string? ClassName { get; set; } - - /// - /// The namespace in which to place the generated static class containing the extension methods. - /// - /// - /// If unspecified, null, empty, or only whitespace, defaults to the namespace of the enum.
- /// No other validation is performed, so illegal values will simply result in compiler errors. - /// - /// Explicitly specifying a default value is unnecessary and will result in unnecessary processing. - /// - ///
- public string? ClassNamespace { get; set; } - - /// - /// Whether to generate a fast, zero-allocation, non-boxing, and reflection-free alternative to the built-in - /// method. - /// - /// - /// - /// Default: false - /// - /// - /// If the enum is not decorated with , this option has no effect. - /// - /// - /// If multiple members have the same value, the first member with that value will be used and subsequent members - /// with the same value will be skipped. - /// - /// - /// Overloads taking the enum type itself as well as the underlying type of the enum will be generated, enabling - /// avoidance of implicit or explicit cast overhead. - /// - /// - /// Explicitly specifying a default value is unnecessary and will result in unnecessary processing. - /// - /// - public bool FastHasFlags { get; set; } - - /// - /// Whether to generate a fast, zero-allocation, and reflection-free alternative to the built-in - /// method, - /// using a switch expression as a hard-coded reverse mapping of numeric values to explicitly-named members. - /// - /// - /// - /// Default: true - /// - /// - /// If multiple members have the same value, the first member with that value will be used and subsequent members - /// with the same value will be skipped. - /// - /// - /// As with the source generator only considers explicitly-named members.
- /// Generation of values which represent valid bitwise combinations of members of enums decorated with - /// is not affected by this property. - ///
- ///
- public bool FastIsDefined { get; init; } = true; - - /// - /// Gets a value indicating if this instance - /// contains default values only. See remarks of this method or documentation on properties of this type for details. - /// - /// - /// A value indicating if all property values are default for this - /// instance. - /// - /// - /// Default values that will result in a return value are:
- /// && ! && - /// && - /// - ///
- public override bool IsDefaultAttribute () - { - return FastIsDefined - && !FastHasFlags - && ClassName is null - && ClassNamespace is null; - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/IExtensionsForEnumTypeAttribute.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/IExtensionsForEnumTypeAttribute.cs deleted file mode 100644 index 4ae8875b7e..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Attributes/IExtensionsForEnumTypeAttribute.cs +++ /dev/null @@ -1,14 +0,0 @@ -// ReSharper disable All - -using System; - -namespace Terminal.Gui.Analyzers.Internal.Attributes; - -/// -/// Interface to simplify general enumeration of constructed generic types for -/// -/// -internal interface IExtensionsForEnumTypeAttributes -{ - Type EnumType { get; } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/IEqualityOperators.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/IEqualityOperators.cs deleted file mode 100644 index 63493a738c..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/IEqualityOperators.cs +++ /dev/null @@ -1,11 +0,0 @@ -// ReSharper disable once CheckNamespace -namespace System.Numerics; -/// -/// Included for compatibility with .net7+, but has no members. -/// Thus it cannot be explicitly used in generator code. -/// Use it for static analysis only. -/// -/// The left operand type. -/// The right operand type. -/// The return type. -internal interface IEqualityOperators; \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/IntrinsicAttribute.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/IntrinsicAttribute.cs deleted file mode 100644 index 06cd5b3d50..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/IntrinsicAttribute.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace System.Runtime.CompilerServices; - -[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Field, Inherited = false)] -public sealed class IntrinsicAttribute : Attribute -{ -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/NumericExtensions.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/NumericExtensions.cs deleted file mode 100644 index 8a6df7be99..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Compatibility/NumericExtensions.cs +++ /dev/null @@ -1,43 +0,0 @@ -// ReSharper disable once CheckNamespace -namespace Terminal.Gui.Analyzers.Internal.Compatibility; - -/// -/// Extension methods for and types. -/// -/// -/// This is mostly just for backward compatibility with netstandard2.0. -/// -public static class NumericExtensions -{ - /// - /// Gets the population count (number of bits set to 1) of this 32-bit value. - /// - /// The value to get the population count of. - /// - /// The algorithm is the well-known SWAR (SIMD Within A Register) method for population count.
- /// Included for hardware- and runtime- agnostic support for the equivalent of the x86 popcnt instruction, since - /// System.Numerics.Intrinsics isn't available in netstandard2.0.
- /// It performs the operation simultaneously on 4 bytes at a time, rather than the naive method of testing all 32 bits - /// individually.
- /// Most compilers can recognize this and turn it into a single platform-specific instruction, when available. - ///
- /// - /// An unsigned 32-bit integer value containing the population count of . - /// - [MethodImpl (MethodImplOptions.AggressiveInlining)] - public static uint GetPopCount (this uint value) - { - unchecked - { - value -= (value >> 1) & 0x55555555; - value = (value & 0x33333333) + ((value >> 2) & 0x33333333); - value = (value + (value >> 4)) & 0x0F0F0F0F; - - return (value * 0x01010101) >> 24; - } - } - - /// - [MethodImpl (MethodImplOptions.AggressiveInlining)] - public static uint GetPopCount (this int value) { return GetPopCount (Unsafe.As (ref value)); } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Constants/Strings.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Constants/Strings.cs deleted file mode 100644 index 3ffb234a6d..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Constants/Strings.cs +++ /dev/null @@ -1,204 +0,0 @@ -// ReSharper disable MemberCanBePrivate.Global - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui.Analyzers.Internal.Constants; - -/// String constants for frequently-used boilerplate. -/// These are for performance, instead of using Roslyn to build it all during execution of analyzers. -internal static class Strings -{ - internal const string AnalyzersAttributesNamespace = $"{InternalAnalyzersNamespace}.Attributes"; - - internal const string AssemblyExtendedEnumTypeAttributeFullName = $"{AnalyzersAttributesNamespace}.{nameof (AssemblyExtendedEnumTypeAttribute)}"; - - internal const string DefaultTypeNameSuffix = "Extensions"; - - internal const string FallbackClassNamespace = $"{TerminalGuiRootNamespace}"; - - internal const string InternalAnalyzersNamespace = $"{AnalyzersRootNamespace}.Internal"; - - internal const string TerminalGuiRootNamespace = "Terminal.Gui"; - - private const string AnalyzersRootNamespace = $"{TerminalGuiRootNamespace}.Analyzers"; - private const string NetStandard20CompatibilityNamespace = $"{InternalAnalyzersNamespace}.Compatibility"; - - /// - /// Names of dotnet namespaces and types. Included as compile-time constants to avoid unnecessary work for the Roslyn - /// source generators. - /// - /// Implemented as nested static types because XmlDoc doesn't work on namespaces. - internal static class DotnetNames - { - /// Fully-qualified attribute type names. Specific applications (uses) are in . - internal static class Attributes - { - /// - internal const string CompilerGenerated = $"{Namespaces.System_Runtime_CompilerServices}.{nameof (CompilerGeneratedAttribute)}"; - - /// - internal const string DebuggerNonUserCode = $"{Namespaces.System_Diagnostics}.{nameof (DebuggerNonUserCodeAttribute)}"; - - /// - internal const string ExcludeFromCodeCoverage = $"{Namespaces.System_Diagnostics_CodeAnalysis}.{nameof (ExcludeFromCodeCoverageAttribute)}"; - - internal const string Flags = $"{Namespaces.SystemNs}.{nameof (FlagsAttribute)}"; - - internal const string GeneratedCode = $"{Namespaces.System_CodeDom_Compiler}.{nameof (GeneratedCodeAttribute)}"; - - /// - /// Use of this attribute should be carefully evaluated. - internal const string MethodImpl = $"{Namespaces.System_Runtime_CompilerServices}.{nameof (MethodImplAttribute)}"; - - /// Attributes formatted for use in code, including square brackets. - internal static class Applications - { - // ReSharper disable MemberHidesStaticFromOuterClass - internal const string Flags = $"[{Attributes.Flags}]"; - - /// - internal const string GeneratedCode = $"""[{Attributes.GeneratedCode}("{InternalAnalyzersNamespace}","1.0")]"""; - - /// - /// Use of this attribute should be carefully evaluated. - internal const string AggressiveInlining = $"[{MethodImpl}({Types.MethodImplOptions}.{nameof (MethodImplOptions.AggressiveInlining)})]"; - - /// - internal const string DebuggerNonUserCode = $"[{Attributes.DebuggerNonUserCode}]"; - - /// - internal const string CompilerGenerated = $"[{Attributes.CompilerGenerated}]"; - - /// - internal const string ExcludeFromCodeCoverage = $"[{Attributes.ExcludeFromCodeCoverage}]"; - - // ReSharper restore MemberHidesStaticFromOuterClass - } - } - - /// Names of dotnet namespaces. - internal static class Namespaces - { - internal const string SystemNs = nameof (System); - // ReSharper disable InconsistentNaming - internal const string System_CodeDom = $"{SystemNs}.{nameof (System.CodeDom)}"; - internal const string System_CodeDom_Compiler = $"{System_CodeDom}.{nameof (System.CodeDom.Compiler)}"; - internal const string System_ComponentModel = $"{SystemNs}.{nameof (System.ComponentModel)}"; - internal const string System_Diagnostics = $"{SystemNs}.{nameof (System.Diagnostics)}"; - internal const string System_Diagnostics_CodeAnalysis = $"{System_Diagnostics}.{nameof (System.Diagnostics.CodeAnalysis)}"; - internal const string System_Numerics = $"{SystemNs}.{nameof (System.Numerics)}"; - internal const string System_Runtime = $"{SystemNs}.{nameof (System.Runtime)}"; - internal const string System_Runtime_CompilerServices = $"{System_Runtime}.{nameof (System.Runtime.CompilerServices)}"; - // ReSharper restore InconsistentNaming - } - - internal static class Types - { - internal const string Attribute = $"{Namespaces.SystemNs}.{nameof (System.Attribute)}"; - internal const string AttributeTargets = $"{Namespaces.SystemNs}.{nameof (System.AttributeTargets)}"; - internal const string AttributeUsageAttribute = $"{Namespaces.SystemNs}.{nameof (System.AttributeUsageAttribute)}"; - - internal const string MethodImplOptions = - $"{Namespaces.System_Runtime_CompilerServices}.{nameof (System.Runtime.CompilerServices.MethodImplOptions)}"; - } - } - - internal static class Templates - { - internal const string AutoGeneratedCommentBlock = $""" - //------------------------------------------------------------------------------ - // - // This file and the code it contains was generated by a source generator in - // the {InternalAnalyzersNamespace} library. - // - // Modifications to this file are not supported and will be lost when - // source generation is triggered, either implicitly or explicitly. - // - //------------------------------------------------------------------------------ - """; - - /// - /// A set of explicit type aliases to work around Terminal.Gui having name collisions with types like - /// . - /// - internal const string DotnetExplicitTypeAliasUsingDirectives = $""" - using Attribute = {DotnetNames.Types.Attribute}; - using AttributeUsageAttribute = {DotnetNames.Types.AttributeUsageAttribute}; - using GeneratedCode = {DotnetNames.Attributes.GeneratedCode}; - """; - - /// Using directives for common namespaces in generated code. - internal const string DotnetNamespaceUsingDirectives = $""" - using {DotnetNames.Namespaces.SystemNs}; - using {DotnetNames.Namespaces.System_CodeDom}; - using {DotnetNames.Namespaces.System_CodeDom_Compiler}; - using {DotnetNames.Namespaces.System_ComponentModel}; - using {DotnetNames.Namespaces.System_Numerics}; - using {DotnetNames.Namespaces.System_Runtime}; - using {DotnetNames.Namespaces.System_Runtime_CompilerServices}; - """; - - /// - /// A set of empty namespaces that MAY be referenced in generated code, especially in using statements, - /// which are always included to avoid additional complexity due to conditional compilation. - /// - internal const string DummyNamespaceDeclarations = $$""" - // These are dummy declarations to avoid complexity with conditional compilation. - #pragma warning disable IDE0079 // Remove unnecessary suppression - #pragma warning disable RCS1259 // Remove empty syntax - namespace {{TerminalGuiRootNamespace}} { } - namespace {{AnalyzersRootNamespace}} { } - namespace {{InternalAnalyzersNamespace}} { } - namespace {{NetStandard20CompatibilityNamespace}} { } - namespace {{AnalyzersAttributesNamespace}} { } - #pragma warning restore RCS1259 // Remove empty syntax - #pragma warning restore IDE0079 // Remove unnecessary suppression - """; - - internal const string StandardHeader = $""" - {AutoGeneratedCommentBlock} - // ReSharper disable RedundantUsingDirective - // ReSharper disable once RedundantNullableDirective - {NullableContextDirective} - - {StandardUsingDirectivesText} - """; - - /// - /// Standard set of using directives for generated extension method class files. - /// Not all are always needed, but all are included so we don't have to worry about it. - /// - internal const string StandardUsingDirectivesText = $""" - {DotnetNamespaceUsingDirectives} - {DotnetExplicitTypeAliasUsingDirectives} - using {TerminalGuiRootNamespace}; - using {AnalyzersRootNamespace}; - using {InternalAnalyzersNamespace}; - using {AnalyzersAttributesNamespace}; - using {NetStandard20CompatibilityNamespace}; - """; - - internal const string AttributesForGeneratedInterfaces = $""" - {DotnetNames.Attributes.Applications.GeneratedCode} - {DotnetNames.Attributes.Applications.CompilerGenerated} - """; - - internal const string AttributesForGeneratedTypes = $""" - {DotnetNames.Attributes.Applications.GeneratedCode} - {DotnetNames.Attributes.Applications.CompilerGenerated} - {DotnetNames.Attributes.Applications.DebuggerNonUserCode} - {DotnetNames.Attributes.Applications.ExcludeFromCodeCoverage} - """; - - /// - /// Preprocessor directive to enable nullability context for generated code.
- /// This should always be emitted, as it applies only to generated code.
- /// As such, generated code MUST be properly annotated. - ///
- internal const string NullableContextDirective = "#nullable enable"; - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/CodeWriter.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/CodeWriter.cs deleted file mode 100644 index f35e20d88c..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/CodeWriter.cs +++ /dev/null @@ -1,235 +0,0 @@ -using System; -using System.CodeDom.Compiler; -using System.Diagnostics.CodeAnalysis; -using System.IO; -using System.Text; -using Microsoft.CodeAnalysis.Text; -using Terminal.Gui.Analyzers.Internal.Constants; - -namespace Terminal.Gui.Analyzers.Internal.Generators.EnumExtensions; - -/// -/// The class responsible for turning an -/// into actual C# code. -/// -/// Try to use this type as infrequently as possible. -/// -/// A reference to an which will be used -/// to generate the extension class code. The object will not be validated, -/// so it is critical that it be correct and remain unchanged while in use -/// by an instance of this class. Behavior if those rules are not followed -/// is undefined. -/// -[SuppressMessage ("CodeQuality", "IDE0079", Justification = "Suppressions here are intentional and the warnings they disable are just noise.")] -internal sealed class CodeWriter (in EnumExtensionMethodsGenerationInfo metadata) : IStandardCSharpCodeGenerator -{ - // Using the null suppression operator here because this will always be - // initialized to non-null before a reference to it is returned. - private SourceText _sourceText = null!; - - /// - public EnumExtensionMethodsGenerationInfo Metadata - { - [MethodImpl (MethodImplOptions.AggressiveInlining)] - [return: NotNull] - get; - [param: DisallowNull] - set; - } = metadata; - - /// - public ref readonly SourceText GenerateSourceText (Encoding? encoding = null) - { - encoding ??= Encoding.UTF8; - _sourceText = SourceText.From (GetFullSourceText (), encoding); - - return ref _sourceText; - } - - /// - /// Gets the using directive for the namespace containing the enum, - /// if different from the extension class namespace, or an empty string, if they are the same. - /// - private string EnumNamespaceUsingDirective => Metadata.TargetTypeNamespace != Metadata.GeneratedTypeNamespace - - // ReSharper disable once HeapView.ObjectAllocation - ? $"using {Metadata.TargetTypeNamespace};" - : string.Empty; - - private string EnumTypeKeyword => Metadata.EnumBackingTypeCode switch - { - TypeCode.Int32 => "int", - TypeCode.UInt32 => "uint", - _ => string.Empty - }; - - /// Gets the class declaration line. - private string ExtensionClassDeclarationLine => $"public static partial class {Metadata.GeneratedTypeName}"; - - // ReSharper disable once HeapView.ObjectAllocation - /// Gets the XmlDoc for the extension class declaration. - private string ExtensionClassDeclarationXmlDoc => - $"/// Extension methods for the type."; - - // ReSharper disable once HeapView.ObjectAllocation - /// Gets the extension class file-scoped namespace directive. - private string ExtensionClassNamespaceDirective => $"namespace {Metadata.GeneratedTypeNamespace};"; - - /// - /// An attribute to decorate the extension class with for easy mapping back to the target enum type, for reflection and - /// analysis. - /// - private string ExtensionsForTypeAttributeLine => $"[ExtensionsForEnumType<{Metadata.TargetTypeFullName}>]"; - - /// - /// Creates the code for the FastHasFlags method. - /// - /// - /// Since the generator already only writes code for enums backed by and , - /// this method is safe, as we'll always be using a DWORD. - /// - /// An instance of an to write to. - private void GetFastHasFlagsMethods (IndentedTextWriter w) - { - // The version taking the same enum type as the check value. - w.WriteLine ( - $"/// Determines if the specified flags are set in the current value of this ."); - w.WriteLine ("/// NO VALIDATION IS PERFORMED!"); - - w.WriteLine ( - $"/// True, if all flags present in are also present in the current value of the .
Otherwise false.
"); - w.WriteLine (Strings.DotnetNames.Attributes.Applications.AggressiveInlining); - - w.Push ( - $"{Metadata.Accessibility.ToCSharpString ()} static bool FastHasFlags (this {Metadata.TargetTypeFullName} e, {Metadata.TargetTypeFullName} checkFlags)"); - w.WriteLine ($"ref uint enumCurrentValueRef = ref Unsafe.As<{Metadata.TargetTypeFullName},uint> (ref e);"); - w.WriteLine ($"ref uint checkFlagsValueRef = ref Unsafe.As<{Metadata.TargetTypeFullName},uint> (ref checkFlags);"); - w.WriteLine ("return (enumCurrentValueRef & checkFlagsValueRef) == checkFlagsValueRef;"); - w.Pop (); - - // The version taking the underlying type of the enum as the check value. - w.WriteLine ( - $"/// Determines if the specified mask bits are set in the current value of this ."); - - w.WriteLine ( - $"/// The value to check against the value."); - w.WriteLine ("/// A mask to apply to the current value."); - - w.WriteLine ( - $"/// True, if all bits set to 1 in the mask are also set to 1 in the current value of the .
Otherwise false.
"); - w.WriteLine ("/// NO VALIDATION IS PERFORMED!"); - w.WriteLine (Strings.DotnetNames.Attributes.Applications.AggressiveInlining); - - w.Push ( - $"{Metadata.Accessibility.ToCSharpString ()} static bool FastHasFlags (this {Metadata.TargetTypeFullName} e, {EnumTypeKeyword} mask)"); - w.WriteLine ($"ref {EnumTypeKeyword} enumCurrentValueRef = ref Unsafe.As<{Metadata.TargetTypeFullName},{EnumTypeKeyword}> (ref e);"); - w.WriteLine ("return (enumCurrentValueRef & mask) == mask;"); - w.Pop (); - } - - /// - /// Creates the code for the FastIsDefined method. - /// - [SuppressMessage ("ReSharper", "SwitchStatementHandlesSomeKnownEnumValuesWithDefault", Justification = "Only need to handle int and uint.")] - [SuppressMessage ("ReSharper", "SwitchStatementMissingSomeEnumCasesNoDefault", Justification = "Only need to handle int and uint.")] - private void GetFastIsDefinedMethod (IndentedTextWriter w) - { - w.WriteLine ( - $"/// Determines if the specified value is explicitly defined as a named value of the type."); - - w.WriteLine ( - "/// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are not explicitly named will return false."); - - w.Push ( - $"{Metadata.Accessibility.ToCSharpString ()} static bool FastIsDefined (this {Metadata.TargetTypeFullName} e, {EnumTypeKeyword} value)"); - w.Push ("return value switch"); - - switch (Metadata.EnumBackingTypeCode) - { - case TypeCode.Int32: - foreach (int definedValue in Metadata._intMembers) - { - w.WriteLine ($"{definedValue:D} => true,"); - } - - break; - case TypeCode.UInt32: - foreach (uint definedValue in Metadata._uIntMembers) - { - w.WriteLine ($"{definedValue:D} => true,"); - } - - break; - } - - w.WriteLine ("_ => false"); - - w.Pop ("};"); - w.Pop (); - } - - private string GetFullSourceText () - { - StringBuilder sb = new ( - $""" - {Strings.Templates.StandardHeader} - - [assembly: {Strings.AssemblyExtendedEnumTypeAttributeFullName} (typeof({Metadata.TargetTypeFullName}), typeof({Metadata.GeneratedTypeFullName}))] - - {EnumNamespaceUsingDirective} - {ExtensionClassNamespaceDirective} - {ExtensionClassDeclarationXmlDoc} - {Strings.Templates.AttributesForGeneratedTypes} - {ExtensionsForTypeAttributeLine} - {ExtensionClassDeclarationLine} - - """, - 4096); - - using IndentedTextWriter w = new (new StringWriter (sb)); - w.Push (); - - GetNamedValuesToInt32Method (w); - GetNamedValuesToUInt32Method (w); - - if (Metadata.GenerateFastIsDefined) - { - GetFastIsDefinedMethod (w); - } - - if (Metadata.GenerateFastHasFlags) - { - GetFastHasFlagsMethods (w); - } - - w.Pop (); - - w.Flush (); - - return sb.ToString (); - } - - [MethodImpl (MethodImplOptions.AggressiveInlining)] - private void GetNamedValuesToInt32Method (IndentedTextWriter w) - { - w.WriteLine ( - $"/// Directly converts this value to an value with the same binary representation."); - w.WriteLine ("/// NO VALIDATION IS PERFORMED!"); - w.WriteLine (Strings.DotnetNames.Attributes.Applications.AggressiveInlining); - w.Push ($"{Metadata.Accessibility.ToCSharpString ()} static int AsInt32 (this {Metadata.TargetTypeFullName} e)"); - w.WriteLine ($"return Unsafe.As<{Metadata.TargetTypeFullName},int> (ref e);"); - w.Pop (); - } - - [MethodImpl (MethodImplOptions.AggressiveInlining)] - private void GetNamedValuesToUInt32Method (IndentedTextWriter w) - { - w.WriteLine ( - $"/// Directly converts this value to a value with the same binary representation."); - w.WriteLine ("/// NO VALIDATION IS PERFORMED!"); - w.WriteLine (Strings.DotnetNames.Attributes.Applications.AggressiveInlining); - w.Push ($"{Metadata.Accessibility.ToCSharpString ()} static uint AsUInt32 (this {Metadata.TargetTypeFullName} e)"); - w.WriteLine ($"return Unsafe.As<{Metadata.TargetTypeFullName},uint> (ref e);"); - w.Pop (); - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/EnumExtensionMethodsGenerationInfo.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/EnumExtensionMethodsGenerationInfo.cs deleted file mode 100644 index cab633cbfc..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/EnumExtensionMethodsGenerationInfo.cs +++ /dev/null @@ -1,443 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Threading; -using JetBrains.Annotations; -using Microsoft.CodeAnalysis; -using Terminal.Gui.Analyzers.Internal.Attributes; -using Terminal.Gui.Analyzers.Internal.Constants; - -namespace Terminal.Gui.Analyzers.Internal.Generators.EnumExtensions; - -/// -/// Type containing the information necessary to generate code according to the declared attribute values, -/// as well as the actual code to create the corresponding source code text, to be used in the -/// source generator pipeline. -/// -/// -/// Minimal validation is performed by this type.
-/// Errors in analyzed source code will result in generation failure or broken output.
-/// This type is not intended for use outside of Terminal.Gui library development. -///
-internal sealed record EnumExtensionMethodsGenerationInfo : IGeneratedTypeMetadata, - IEqualityOperators -{ - private const int ExplicitFastHasFlagsMask = 0b_0100; - private const int ExplicitFastIsDefinedMask = 0b_1000; - private const int ExplicitNameMask = 0b_0010; - private const int ExplicitNamespaceMask = 0b_0001; - private const string GeneratorAttributeFullyQualifiedName = $"{GeneratorAttributeNamespace}.{GeneratorAttributeName}"; - private const string GeneratorAttributeName = nameof (GenerateEnumExtensionMethodsAttribute); - private const string GeneratorAttributeNamespace = Strings.AnalyzersAttributesNamespace; - - /// - /// Type containing the information necessary to generate code according to the declared attribute values, - /// as well as the actual code to create the corresponding source code text, to be used in the - /// source generator pipeline. - /// - /// The fully-qualified namespace of the enum type, without assembly name. - /// - /// The name of the enum type, as would be given by on the enum's type - /// declaration. - /// - /// - /// The fully-qualified namespace in which to place the generated code, without assembly name. If omitted or explicitly - /// null, uses the value provided in . - /// - /// - /// The name of the generated class. If omitted or explicitly null, appends "Extensions" to the value of - /// . - /// - /// The backing type of the enum. Defaults to . - /// - /// Whether to generate a fast HasFlag alternative. (Default: true) Ignored if the enum does not also have - /// . - /// - /// Whether to generate a fast IsDefined alternative. (Default: true) - /// - /// Minimal validation is performed by this type.
- /// Errors in analyzed source code will result in generation failure or broken output.
- /// This type is not intended for use outside of Terminal.Gui library development. - ///
- public EnumExtensionMethodsGenerationInfo ( - string enumNamespace, - string enumTypeName, - string? typeNamespace = null, - string? typeName = null, - TypeCode enumBackingTypeCode = TypeCode.Int32, - bool generateFastHasFlags = true, - bool generateFastIsDefined = true - ) : this (enumNamespace, enumTypeName, enumBackingTypeCode) - { - GeneratedTypeNamespace = typeNamespace ?? enumNamespace; - GeneratedTypeName = typeName ?? string.Concat (enumTypeName, Strings.DefaultTypeNameSuffix); - GenerateFastHasFlags = generateFastHasFlags; - GenerateFastIsDefined = generateFastIsDefined; - } - - public EnumExtensionMethodsGenerationInfo (string enumNamespace, string enumTypeName, TypeCode enumBackingType) - { - // Interning these since they're rather unlikely to change. - string enumInternedNamespace = string.Intern (enumNamespace); - string enumInternedName = string.Intern (enumTypeName); - TargetTypeNamespace = enumInternedNamespace; - TargetTypeName = enumInternedName; - EnumBackingTypeCode = enumBackingType; - } - - [AccessedThroughProperty (nameof (EnumBackingTypeCode))] - private readonly TypeCode _enumBackingTypeCode; - - [AccessedThroughProperty (nameof (GeneratedTypeName))] - private string? _generatedTypeName; - - [AccessedThroughProperty (nameof (GeneratedTypeNamespace))] - private string? _generatedTypeNamespace; - - private BitVector32 _discoveredProperties = new (0); - - /// The name of the extension class. - public string? GeneratedTypeName - { - get => _generatedTypeName ?? string.Concat (TargetTypeName, Strings.DefaultTypeNameSuffix); - set => _generatedTypeName = value ?? string.Concat (TargetTypeName, Strings.DefaultTypeNameSuffix); - } - - /// The namespace for the extension class. - /// - /// Value is not validated by the set accessor.
- /// Get accessor will never return null and is thus marked [NotNull] for static analysis, even though the property is - /// declared as a nullable .
If the backing field for this property is null, the get - /// accessor will return instead. - ///
- public string? GeneratedTypeNamespace - { - get => _generatedTypeNamespace ?? TargetTypeNamespace; - set => _generatedTypeNamespace = value ?? TargetTypeNamespace; - } - - /// - public string TargetTypeFullName => string.Concat (TargetTypeNamespace, ".", TargetTypeName); - - /// - public Accessibility Accessibility - { - get; - [UsedImplicitly] - internal set; - } = Accessibility.Public; - - /// - public TypeKind TypeKind => TypeKind.Class; - - /// - public bool IsRecord => false; - - /// - public bool IsClass => true; - - /// - public bool IsStruct => false; - - /// - public bool IsByRefLike => false; - - /// - public bool IsSealed => false; - - /// - public bool IsAbstract => false; - - /// - public bool IsEnum => false; - - /// - public bool IsStatic => true; - - /// - public bool IncludeInterface => false; - - public string GeneratedTypeFullName => $"{GeneratedTypeNamespace}.{GeneratedTypeName}"; - - /// Whether to generate the extension class as partial (Default: true) - public bool IsPartial => true; - - /// The fully-qualified namespace of the source enum type. - public string TargetTypeNamespace - { - get; - [UsedImplicitly] - set; - } - - /// The UNQUALIFIED name of the source enum type. - public string TargetTypeName - { - get; - [UsedImplicitly] - set; - } - - /// - /// The backing type for the enum. - /// - /// For simplicity and formality, only System.Int32 and System.UInt32 are supported at this time. - public TypeCode EnumBackingTypeCode - { - get => _enumBackingTypeCode; - init - { - if (value is not TypeCode.Int32 and not TypeCode.UInt32) - { - throw new NotSupportedException ("Only System.Int32 and System.UInt32 are supported at this time."); - } - - _enumBackingTypeCode = value; - } - } - - /// - /// Whether a fast alternative to the built-in Enum.HasFlag method will be generated (Default: false) - /// - public bool GenerateFastHasFlags { [UsedImplicitly] get; set; } - - /// Whether a switch-based IsDefined replacement will be generated (Default: true) - public bool GenerateFastIsDefined { [UsedImplicitly]get; set; } = true; - - internal ImmutableHashSet? _intMembers; - internal ImmutableHashSet? _uIntMembers; - - /// - /// Fully-qualified name of the extension class - /// - internal string FullyQualifiedClassName => $"{GeneratedTypeNamespace}.{GeneratedTypeName}"; - - /// - /// Whether a Flags was found on the enum type. - /// - internal bool HasFlagsAttribute {[UsedImplicitly] get; set; } - - private static readonly SymbolDisplayFormat FullyQualifiedSymbolDisplayFormatWithoutGlobal = - SymbolDisplayFormat.FullyQualifiedFormat - .WithGlobalNamespaceStyle ( - SymbolDisplayGlobalNamespaceStyle.Omitted); - - - internal bool TryConfigure (INamedTypeSymbol enumSymbol, CancellationToken cancellationToken) - { - using var cts = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken); - cts.Token.ThrowIfCancellationRequested (); - - ImmutableArray attributes = enumSymbol.GetAttributes (); - - // This is theoretically impossible, but guarding just in case and canceling if it does happen. - if (attributes.Length == 0) - { - cts.Cancel (true); - - return false; - } - - // Check all attributes provided for anything interesting. - // Attributes can be in any order, so just check them all and adjust at the end if necessary. - // Note that we do not perform as strict validation on actual usage of the attribute, at this stage, - // because the analyzer should have already thrown errors for invalid uses like global namespace - // or unsupported enum underlying types. - foreach (AttributeData attr in attributes) - { - cts.Token.ThrowIfCancellationRequested (); - string? attributeFullyQualifiedName = attr.AttributeClass?.ToDisplayString (FullyQualifiedSymbolDisplayFormatWithoutGlobal); - - // Skip if null or not possibly an attribute we care about - if (attributeFullyQualifiedName is null or not { Length: >= 5 }) - { - continue; - } - - switch (attributeFullyQualifiedName) - { - // For Flags enums - case Strings.DotnetNames.Attributes.Flags: - { - HasFlagsAttribute = true; - } - - continue; - - // For the attribute that started this whole thing - case GeneratorAttributeFullyQualifiedName: - - { - // If we can't successfully complete this method, - // something is wrong enough that we may as well just stop now. - if (!TryConfigure (attr, cts.Token)) - { - if (cts.Token.CanBeCanceled) - { - cts.Cancel (); - } - - return false; - } - } - - continue; - } - } - - // Now get the members, if we know we'll need them. - if (GenerateFastIsDefined || GenerateFastHasFlags) - { - if (EnumBackingTypeCode == TypeCode.Int32) - { - PopulateIntMembersHashSet (enumSymbol); - } - else if (EnumBackingTypeCode == TypeCode.UInt32) - { - PopulateUIntMembersHashSet (enumSymbol); - } - } - - return true; - } - - private void PopulateIntMembersHashSet (INamedTypeSymbol enumSymbol) - { - ImmutableArray enumMembers = enumSymbol.GetMembers (); - IEnumerable fieldSymbols = enumMembers.OfType (); - _intMembers = fieldSymbols.Select (static m => m.HasConstantValue ? (int)m.ConstantValue : 0).ToImmutableHashSet (); - } - private void PopulateUIntMembersHashSet (INamedTypeSymbol enumSymbol) - { - _uIntMembers = enumSymbol.GetMembers ().OfType ().Select (static m => (uint)m.ConstantValue).ToImmutableHashSet (); - } - - private bool HasExplicitFastHasFlags - { - [UsedImplicitly]get => _discoveredProperties [ExplicitFastHasFlagsMask]; - set => _discoveredProperties [ExplicitFastHasFlagsMask] = value; - } - - private bool HasExplicitFastIsDefined - { - [UsedImplicitly]get => _discoveredProperties [ExplicitFastIsDefinedMask]; - set => _discoveredProperties [ExplicitFastIsDefinedMask] = value; - } - - private bool HasExplicitTypeName - { - get => _discoveredProperties [ExplicitNameMask]; - set => _discoveredProperties [ExplicitNameMask] = value; - } - - private bool HasExplicitTypeNamespace - { - get => _discoveredProperties [ExplicitNamespaceMask]; - set => _discoveredProperties [ExplicitNamespaceMask] = value; - } - - [MemberNotNullWhen (true, nameof (_generatedTypeName), nameof (_generatedTypeNamespace))] - private bool TryConfigure (AttributeData attr, CancellationToken cancellationToken) - { - using var cts = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken); - cts.Token.ThrowIfCancellationRequested (); - - if (attr is not { NamedArguments.Length: > 0 }) - { - // Just a naked attribute, so configure with appropriate defaults. - GeneratedTypeNamespace = TargetTypeNamespace; - GeneratedTypeName = string.Concat (TargetTypeName, Strings.DefaultTypeNameSuffix); - - return true; - } - - cts.Token.ThrowIfCancellationRequested (); - - foreach (KeyValuePair kvp in attr.NamedArguments) - { - string? propName = kvp.Key; - TypedConstant propValue = kvp.Value; - - cts.Token.ThrowIfCancellationRequested (); - - // For every property name and value pair, set associated metadata - // property, if understood. - switch (propName, propValue) - { - // Null or empty string doesn't make sense, so skip if it happens. - case (null, _): - case ("", _): - continue; - - // ClassName is specified, not explicitly null, and at least 1 character long. - case (AttributeProperties.TypeNamePropertyName, { IsNull: false, Value: string { Length: > 1 } classNameProvidedValue }): - if (string.IsNullOrWhiteSpace (classNameProvidedValue)) - { - return false; - } - - GeneratedTypeName = classNameProvidedValue; - HasExplicitTypeName = true; - - continue; - - // Class namespace is specified, not explicitly null, and at least 1 character long. - case (AttributeProperties.TypeNamespacePropertyName, { IsNull: false, Value: string { Length: > 1 } classNamespaceProvidedValue }): - - if (string.IsNullOrWhiteSpace (classNamespaceProvidedValue)) - { - return false; - } - - GeneratedTypeNamespace = classNamespaceProvidedValue; - HasExplicitTypeNamespace = true; - - continue; - - // FastHasFlags is specified - case (AttributeProperties.FastHasFlagsPropertyName, { IsNull: false } fastHasFlagsConstant): - GenerateFastHasFlags = fastHasFlagsConstant.Value is true; - HasExplicitFastHasFlags = true; - - continue; - - // FastIsDefined is specified - case (AttributeProperties.FastIsDefinedPropertyName, { IsNull: false } fastIsDefinedConstant): - GenerateFastIsDefined = fastIsDefinedConstant.Value is true; - HasExplicitFastIsDefined = true; - - continue; - } - } - - // The rest is simple enough it's not really worth worrying about cancellation, so don't bother from here on... - - // Configure anything that wasn't specified that doesn't have an implicitly safe default - if (!HasExplicitTypeName || _generatedTypeName is null) - { - _generatedTypeName = string.Concat (TargetTypeName, Strings.DefaultTypeNameSuffix); - } - - if (!HasExplicitTypeNamespace || _generatedTypeNamespace is null) - { - _generatedTypeNamespace = TargetTypeNamespace; - } - - if (!HasFlagsAttribute) - { - GenerateFastHasFlags = false; - } - - return true; - } - - private static class AttributeProperties - { - internal const string FastHasFlagsPropertyName = nameof (GenerateEnumExtensionMethodsAttribute.FastHasFlags); - internal const string FastIsDefinedPropertyName = nameof (GenerateEnumExtensionMethodsAttribute.FastIsDefined); - internal const string TypeNamePropertyName = nameof (GenerateEnumExtensionMethodsAttribute.ClassName); - internal const string TypeNamespacePropertyName = nameof (GenerateEnumExtensionMethodsAttribute.ClassNamespace); - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/EnumExtensionMethodsIncrementalGenerator.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/EnumExtensionMethodsIncrementalGenerator.cs deleted file mode 100644 index 7629fd8c21..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Generators/EnumExtensions/EnumExtensionMethodsIncrementalGenerator.cs +++ /dev/null @@ -1,452 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using System.Text; -using System.Threading; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Text; -using Terminal.Gui.Analyzers.Internal.Attributes; -using Terminal.Gui.Analyzers.Internal.Constants; - -namespace Terminal.Gui.Analyzers.Internal.Generators.EnumExtensions; - -/// -/// Incremental code generator for enums decorated with . -/// -[SuppressMessage ("CodeQuality", "IDE0079", Justification = "Suppressions here are intentional and the warnings they disable are just noise.")] -[Generator (LanguageNames.CSharp)] -public sealed class EnumExtensionMethodsIncrementalGenerator : IIncrementalGenerator -{ - private const string ExtensionsForEnumTypeAttributeFullyQualifiedName = $"{Strings.AnalyzersAttributesNamespace}.{ExtensionsForEnumTypeAttributeName}"; - private const string ExtensionsForEnumTypeAttributeName = "ExtensionsForEnumTypeAttribute"; - private const string GeneratorAttributeFullyQualifiedName = $"{Strings.AnalyzersAttributesNamespace}.{GeneratorAttributeName}"; - private const string GeneratorAttributeName = nameof (GenerateEnumExtensionMethodsAttribute); - - /// Fully-qualified symbol name format without the "global::" prefix. - private static readonly SymbolDisplayFormat _fullyQualifiedSymbolDisplayFormatWithoutGlobal = - SymbolDisplayFormat.FullyQualifiedFormat.WithGlobalNamespaceStyle (SymbolDisplayGlobalNamespaceStyle.Omitted); - - /// - /// - /// - /// Basically, this method is called once by the compiler, and is responsible for wiring up - /// everything important about how source generation works. - /// - /// - /// See in-line comments for specifics of what's going on. - /// - /// - /// Note that is everything in the compilation, - /// except for code generated by this generator or generators which have not yet executed.
- /// The methods registered to perform generation get called on-demand by the host (the IDE, - /// compiler, etc), sometimes as often as every single keystroke. - ///
- ///
- public void Initialize (IncrementalGeneratorInitializationContext context) - { - // Write out namespaces that may be used later. Harmless to declare them now and will avoid - // additional processing and potential omissions later on. - context.RegisterPostInitializationOutput (GenerateDummyNamespaces); - - // This executes the delegate given to it immediately after Roslyn gets all set up. - // - // As written, this will result in the GenerateEnumExtensionMethodsAttribute code - // being added to the environment, so that it can be used without having to actually - // be declared explicitly in the target project. - // This is important, as it guarantees the type will exist and also guarantees it is - // defined exactly as the generator expects it to be defined. - context.RegisterPostInitializationOutput (GenerateAttributeSources); - - // Next up, we define our pipeline. - // To do so, we create one or more IncrementalValuesProvider objects, each of which - // defines on stage of analysis or generation as needed. - // - // Critically, these must be as fast and efficient as reasonably possible because, - // once the pipeline is registered, this stuff can get called A LOT. - // - // Note that declaring these doesn't really do much of anything unless they are given to the - // RegisterSourceOutput method at the end of this method. - // - // The delegates are not actually evaluated right here. That is triggered by changes being - // made to the source code. - - // This provider grabs attributes that pass our filter and then creates lightweight - // metadata objects to be used in the final code generation step. - // It also preemptively removes any nulls from the collection before handing things off - // to the code generation logic. - IncrementalValuesProvider enumGenerationInfos = - context - .SyntaxProvider - - // This method is a highly-optimized (and highly-recommended) filter on the incoming - // code elements that only bothers to present code that is annotated with the specified - // attribute, by its fully-qualified name, as a string, which is the first parameter. - // - // Two delegates are passed to it, in the second and third parameters. - // - // The second parameter is a filter predicate taking each SyntaxNode that passes the - // name filter above, and then refines that result. - // - // It is critical that the filter predicate be as simple and fast as possible, as it - // will be called a ton, triggered by keystrokes or anything else that modifies code - // in or even related to (in either direction) the pre-filtered code. - // It should collect metadata only and not actually generate any code. - // It must return a boolean indicating whether the supplied SyntaxNode should be - // given to the transform delegate at all. - // - // The third parameter is the "transform" delegate. - // That one only runs when code is changed that passed both the attribute name filter - // and the filter predicate in the second parameter. - // It will be called for everything that passes both of those, so it can still happen - // a lot, but should at least be pretty close. - // In our case, it should be 100% accurate, since we're using OUR attribute, which can - // only be applied to enum types in the first place. - // - // That delegate is responsible for creating some sort of lightweight data structure - // which can later be used to generate the actual source code for output. - // - // THIS DELEGATE DOES NOT GENERATE CODE! - // However, it does need to return instances of the metadata class in use that are either - // null or complete enough to generate meaningful code from, later on. - // - // We then filter out any that were null with the .Where call at the end, so that we don't - // know or care about them when it's time to generate code. - // - // While the syntax of that .Where call is the same as LINQ, that is actually a - // highly-optimized implementation specifically for this use. - .ForAttributeWithMetadataName ( - GeneratorAttributeFullyQualifiedName, - IsPotentiallyInterestingDeclaration, - GatherMetadataForCodeGeneration - ) - .WithTrackingName ("CollectEnumMetadata") - .Where (static eInfo => eInfo is { }); - - // Finally, we wire up any IncrementalValuesProvider instances above to the appropriate - // delegate that takes the SourceProductionContext that is current at run-time and an instance of - // our metadata type and takes appropriate action. - // Typically that means generating code from that metadata and adding it to the compilation via - // the received context object. - // - // As with everything else , the delegate will be invoked once for each item that passed - // all of the filters above, so we get to write that method from the perspective of a single - // enum type declaration. - - context.RegisterSourceOutput (enumGenerationInfos, GenerateSourceFromGenerationInfo); - } - - private static EnumExtensionMethodsGenerationInfo? GatherMetadataForCodeGeneration ( - GeneratorAttributeSyntaxContext context, - CancellationToken cancellationToken - ) - { - var cts = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken); - cancellationToken.ThrowIfCancellationRequested (); - - // If it's not an enum symbol, we don't care. - // EnumUnderlyingType is null for non-enums, so this validates it's an enum declaration. - if (context.TargetSymbol is not INamedTypeSymbol { EnumUnderlyingType: { } } namedSymbol) - { - return null; - } - - INamespaceSymbol? enumNamespaceSymbol = namedSymbol.ContainingNamespace; - - if (enumNamespaceSymbol is null or { IsGlobalNamespace: true }) - { - // Explicitly choosing not to support enums in the global namespace. - // The corresponding analyzer will report this. - return null; - } - - string enumName = namedSymbol.Name; - - string enumNamespace = enumNamespaceSymbol.ToDisplayString (_fullyQualifiedSymbolDisplayFormatWithoutGlobal); - - TypeCode enumTypeCode = namedSymbol.EnumUnderlyingType.Name switch - { - "UInt32" => TypeCode.UInt32, - "Int32" => TypeCode.Int32, - _ => TypeCode.Empty - }; - - EnumExtensionMethodsGenerationInfo info = new ( - enumNamespace, - enumName, - enumTypeCode - ); - - if (!info.TryConfigure (namedSymbol, cts.Token)) - { - cts.Cancel (); - cts.Token.ThrowIfCancellationRequested (); - } - - return info; - } - - - private static void GenerateAttributeSources (IncrementalGeneratorPostInitializationContext postInitializationContext) - { - postInitializationContext - .AddSource ( - $"{nameof (IExtensionsForEnumTypeAttributes)}.g.cs", - SourceText.From ( - $$""" - // ReSharper disable All - {{Strings.Templates.AutoGeneratedCommentBlock}} - using System; - - namespace {{Strings.AnalyzersAttributesNamespace}}; - - /// - /// Interface to simplify general enumeration of constructed generic types for - /// - /// - {{Strings.Templates.AttributesForGeneratedInterfaces}} - public interface IExtensionsForEnumTypeAttributes - { - System.Type EnumType { get; } - } - - """, - Encoding.UTF8)); - - postInitializationContext - .AddSource ( - $"{nameof (AssemblyExtendedEnumTypeAttribute)}.g.cs", - SourceText.From ( - $$""" - // ReSharper disable All - #nullable enable - {{Strings.Templates.AutoGeneratedCommentBlock}} - - namespace {{Strings.AnalyzersAttributesNamespace}}; - - /// Assembly attribute declaring a known pairing of an type to an extension class. - /// This attribute should only be written by internal source generators for Terminal.Gui. No other usage of any kind is supported. - {{Strings.Templates.AttributesForGeneratedTypes}} - [System.AttributeUsageAttribute(System.AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class {{nameof(AssemblyExtendedEnumTypeAttribute)}} : System.Attribute - { - /// Creates a new instance of from the provided parameters. - /// The of an decorated with a . - /// The of the decorated with an referring to the same type as . - public AssemblyExtendedEnumTypeAttribute (System.Type enumType, System.Type extensionClass) - { - EnumType = enumType; - ExtensionClass = extensionClass; - } - /// An type that has been extended by Terminal.Gui source generators. - public System.Type EnumType { get; init; } - /// A class containing extension methods for . - public System.Type ExtensionClass { get; init; } - /// - public override string ToString () => $"{EnumType.Name},{ExtensionClass.Name}"; - } - - """, - Encoding.UTF8)); - - postInitializationContext - .AddSource ( - $"{GeneratorAttributeFullyQualifiedName}.g.cs", - SourceText.From ( - $$""" - {{Strings.Templates.StandardHeader}} - - namespace {{Strings.AnalyzersAttributesNamespace}}; - - /// - /// Used to enable source generation of a common set of extension methods for enum types. - /// - {{Strings.Templates.AttributesForGeneratedTypes}} - [{{Strings.DotnetNames.Types.AttributeUsageAttribute}} ({{Strings.DotnetNames.Types.AttributeTargets}}.Enum)] - public sealed class {{GeneratorAttributeName}} : {{Strings.DotnetNames.Types.Attribute}} - { - /// - /// The name of the generated static class. - /// - /// - /// If unspecified, null, empty, or only whitespace, defaults to the name of the enum plus "Extensions".
- /// No other validation is performed, so illegal values will simply result in compiler errors. - /// - /// Explicitly specifying a default value is unnecessary and will result in unnecessary processing. - /// - ///
- public string? ClassName { get; set; } - - /// - /// The namespace in which to place the generated static class containing the extension methods. - /// - /// - /// If unspecified, null, empty, or only whitespace, defaults to the namespace of the enum.
- /// No other validation is performed, so illegal values will simply result in compiler errors. - /// - /// Explicitly specifying a default value is unnecessary and will result in unnecessary processing. - /// - ///
- public string? ClassNamespace { get; set; } - - /// - /// Whether to generate a fast, zero-allocation, non-boxing, and reflection-free alternative to the built-in - /// method. - /// - /// - /// - /// Default: false - /// - /// - /// If the enum is not decorated with , this option has no effect. - /// - /// - /// If multiple members have the same value, the first member with that value will be used and subsequent members - /// with the same value will be skipped. - /// - /// - /// Overloads taking the enum type itself as well as the underlying type of the enum will be generated, enabling - /// avoidance of implicit or explicit cast overhead. - /// - /// - /// Explicitly specifying a default value is unnecessary and will result in unnecessary processing. - /// - /// - public bool FastHasFlags { get; set; } - - /// - /// Whether to generate a fast, zero-allocation, and reflection-free alternative to the built-in - /// method, - /// using a switch expression as a hard-coded reverse mapping of numeric values to explicitly-named members. - /// - /// - /// - /// Default: true - /// - /// - /// If multiple members have the same value, the first member with that value will be used and subsequent members - /// with the same value will be skipped. - /// - /// - /// As with the source generator only considers explicitly-named members.
- /// Generation of values which represent valid bitwise combinations of members of enums decorated with - /// is not affected by this property. - ///
- ///
- public bool FastIsDefined { get; init; } = true; - - /// - /// Gets a value indicating if this instance - /// contains default values only. See remarks of this method or documentation on properties of this type for details. - /// - /// - /// A value indicating if all property values are default for this - /// instance. - /// - /// - /// Default values that will result in a return value are:
- /// && ! && - /// && - /// - ///
- public override bool IsDefaultAttribute () - { - return FastIsDefined - && !FastHasFlags - && ClassName is null - && ClassNamespace is null; - } - } - - """, - Encoding.UTF8)); - - postInitializationContext - .AddSource ( - $"{ExtensionsForEnumTypeAttributeFullyQualifiedName}.g.cs", - SourceText.From ( - $$""" - // ReSharper disable RedundantNameQualifier - // ReSharper disable RedundantNullableDirective - // ReSharper disable UnusedType.Global - {{Strings.Templates.AutoGeneratedCommentBlock}} - #nullable enable - - namespace {{Strings.AnalyzersAttributesNamespace}}; - - /// - /// Attribute written by the source generator for enum extension classes, for easier analysis and reflection. - /// - /// - /// Properties are just convenient shortcuts to properties of . - /// - {{Strings.Templates.AttributesForGeneratedTypes}} - [System.AttributeUsageAttribute (System.AttributeTargets.Class | System.AttributeTargets.Interface)] - public sealed class {{ExtensionsForEnumTypeAttributeName}}: System.Attribute, IExtensionsForEnumTypeAttributes where TEnum : struct, Enum - { - /// - /// The namespace-qualified name of . - /// - public string EnumFullName => EnumType.FullName!; - - /// - /// The unqualified name of . - /// - public string EnumName => EnumType.Name; - - /// - /// The namespace containing . - /// - public string EnumNamespace => EnumType.Namespace!; - - /// - /// The given by (). - /// - public Type EnumType => typeof (TEnum); - } - - """, - Encoding.UTF8)); - } - - [SuppressMessage ("Roslynator", "RCS1267", Justification = "Intentionally used so that Spans are used.")] - private static void GenerateDummyNamespaces (IncrementalGeneratorPostInitializationContext postInitializeContext) - { - postInitializeContext.AddSource ( - string.Concat (Strings.InternalAnalyzersNamespace, "Namespaces.g.cs"), - SourceText.From (Strings.Templates.DummyNamespaceDeclarations, Encoding.UTF8)); - } - - private static void GenerateSourceFromGenerationInfo (SourceProductionContext context, EnumExtensionMethodsGenerationInfo? enumInfo) - { - // Just in case we still made it this far with a null... - if (enumInfo is not { }) - { - return; - } - - CodeWriter writer = new (enumInfo); - - context.AddSource ($"{enumInfo.FullyQualifiedClassName}.g.cs", writer.GenerateSourceText ()); - } - - /// - /// Returns true if is an EnumDeclarationSyntax - /// whose parent is a NamespaceDeclarationSyntax, FileScopedNamespaceDeclarationSyntax, or a - /// (Class|Struct)DeclarationSyntax.
- /// Additional filtering is performed in later stages. - ///
- private static bool IsPotentiallyInterestingDeclaration (SyntaxNode syntaxNode, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested (); - - return syntaxNode is - { - RawKind: 8858, //(int)SyntaxKind.EnumDeclaration, - Parent.RawKind: 8845 //(int)SyntaxKind.FileScopedNamespaceDeclaration - or 8842 //(int)SyntaxKind.NamespaceDeclaration - or 8855 //(int)SyntaxKind.ClassDeclaration - or 8856 //(int)SyntaxKind.StructDeclaration - or 9068 //(int)SyntaxKind.RecordStructDeclaration - or 9063 //(int)SyntaxKind.RecordDeclaration - }; - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/GlobalSuppressions.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/GlobalSuppressions.cs deleted file mode 100644 index ce2fa970b2..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/GlobalSuppressions.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Diagnostics.CodeAnalysis; - -[assembly: SuppressMessage ("Naming", "CA1708:Names should differ by more than case", Scope = "module", Justification = "That's coming from an external generator.")] diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/IGeneratedTypeMetadata.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/IGeneratedTypeMetadata.cs deleted file mode 100644 index c72a8cc448..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/IGeneratedTypeMetadata.cs +++ /dev/null @@ -1,38 +0,0 @@ -using JetBrains.Annotations; -using Microsoft.CodeAnalysis; - -namespace Terminal.Gui.Analyzers.Internal; - -/// -/// Interface for all generators to use for their metadata classes. -/// -/// The type implementing this interface. -internal interface IGeneratedTypeMetadata where TSelf : IGeneratedTypeMetadata -{ - [UsedImplicitly] - string GeneratedTypeNamespace { get; } - [UsedImplicitly] - string? GeneratedTypeName { get; } - [UsedImplicitly] - string GeneratedTypeFullName { get; } - [UsedImplicitly] - string TargetTypeNamespace { get; } - [UsedImplicitly] - string TargetTypeName { get; } - string TargetTypeFullName { get; } - [UsedImplicitly] - Accessibility Accessibility { get; } - TypeKind TypeKind { get; } - bool IsRecord { get; } - bool IsClass { get; } - bool IsStruct { get; } - [UsedImplicitly] - bool IsPartial { get; } - bool IsByRefLike { get; } - bool IsSealed { get; } - bool IsAbstract { get; } - bool IsEnum { get; } - bool IsStatic { get; } - [UsedImplicitly] - bool IncludeInterface { get; } -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/IStandardCSharpCodeGenerator.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/IStandardCSharpCodeGenerator.cs deleted file mode 100644 index a0e3d584da..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/IStandardCSharpCodeGenerator.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Text; -using JetBrains.Annotations; -using Microsoft.CodeAnalysis.Text; - -namespace Terminal.Gui.Analyzers.Internal; - -internal interface IStandardCSharpCodeGenerator where T : IGeneratedTypeMetadata -{ - /// - /// Generates and returns the full source text corresponding to , - /// in the requested or if not provided. - /// - /// - /// The of the generated source text or if not - /// provided. - /// - /// - [UsedImplicitly] - [SkipLocalsInit] - ref readonly SourceText GenerateSourceText (Encoding? encoding = null); - - /// - /// A type implementing which - /// will be used for source generation. - /// - [UsedImplicitly] - T Metadata { get; set; } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/IndentedTextWriterExtensions.cs b/Analyzers/Terminal.Gui.Analyzers.Internal/IndentedTextWriterExtensions.cs deleted file mode 100644 index 90105d582b..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/IndentedTextWriterExtensions.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System.CodeDom.Compiler; - -namespace Terminal.Gui.Analyzers.Internal; - -/// -/// Just a simple set of extension methods to increment and decrement the indentation -/// level of an via push and pop terms, and to avoid having -/// explicit values all over the place. -/// -public static class IndentedTextWriterExtensions -{ - /// - /// Decrements by 1, but only if it is greater than 0. - /// - /// - /// The resulting indentation level of the . - /// - [MethodImpl (MethodImplOptions.AggressiveInlining)] - public static int Pop (this IndentedTextWriter w, string endScopeDelimiter = "}") - { - if (w.Indent > 0) - { - w.Indent--; - w.WriteLine (endScopeDelimiter); - } - return w.Indent; - } - - /// - /// Decrements by 1 and then writes a closing curly brace. - /// - [MethodImpl (MethodImplOptions.AggressiveInlining)] - public static void PopCurly (this IndentedTextWriter w, bool withSemicolon = false) - { - w.Indent--; - - if (withSemicolon) - { - w.WriteLine ("};"); - } - else - { - w.WriteLine ('}'); - } - } - - /// - /// Increments by 1, with optional parameters to customize the scope push. - /// - /// An instance of an . - /// - /// The first line to be written before indenting and before the optional line or - /// null if not needed. - /// - /// - /// An opening delimiter to write. Written before the indentation and after (if provided). Default is an opening curly brace. - /// - /// Calling with no parameters will write an opening curly brace and a line break at the current indentation and then increment. - [MethodImpl (MethodImplOptions.AggressiveInlining)] - public static void Push (this IndentedTextWriter w, string? declaration = null, char scopeDelimiter = '{') - { - if (declaration is { Length: > 0 }) - { - w.WriteLine (declaration); - } - - w.WriteLine (scopeDelimiter); - - w.Indent++; - } -} diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Properties/launchSettings.json b/Analyzers/Terminal.Gui.Analyzers.Internal/Properties/launchSettings.json deleted file mode 100644 index 6392727336..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "InternalAnalyzers Debug": { - "commandName": "DebugRoslynComponent", - "targetProject": "..\\Terminal.Gui.Analyzers.Internal.Debugging\\Terminal.Gui.Analyzers.Internal.Debugging.csproj" - } - } -} \ No newline at end of file diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Terminal.Gui.Analyzers.Internal.csproj b/Analyzers/Terminal.Gui.Analyzers.Internal/Terminal.Gui.Analyzers.Internal.csproj deleted file mode 100644 index 06ce0794b4..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Terminal.Gui.Analyzers.Internal.csproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - netstandard2.0 - - - - Library - 12 - Terminal.Gui.Analyzers.Internal - disable - true - true - True - true - true - true - True - true - true - - - - - - - - - - - - - $(NoWarn);nullable;CA1067 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Analyzers/Terminal.Gui.Analyzers.Internal/Terminal.Gui.Analyzers.Internal.csproj.DotSettings b/Analyzers/Terminal.Gui.Analyzers.Internal/Terminal.Gui.Analyzers.Internal.csproj.DotSettings deleted file mode 100644 index 6c2c0e27d4..0000000000 --- a/Analyzers/Terminal.Gui.Analyzers.Internal/Terminal.Gui.Analyzers.Internal.csproj.DotSettings +++ /dev/null @@ -1,4 +0,0 @@ - - CSharp120 - InternalsOnly - False \ No newline at end of file diff --git a/NoSamples.slnf b/NoSamples.slnf index f0b1382211..8d2a38dadf 100644 --- a/NoSamples.slnf +++ b/NoSamples.slnf @@ -2,8 +2,6 @@ "solution": { "path": "Terminal.sln", "projects": [ - "Analyzers\\Terminal.Gui.Analyzers.Internal.Tests\\Terminal.Gui.Analyzers.Internal.Tests.csproj", - "Analyzers\\Terminal.Gui.Analyzers.Internal\\Terminal.Gui.Analyzers.Internal.csproj", "Terminal.Gui\\Terminal.Gui.csproj", "UICatalog\\UICatalog.csproj", "UnitTests\\UnitTests.csproj" diff --git a/Release.slnf b/Release.slnf index 4949e26c35..8d2a38dadf 100644 --- a/Release.slnf +++ b/Release.slnf @@ -2,7 +2,6 @@ "solution": { "path": "Terminal.sln", "projects": [ - "Analyzers\\Terminal.Gui.Analyzers.Internal\\Terminal.Gui.Analyzers.Internal.csproj", "Terminal.Gui\\Terminal.Gui.csproj", "UICatalog\\UICatalog.csproj", "UnitTests\\UnitTests.csproj" diff --git a/Scripts/Terminal.Gui.PowerShell.Analyzers.psd1 b/Scripts/Terminal.Gui.PowerShell.Analyzers.psd1 deleted file mode 100644 index c94a3e242d..0000000000 --- a/Scripts/Terminal.Gui.PowerShell.Analyzers.psd1 +++ /dev/null @@ -1,117 +0,0 @@ -# -# Module manifest for module 'Terminal.Gui.Powershell.Analyzers' -# -# Generated by: Brandon Thetford (GitHub @dodexahedron) -# -# Generated on: 4/24/2024 -# - -@{ - -# Script module or binary module file associated with this manifest. -RootModule = '' - -# Version number of this module. -ModuleVersion = '1.0.0' - -# Supported PSEditions -CompatiblePSEditions = @('Core') - -# ID used to uniquely identify this module -GUID = '3e85001d-6539-4cf1-b71c-ec9e983f7fc8' - -# Author of this module -Author = 'Brandon Thetford (GitHub @dodexahedron)' - -# Company or vendor of this module -CompanyName = 'The Terminal.Gui Project' - -# Copyright statement for this module -Copyright = '(c) Brandon Thetford (GitHub @dodexahedron). Provided to the Terminal.Gui project and you under the terms of the MIT License.' - -# Description of the functionality provided by this module -Description = 'Operations involving Terminal.Gui analyzer projects, fur use during development of Terminal.Gui' - -# Minimum version of the PowerShell engine required by this module -PowerShellVersion = '7.4.0' - -# Name of the PowerShell host required by this module -PowerShellHostName = 'ConsoleHost' - -# Minimum version of the PowerShell host required by this module -# PowerShellHostVersion = '' - -# Processor architecture (None, X86, Amd64) required by this module -ProcessorArchitecture = '' - -# Modules that must be imported into the global environment prior to importing this module -RequiredModules = @('Microsoft.PowerShell.Management','Microsoft.PowerShell.Utility','./Terminal.Gui.PowerShell.Core.psd1') - -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() - -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -# ScriptsToProcess = @() - -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() - -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() - -# Modules to import as nested modules. -NestedModules = @('./Terminal.Gui.PowerShell.Analyzers.psm1') - -# Functions to export from this module. -FunctionsToExport = @('Build-Analyzers') - -# Cmdlets to export from this module. -CmdletsToExport = @() - -# Variables to export from this module -VariablesToExport = @() - -# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -AliasesToExport = @() - -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ - - PSData = @{ - - # Tags applied to this module. These help with module discovery in online galleries. - # Tags = @() - - # A URL to the license for this module. - LicenseUri = 'https://github.com/gui-cs/Terminal.Gui/Scripts/COPYRIGHT' - - # A URL to the main website for this project. - ProjectUri = 'https://github.com/gui-cs/Terminal.Gui' - - # A URL to an icon representing this module. - # IconUri = '' - - # ReleaseNotes of this module - # ReleaseNotes = '' - - # Prerelease string of this module - # Prerelease = '' - - # Flag to indicate whether the module requires explicit user acceptance for install/update/save - # RequireLicenseAcceptance = $false - - # External dependent modules of this module - # ExternalModuleDependencies = @() - - } # End of PSData hashtable - -} # End of PrivateData hashtable - -# HelpInfo URI of this module -# HelpInfoURI = '' - -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' - -} - diff --git a/Scripts/Terminal.Gui.PowerShell.Analyzers.psm1 b/Scripts/Terminal.Gui.PowerShell.Analyzers.psm1 deleted file mode 100644 index 8e3a8dc587..0000000000 --- a/Scripts/Terminal.Gui.PowerShell.Analyzers.psm1 +++ /dev/null @@ -1,96 +0,0 @@ -<# - .SYNOPSIS - Builds all analyzer projects in Debug and Release configurations. - .DESCRIPTION - Uses dotnet build to build all analyzer projects, with optional behavior changes via switch parameters. - .PARAMETER AutoClose - Automatically close running Visual Studio processes which have the Terminal.sln solution loaded, before taking any other actions. - .PARAMETER AutoLaunch - Automatically start a new Visual Studio process and load the solution after completion. - .PARAMETER Force - Carry out operations unconditionally and do not prompt for confirmation. - .PARAMETER NoClean - Do not delete the bin and obj folders before building the analyzers. Usually best not to use this, but can speed up the builds slightly. - .PARAMETER Quiet - Write less text output to the terminal. - .INPUTS - None - .OUTPUTS - None -#> -Function Build-Analyzers { - [CmdletBinding()] - param( - [Parameter(Mandatory=$false, HelpMessage="Automatically close running Visual Studio processes which have the Terminal.sln solution loaded, before taking any other actions.")] - [switch]$AutoClose, - [Parameter(Mandatory=$false, HelpMessage="Automatically start a new Visual Studio process and load the solution after completion.")] - [switch]$AutoLaunch, - [Parameter(Mandatory=$false, HelpMessage="Carry out operations unconditionally and do not prompt for confirmation.")] - [switch]$Force, - [Parameter(Mandatory=$false, HelpMessage="Do not delete the bin and obj folders before building the analyzers.")] - [switch]$NoClean, - [Parameter(Mandatory=$false, HelpMessage="Write less text output to the terminal.")] - [switch]$Quiet - ) - - if($AutoClose) { - if(!$Quiet) { - Write-Host Closing Visual Studio processes - } - Close-Solution - } - - if($Force){ - $response = 'Y' - } - elseif(!$Force && $NoClean){ - $response = ($r = Read-Host "Pre-build Terminal.Gui.InternalAnalyzers without removing old build artifacts? [Y/n]") ? $r : 'Y' - } - else{ - $response = ($r = Read-Host "Delete bin and obj folders for Terminal.Gui and Terminal.Gui.InternalAnalyzers and pre-build Terminal.Gui.InternalAnalyzers? [Y/n]") ? $r : 'Y' - } - - if (($response -ne 'Y')) { - Write-Host Took no action - return - } - - Push-Location $InternalAnalyzersProjectDirectory - - if(!$NoClean) { - if(!$Quiet) { - Write-Host Deleting bin and obj folders for Terminal.Gui - } - Remove-Item -Recurse -Force $TerminalGuiProjectDirectory/bin -ErrorAction SilentlyContinue - Remove-Item -Recurse -Force $TerminalGuiProjectDirectory/obj -ErrorAction SilentlyContinue - - if(!$Quiet) { - Write-Host Deleting bin and obj folders for Terminal.Gui.InternalAnalyzers - } - Remove-Item -Recurse -Force $InternalAnalyzersProjectDirectory/bin -ErrorAction SilentlyContinue - Remove-Item -Recurse -Force $InternalAnalyzersProjectDirectory/obj -ErrorAction SilentlyContinue - } - - if(!$Quiet) { - Write-Host Building analyzers in Debug configuration - } - dotnet build $InternalAnalyzersProjectFilePath --no-incremental --nologo --force --configuration Debug - - if(!$Quiet) { - Write-Host Building analyzers in Release configuration - } - dotnet build $InternalAnalyzersProjectFilePath --no-incremental --nologo --force --configuration Release - - Pop-Location - - if(!$AutoLaunch) { - Write-Host -ForegroundColor Green Finished. Restart Visual Studio for changes to take effect. - } else { - if(!$Quiet) { - Write-Host -ForegroundColor Green Finished. Re-loading Terminal.sln. - } - Open-Solution - } - - return -} diff --git a/Scripts/Terminal.Gui.PowerShell.Core.psm1 b/Scripts/Terminal.Gui.PowerShell.Core.psm1 index f4df840497..6a53e10c5e 100644 --- a/Scripts/Terminal.Gui.PowerShell.Core.psm1 +++ b/Scripts/Terminal.Gui.PowerShell.Core.psm1 @@ -69,9 +69,6 @@ Function Set-PowerShellEnvironment { New-Variable -Name SolutionFilePath -Value (Join-Path -Resolve $RepositoryRootDirectory "Terminal.sln") -Option ReadOnly -Scope Global -Visibility Public New-Variable -Name TerminalGuiProjectDirectory -Value (Join-Path -Resolve $RepositoryRootDirectory "Terminal.Gui") -Option ReadOnly -Scope Global -Visibility Public New-Variable -Name TerminalGuiProjectFilePath -Value (Join-Path -Resolve $TerminalGuiProjectDirectory "Terminal.Gui.csproj") -Option ReadOnly -Scope Global -Visibility Public - New-Variable -Name AnalyzersDirectory -Value (Join-Path -Resolve $RepositoryRootDirectory "Analyzers") -Option ReadOnly -Scope Global -Visibility Public - New-Variable -Name InternalAnalyzersProjectDirectory -Value (Join-Path -Resolve $AnalyzersDirectory "Terminal.Gui.Analyzers.Internal") -Option ReadOnly -Scope Global -Visibility Public - New-Variable -Name InternalAnalyzersProjectFilePath -Value (Join-Path -Resolve $InternalAnalyzersProjectDirectory "Terminal.Gui.Analyzers.Internal.csproj") -Option ReadOnly -Scope Global -Visibility Public # Save existing PSModulePath for optional reset later. # If it is already saved, do not overwrite, but continue anyway. @@ -137,9 +134,6 @@ Function Reset-PowerShellEnvironment { Remove-Variable -Name TerminalGuiProjectDirectory -Scope Global -Force -ErrorAction SilentlyContinue Remove-Variable -Name TerminalGuiProjectFilePath -Scope Global -Force -ErrorAction SilentlyContinue Remove-Variable -Name ScriptsDirectory -Scope Global -Force -ErrorAction SilentlyContinue - Remove-Variable -Name AnalyzersDirectory -Scope Global -Force -ErrorAction SilentlyContinue - Remove-Variable -Name InternalAnalyzersProjectDirectory -Scope Global -Force -ErrorAction SilentlyContinue - Remove-Variable -Name InternalAnalyzersProjectFilePath -Scope Global -Force -ErrorAction SilentlyContinue } # This ensures the environment is reset when unloading the module. diff --git a/Scripts/Terminal.Gui.PowerShell.psd1 b/Scripts/Terminal.Gui.PowerShell.psd1 index ca182f375f..3d190a4ac0 100644 --- a/Scripts/Terminal.Gui.PowerShell.psd1 +++ b/Scripts/Terminal.Gui.PowerShell.psd1 @@ -81,7 +81,7 @@ RequiredModules = @( # Modules to import as nested modules of this module. # This module is just a shortcut that loads all of our modules. -NestedModules = @('./Terminal.Gui.PowerShell.Core.psd1', './Terminal.Gui.PowerShell.Analyzers.psd1', './Terminal.Gui.PowerShell.Git.psd1', './Terminal.Gui.PowerShell.Build.psd1') +NestedModules = @('./Terminal.Gui.PowerShell.Core.psd1', './Terminal.Gui.PowerShell.Git.psd1', './Terminal.Gui.PowerShell.Build.psd1') # Functions to export from this module. # Not filtered, so exports all functions exported by all nested modules. diff --git a/Terminal.Gui/Drawing/Alignment.cs b/Terminal.Gui/Drawing/Alignment.cs index 40061a8c19..6a160096f1 100644 --- a/Terminal.Gui/Drawing/Alignment.cs +++ b/Terminal.Gui/Drawing/Alignment.cs @@ -1,12 +1,10 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; /// /// Determines the position of items when arranged in a container. /// -[GenerateEnumExtensionMethods (FastHasFlags = true)] - public enum Alignment { /// diff --git a/Terminal.Gui/Drawing/AlignmentModes.cs b/Terminal.Gui/Drawing/AlignmentModes.cs index 4de4d5c988..b7e0bb87e0 100644 --- a/Terminal.Gui/Drawing/AlignmentModes.cs +++ b/Terminal.Gui/Drawing/AlignmentModes.cs @@ -1,4 +1,4 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; @@ -6,7 +6,6 @@ namespace Terminal.Gui; /// Determines alignment modes for . /// [Flags] -[GenerateEnumExtensionMethods (FastHasFlags = true)] public enum AlignmentModes { /// diff --git a/Terminal.Gui/EnumExtensions/AddOrSubtractExtensions.cs b/Terminal.Gui/EnumExtensions/AddOrSubtractExtensions.cs new file mode 100644 index 0000000000..8fb98d81c0 --- /dev/null +++ b/Terminal.Gui/EnumExtensions/AddOrSubtractExtensions.cs @@ -0,0 +1,51 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class AddOrSubtractExtensions +{ + /// + /// Directly converts this value to an value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this AddOrSubtract e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this AddOrSubtract e) => Unsafe.As (ref e); + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this AddOrSubtract _, int value) + { + return value switch + { + 0 => true, + 1 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/AlignmentExtensions.cs b/Terminal.Gui/EnumExtensions/AlignmentExtensions.cs new file mode 100644 index 0000000000..3666d2de5c --- /dev/null +++ b/Terminal.Gui/EnumExtensions/AlignmentExtensions.cs @@ -0,0 +1,53 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class AlignmentExtensions +{ + /// + /// Directly converts this value to an value with the same + /// binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this Alignment e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the same + /// binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this Alignment e) => Unsafe.As (ref e); + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this Alignment _, int value) + { + return value switch + { + 0 => true, + 1 => true, + 2 => true, + 3 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/AlignmentModesExtensions.cs b/Terminal.Gui/EnumExtensions/AlignmentModesExtensions.cs new file mode 100644 index 0000000000..3babe81b64 --- /dev/null +++ b/Terminal.Gui/EnumExtensions/AlignmentModesExtensions.cs @@ -0,0 +1,90 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class AlignmentModesExtensions +{ + /// + /// Directly converts this value to an value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this AlignmentModes e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this AlignmentModes e) => Unsafe.As (ref e); + + /// + /// Determines if the specified flags are set in the current value of this + /// . + /// + /// NO VALIDATION IS PERFORMED! + /// + /// True, if all flags present in are also present in the current value of the + /// .
Otherwise false. + ///
+ [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this AlignmentModes e, AlignmentModes checkFlags) + { + ref uint enumCurrentValueRef = ref Unsafe.As (ref e); + ref uint checkFlagsValueRef = ref Unsafe.As (ref checkFlags); + + return (enumCurrentValueRef & checkFlagsValueRef) == checkFlagsValueRef; + } + + /// + /// Determines if the specified mask bits are set in the current value of this + /// . + /// + /// The value to check against the value. + /// A mask to apply to the current value. + /// + /// True, if all bits set to 1 in the mask are also set to 1 in the current value of the + /// .
Otherwise false. + ///
+ /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this AlignmentModes e, int mask) + { + ref int enumCurrentValueRef = ref Unsafe.As (ref e); + + return (enumCurrentValueRef & mask) == mask; + } + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this AlignmentModes _, int value) + { + return value switch + { + 0 => true, + 1 => true, + 2 => true, + 4 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/BorderSettingsExtensions.cs b/Terminal.Gui/EnumExtensions/BorderSettingsExtensions.cs new file mode 100644 index 0000000000..074a459760 --- /dev/null +++ b/Terminal.Gui/EnumExtensions/BorderSettingsExtensions.cs @@ -0,0 +1,89 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class BorderSettingsExtensions +{ + /// + /// Directly converts this value to an value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this BorderSettings e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this BorderSettings e) => Unsafe.As (ref e); + + /// + /// Determines if the specified flags are set in the current value of this + /// . + /// + /// NO VALIDATION IS PERFORMED! + /// + /// True, if all flags present in are also present in the current value of the + /// .
Otherwise false. + ///
+ [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this BorderSettings e, BorderSettings checkFlags) + { + ref uint enumCurrentValueRef = ref Unsafe.As (ref e); + ref uint checkFlagsValueRef = ref Unsafe.As (ref checkFlags); + + return (enumCurrentValueRef & checkFlagsValueRef) == checkFlagsValueRef; + } + + /// + /// Determines if the specified mask bits are set in the current value of this + /// . + /// + /// The value to check against the value. + /// A mask to apply to the current value. + /// + /// True, if all bits set to 1 in the mask are also set to 1 in the current value of the + /// .
Otherwise false. + ///
+ /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this BorderSettings e, int mask) + { + ref int enumCurrentValueRef = ref Unsafe.As (ref e); + + return (enumCurrentValueRef & mask) == mask; + } + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this BorderSettings _, int value) + { + return value switch + { + 0 => true, + 1 => true, + 2 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/DimAutoStyleExtensions.cs b/Terminal.Gui/EnumExtensions/DimAutoStyleExtensions.cs new file mode 100644 index 0000000000..6c0813df8e --- /dev/null +++ b/Terminal.Gui/EnumExtensions/DimAutoStyleExtensions.cs @@ -0,0 +1,89 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class DimAutoStyleExtensions +{ + /// + /// Directly converts this value to an value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this DimAutoStyle e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this DimAutoStyle e) => Unsafe.As (ref e); + + /// + /// Determines if the specified flags are set in the current value of this + /// . + /// + /// NO VALIDATION IS PERFORMED! + /// + /// True, if all flags present in are also present in the current value of the + /// .
Otherwise false. + ///
+ [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this DimAutoStyle e, DimAutoStyle checkFlags) + { + ref uint enumCurrentValueRef = ref Unsafe.As (ref e); + ref uint checkFlagsValueRef = ref Unsafe.As (ref checkFlags); + + return (enumCurrentValueRef & checkFlagsValueRef) == checkFlagsValueRef; + } + + /// + /// Determines if the specified mask bits are set in the current value of this + /// . + /// + /// The value to check against the value. + /// A mask to apply to the current value. + /// + /// True, if all bits set to 1 in the mask are also set to 1 in the current value of the + /// .
Otherwise false. + ///
+ /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this DimAutoStyle e, int mask) + { + ref int enumCurrentValueRef = ref Unsafe.As (ref e); + + return (enumCurrentValueRef & mask) == mask; + } + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this DimAutoStyle _, int value) + { + return value switch + { + 1 => true, + 2 => true, + 3 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/DimPercentModeExtensions.cs b/Terminal.Gui/EnumExtensions/DimPercentModeExtensions.cs new file mode 100644 index 0000000000..2fc943f17c --- /dev/null +++ b/Terminal.Gui/EnumExtensions/DimPercentModeExtensions.cs @@ -0,0 +1,51 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class DimPercentModeExtensions +{ + /// + /// Directly converts this value to an value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this DimPercentMode e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this DimPercentMode e) => Unsafe.As (ref e); + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this DimPercentMode _, int value) + { + return value switch + { + 0 => true, + 1 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/DimensionExtensions.cs b/Terminal.Gui/EnumExtensions/DimensionExtensions.cs new file mode 100644 index 0000000000..ccbfbf5ed4 --- /dev/null +++ b/Terminal.Gui/EnumExtensions/DimensionExtensions.cs @@ -0,0 +1,51 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +public static class DimensionExtensions +{ + /// + /// Directly converts this value to an value with the same + /// binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this Dimension e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the same + /// binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this Dimension e) => Unsafe.As (ref e); + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this Dimension _, int value) + { + return value switch + { + 0 => true, + 1 => true, + 2 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/KeyBindingScopeExtensions.cs b/Terminal.Gui/EnumExtensions/KeyBindingScopeExtensions.cs new file mode 100644 index 0000000000..6f42f4c826 --- /dev/null +++ b/Terminal.Gui/EnumExtensions/KeyBindingScopeExtensions.cs @@ -0,0 +1,93 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class KeyBindingScopeExtensions +{ + /// + /// Directly converts this value to an value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this KeyBindingScope e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the + /// same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this KeyBindingScope e) => Unsafe.As (ref e); + + /// + /// Determines if the specified flags are set in the current value of this + /// . + /// + /// NO VALIDATION IS PERFORMED! + /// + /// True, if all flags present in are also present in the current value of the + /// .
Otherwise false. + ///
+ [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this KeyBindingScope e, KeyBindingScope checkFlags) + { + ref uint enumCurrentValueRef = ref Unsafe.As (ref e); + ref uint checkFlagsValueRef = ref Unsafe.As (ref checkFlags); + + return (enumCurrentValueRef & checkFlagsValueRef) == checkFlagsValueRef; + } + + /// + /// Determines if the specified mask bits are set in the current value of this + /// . + /// + /// + /// The value to check against the + /// value. + /// + /// A mask to apply to the current value. + /// + /// True, if all bits set to 1 in the mask are also set to 1 in the current value of the + /// .
Otherwise false. + ///
+ /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this KeyBindingScope e, int mask) + { + ref int enumCurrentValueRef = ref Unsafe.As (ref e); + + return (enumCurrentValueRef & mask) == mask; + } + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this KeyBindingScope _, int value) + { + return value switch + { + 0 => true, + 1 => true, + 2 => true, + 4 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/SideExtensions.cs b/Terminal.Gui/EnumExtensions/SideExtensions.cs new file mode 100644 index 0000000000..b50e12bdc0 --- /dev/null +++ b/Terminal.Gui/EnumExtensions/SideExtensions.cs @@ -0,0 +1,53 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class SideExtensions +{ + /// + /// Directly converts this value to an value with the same binary + /// representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this Side e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with the same binary + /// representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this Side e) => Unsafe.As (ref e); + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this Side _, int value) + { + return value switch + { + 0 => true, + 1 => true, + 2 => true, + 3 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/EnumExtensions/ViewDiagnosticFlagsExtensions.cs b/Terminal.Gui/EnumExtensions/ViewDiagnosticFlagsExtensions.cs new file mode 100644 index 0000000000..1aa18fe72b --- /dev/null +++ b/Terminal.Gui/EnumExtensions/ViewDiagnosticFlagsExtensions.cs @@ -0,0 +1,93 @@ +#nullable enable + +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Terminal.Gui.EnumExtensions; + +/// Extension methods for the type. +[GeneratedCode ("Terminal.Gui.Analyzers.Internal", "1.0")] +[CompilerGenerated] +[DebuggerNonUserCode] +[ExcludeFromCodeCoverage (Justification = "Generated code is already tested.")] +[PublicAPI] +public static class ViewDiagnosticFlagsExtensions +{ + /// + /// Directly converts this value to an value with + /// the same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static int AsInt32 (this ViewDiagnosticFlags e) => Unsafe.As (ref e); + + /// + /// Directly converts this value to a value with + /// the same binary representation. + /// + /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static uint AsUInt32 (this ViewDiagnosticFlags e) => Unsafe.As (ref e); + + /// + /// Determines if the specified flags are set in the current value of this + /// . + /// + /// NO VALIDATION IS PERFORMED! + /// + /// True, if all flags present in are also present in the current value of the + /// .
Otherwise false. + ///
+ [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this ViewDiagnosticFlags e, ViewDiagnosticFlags checkFlags) + { + ref uint enumCurrentValueRef = ref Unsafe.As (ref e); + ref uint checkFlagsValueRef = ref Unsafe.As (ref checkFlags); + + return (enumCurrentValueRef & checkFlagsValueRef) == checkFlagsValueRef; + } + + /// + /// Determines if the specified mask bits are set in the current value of this + /// . + /// + /// + /// The value to check against the + /// value. + /// + /// A mask to apply to the current value. + /// + /// True, if all bits set to 1 in the mask are also set to 1 in the current value of the + /// .
Otherwise false. + ///
+ /// NO VALIDATION IS PERFORMED! + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public static bool FastHasFlags (this ViewDiagnosticFlags e, uint mask) + { + ref uint enumCurrentValueRef = ref Unsafe.As (ref e); + + return (enumCurrentValueRef & mask) == mask; + } + + /// + /// Determines if the specified value is explicitly defined as a named value of the + /// type. + /// + /// + /// Only explicitly named values return true, as with IsDefined. Combined valid flag values of flags enums which are + /// not explicitly named will return false. + /// + public static bool FastIsDefined (this ViewDiagnosticFlags _, uint value) + { + return value switch + { + 0 => true, + 1 => true, + 2 => true, + 4 => true, + _ => false + }; + } +} diff --git a/Terminal.Gui/Input/KeyBindingScope.cs b/Terminal.Gui/Input/KeyBindingScope.cs index 3b6c53ebcb..0c75299c7b 100644 --- a/Terminal.Gui/Input/KeyBindingScope.cs +++ b/Terminal.Gui/Input/KeyBindingScope.cs @@ -1,4 +1,4 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; @@ -10,7 +10,7 @@ namespace Terminal.Gui; /// Key bindings are scoped to the most-focused view () by default. /// [Flags] -[GenerateEnumExtensionMethods (FastHasFlags = true)] + public enum KeyBindingScope { /// The key binding is disabled. diff --git a/Terminal.Gui/Terminal.Gui.csproj b/Terminal.Gui/Terminal.Gui.csproj index b436834a11..3b312dcdd5 100644 --- a/Terminal.Gui/Terminal.Gui.csproj +++ b/Terminal.Gui/Terminal.Gui.csproj @@ -19,7 +19,7 @@ - net8.0 + net8.0 12 $(AssemblyName) true @@ -59,11 +59,6 @@ - - all - Analyzer - false - @@ -73,6 +68,7 @@ + diff --git a/Terminal.Gui/View/Adornment/BorderSettings.cs b/Terminal.Gui/View/Adornment/BorderSettings.cs index 5829d1ed67..7b4846d341 100644 --- a/Terminal.Gui/View/Adornment/BorderSettings.cs +++ b/Terminal.Gui/View/Adornment/BorderSettings.cs @@ -1,4 +1,4 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; @@ -6,7 +6,7 @@ namespace Terminal.Gui; /// Determines the settings for . ///
[Flags] -[GenerateEnumExtensionMethods (FastHasFlags = true)] + public enum BorderSettings { /// diff --git a/Terminal.Gui/View/Layout/AddOrSubtract.cs b/Terminal.Gui/View/Layout/AddOrSubtract.cs index e03cfbcfd2..83d1dd12c7 100644 --- a/Terminal.Gui/View/Layout/AddOrSubtract.cs +++ b/Terminal.Gui/View/Layout/AddOrSubtract.cs @@ -1,11 +1,8 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; - -namespace Terminal.Gui; +namespace Terminal.Gui; /// /// Describes whether an operation should add or subtract values. /// -[GenerateEnumExtensionMethods] public enum AddOrSubtract { /// diff --git a/Terminal.Gui/View/Layout/DimAutoStyle.cs b/Terminal.Gui/View/Layout/DimAutoStyle.cs index f350e80454..ee712f0fb1 100644 --- a/Terminal.Gui/View/Layout/DimAutoStyle.cs +++ b/Terminal.Gui/View/Layout/DimAutoStyle.cs @@ -1,4 +1,4 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; @@ -6,7 +6,7 @@ namespace Terminal.Gui; /// Specifies how will compute the dimension. /// [Flags] -[GenerateEnumExtensionMethods (FastHasFlags = true)] + public enum DimAutoStyle { /// diff --git a/Terminal.Gui/View/Layout/DimPercentMode.cs b/Terminal.Gui/View/Layout/DimPercentMode.cs index 60a7da056c..10077848b6 100644 --- a/Terminal.Gui/View/Layout/DimPercentMode.cs +++ b/Terminal.Gui/View/Layout/DimPercentMode.cs @@ -1,12 +1,10 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; /// /// Indicates the mode for a object. /// -[GenerateEnumExtensionMethods] - public enum DimPercentMode { /// diff --git a/Terminal.Gui/View/Layout/Dimension.cs b/Terminal.Gui/View/Layout/Dimension.cs index cc56ffd4b6..8cfb3f7f08 100644 --- a/Terminal.Gui/View/Layout/Dimension.cs +++ b/Terminal.Gui/View/Layout/Dimension.cs @@ -1,12 +1,10 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; /// /// Indicates the dimension for operations. /// - -[GenerateEnumExtensionMethods] public enum Dimension { /// diff --git a/Terminal.Gui/View/Layout/Side.cs b/Terminal.Gui/View/Layout/Side.cs index 6708904dae..afdc5640ef 100644 --- a/Terminal.Gui/View/Layout/Side.cs +++ b/Terminal.Gui/View/Layout/Side.cs @@ -1,4 +1,4 @@ -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; @@ -6,7 +6,6 @@ namespace Terminal.Gui; /// Indicates the side for operations. /// /// -[GenerateEnumExtensionMethods] public enum Side { /// diff --git a/Terminal.Gui/View/ViewDiagnostics.cs b/Terminal.Gui/View/ViewDiagnostics.cs index 20899cfd0a..c7ac7b851a 100644 --- a/Terminal.Gui/View/ViewDiagnostics.cs +++ b/Terminal.Gui/View/ViewDiagnostics.cs @@ -1,11 +1,10 @@  -using Terminal.Gui.Analyzers.Internal.Attributes; + namespace Terminal.Gui; /// Enables diagnostic functions for . [Flags] -[GenerateEnumExtensionMethods(FastHasFlags = true)] public enum ViewDiagnosticFlags : uint { /// All diagnostics off diff --git a/Terminal.sln b/Terminal.sln index a637627809..0eb947ab4c 100644 --- a/Terminal.sln +++ b/Terminal.sln @@ -14,14 +14,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example", "Example\Example. EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E143FB1F-0B88-48CB-9086-72CDCECFCD22}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{CCADA0BC-61CF-4B4B-96BA-A3B0C0A7F54D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Terminal.Gui.Analyzers.Internal", "Analyzers\Terminal.Gui.Analyzers.Internal\Terminal.Gui.Analyzers.Internal.csproj", "{5DE91722-8765-4E2B-97E4-2A18010B5CED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Terminal.Gui.Analyzers.Internal.Tests", "Analyzers\Terminal.Gui.Analyzers.Internal.Tests\Terminal.Gui.Analyzers.Internal.Tests.csproj", "{715DB4BA-F989-4DF6-B46F-5ED26A32B2DD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Terminal.Gui.Analyzers.Internal.Debugging", "Analyzers\Terminal.Gui.Analyzers.Internal.Debugging\Terminal.Gui.Analyzers.Internal.Debugging.csproj", "{C2AD09BD-D579-45A7-ACA3-E4EF3BC027D2}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkitExample", "CommunityToolkitExample\CommunityToolkitExample.csproj", "{58FDCA8F-08F7-4D80-9DA3-6A9AED01E163}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Settings", "Settings", "{B8F48EE8-34A6-43B7-B00E-CD91CDD93962}" @@ -61,14 +53,6 @@ Global {00F366F8-DEE4-482C-B9FD-6DB0200B79E5}.Debug|Any CPU.Build.0 = Debug|Any CPU {00F366F8-DEE4-482C-B9FD-6DB0200B79E5}.Release|Any CPU.ActiveCfg = Release|Any CPU {00F366F8-DEE4-482C-B9FD-6DB0200B79E5}.Release|Any CPU.Build.0 = Release|Any CPU - {5DE91722-8765-4E2B-97E4-2A18010B5CED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5DE91722-8765-4E2B-97E4-2A18010B5CED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5DE91722-8765-4E2B-97E4-2A18010B5CED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5DE91722-8765-4E2B-97E4-2A18010B5CED}.Release|Any CPU.Build.0 = Release|Any CPU - {715DB4BA-F989-4DF6-B46F-5ED26A32B2DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {715DB4BA-F989-4DF6-B46F-5ED26A32B2DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {715DB4BA-F989-4DF6-B46F-5ED26A32B2DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {715DB4BA-F989-4DF6-B46F-5ED26A32B2DD}.Release|Any CPU.Build.0 = Release|Any CPU {88979F89-9A42-448F-AE3E-3060145F6375}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {88979F89-9A42-448F-AE3E-3060145F6375}.Debug|Any CPU.Build.0 = Debug|Any CPU {88979F89-9A42-448F-AE3E-3060145F6375}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -85,10 +69,6 @@ Global {B0A602CD-E176-449D-8663-64238D54F857}.Debug|Any CPU.Build.0 = Debug|Any CPU {B0A602CD-E176-449D-8663-64238D54F857}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0A602CD-E176-449D-8663-64238D54F857}.Release|Any CPU.Build.0 = Release|Any CPU - {C2AD09BD-D579-45A7-ACA3-E4EF3BC027D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C2AD09BD-D579-45A7-ACA3-E4EF3BC027D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C2AD09BD-D579-45A7-ACA3-E4EF3BC027D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C2AD09BD-D579-45A7-ACA3-E4EF3BC027D2}.Release|Any CPU.Build.0 = Release|Any CPU {58FDCA8F-08F7-4D80-9DA3-6A9AED01E163}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58FDCA8F-08F7-4D80-9DA3-6A9AED01E163}.Debug|Any CPU.Build.0 = Debug|Any CPU {58FDCA8F-08F7-4D80-9DA3-6A9AED01E163}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -98,9 +78,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {5DE91722-8765-4E2B-97E4-2A18010B5CED} = {CCADA0BC-61CF-4B4B-96BA-A3B0C0A7F54D} - {715DB4BA-F989-4DF6-B46F-5ED26A32B2DD} = {CCADA0BC-61CF-4B4B-96BA-A3B0C0A7F54D} - {C2AD09BD-D579-45A7-ACA3-E4EF3BC027D2} = {CCADA0BC-61CF-4B4B-96BA-A3B0C0A7F54D} {B8F48EE8-34A6-43B7-B00E-CD91CDD93962} = {E143FB1F-0B88-48CB-9086-72CDCECFCD22} {13BB2C46-B324-4B9C-92EB-CE6184D4736E} = {E143FB1F-0B88-48CB-9086-72CDCECFCD22} {C7A51224-5E0F-4986-AB37-A6BF89966C12} = {E143FB1F-0B88-48CB-9086-72CDCECFCD22} diff --git a/UICatalog/UICatalog.csproj b/UICatalog/UICatalog.csproj index 1295f4f5a1..df715a3de3 100644 --- a/UICatalog/UICatalog.csproj +++ b/UICatalog/UICatalog.csproj @@ -45,6 +45,7 @@ +