|
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Simplification
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
Friend Class ExpressionSyntaxGeneratorVisitor
Inherits SymbolVisitor(Of ExpressionSyntax)
' Public Shared ReadOnly Instance As ExpressionSyntaxGeneratorVisitor = New ExpressionSyntaxGeneratorVisitor()
Private ReadOnly _addGlobal As Boolean
Public Sub New(addGlobal As Boolean)
Me._addGlobal = addGlobal
End Sub
Public Overrides Function DefaultVisit(symbol As ISymbol) As ExpressionSyntax
Return symbol.Accept(TypeSyntaxGeneratorVisitor.Create(_addGlobal))
End Function
Private Shared Function AddInformationTo(Of TExpressionSyntax As ExpressionSyntax)(expression As TExpressionSyntax, symbol As ISymbol) As TExpressionSyntax
expression = expression.WithPrependedLeadingTrivia(SyntaxFactory.ElasticMarker).WithAppendedTrailingTrivia(SyntaxFactory.ElasticMarker)
expression = expression.WithAdditionalAnnotations(SymbolAnnotation.Create(symbol))
Return expression
End Function
Public Overrides Function VisitNamedType(symbol As INamedTypeSymbol) As ExpressionSyntax
Dim typeSyntax = TypeSyntaxGeneratorVisitor.Create(_addGlobal).CreateSimpleTypeSyntax(symbol)
If Not (TypeOf typeSyntax Is SimpleNameSyntax) Then
Return typeSyntax
End If
Dim simpleNameSyntax = DirectCast(typeSyntax, SimpleNameSyntax)
If symbol.ContainingType IsNot Nothing Then
If symbol.ContainingType.TypeKind = TypeKind.Submission Then
Return simpleNameSyntax
Else
Dim container = symbol.ContainingType.Accept(Me)
Return CreateMemberAccessExpression(symbol, container, simpleNameSyntax)
End If
ElseIf symbol.ContainingNamespace IsNot Nothing Then
If symbol.ContainingNamespace.IsGlobalNamespace Then
If symbol.TypeKind <> TypeKind.[Error] Then
Return CreateMemberAccessExpression(symbol, SyntaxFactory.GlobalName(), simpleNameSyntax)
End If
Else
Dim container = symbol.ContainingNamespace.Accept(Me)
Return CreateMemberAccessExpression(symbol, container, simpleNameSyntax)
End If
End If
Return simpleNameSyntax
End Function
Public Overrides Function VisitNamespace(symbol As INamespaceSymbol) As ExpressionSyntax
Dim result = AddInformationTo(symbol.Name.ToIdentifierName, symbol)
If symbol.ContainingNamespace Is Nothing Then
Return result
End If
If symbol.ContainingNamespace.IsGlobalNamespace Then
Return CreateMemberAccessExpression(symbol, SyntaxFactory.GlobalName(), result)
Else
Dim container = symbol.ContainingNamespace.Accept(Me)
Return CreateMemberAccessExpression(symbol, container, result)
End If
End Function
Private Shared Function CreateMemberAccessExpression(symbol As ISymbol, container As ExpressionSyntax, simpleName As SimpleNameSyntax) As ExpressionSyntax
Return AddInformationTo(SyntaxFactory.SimpleMemberAccessExpression(container, SyntaxFactory.Token(SyntaxKind.DotToken), simpleName), symbol)
End Function
End Class
End Namespace
|