2016-04-22 12 views
1

Roslynは、任意の有効なタイプ文字列またはITypeSymbolの構文ツリーを生成する方法を提供していますか?例えばRoslynのタイプ文字列/ ITypeSymbolから構文ツリーを作成する

System.Threading.Task<int>

QualifiedName(
    QualifiedName(
     IdentifierName("System"), 
     IdentifierName("Threading")), 
    GenericName(
     Identifier("Task")) 
    .WithTypeArgumentList(
     TypeArgumentList(
      SingletonSeparatedList<TypeSyntax>(
       PredefinedType(
        Token(SyntaxKind.IntKeyword)))))) 

、最終的にSystem.Threading.Task<,>のツリーに解析しながらSystem.Threading.Task

QualifiedName(
    QualifiedName(
     IdentifierName("System"), 
     IdentifierName("Threading")), 
    GenericName(
     Identifier("Task")) 
    .WithTypeArgumentList(
     TypeArgumentList(
      SeparatedList<TypeSyntax>(
       new SyntaxNodeOrToken[]{ 
        OmittedTypeArgument(), 
        Token(SyntaxKind.CommaToken), 
        OmittedTypeArgument()})))) 

一方のツリーに構文解析

QualifiedName(
    QualifiedName(
     IdentifierName("System"), 
     IdentifierName("Threading")), 
    IdentifierName("Task")) 

のツリーに構文解析私は軽量レクサーfを書く過程にあるこのユースケースでは、これが既にRoslynによって提供されているかどうかを知りたかったのです。

更新#1: タマスで説明した手法に基づいて解析する最小限に抑えるために最終的な変種:

public static async Task<TypeSyntax> CreateTypeSyntax(string typeName) 
{ 
    var options = new CSharpParseOptions(kind: SourceCodeKind.Script); 
    var parsedTree = CSharpSyntaxTree.ParseText($"typeof({typeName})", options); 
    var treeRoot = await parsedTree.GetRootAsync(); 
    var typeNameNode = treeRoot.DescendantNodes().OfType<TypeSyntax>().FirstOrDefault(); 
    return typeNameNode; 
} 

答えて

1

あなたは、任意の入力からツリーを生成するためにCSharpSyntaxTree.ParseTextを使用することができます。あなたがコントロールしている入力を与えると、興味のあるサブツリーに行くことができます。例えば、あるタイプの構文が必要な場合です。そして、それのツリーを取得

@"class MyClass 
{ 
    TYPE_THAT_INTERESTS_ME field; 
}" 

、およびフィールドに移動し、そのVariableDeclarationSyntaxからTypeSyntaxを得る:あなたのような入力を一緒に置くことができます。

+0

typeof()ノードを使用するこのアプローチは、請求書に適合しているようです。 – ThatRA

+0

Roslynに完全なC#プログラムを提供する必要がありますか、それとも単なる断片を与えることはできますか? (例えば、 "a + b * c"を単独で解析できますか?)言語の有効な部分文字列を解析することはできますか: "else x + 2;"?どのAPIが呼び出されますか –

+0

APIを使って任意の入力のためにツリーを返すことさえできないかもしれません。 'x +'を考えてみましょう。有効な式であり、 'x + 2'や' x ++ 'の一部である可能性があります。http://roslynquoter.azurewebsites.net/をチェックして、何が入力されているかを確認してください。 – Tamas

関連する問題