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;
}
typeof()ノードを使用するこのアプローチは、請求書に適合しているようです。 – ThatRA
Roslynに完全なC#プログラムを提供する必要がありますか、それとも単なる断片を与えることはできますか? (例えば、 "a + b * c"を単独で解析できますか?)言語の有効な部分文字列を解析することはできますか: "else x + 2;"?どのAPIが呼び出されますか –
APIを使って任意の入力のためにツリーを返すことさえできないかもしれません。 'x +'を考えてみましょう。有効な式であり、 'x + 2'や' x ++ 'の一部である可能性があります。http://roslynquoter.azurewebsites.net/をチェックして、何が入力されているかを確認してください。 – Tamas