@@ -108,7 +108,6 @@ private static void HandleGreaterThanToken(SyntaxTreeAnalysisContext context, Sy
108108 SyntaxToken nextToken = token . GetNextToken ( ) ;
109109 switch ( nextToken . Kind ( ) )
110110 {
111- case SyntaxKind . OpenParenToken :
112111 // DotToken isn't listed above, but it's required for reasonable member access formatting
113112 case SyntaxKind . DotToken :
114113 // CommaToken isn't listed above, but it's required for reasonable nested generic type arguments formatting
@@ -122,6 +121,10 @@ private static void HandleGreaterThanToken(SyntaxTreeAnalysisContext context, Sy
122121 allowTrailingSpace = false ;
123122 break ;
124123
124+ case SyntaxKind . OpenParenToken :
125+ AnalyzeWithTrailingOpenParen ( nextToken , out allowTrailingNoSpace , out allowTrailingSpace ) ;
126+ break ;
127+
125128 case SyntaxKind . CloseParenToken :
126129 case SyntaxKind . GreaterThanToken :
127130 allowTrailingNoSpace = true ;
@@ -187,5 +190,33 @@ private static void HandleGreaterThanToken(SyntaxTreeAnalysisContext context, Sy
187190 }
188191 }
189192 }
193+
194+ private static void AnalyzeWithTrailingOpenParen (
195+ SyntaxToken nextToken ,
196+ out bool allowTrailingNoSpace ,
197+ out bool allowTrailingSpace )
198+ {
199+ switch ( nextToken . Parent . Kind ( ) )
200+ {
201+ // List<int> (int x) => new List<int> { x }
202+ // ^ ^
203+ case SyntaxKind . ParameterList when nextToken . Parent . Parent . IsKind ( SyntaxKind . ParenthesizedLambdaExpression ) :
204+ allowTrailingNoSpace = false ;
205+ allowTrailingSpace = true ;
206+ break ;
207+
208+ // NOTE: Intentionally keeping redundant cases here as documentation of what is known to occur
209+ // M<int>()
210+ // ^^
211+ case SyntaxKind . ArgumentList :
212+ // void M<T>(T x) { }
213+ // ^^
214+ case SyntaxKind . ParameterList when nextToken . Parent . Parent . IsKind ( SyntaxKind . MethodDeclaration ) :
215+ default :
216+ allowTrailingNoSpace = true ;
217+ allowTrailingSpace = false ;
218+ break ;
219+ }
220+ }
190221 }
191222}
0 commit comments