diff --git a/Analyzers/Directory.Build.props b/Analyzers/Directory.Build.props deleted file mode 100644 index 6a6ec1589..000000000 --- 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 559424a1b..000000000 --- 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 5594dd0da..000000000 --- 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 0846f8e90..000000000 --- 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 0fb09b8d9..000000000 --- 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 535f0448f..000000000 --- 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 3b193b54c..000000000 --- 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 ca24165ef..000000000 --- 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 01edea7a5..000000000 --- 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 04f6580ad..000000000 --- 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 2e468941c..000000000 --- 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 00b1b9487..000000000 --- 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 9edb067d8..000000000 --- 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 bfb743df6..000000000 --- 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 8a400ab14..000000000 --- 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 911e64c9c..000000000 --- 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 b69fcd057..000000000 --- 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 a01174e71..000000000 --- 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 39285e26d..000000000 --- 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 c134ab9fa..000000000 --- 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 aba37def0..000000000 --- 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 250971d58..000000000 --- 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 42445111d..000000000 --- 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 cd5ef68b8..000000000 --- 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 fb80ebe87..000000000 --- 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 9316c42e0..000000000 --- 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 cb4c8a8b9..000000000 --- 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 d49fd37d1..000000000 --- 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 503f1f0bb..000000000 --- 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 da340e075..000000000 --- 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 be4b6eef4..000000000 --- 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 507c45102..000000000 --- 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 4ae8875b7..000000000 --- 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 63493a738..000000000 --- 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 06cd5b3d5..000000000 --- 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 8a6df7be9..000000000 --- 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 3ffb234a6..000000000 --- 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 f35e20d88..000000000 --- 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 cab633cbf..000000000 --- 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 7629fd8c2..000000000 --- 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 ce2fa970b..000000000 --- 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 c72a8cc44..000000000 --- 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 a0e3d584d..000000000 --- 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 90105d582..000000000 --- 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 639272733..000000000 --- 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 06ce0794b..000000000 --- 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 6c2c0e27d..000000000 --- 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