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