How to Ignore specific file from Visual Studio Warnings Analyzer? - c#

Is there anyway to suppress all error codes in one specific file?
Surprisingly I couldn't find this. This is pretty common scenario
isn't it?
Documentation describes it seems:
we have to disable it line by line or
globally across all files.
https://learn.microsoft.com/en-us/visualstudio/code-quality/in-source-suppression-overview?view=vs-2022#:~:text=You%20can%20suppress%20violations%20in,can%20use%20the%20SuppressMessage%20attribute.

Make a section in the .editorconfig file for that given class;
specify its file name [{YourClass.cs}] or path [{Folder/YourClass.cs}]in a section and set the severity for all rules to none.
See the All rules scope in the documentation.
[{YourClass.cs}]
dotnet_analyzer_diagnostic.severity = none

You can add this snippet at the very beginning of the file:
// <autogenerated />
This suppresses most warnings on that file.

Use #pragma warning ( push ), then #pragma warning ( disable ), then put your code, then use #pragma warning ( pop ) as described here:
Replace warningCode below with the real codes
#pragma warning( push )
#pragma warning( disable : WarningCode)
//code with warning
#pragma warning( pop )

Related

SuppressMessage for a specific class/type only

I am trying to suppress "Missing XML comment" (CS1591) but only for a specific class. The class in my case is System.Windows.DependencyProperty. I want the warnings to appear for every other occasion. Adding CS1591 to <NoWarn> won't work as this will simply ignore all occurrences.
What I tried was to create a GlobalSuppressions.cs at my project's root and adding the following line to it:
[assembly: SuppressMessage( "Missing XML comment", "CS1591", Justification = "No need for DependencyProperty docs.", Scope = "type", Target = "~T:System.Windows.DependencyProperty" )]
Unfortunately this doesn't work at all.
You should be able to use #pragma warning disable CS1591 right above your class definition and #pragma warning restore CS1591 at the end.
see: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-pragma-warning

How can I import namespaces (e.g. using System.Linq) in Anltr4 / C#

I have created a simple .g4 (Antlr4) grammar & lexer file.
It generates my lexer/parser code fine.
But after adding some custom code that require Linq extensions I now need to get the custom statement "using System.Linq;" injected at the top of my generated lexer code file.
I am aware that there are some options for injecting code (from the .g4 file), e.g.
#lexer::members {
... {custom lexer code goes here}
Can someone please point me to the correct (.g4) syntax that will render the necessary "using" statements in the rendered lexer/parser.
UPDATE:
LexLi made a good point .. why do I need that? I'm supposed to write my code in visitor or listener. Answer to that: I am trying to implement INDENT and DEDENT tokens in C# (analogue to the the Java code posted here under "ANTLR4":
ANTLR What is simpliest way to realize python like indent-depending grammar?
Thanks!
You can control what is written to your file in the classic way,
#parser::header
{
#pragma warning disable 3001, 3003, 3005, 3009, 1591
}
#lexer::header
{
#pragma warning disable 3001, 3003, 3005, 3009, 1591
}
#parser::namespace { Lextm.Namespace }
#lexer::namespace { Lextm.Namespace }
#parser::footer
{
#pragma warning restore 3001, 3003, 3005, 3009, 1591
}
#lexer::footer
{
#pragma warning restore 3001, 3003, 3005, 3009, 1591
}
So in your case, add the using statements to header.

msbuild C# 14 compiler doesn't ignore warning 3021

I have the following pragma in one of the generated C# class and it is used to ignore a CLSCompliant warning
#pragma warning disable 3021
This works perfectly when compiling with msbuild 12. After upgrading my project to use msbuild 14, this warning is enabled again.
It seems to happen with partial class. This how I reproduce:
Create empty project in visual studio 2013(ToolsVersion=12.0)
Add new file TestPragmaFile1.cs with this content:
namespace TestPragma
{
public partial class TestPragma
{
}
}
Add new file TestPragmaFile2.cs with this content:
namespace TestPragma
{
#pragma warning disable 3021
[System.CLSCompliant(false)]
public partial class TestPragma
{
}
}
4.Compile by executing this command in the project directory(directory that contains csproj file):
"C:\Program Files (x86)\MSBuild\14.0\Bin\msbuild" /T:Clean;Build
Result:
"C:\Users\me\Documents\Visual Studio
2013\Projects\TestPragma\TestPragma\TestPragma.csproj" (Clean;Build
target) (1) -> (CoreCompile target) -> TestPragmaFile1.cs(5,26):
warning CS3021: 'TestPragma' does not need a CLSCompliant attribute
because the assembly does not have a CLSCompliant attribute
[C:\Users\me\Documents\Visual Studio
2013\Projects\TestPragma\TestPragma\TestPrag ma.csproj]
1 Warning(s)
0 Error(s)
Can you please help understand why this happens? Is it normal ? how to fix it ?
I solved the issue by adding #pragma warning disable 3021 to the first cs file(TestPragmaFile1.cs).
You may also want to try #JeroenMostert solution by adding [assembly:CLSCompliant(false)] to the assembly.

"StyleCop "SA1300 is not suppressing in GlobalSuppressions.cs class

I am trying to suppress Style Cope warning for SA1300 by this line of code.
[SuppressMessage("StyleCop.CSharp.NamingRules","SA1300:ElementMustBeginWithUpperCaseLetter", Justification = "Reviewed.")]
It is working at class level (i.e. if I put it in class which has warnings then its work) but not working if I put it in GlobalSuppressions.cs class. I want to suppress SA1300 warnings for whole assembly so I put this line in GlobalSuppressions.cs but it’s not working.
[assembly: SuppressMessage("StyleCop.CSharp.NamingRules","SA1300:ElementMustBeginWithUpperCaseLetter", MessageId = "Ctl", Scope = "namespace", Target = "Assembly name"))]
Is it possible to do it in "GlobalSuppressions.cs"?
it is also not working for "SA1600"
I just had this same issue so thought I would give you my result.
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1300:ElementMustBeginWithUpperCaseLetter", Justification = "Auto generated name")]
I noticed your StyleCop namespace is not fully qualified. Should be "Microsoft.StyleCop.CSharp.NamingRules"

