From f42cbdbd8a6a23939bed3841882a93203e9a93f4 Mon Sep 17 00:00:00 2001 From: Callum Tolley Date: Tue, 6 Jan 2026 14:54:29 +0000 Subject: [PATCH 1/3] Fix non-integer warning disables --- .gitignore | 1 + grammars/csharp.tmLanguage | 4 +- grammars/csharp.tmLanguage.cson | 4 +- src/csharp.tmLanguage.yml | 4 +- test/preprocessor.tests.ts | 92 +++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 1439d28..ccbe9df 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ out/ grammars/*.json npm-debug.log* copy.sh +bun.lock \ No newline at end of file diff --git a/grammars/csharp.tmLanguage b/grammars/csharp.tmLanguage index 3906d58..b9ff444 100644 --- a/grammars/csharp.tmLanguage +++ b/grammars/csharp.tmLanguage @@ -8978,7 +8978,7 @@ preprocessor-pragma-warning match - \b(pragma)\b\s*\b(warning)\b\s*\b(?:(disable)|(restore))\b(\s*[0-9]+(?:\s*,\s*[0-9]+)?)? + \b(pragma)\b\s*\b(warning)\b\s*\b(?:(disable)|(restore))\b(\s*[A-Za-z]*[0-9]+(?:\s*,\s*[A-Za-z]*[0-9]+)?)? captures 1 @@ -9007,7 +9007,7 @@ match - [0-9]+ + [A-Za-z]*[0-9]+ captures 0 diff --git a/grammars/csharp.tmLanguage.cson b/grammars/csharp.tmLanguage.cson index 0fb74a7..fe25c2c 100644 --- a/grammars/csharp.tmLanguage.cson +++ b/grammars/csharp.tmLanguage.cson @@ -5379,7 +5379,7 @@ repository: } ] "preprocessor-pragma-warning": - match: "\\b(pragma)\\b\\s*\\b(warning)\\b\\s*\\b(?:(disable)|(restore))\\b(\\s*[0-9]+(?:\\s*,\\s*[0-9]+)?)?" + match: "\\b(pragma)\\b\\s*\\b(warning)\\b\\s*\\b(?:(disable)|(restore))\\b(\\s*[A-Za-z]*[0-9]+(?:\\s*,\\s*[A-Za-z]*[0-9]+)?)?" captures: "1": name: "keyword.preprocessor.pragma.cs" @@ -5392,7 +5392,7 @@ repository: "5": patterns: [ { - match: "[0-9]+" + match: "[A-Za-z]*[0-9]+" captures: "0": name: "constant.numeric.decimal.cs" diff --git a/src/csharp.tmLanguage.yml b/src/csharp.tmLanguage.yml index 4576f37..7f5bf49 100644 --- a/src/csharp.tmLanguage.yml +++ b/src/csharp.tmLanguage.yml @@ -3512,7 +3512,7 @@ repository: '0': { name: string.quoted.double.cs } preprocessor-pragma-warning: - match: \b(pragma)\b\s*\b(warning)\b\s*\b(?:(disable)|(restore))\b(\s*[0-9]+(?:\s*,\s*[0-9]+)?)? + match: \b(pragma)\b\s*\b(warning)\b\s*\b(?:(disable)|(restore))\b(\s*[A-Za-z]*[0-9]+(?:\s*,\s*[A-Za-z]*[0-9]+)?)? captures: '1': { name: keyword.preprocessor.pragma.cs } '2': { name: keyword.preprocessor.warning.cs } @@ -3520,7 +3520,7 @@ repository: '4': { name: keyword.preprocessor.restore.cs } '5': patterns: - - match: '[0-9]+' + - match: '[A-Za-z]*[0-9]+' captures: '0': { name: constant.numeric.decimal.cs } - include: '#punctuation-comma' diff --git a/test/preprocessor.tests.ts b/test/preprocessor.tests.ts index 7bec550..d87065f 100644 --- a/test/preprocessor.tests.ts +++ b/test/preprocessor.tests.ts @@ -745,6 +745,98 @@ void Bar() Token.Punctuation.CloseBrace ]); }); + + it("#pragma warning disable with comment followed by code", async () => { + const input = Input.InClass(` +#pragma warning disable IDE0001 // Comment1 + private int myField; +#pragma warning restore IDE0001 // Comment2`); + const tokens = await tokenize(input); + + tokens.should.deep.equal([ + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Pragma, + Token.Keyword.Preprocessor.Warning, + Token.Keyword.Preprocessor.Disable, + Token.Literal.Numeric.Decimal("IDE0001"), + Token.Comment.SingleLine.Start, + Token.Comment.SingleLine.Text(" Comment1"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("myField"), + Token.Punctuation.Semicolon, + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Pragma, + Token.Keyword.Preprocessor.Warning, + Token.Keyword.Preprocessor.Restore, + Token.Literal.Numeric.Decimal("IDE0001"), + Token.Comment.SingleLine.Start, + Token.Comment.SingleLine.Text(" Comment2"), + ]); + }); + + it("#pragma warning disable multiple warnings", async () => { + const input = Input.InClass(` +#pragma warning disable IDE0001, IDE0002 + private int myField; +#pragma warning restore IDE0001, IDE0002 + private int anotherField; +`); + const tokens = await tokenize(input); + + tokens.should.deep.equal([ + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Pragma, + Token.Keyword.Preprocessor.Warning, + Token.Keyword.Preprocessor.Disable, + Token.Literal.Numeric.Decimal("IDE0001"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("IDE0002"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("myField"), + Token.Punctuation.Semicolon, + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Pragma, + Token.Keyword.Preprocessor.Warning, + Token.Keyword.Preprocessor.Restore, + Token.Literal.Numeric.Decimal("IDE0001"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("IDE0002"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("anotherField"), + Token.Punctuation.Semicolon, + ]); + }); + + it("#region and #endregion with comment", async () => { + const input = Input.InClass(` +#region My Region // This is my region + private int myField; +#endregion // End of my region + private int anotherField; +`); + const tokens = await tokenize(input); + + tokens.should.deep.equal([ + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Region, + Token.PreprocessorMessage("My Region // This is my region"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("myField"), + Token.Punctuation.Semicolon, + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.EndRegion, + Token.Comment.SingleLine.Start, + Token.Comment.SingleLine.Text(" End of my region"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("anotherField"), + Token.Punctuation.Semicolon, + ]); + }); }); describe("AppDirectives", () => { From 64654e2989f47ff6f2c9f25233ab57359cffa41d Mon Sep 17 00:00:00 2001 From: Callum Tolley Date: Tue, 6 Jan 2026 15:06:31 +0000 Subject: [PATCH 2/3] Add test for >2 warnings --- grammars/csharp.tmLanguage | 4 +- grammars/csharp.tmLanguage.cson | 4 +- src/csharp.tmLanguage.yml | 4 +- test/preprocessor.tests.ts | 118 +++++++++++++++++++++++++++++++- 4 files changed, 121 insertions(+), 9 deletions(-) diff --git a/grammars/csharp.tmLanguage b/grammars/csharp.tmLanguage index b9ff444..a5390e5 100644 --- a/grammars/csharp.tmLanguage +++ b/grammars/csharp.tmLanguage @@ -8978,7 +8978,7 @@ preprocessor-pragma-warning match - \b(pragma)\b\s*\b(warning)\b\s*\b(?:(disable)|(restore))\b(\s*[A-Za-z]*[0-9]+(?:\s*,\s*[A-Za-z]*[0-9]+)?)? + \b(pragma)\b\s*\b(warning)\b\s*\b(?:(disable)|(restore))\b([A-Za-z0-9\s,]+) captures 1 @@ -9007,7 +9007,7 @@ match - [A-Za-z]*[0-9]+ + [A-Za-z0-9]+ captures 0 diff --git a/grammars/csharp.tmLanguage.cson b/grammars/csharp.tmLanguage.cson index fe25c2c..b4d55dc 100644 --- a/grammars/csharp.tmLanguage.cson +++ b/grammars/csharp.tmLanguage.cson @@ -5379,7 +5379,7 @@ repository: } ] "preprocessor-pragma-warning": - match: "\\b(pragma)\\b\\s*\\b(warning)\\b\\s*\\b(?:(disable)|(restore))\\b(\\s*[A-Za-z]*[0-9]+(?:\\s*,\\s*[A-Za-z]*[0-9]+)?)?" + match: "\\b(pragma)\\b\\s*\\b(warning)\\b\\s*\\b(?:(disable)|(restore))\\b([A-Za-z0-9\\s,]+)" captures: "1": name: "keyword.preprocessor.pragma.cs" @@ -5392,7 +5392,7 @@ repository: "5": patterns: [ { - match: "[A-Za-z]*[0-9]+" + match: "[A-Za-z0-9]+" captures: "0": name: "constant.numeric.decimal.cs" diff --git a/src/csharp.tmLanguage.yml b/src/csharp.tmLanguage.yml index 7f5bf49..ebf7125 100644 --- a/src/csharp.tmLanguage.yml +++ b/src/csharp.tmLanguage.yml @@ -3512,7 +3512,7 @@ repository: '0': { name: string.quoted.double.cs } preprocessor-pragma-warning: - match: \b(pragma)\b\s*\b(warning)\b\s*\b(?:(disable)|(restore))\b(\s*[A-Za-z]*[0-9]+(?:\s*,\s*[A-Za-z]*[0-9]+)?)? + match: \b(pragma)\b\s*\b(warning)\b\s*\b(?:(disable)|(restore))\b([A-Za-z0-9\s,]+) captures: '1': { name: keyword.preprocessor.pragma.cs } '2': { name: keyword.preprocessor.warning.cs } @@ -3520,7 +3520,7 @@ repository: '4': { name: keyword.preprocessor.restore.cs } '5': patterns: - - match: '[A-Za-z]*[0-9]+' + - match: '[A-Za-z0-9]+' captures: '0': { name: constant.numeric.decimal.cs } - include: '#punctuation-comma' diff --git a/test/preprocessor.tests.ts b/test/preprocessor.tests.ts index d87065f..da6bf06 100644 --- a/test/preprocessor.tests.ts +++ b/test/preprocessor.tests.ts @@ -745,7 +745,7 @@ void Bar() Token.Punctuation.CloseBrace ]); }); - + it("#pragma warning disable with comment followed by code", async () => { const input = Input.InClass(` #pragma warning disable IDE0001 // Comment1 @@ -774,7 +774,7 @@ void Bar() Token.Comment.SingleLine.Text(" Comment2"), ]); }); - + it("#pragma warning disable multiple warnings", async () => { const input = Input.InClass(` #pragma warning disable IDE0001, IDE0002 @@ -809,7 +809,119 @@ void Bar() Token.Punctuation.Semicolon, ]); }); - + + it("#pragma warning disable many warnings", async () => { + const input = Input.InClass(` +#pragma warning disable IDE0001, IDE0002, 1, CS1233, XYZ9999, 404, 505, 606, 707, 808, 909 + private int myField; +#pragma warning restore IDE0001, IDE0002, 1, CS1233, XYZ9999, 404, 505, 606, 707, 808, 909 + private int anotherField; +`); + const tokens = await tokenize(input); + + tokens.should.deep.equal([ + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Pragma, + Token.Keyword.Preprocessor.Warning, + Token.Keyword.Preprocessor.Disable, + Token.Literal.Numeric.Decimal("IDE0001"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("IDE0002"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("1"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("CS1233"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("XYZ9999"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("404"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("505"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("606"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("707"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("808"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("909"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("myField"), + Token.Punctuation.Semicolon, + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Pragma, + Token.Keyword.Preprocessor.Warning, + Token.Keyword.Preprocessor.Restore, + Token.Literal.Numeric.Decimal("IDE0001"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("IDE0002"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("1"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("CS1233"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("XYZ9999"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("404"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("505"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("606"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("707"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("808"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("909"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("anotherField"), + Token.Punctuation.Semicolon, + ]); + }); + + it("#pragma warning disable multiple warnings with comment", async () => { + const input = Input.InClass(` +#pragma warning disable IDE0001, IDE0002, CS1234 // Comment1 + private int myField; +#pragma warning restore IDE0001, IDE0002 // Comment2 + private int anotherField; +`); + const tokens = await tokenize(input); + + tokens.should.deep.equal([ + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Pragma, + Token.Keyword.Preprocessor.Warning, + Token.Keyword.Preprocessor.Disable, + Token.Literal.Numeric.Decimal("IDE0001"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("IDE0002"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("CS1234"), + Token.Comment.SingleLine.Start, + Token.Comment.SingleLine.Text(" Comment1"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("myField"), + Token.Punctuation.Semicolon, + Token.Punctuation.Hash, + Token.Keyword.Preprocessor.Pragma, + Token.Keyword.Preprocessor.Warning, + Token.Keyword.Preprocessor.Restore, + Token.Literal.Numeric.Decimal("IDE0001"), + Token.Punctuation.Comma, + Token.Literal.Numeric.Decimal("IDE0002"), + Token.Comment.SingleLine.Start, + Token.Comment.SingleLine.Text(" Comment2"), + Token.Keyword.Modifier.Private, + Token.PrimitiveType.Int, + Token.Identifier.FieldName("anotherField"), + Token.Punctuation.Semicolon, + ]); + }); + it("#region and #endregion with comment", async () => { const input = Input.InClass(` #region My Region // This is my region From 01b20f2fe07213e7581553249a9fe0dc809bfdf9 Mon Sep 17 00:00:00 2001 From: Callum Tolley Date: Tue, 6 Jan 2026 15:17:35 +0000 Subject: [PATCH 3/3] Newline --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ccbe9df..b9ce341 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ out/ grammars/*.json npm-debug.log* copy.sh -bun.lock \ No newline at end of file +bun.lock