99using Microsoft . CodeAnalysis . VisualBasic ;
1010using Microsoft . CodeAnalysis . VisualBasic . Syntax ;
1111using AttributeListSyntax = Microsoft . CodeAnalysis . VisualBasic . Syntax . AttributeListSyntax ;
12+ using BinaryExpressionSyntax = Microsoft . CodeAnalysis . CSharp . Syntax . BinaryExpressionSyntax ;
1213using CSharpExtensions = Microsoft . CodeAnalysis . CSharp . CSharpExtensions ;
1314using CSSyntaxKind = Microsoft . CodeAnalysis . CSharp . SyntaxKind ;
1415using ExpressionSyntax = Microsoft . CodeAnalysis . VisualBasic . Syntax . ExpressionSyntax ;
@@ -206,7 +207,7 @@ public ExpressionSyntax ReduceArrayUpperBoundExpression(Microsoft.CodeAnalysis.C
206207
207208 public LambdaExpressionSyntax ConvertLambdaExpression ( AnonymousFunctionExpressionSyntax node , CSharpSyntaxNode body , IEnumerable < ParameterSyntax > parameters , SyntaxTokenList modifiers )
208209 {
209- var symbol = ModelExtensions . GetSymbolInfo ( _semanticModel , node ) . Symbol as IMethodSymbol ;
210+ var symbol = ( IMethodSymbol ) ModelExtensions . GetSymbolInfo ( _semanticModel , node ) . Symbol ;
210211 var parameterList = SyntaxFactory . ParameterList ( SyntaxFactory . SeparatedList ( parameters . Select ( p => ( Microsoft . CodeAnalysis . VisualBasic . Syntax . ParameterSyntax ) p . Accept ( _nodesVisitor ) ) ) ) ;
211212 LambdaHeaderSyntax header ;
212213 EndBlockStatementSyntax endBlock ;
@@ -233,7 +234,8 @@ public LambdaExpressionSyntax ConvertLambdaExpression(AnonymousFunctionExpressio
233234 var vbThrowExpression = ( ExpressionSyntax ) csThrowExpression . Expression . Accept ( _nodesVisitor ) ;
234235 var vbThrowStatement = SyntaxFactory . ThrowStatement ( SyntaxFactory . Token ( SyntaxKind . ThrowKeyword ) , vbThrowExpression ) ;
235236
236- return SyntaxFactory . MultiLineFunctionLambdaExpression ( header , SyntaxFactory . SingletonList < StatementSyntax > ( vbThrowStatement ) , endBlock ) ;
237+ return SyntaxFactory . MultiLineFunctionLambdaExpression ( header ,
238+ SyntaxFactory . SingletonList < StatementSyntax > ( vbThrowStatement ) , endBlock ) ;
237239 } else {
238240 statements = InsertRequiredDeclarations (
239241 SyntaxFactory . SingletonList < StatementSyntax > (
@@ -396,19 +398,25 @@ public VisualBasicSyntaxNode ConvertTopLevelExpression(Microsoft.CodeAnalysis.CS
396398 return topLevelExpression . Accept ( _nodesVisitor ) ;
397399 }
398400
399- private static ModifiedIdentifierSyntax ExtractIdentifier ( Microsoft . CodeAnalysis . CSharp . Syntax . VariableDeclaratorSyntax v )
401+ private ModifiedIdentifierSyntax ExtractIdentifier ( Microsoft . CodeAnalysis . CSharp . Syntax . VariableDeclaratorSyntax v )
400402 {
401403 return SyntaxFactory . ModifiedIdentifier ( ConvertIdentifier ( v . Identifier ) ) ;
402404 }
403405
404- public static SyntaxToken ConvertIdentifier ( SyntaxToken id )
406+ public SyntaxToken ConvertIdentifier ( SyntaxToken id )
405407 {
406- var idText = id . ValueText ;
408+ CSharpSyntaxNode parent = ( CSharpSyntaxNode ) id . Parent ;
409+ var idText = IsEventHandlerIdentifier ( parent ) && ! IsEventHandlerAssignLhs ( parent ) ? id . ValueText + "Event" : id . ValueText ;
407410 // Underscore is a special character in VB lexer which continues lines - not sure where to find the whole set of other similar tokens if any
408411 // Rather than a complicated contextual rename, just add an extra dash to all identifiers and hope this method is consistently used
412+ bool keywordRequiresEscaping = KeywordRequiresEscaping ( id ) ;
413+ return Identifier ( idText , keywordRequiresEscaping ) ;
414+ }
415+
416+ public static SyntaxToken Identifier ( string idText , bool keywordRequiresEscaping = false )
417+ {
409418 if ( idText . All ( c => c == '_' ) ) idText += "_" ;
410-
411- return KeywordRequiresEscaping ( id ) ? SyntaxFactory . Identifier ( $ "[{ idText } ]") : SyntaxFactory . Identifier ( idText ) ;
419+ return keywordRequiresEscaping ? SyntaxFactory . Identifier ( $ "[{ idText } ]") : SyntaxFactory . Identifier ( idText ) ;
412420 }
413421
414422 private static bool KeywordRequiresEscaping ( SyntaxToken id )
@@ -530,5 +538,31 @@ private static string UppercaseFirstLetter(string sourceText)
530538 {
531539 return sourceText . Substring ( 0 , 1 ) . ToUpper ( ) + sourceText . Substring ( 1 ) ;
532540 }
541+
542+ public bool IsEventHandlerIdentifier ( CSharpSyntaxNode syntax )
543+ {
544+ return GetSymbol ( syntax ) . IsKind ( SymbolKind . Event ) ;
545+ }
546+
547+ private static bool IsEventHandlerAssignLhs ( CSharpSyntaxNode syntax )
548+ {
549+ var assignmentExpressionSyntax = syntax . GetAncestor < AssignmentExpressionSyntax > ( ) ;
550+ return assignmentExpressionSyntax != null && assignmentExpressionSyntax . IsKind ( CSSyntaxKind . AddAssignmentExpression , CSSyntaxKind . SubtractAssignmentExpression )
551+ && assignmentExpressionSyntax . Left . DescendantNodes ( ) . Contains ( syntax ) ;
552+ }
553+
554+ private ISymbol GetSymbol ( CSharpSyntaxNode syntax )
555+ {
556+ return syntax . SyntaxTree == _semanticModel . SyntaxTree
557+ ? _semanticModel . GetSymbolInfo ( syntax ) . Symbol
558+ : null ;
559+ }
560+
561+ private ITypeSymbol GetTypeSymbol ( CSharpSyntaxNode syntax )
562+ {
563+ return syntax . SyntaxTree == _semanticModel . SyntaxTree
564+ ? _semanticModel . GetTypeInfo ( syntax ) . Type
565+ : null ;
566+ }
533567 }
534568}
0 commit comments