How to suppress a StyleCop warning?

I'm using StyleCop and want to suppress some warning which does not suit my style. I prefer to have solution for
1) in-line code suppressing
2) global setting suppressing
I've searched the internet but still not sure how to do the suppressing.
For method 1), They said to add the lines:
[assembly: SuppressMessage("Microsoft.Design",
"SA1202:All private methods must be placed after all public methods",
Scope = "namespace", Target = "Consus.Client.ClientVaultModule.Services.OnlineDetection")]
But they do not say where and which namespace to be used.
For method 2), they said to use GlobalSuppress file but it seems not easy to search for a how-to do it at the moment.
Please help.
[Edited]
In my case, I have the warning about SA1202: All private methods must be placed after all public methods which is bothering since I group my related codes into regions. I want to suppress those warning for just some certain methods.
Here's what you need:
[SuppressMessage("Microsoft.StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess")]
An example of inline suppression would be similar to this - examine the namespaces in the code compared to the suppression
namespace Soapi
{
///<summary>
///</summary>
///<param name = "message"></param>
///<param name = "statusCode"></param>
///<param name = "innerException"></param>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object,System.Object)")]
public ApiException(string message, ErrorCode statusCode, Exception innerException)
: base(String.Format("{0}\r\nStatusCode:{1}", message, statusCode), innerException)
{
this.statusCode = statusCode;
}
A global supression file is a file in the root of your project named GlobalSuppressions.cs and might look like this:
// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.
//
// To add a suppression to this file, right-click the message in the
// Error List, point to "Suppress Message(s)", and click
// "In Project Suppression File".
// You do not need to add suppressions to this file manually.
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object,System.Object,System.Object)", Scope = "member", Target = "Soapi.ApiException.#.ctor(System.String,Soapi.ErrorCode,System.String,System.Exception)")]
And you can generate this code automatically by right-clicking on the warning.
Starting with StyleCop 4.3.2, it is possible to suppress the reporting of rule violations by adding suppression attributes within the source code.
Rule Suppressions
http://stylecop.soyuz5.com/Suppressions.html
but it says -
Global Suppressions
StyleCop does not support the notion of global suppressions or
file-level suppressions. Suppressions must be placed on a code
element.
If you've installed StyleCop, you can right-click your project and there will be a StyleCop option. Click this and you'll see you can prevent certain rules from even running against your project. Moreover, you can create a separate rules file to share between different projects. This means you can configure the rules once the way you want them and then share that configuration between all your projects.
For individual overrides, SuppressMessage is the way to go.
Go to Solution Explorer
Go to your project
Expand references
Expand Analyzers
Expand StyleCop.Analyzers
Right click on a particular rule which you want to disable at a global (project) level
Set Rule Set severity -> Select None
Read the admonition from Style Cop, looking for the alphanumeric code. In your case 'SA1202'. Then browse to the corresponding page on the Style Cop website. Change the URL as appropriate https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1202.md
Copy the line labelled 'How to Suppress Violations'. Paste the attribute above the class about which Style Cop moans
[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess", Justification = "Reviewed.")]
Cant you just remove the rule instead of soiling your code?
Same goes for FxCop...
1.
In your case, correct SuppressMessage attribute should like like the following:
[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess")]
private void SomeMethod()
{
}
Note that you can place it on any other element (e.g, on the class - then all similar violations in the entire class will be supressed).
I also agree that it's quite unobvious what to write in these fields.
Actually, the first one should be the fully qualified name of StyleCop analyser class and could be found from the source code (e.g. from here).
The second one should start with rule code, then colon and the name of the rule enumeration (luckily, it always looks like the rule name displayed in the Settings Editor, but with no whitespaces).
2.
Regarding suppressing rules "globally" - why don't just turn them off via Settings Editor? Settings files are inherited through the file system, so you could easily have one "main" settings file at the "top" of your folder structure, and some other files (holding the "difference" from main) with exceptions made for some projects, if you want so (like described here).
Good luck!
You can disable the rules you don't want in Settings.StyleCop file, which is in the project root folder.
You will need the namespace that contains the rule, which can be found here:
http://stylecop.soyuz5.com/StyleCop%20Rules.html
Settings.stylecop file code for your reference:
<StyleCopSettings Version="105">
<Analyzers>
<Analyzer AnalyzerId="StyleCop.CSharp.LayoutRules">
<Rules>
<Rule Name="ElementsMustBeSeparatedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
</Analyzers>
</StyleCopSettings>
Alternatively you could move the code in regions into partial classes. Then the issue with the stylecop rule will go away.
In addition to the helpful answers already in place:
If you suppress a warning in the suppression file GlobalSuppressions.cs,
you can edit that [assembly: SuppressMessage(StyleCop...blabla line and entirely remove the Scope=... and Target=... tags. That makes the suppression global in the project.
The README.md for the StyleCop.Analyzers NuGet package used by Visual Studio 2015+ contains a link to the documentation for the rules. The documentation for each rule contains a "How to suppress violations" section. For the SA1202 rule, the options are:
[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess", Justification = "Reviewed.")]
and
#pragma warning disable SA1202 // ElementsMustBeOrderedByAccess
#pragma warning restore SA1202 // ElementsMustBeOrderedByAccess

Categories