GithubHelp home page GithubHelp logo

bkoelman / csharpguidelinesanalyzer Goto Github PK

View Code? Open in Web Editor NEW
122.0 122.0 33.0 2.11 MB

Reports diagnostics for C# coding guidelines that are not already covered by Resharper.

License: Apache License 2.0

C# 99.75% PowerShell 0.24% Batchfile 0.02%
analyzer c-sharp coding-guidelines

csharpguidelinesanalyzer's People

Contributors

bkoelman avatar dennisdoomen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

csharpguidelinesanalyzer's Issues

Implement AV2215: Properly fill the attributes of the AssemblyInfo.cs file

This analyzer should report when the AssemblyTitle, AssemblyDescription, AssemblyConfiguration, AssemblyCompany, AssemblyProduct, AssemblyCopyright, AssemblyTrademark, AssemblyCulture, AssemblyVersion or AssemblyFileVersion is missing or invoked with an empty string as first constructor parameter.

Note there may not be a location to report on.

Exception in UseUnderscoresForUnusedLambdaParametersAnalyzer

Analyzer

UseUnderscoresForUnusedLambdaParametersAnalyzer

Repro steps

public class Class1
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

Expected behavior

no exceptions

Actual behavior

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at CSharpGuidelinesAnalyzer.Rules.Naming.UseUnderscoresForUnusedLambdaParametersAnalyzer.AnalyzeParameterUsage(IParameterSymbol parameter, IMethodSymbol method, OperationAnalysisContext context)
   at CSharpGuidelinesAnalyzer.Rules.Naming.UseUnderscoresForUnusedLambdaParametersAnalyzer.AnalyzeLambdaExpression(OperationAnalysisContext context)
   at CSharpGuidelinesAnalyzer.Extensions.AnalysisContextExtensions.SkipInvalid(OperationAnalysisContext context, Action`1 action)
   at CSharpGuidelinesAnalyzer.Rules.Naming.UseUnderscoresForUnusedLambdaParametersAnalyzer.<Initialize>b__8_0(OperationAnalysisContext c)
   at Microsoft.CodeAnalysis.Diagnostics.AnalyzerExecutor.<>c.<ExecuteOperationAction>b__44_0(ValueTuple`2 data)
   at Microsoft.CodeAnalysis.Diagnostics.AnalyzerExecutor.ExecuteAndCatchIfThrows_NoLock[TArg](DiagnosticAnalyzer analyzer, Action`1 analyze, TArg argument, Nullable`1 info)

Bug: Writes to a parameter of type struct are not reported (AV1568)

Analyzer

AV1568: DoNotAssignToParametersAnalyzer

This analyzer uses the SemanticModel.AnalyzeDataFlow API to determine whether parameters are written to in the method body. This works great for reference types. But for parameters of type struct, it reports a write on invocation of the struct member. As explained, this is by design.

For the moment, reporting on parameters of type struct is disabled to prevent false reports. To fix this, we should write an IOperation-based walker to analyze assignments and expressions within the method body.

Repro steps

See unittest When_struct_parameter_is_written_to_in_method_body_it_must_be_reported, which is currently disabled.

Implement AV1715: Properly name properties

This analyzer should report on boolean variables, parameters and fields whose names do not start with the word "Is", "Has", "Allows", "Can", "Should", "Will", "Do" or "Supports".

Problems with latest version of csc

Analyzer

All

Repro steps

  • Have a Xamarin iOS or Android project that references Roslyn analyzers through Nuget.
  • Build Project in Visual Studio for Mac with MSBuild selected or using MSBuild on the Mac directly in Terminal.

Expected behavior

Roslyn analyzers are run and evaluate code correctly.

Actual behavior

Steps to reproduce

  • Have a Xamarin iOS or Android project that references Roslyn analyzers through Nuget.
  • Build Project in Visual Studio for Mac with MSBuild selected or using MSBuild on the Mac directly in Terminal.

Expected behavior

Roslyn analyzers are run and evaluate code correctly.

Actual behavior

Errors similar to the following for are generated for each analyzer and the analyzers are not run
CSC : error CS8032: An instance of analyzer CSharpGuidelinesAnalyzer.Rules.Naming.AvoidMisleadingNamesAnalyzer cannot be created from /Users/kevinford/Documents/Projects/VSLiveCICDDemo/Code/BuildTest/packages/CSharpGuidelinesAnalyzer.1.0.1/analyzers/dotnet/cs/CSharpGuidelinesAnalyzer.dll : Exception has been thrown by the target of an invocation.. [/Users/kevinford/Documents/Projects/VSLiveCICDDemo/Code/BuildTest/iOS/BuildTest.iOS.csproj]

Because of this no project with references to Roslyn analyzer DLLs compile in the newest Visual Studio for Mac.

See the following bug for more information.

https://bugzilla.xamarin.com/show_bug.cgi

Implement AV1706: Don't use abbreviations

This analyzer should report on single-letter variable names. But also if an identifier contains a blacklisted word. Words on the blacklist: "Btn", "Ctrl", "Frm".

Add exception for Deconstruct method (AV1562)

