提交 6debbc35 编写于 作者: S Shen Chen

Use SemanticFactService to rewrite all the rename logic

上级 eb3dd391
......@@ -288,9 +288,9 @@ public class TestClass
{
private void Caller(float s1, float s2)
{
float s3 = SomeCaculation(s1);
float s4 = SomeCaculation(s2);
System.Console.WriteLine(""This is s1"" + s3 + ""This is s2"" + s4);
float s11 = SomeCaculation(s1);
float s21 = SomeCaculation(s2);
System.Console.WriteLine(""This is s1"" + s11 + ""This is s2"" + s21);
}
private void Callee(float s1, float s2)
......
......@@ -44,7 +44,7 @@ internal sealed class CSharpInlineMethodRefactoringProvider :
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public CSharpInlineMethodRefactoringProvider() : base(CSharpSyntaxFacts.Instance)
public CSharpInlineMethodRefactoringProvider() : base(CSharpSyntaxFacts.Instance, CSharpSemanticFactsService.Instance)
{
}
......
......@@ -22,6 +22,7 @@ internal abstract partial class AbstractInlineMethodRefactoringProvider<TInvocat
where TArgumentSyntax : SyntaxNode
{
private readonly ISyntaxFacts _syntaxFacts;
private readonly ISemanticFactsService _semanticFactsService;
/// <summary>
/// Check if the <param name="calleeMethodDeclarationSyntaxNode"/> has only one expression or it is using arrow expression.
......@@ -34,9 +35,10 @@ internal abstract partial class AbstractInlineMethodRefactoringProvider<TInvocat
protected abstract bool IsStatementConsideredAsInvokingStatement(SyntaxNode node);
protected abstract TExpressionSyntax Parenthesize(TExpressionSyntax node);
protected AbstractInlineMethodRefactoringProvider(ISyntaxFacts syntaxFacts)
protected AbstractInlineMethodRefactoringProvider(ISyntaxFacts syntaxFacts, ISemanticFactsService semanticFactsService)
{
_syntaxFacts = syntaxFacts;
_semanticFactsService = semanticFactsService;
}
public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context)
......@@ -121,6 +123,7 @@ private static bool IsExpressionSyntax(SyntaxNode syntaxNode)
var inlineContext = await InlineMethodContext.GetInlineContextAsync(
this,
_syntaxFacts,
_semanticFactsService,
document,
semanticModel,
calleeMethodInvocationSyntaxNode,
......
......@@ -19,6 +19,17 @@ internal abstract class AbstractSemanticFactsService : ISemanticFacts
protected abstract SyntaxToken ToIdentifierToken(string identifier);
// local name can be same as field or property. but that will hide
// those and can cause semantic change later in some context.
// so to be safe, we consider field and property in scope when
// creating unique name for local
private static Func<ISymbol, bool> s_LocalNameFilter = s =>
s.Kind == SymbolKind.Local ||
s.Kind == SymbolKind.Parameter ||
s.Kind == SymbolKind.RangeVariable ||
s.Kind == SymbolKind.Field ||
s.Kind == SymbolKind.Property;
public SyntaxToken GenerateUniqueName(
SemanticModel semanticModel, SyntaxNode location, SyntaxNode containerOpt,
string baseName, CancellationToken cancellationToken)
......@@ -39,19 +50,16 @@ internal abstract class AbstractSemanticFactsService : ISemanticFacts
SemanticModel semanticModel, SyntaxNode location, SyntaxNode containerOpt,
string baseName, CancellationToken cancellationToken)
{
// local name can be same as field or property. but that will hide
// those and can cause semantic change later in some context.
// so to be safe, we consider field and property in scope when
// creating unique name for local
Func<ISymbol, bool> filter = s =>
s.Kind == SymbolKind.Local ||
s.Kind == SymbolKind.Parameter ||
s.Kind == SymbolKind.RangeVariable ||
s.Kind == SymbolKind.Field ||
s.Kind == SymbolKind.Property;
return GenerateUniqueName(
semanticModel, location, containerOpt, baseName, s_LocalNameFilter, usedNames: Enumerable.Empty<string>(), cancellationToken);
}
public SyntaxToken GenerateUniqueLocalName(
SemanticModel semanticModel, SyntaxNode location, SyntaxNode containerOpt,
string baseName, IEnumerable<string> usedNames, CancellationToken cancellationToken)
{
return GenerateUniqueName(
semanticModel, location, containerOpt, baseName, filter, usedNames: Enumerable.Empty<string>(), cancellationToken);
semanticModel, location, containerOpt, baseName, s_LocalNameFilter, usedNames: usedNames, cancellationToken);
}
public SyntaxToken GenerateUniqueName(
......
......@@ -39,6 +39,10 @@ internal interface ISemanticFactsService : ISemanticFacts, ILanguageService
SemanticModel semanticModel, SyntaxNode location,
SyntaxNode containerOpt, string baseName, CancellationToken cancellationToken);
SyntaxToken GenerateUniqueLocalName(
SemanticModel semanticModel, SyntaxNode location,
SyntaxNode containerOpt, string baseName, IEnumerable<string> usedNames, CancellationToken cancellationToken);
SyntaxToken GenerateUniqueName(string baseName, IEnumerable<string> usedNames);
}
}
......@@ -118,6 +118,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return MyBase.GenerateUniqueLocalName(semanticModel, location, containerOpt, baseName, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueLocalName(
semanticModel As SemanticModel, location As SyntaxNode, containerOpt As SyntaxNode, baseName As String, usedName As IEnumerable(Of String), cancellationToken As CancellationToken) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueLocalName
Return MyBase.GenerateUniqueLocalName(semanticModel, location, containerOpt, baseName, usedName, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueName(semanticModel As SemanticModel, location As SyntaxNode, containerOpt As SyntaxNode, baseName As String, filter As Func(Of ISymbol, Boolean), usedNames As IEnumerable(Of String), cancellationToken As CancellationToken) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueName
Return MyBase.GenerateUniqueName(semanticModel, location, containerOpt, baseName, filter, usedNames, cancellationToken)
End Function
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册