亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從具有ITypeSymbol的所有封閉名稱空間收集使用

從具有ITypeSymbol的所有封閉名稱空間收集使用

C#
江戶川亂折騰 2021-04-29 13:08:35
我正在編寫一個類生成器Microsoft.CodeAnalysis,它使用一個現有類(即ITypeSymbol實例)作為輸入,并應該生成一個NamespaceDeclarationSyntax包含的新類ClassDeclarationSyntax。本質上,生成的類是源類的外觀。就是說,在生成的代碼中需要相同的usings集和相同的namespace名稱,以使生成的Facade類正確編譯。我正在使用自定義CSharpSyntaxRewriter后代來處理源代碼。從該VisitClassDeclaration方法調用外觀生成邏輯。我SemanticModel.GetDeclaredSymbol用來檢索對應的ITypeSymbol。為了構建所有適用的usings的列表,并構建完全限定的名稱空間名稱,我想執行以下操作:// collect usings and construct namespace nameSyntaxList<UsingDirectiveSyntax> allUsings = SyntaxFactory.List<UsingDirectiveSyntax>();var nmspace = ClassSymbol.ContainingNamespace;string namespaceName = null;while (nmspace != null){    if (!nmspace.IsGlobalNamespace)    {        if (namespaceName == null)            namespaceName = nmspace.Name;        else            namespaceName = nmspace.Name + "." + namespaceName;    }    // here nmspace.DeclaringSyntaxReferences contains all occurrences in the given assembly    var syntax = nmspace.DeclaringSyntaxReferences.First().GetSyntax();    if (syntax is NamespaceDeclarationSyntax)        allUsings = allUsings.AddRange(((NamespaceDeclarationSyntax) syntax).Usings);    else if (syntax is CompilationUnitSyntax)        allUsings = allUsings.AddRange(((CompilationUnitSyntax) syntax).Usings);    nmspace = nmspace.ContainingNamespace;}問題是(1)我看不到一種簡單的方法來將語法樹從給定遍歷SyntaxNode到根,以及(2)甚至如何檢索一個精確地NamespaceDeclarationSyntax包圍給定的ClassDeclarationSyntax。最后,我想構建一個新的NamespaceDeclarationSyntax像這樣:return SyntaxFactory.NamespaceDeclaration(    SyntaxFactory.ParseName(namespaceName),     SyntaxFactory.List<ExternAliasDirectiveSyntax>(),     allUsings,     SyntaxFactory.List(new[] {(MemberDeclarationSyntax) generatedClass}));問題:有了給定的條件后SyntaxNode,如何遍歷樹回到CompilationUnitSyntax根節點?
查看完整描述

1 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

使用Ancestors或AncestorsAndSelf屬性檢索所有父級,以備份SyntaxTree。


從給定SyntaxNode直到根收集所有使用的代碼CompilationUnitSyntax如下所示:


// collect usings

SyntaxList<UsingDirectiveSyntax> allUsings = SyntaxFactory.List<UsingDirectiveSyntax>();

foreach (var syntaxRef in ClassSymbol.DeclaringSyntaxReferences)

{

    foreach (var parent in syntaxRef.GetSyntax().Ancestors(false))

    {

        if (parent is NamespaceDeclarationSyntax)

            allUsings = allUsings.AddRange(((NamespaceDeclarationSyntax)parent).Usings);

        else if (parent is CompilationUnitSyntax)

            allUsings = allUsings.AddRange(((CompilationUnitSyntax)parent).Usings);

    }

}


查看完整回答
反對 回復 2021-05-08
  • 1 回答
  • 0 關注
  • 205 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號