2016-11-16 3 views
0

프로젝트의 변수/멤버/매개 변수의 이름을 바꾸기 위해 약간의 Roslyn 유틸리티를 작성하려고합니다. 그것은 행동의 가장 좋은 코스 Renamer.RenameSymbolAsync 메서드 것 같습니다. 그것을 사용하기 위해서는 솔루션과 의미 기호가 필요합니다. 지금까지이 정보를 얻는데 어려움을 겪고 있습니다. 여기에 지금까지ParameterSyntax에 대한 심볼 가져 오기

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.CodeAnalysis; 
using Microsoft.CodeAnalysis.CSharp; 
using Microsoft.CodeAnalysis.CSharp.Symbols; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 
using Microsoft.CodeAnalysis.FindSymbols; 
using Microsoft.CodeAnalysis.MSBuild; 
using Microsoft.CodeAnalysis.Rename; 
using Microsoft.CodeAnalysis.Text; 

namespace PlayCodeAnalysis 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 

     var solutionPath = @"D:\Development\lams\src\Lams.sln"; 
     var workspace = MSBuildWorkspace.Create(); 
     var solution = workspace.OpenSolutionAsync(solutionPath).Result; 

     var doc = solution.Projects.First().Documents.First(); 
     var model = doc.GetSemanticModelAsync().Result; 
     var syntax = doc.GetSyntaxRootAsync().Result; 

     var s = syntax.DescendantNodes().OfType<ParameterSyntax>().ToList(); 
     var symbol = model.GetSymbolInfo(s[0]).Symbol; 

     //Renamer.RenameSymbolAsync(solution,) 

    } 
    } 
} 

나는 데 문제가 symbol가 비어있는 끝나는 것입니다 노력 무엇을, 왜 그런지 모르겠어요. s은 파일의 모든 매개 변수 목록으로 올바르게 해석되지만 문자를 renamer로 전달할 수는 없습니다.

이 특정 경우에 대상이되는 문서는 다음과 같습니다,이 경우에 s[0]inCollection되는 끝 : 당신이 사용 할 수있는 로슬린 소스에 잠깐 눈에서

using System.Collections.Generic; 
using System.Data.Entity; 
using System.Threading.Tasks; 

namespace System.Linq 
{ 
    public static class AsyncEnumerable 
    { 
    public static async Task<ILookup<TKey, T>> ToLookupAsync<T, TKey>(this Task<IEnumerable<T>> inCollection, Func<T, TKey> inKeySelector) 
    { 
     return (await inCollection.ConfigureAwait(false)).ToLookup(inKeySelector); 
    } 
    } 
} 

답변

2

ParameterSyntaxGetSymbolInfo 대신 GetDeclaredSymbol이 표시됩니다.

+0

수정. 선언 컨텍스트 (예 : 정의 된 곳)의 심볼에'GetDeclaredSymbol'을 사용하십시오. 둘 다있을 수있는 몇 가지가 있지만 그게 더 많은 edgecase의. –