The Deconstruct method in the example below should not be reported on.

public class Point
{
    public int X { get; }
    public int Y { get; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    public void Deconstruct(out int x, out int y)
    {
        x = X;
        y = Y;
    }
}

public class Example
{
    public void Test(Point point)
    {
        var (x, y) = point;
        Console.WriteLine($"Coordinates: ({x}, {y})");
    }
}

Deconstruct (which may occur as instance method or extension method) should be considered an exception to AV1562, because the compiler recognizes this method to deconstruct an object into tuple elements.

Optimize running time of AV1568

Analyzer

AV1568: DoNotAssignToParametersAnalyzer

Repro steps

Results of running the analyzers on its own codebase:

1>  Total analyzer execution time: 0.670 seconds. (TaskId:28)
1>  NOTE: Elapsed time may be less than analyzer execution time because analyzers can run concurrently. (TaskId:28)
1>  Time (s)    %   Analyzer (TaskId:28)
1>  0.498   74   CSharpGuidelinesAnalyzer, Version=0.2.0.0, Culture=neutral, PublicKeyToken=null (TaskId:28)
1>  0.121   18      CSharpGuidelinesAnalyzer.Maintainability.DoNotAssignToParametersAnalyzer (TaskId:28)
1>  0.051    7      CSharpGuidelinesAnalyzer.Documentation.AvoidInlineCommentsAnalyzer (TaskId:28)
1>  0.040    5      CSharpGuidelinesAnalyzer.Naming.UseUnderscoresForUnusedLambdaParametersAnalyzer (TaskId:28)
1>  0.028    4      CSharpGuidelinesAnalyzer.Documentation.AvoidToDoCommentsAnalyzer (TaskId:28)
1>  0.021    3      CSharpGuidelinesAnalyzer.Naming.DoNotUseAbbreviationsInIdentifierNamesAnalyzer (TaskId:28)
1>  0.021    3      CSharpGuidelinesAnalyzer.Maintainability.IfElseIfStatementsShouldFinishWithElseClauseAnalyzer (TaskId:28)
1>  0.014    2      CSharpGuidelinesAnalyzer.ClassDesign.DoNotHideInheritedMembersAnalyzer (TaskId:28)
1>  0.013    1      CSharpGuidelinesAnalyzer.Naming.NamePropertiesWithAnAffirmativePhraseAnalyzer (TaskId:28)
1>  0.013    1      CSharpGuidelinesAnalyzer.Maintainability.AvoidMultipleTypesPerFileAnalyzer (TaskId:28)
1>  0.012    1      CSharpGuidelinesAnalyzer.Maintainability.AvoidMembersWithMoreThanSevenStatementsAnalyzer (TaskId:28)
1>  0.012    1      CSharpGuidelinesAnalyzer.ClassDesign.MembersShouldDoASingleThingAnalyzer (TaskId:28)
1>  0.011    1      CSharpGuidelinesAnalyzer.Maintainability.NamespacesShouldMatchAssemblyNameAnalyzer (TaskId:28)
1>  0.011    1      CSharpGuidelinesAnalyzer.ClassDesign.AvoidStaticClassesAnalyzer (TaskId:28)
1>  0.010    1      CSharpGuidelinesAnalyzer.Maintainability.OverloadsShouldCallOtherOverloadsAnalyzer (TaskId:28)
1>  0.009    1      CSharpGuidelinesAnalyzer.Naming.DoNotUseNumbersInIdentifiersAnalyzer (TaskId:28)
1>  0.009    1      CSharpGuidelinesAnalyzer.Maintainability.DoNotChangeLoopVariablesAnalyzer (TaskId:28)
1>  0.009    1      CSharpGuidelinesAnalyzer.Framework.ProvideAssemblyInformationAnalyzer (TaskId:28)
1>  0.008    1      CSharpGuidelinesAnalyzer.MiscellaneousDesign.EvaluateQueriesBeforeReturningThemAnalyzer (TaskId:28)
1>  0.007    1      CSharpGuidelinesAnalyzer.MiscellaneousDesign.DoNotPassNullsOnEventInvocationAnalyzer (TaskId:28)
1>  0.006   <1      CSharpGuidelinesAnalyzer.Maintainability.AssignVariablesInSeparateStatementsAnalyzer (TaskId:28)
1>  0.006   <1      CSharpGuidelinesAnalyzer.Maintainability.AvoidBooleanParametersAnalyzer (TaskId:28)
1>  0.006   <1      CSharpGuidelinesAnalyzer.Documentation.DocumentAllInternalMembersAnalyzer (TaskId:28)
1>  0.006   <1      CSharpGuidelinesAnalyzer.Maintainability.AvoidConditionsWithDoubleNegativesAnalyzer (TaskId:28)
1>  0.005   <1      CSharpGuidelinesAnalyzer.Maintainability.AvoidExplicitBooleanComparisonsAnalyzer (TaskId:28)
1>  0.005   <1      CSharpGuidelinesAnalyzer.Framework.OnlyUseDynamicForUnknownTypesAnalyzer (TaskId:28)
1>  0.005   <1      CSharpGuidelinesAnalyzer.Naming.AvoidMisleadingNamesAnalyzer (TaskId:28)
1>  0.004   <1      CSharpGuidelinesAnalyzer.MemberDesign.ReturnInterfacesToCollectionsAnalyzer (TaskId:28)
1>  0.004   <1      CSharpGuidelinesAnalyzer.ClassDesign.TypesShouldHaveASinglePurposeAnalyzer (TaskId:28)
1>  0.004   <1      CSharpGuidelinesAnalyzer.Framework.FavorAsyncAwaitOverTaskContinueWithAnalyzer (TaskId:28)
1>  0.003   <1      CSharpGuidelinesAnalyzer.Naming.UseFrameworkTerminologyInMemberNamesAnalyzer (TaskId:28)
1>  0.003   <1      CSharpGuidelinesAnalyzer.Maintainability.SwitchStatementsShouldHaveADefaultCaseAnalyzer (TaskId:28)
1>  0.003   <1      CSharpGuidelinesAnalyzer.Maintainability.AvoidMembersWithMoreThanThreeParametersAnalyzer (TaskId:28)
1>  0.003   <1      CSharpGuidelinesAnalyzer.Naming.DoNotIncludeContainingTypeNameInMembersAnalyzer (TaskId:28)
1>  0.003   <1      CSharpGuidelinesAnalyzer.MiscellaneousDesign.RaiseEventsFromProtectedVirtualMethodsAnalyzer (TaskId:28)
1>  0.002   <1      CSharpGuidelinesAnalyzer.Maintainability.AvoidNestedLoopsAnalyzer (TaskId:28)
1>  0.002   <1      CSharpGuidelinesAnalyzer.Naming.StaticClassesShouldOnlyContainExtensionMethodsAnalyzer (TaskId:28)
1>  0.002   <1      CSharpGuidelinesAnalyzer.Naming.DoNotUseHelperMethodsAnalyzer (TaskId:28)
1>  0.002   <1      CSharpGuidelinesAnalyzer.Maintainability.AvoidUsingNamedArgumentsAnalyzer (TaskId:28)
1>  0.002   <1      CSharpGuidelinesAnalyzer.Framework.BuildWithTheHighestWarningLevelAnalyzer (TaskId:28)
1>  0.001   <1      CSharpGuidelinesAnalyzer.Maintainability.CaseClausesInSwitchStatementsShouldHaveBracesAnalyzer (TaskId:28)
1>  0.001   <1      CSharpGuidelinesAnalyzer.Naming.NameAsyncMethodsCorrectlyAnalyzer (TaskId:28)
1>  <0.001   <1      CSharpGuidelinesAnalyzer.Naming.PrefixEventHandlersWithOnAnalyzer (TaskId:28)
1>  0.146   21   Microsoft.CodeAnalysis.CSharp.Analyzers, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 (TaskId:28)
1>  0.093   13      Microsoft.CodeAnalysis.CSharp.Analyzers.MetaAnalyzers.CSharpReportDiagnosticAnalyzer (TaskId:28)
1>  0.041    6      Microsoft.CodeAnalysis.CSharp.Analyzers.MetaAnalyzers.CSharpRegisterActionAnalyzer (TaskId:28)
1>  0.008    1      Microsoft.CodeAnalysis.CSharp.Analyzers.MetaAnalyzers.CSharpDiagnosticAnalyzerFieldsAnalyzer (TaskId:28)
1>  0.003   <1      Microsoft.CodeAnalysis.CSharp.Analyzers.CSharpImmutableObjectMethodAnalyzer (TaskId:28)
1>  0.001   <1      Microsoft.CodeAnalysis.CSharp.Analyzers.FixAnalyzers.CSharpFixerWithFixAllAnalyzer (TaskId:28)
1>  <0.001   <1      Microsoft.CodeAnalysis.CSharp.Analyzers.MetaAnalyzers.CSharpDiagnosticDescriptorCreationAnalyzer (TaskId:28)
1>  0.019    2   CodeContractNullability, Version=1.0.5.0, Culture=neutral, PublicKeyToken=null (TaskId:28)
1>  0.010    1      CodeContractNullability.CodeContractItemNullabilityAnalyzer (TaskId:28)
1>  0.008    1      CodeContractNullability.CodeContractNullabilityAnalyzer (TaskId:28)
1>  0.007    1   Microsoft.CodeAnalysis.Analyzers, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 (TaskId:28)
1>  0.007    1      Microsoft.CodeAnalysis.Analyzers.MetaAnalyzers.DiagnosticAnalyzerAttributeAnalyzer (TaskId:28)
1>  <0.001   <1      Microsoft.CodeAnalysis.Analyzers.InternalImplementationOnlyAnalyzer (TaskId:28)

The output above shows that DoNotAssignToParametersAnalyzer takes a lot of time. It runs (expensive) dataflow analysis on the method body for each parameter individually. We should register on method instead, then run the analysis once and inspect results for each parameter.

Implement AV1008: Avoid static classes

This analyzer should report on static classes whose name does not end in Extensions -or- contain public methods that do not have this as first parameter. Consider merging with AV1745.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.