| File: CodeRefactorings\InlineTemporary\VisualBasicInlineTemporaryCodeRefactoringProvider.ReferenceRewriter.vb | Web Access |
| Project: src\roslyn\src\Features\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.Features.vbproj (Microsoft.CodeAnalysis.VisualBasic.Features) |
' 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 System.Threading Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis.CodeActions Imports Microsoft.CodeAnalysis.Formatting Imports Microsoft.CodeAnalysis.Simplification Imports Microsoft.CodeAnalysis.VisualBasic Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic.CodeRefactorings.InlineTemporary Partial Friend Class VisualBasicInlineTemporaryCodeRefactoringProvider Partial Private Class ReferenceRewriter Inherits VisualBasicSyntaxRewriter Private ReadOnly _semanticModel As SemanticModel Private ReadOnly _definition As ModifiedIdentifierSyntax Private ReadOnly _expressionToInline As ExpressionSyntax Private ReadOnly _cancellationToken As CancellationToken Private ReadOnly _localSymbol As ILocalSymbol Public Sub New( semanticModel As SemanticModel, modifiedIdentifier As ModifiedIdentifierSyntax, expressionToInline As ExpressionSyntax, cancellationToken As CancellationToken ) _definition = modifiedIdentifier _semanticModel = semanticModel _expressionToInline = expressionToInline _cancellationToken = cancellationToken _localSymbol = DirectCast(_semanticModel.GetDeclaredSymbol(_definition, cancellationToken), ILocalSymbol) End Sub Private Function IsReference(node As SimpleNameSyntax) As Boolean If Not CaseInsensitiveComparison.Equals(node.Identifier.ValueText, _definition.Identifier.ValueText) Then Return False End If Dim symbolInfo = _semanticModel.GetSymbolInfo(node) Return Equals(symbolInfo.Symbol, _localSymbol) End Function Public Overrides Function VisitIdentifierName(node As IdentifierNameSyntax) As SyntaxNode _cancellationToken.ThrowIfCancellationRequested() If IsReference(node) Then If HasConflict(node, _definition, _expressionToInline, _semanticModel) Then Return node.Update(node.Identifier.WithAdditionalAnnotations( ConflictAnnotation.Create(FeaturesResources.Conflict_s_detected))) End If ' Make sure we attach any trailing trivia from the identifier node we're replacing ' to the new expression so that we don't remove any line continuation characters. Return _expressionToInline _ .Parenthesize() _ .WithTrailingTrivia(node.GetTrailingTrivia()) _ .WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation) End If Return MyBase.VisitIdentifierName(node) End Function Public Overrides Function VisitNameColonEquals(node As NameColonEqualsSyntax) As SyntaxNode If node.IsParentKind(SyntaxKind.SimpleArgument) AndAlso node.Parent.IsParentKind(SyntaxKind.TupleExpression) Then ' Temporaries should not be inlined in the name portion of a named tuple element ' This special case should be removed once https://github.com/dotnet/roslyn/issues/16697 is fixed Return node End If Return MyBase.VisitNameColonEquals(node) End Function Public Overloads Shared Function Visit( semanticModel As SemanticModel, scope As SyntaxNode, modifiedIdentifier As ModifiedIdentifierSyntax, expressionToInline As ExpressionSyntax, cancellationToken As CancellationToken ) As SyntaxNode Dim rewriter = New ReferenceRewriter(semanticModel, modifiedIdentifier, expressionToInline, cancellationToken) Return rewriter.Visit(scope) End Function End Class End Class End Namespace