44namespace StyleCop . Analyzers . ReadabilityRules
55{
66 using System . Collections . Immutable ;
7+ using System . Linq ;
78 using Microsoft . CodeAnalysis ;
89 using Microsoft . CodeAnalysis . CSharp ;
910 using Microsoft . CodeAnalysis . CSharp . Syntax ;
@@ -64,9 +65,8 @@ public override void Initialize(AnalysisContext context)
6465
6566 private static void HandleCompilationStart ( CompilationStartAnalysisContext context )
6667 {
67- context . RegisterSyntaxNodeActionHonorExclusions ( HandleMethodDeclaration , SyntaxKind . MethodDeclaration ) ;
68+ context . RegisterSyntaxNodeActionHonorExclusions ( HandleBaseMethodDeclaration , SyntaxKind . MethodDeclaration , SyntaxKind . ConstructorDeclaration , SyntaxKind . OperatorDeclaration ) ;
6869 context . RegisterSyntaxNodeActionHonorExclusions ( HandleMethodInvocation , SyntaxKind . InvocationExpression ) ;
69- context . RegisterSyntaxNodeActionHonorExclusions ( HandleConstructorDeclaration , SyntaxKind . ConstructorDeclaration ) ;
7070 context . RegisterSyntaxNodeActionHonorExclusions ( HandleObjectCreation , SyntaxKind . ObjectCreationExpression ) ;
7171 context . RegisterSyntaxNodeActionHonorExclusions ( HandleIndexerDeclaration , SyntaxKind . IndexerDeclaration ) ;
7272 context . RegisterSyntaxNodeActionHonorExclusions ( HandleArrayCreation , SyntaxKind . ArrayCreationExpression ) ;
@@ -77,13 +77,6 @@ private static void HandleCompilationStart(CompilationStartAnalysisContext conte
7777 context . RegisterSyntaxNodeActionHonorExclusions ( HandleAnonymousMethod , SyntaxKind . AnonymousMethodExpression ) ;
7878 context . RegisterSyntaxNodeActionHonorExclusions ( HandleLambdaExpression , SyntaxKind . ParenthesizedLambdaExpression ) ;
7979 context . RegisterSyntaxNodeActionHonorExclusions ( HandleConversionOperatorDeclaration , SyntaxKind . ConversionOperatorDeclaration ) ;
80- context . RegisterSyntaxNodeActionHonorExclusions ( HandleOperatorDeclaration , SyntaxKind . OperatorDeclaration ) ;
81- }
82-
83- private static void HandleOperatorDeclaration ( SyntaxNodeAnalysisContext context )
84- {
85- var operatorDeclaration = ( OperatorDeclarationSyntax ) context . Node ;
86- AnalyzeParametersList ( context , operatorDeclaration . ParameterList ) ;
8780 }
8881
8982 private static void HandleConversionOperatorDeclaration ( SyntaxNodeAnalysisContext context )
@@ -155,21 +148,15 @@ private static void HandleObjectCreation(SyntaxNodeAnalysisContext context)
155148 }
156149 }
157150
158- private static void HandleConstructorDeclaration ( SyntaxNodeAnalysisContext context )
159- {
160- var constructorDeclaration = ( ConstructorDeclarationSyntax ) context . Node ;
161- AnalyzeParametersList ( context , constructorDeclaration . ParameterList ) ;
162- }
163-
164151 private static void HandleMethodInvocation ( SyntaxNodeAnalysisContext context )
165152 {
166153 var invocationExpression = ( InvocationExpressionSyntax ) context . Node ;
167154 AnalyzeArgumentList ( context , invocationExpression . ArgumentList ) ;
168155 }
169156
170- private static void HandleMethodDeclaration ( SyntaxNodeAnalysisContext context )
157+ private static void HandleBaseMethodDeclaration ( SyntaxNodeAnalysisContext context )
171158 {
172- var methodDeclaration = ( MethodDeclarationSyntax ) context . Node ;
159+ var methodDeclaration = ( BaseMethodDeclarationSyntax ) context . Node ;
173160
174161 AnalyzeParametersList ( context , methodDeclaration . ParameterList ) ;
175162 }
@@ -391,24 +378,40 @@ private static void AnalyzeParametersList(SyntaxNodeAnalysisContext context, Par
391378 }
392379
393380 var firstParameter = parameterListSyntax . Parameters [ 0 ] ;
381+ int firstParameterLine ;
394382
395- var firstParameterLineSpan = firstParameter . GetLineSpan ( ) ;
396- if ( ! firstParameterLineSpan . IsValid )
383+ if ( firstParameter . HasLeadingTrivia && firstParameter . GetLeadingTrivia ( ) . All ( trivia => IsValidTrivia ( trivia ) ) )
397384 {
398- return ;
385+ firstParameterLine = firstParameter . SyntaxTree . GetLineSpan ( firstParameter . FullSpan ) . StartLinePosition . Line ;
399386 }
400-
401- var openParenLineSpan = parameterListSyntax . OpenParenToken . GetLineSpan ( ) ;
402- if ( ! openParenLineSpan . IsValid )
387+ else
403388 {
404- return ;
389+ firstParameterLine = firstParameter . GetLineSpan ( ) . StartLinePosition . Line ;
405390 }
406391
407- if ( openParenLineSpan . EndLinePosition . Line != firstParameterLineSpan . StartLinePosition . Line &&
408- openParenLineSpan . EndLinePosition . Line != ( firstParameterLineSpan . StartLinePosition . Line - 1 ) )
392+ var parenLine = parameterListSyntax . OpenParenToken . GetLineSpan ( ) . EndLinePosition . Line ;
393+
394+ if ( ( firstParameterLine - parenLine ) > 1 )
409395 {
410396 context . ReportDiagnostic ( Diagnostic . Create ( Descriptor , firstParameter . GetLocation ( ) ) ) ;
411397 }
412398 }
399+
400+ private static bool IsValidTrivia ( SyntaxTrivia trivia )
401+ {
402+ switch ( trivia . Kind ( ) )
403+ {
404+ case SyntaxKind . IfDirectiveTrivia :
405+ case SyntaxKind . ElseDirectiveTrivia :
406+ case SyntaxKind . ElifDirectiveTrivia :
407+ case SyntaxKind . EndIfDirectiveTrivia :
408+ case SyntaxKind . DisabledTextTrivia :
409+ case SyntaxKind . WhitespaceTrivia :
410+ return true ;
411+
412+ default :
413+ return false ;
414+ }
415+ }
413416 }
414417}
0 commit comments