提交 f2f9d203 编写于 作者: C Cyrus Najmabadi

Extract helper for generating local names.

上级 3651f4fd
......@@ -307,7 +307,8 @@ bool IterationVariableIsUsedForMoreThanCollectionIndex(SyntaxNode current)
if (foreachIdentifier.RawKind == 0)
{
foreachIdentifier = generator.Identifier("v").WithAdditionalAnnotations(RenameAnnotation.Create());
foreachIdentifier = semanticFacts.GenerateUniqueName(semanticModel, forStatement, "v", cancellationToken)
.WithAdditionalAnnotations(RenameAnnotation.Create());
}
var foreachIdentifierName = generator.IdentifierName(foreachIdentifier).WithoutTrivia().WithoutAnnotations();
......
......@@ -221,20 +221,13 @@ private CodeAction CreateAction(State state, bool allOccurrences, bool isConstan
SyntaxNode container,
CancellationToken cancellationToken)
{
var syntaxFacts = document.Document.GetLanguageService<ISyntaxFactsService>();
var semanticFacts = document.Document.GetLanguageService<ISemanticFactsService>();
var semanticModel = document.SemanticModel;
var existingSymbols = semanticModel.GetExistingSymbols(container, cancellationToken);
var semanticFacts = document.Document.GetLanguageService<ISemanticFactsService>();
var baseName = semanticFacts.GenerateNameForExpression(
semanticModel, expression, capitalize: isConstant, cancellationToken: cancellationToken);
var reservedNames = semanticModel.LookupSymbols(expression.SpanStart)
.Select(s => s.Name)
.Concat(existingSymbols.Select(s => s.Name));
return syntaxFacts.ToIdentifierToken(
NameGenerator.EnsureUniqueness(baseName, reservedNames, syntaxFacts.IsCaseSensitive));
return semanticFacts.GenerateUniqueName(semanticModel, container, baseName, cancellationToken);
}
protected ISet<TExpressionSyntax> FindMatches(
......
......@@ -8,6 +8,7 @@
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Extensions.ContextQuery;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Extensions;
......@@ -15,10 +16,12 @@
namespace Microsoft.CodeAnalysis.CSharp
{
internal class CSharpSemanticFactsService : ISemanticFactsService
internal class CSharpSemanticFactsService : AbstractSemanticFactsService, ISemanticFactsService
{
internal static readonly CSharpSemanticFactsService Instance = new CSharpSemanticFactsService();
protected override ISyntaxFactsService SyntaxFactsService => CSharpSyntaxFactsService.Instance;
private CSharpSemanticFactsService()
{
}
......
......@@ -2,8 +2,11 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Utilities;
namespace Microsoft.CodeAnalysis.LanguageServices
{
......@@ -101,5 +104,28 @@ internal interface ISemanticFactsService : ILanguageService
IEnumerable<ISymbol> GetDeclaredSymbols(SemanticModel semanticModel, SyntaxNode memberDeclaration, CancellationToken cancellationToken);
SymbolInfo GetSymbolInfo(SemanticModel semanticModel, SyntaxNode node, SyntaxToken token, CancellationToken cancellationToken);
SyntaxToken GenerateUniqueName(SemanticModel semanticModel, SyntaxNode location, string baseName, CancellationToken cancellationToken);
}
internal abstract class AbstractSemanticFactsService
{
protected abstract ISyntaxFactsService SyntaxFactsService { get; }
public SyntaxToken GenerateUniqueName(SemanticModel semanticModel, SyntaxNode location, string baseName, CancellationToken cancellationToken)
{
var syntaxFacts = this.SyntaxFactsService;
var container = location.AncestorsAndSelf().FirstOrDefault(
a => syntaxFacts.IsExecutableBlock(a) || syntaxFacts.IsMethodBody(a)) ?? location;
var existingSymbols = semanticModel.GetExistingSymbols(container, cancellationToken);
var reservedNames = semanticModel.LookupSymbols(container.SpanStart)
.Select(s => s.Name)
.Concat(existingSymbols.Select(s => s.Name));
return syntaxFacts.ToIdentifierToken(
NameGenerator.EnsureUniqueness(baseName, reservedNames, syntaxFacts.IsCaseSensitive));
}
}
}
......@@ -21,10 +21,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Class
Friend Class VisualBasicSemanticFactsService
Inherits AbstractSemanticFactsService
Implements ISemanticFactsService
Public Shared ReadOnly Instance As New VisualBasicSemanticFactsService()
Protected Overrides ReadOnly Property SyntaxFactsService As ISyntaxFactsService = VisualBasicSyntaxFactsService.Instance
Private Sub New()
End Sub
......@@ -294,5 +297,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Public Function GetSymbolInfo(semanticModel As SemanticModel, node As SyntaxNode, token As SyntaxToken, cancellationToken As CancellationToken) As SymbolInfo Implements ISemanticFactsService.GetSymbolInfo
Return semanticModel.GetSymbolInfo(node, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueName(semanticModel As SemanticModel, location As SyntaxNode, baseName As String, cancellationToken As CancellationToken) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueName
Return MyBase.GenerateUniqueName(semanticModel, location, baseName, cancellationToken)
End Function
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册