2015-06-21 77 views
0

我有兩個不同的項目的解決方案。我使用SyntaxWalker來處理ProjectA.Class1中的一些東西。但是,ProjectA.Class1有參考ProjectB.Class2Roslyn:SyntaxWalker通過2個不同的文檔

有沒有辦法讓語法步行者也可以通過外部類來遍歷?當兩個類都在同一個項目中但是在不同的文件(文檔)中時,我甚至無法做到這一點。它總是通過相同的文件。如果兩個類都在同一個文件中,那麼它就可以工作。如果我將它們提取爲單獨的,它不會...

我正在測試覆蓋率工具上工作。用戶點擊VS中的方法,然後:

  1. 我使用重寫器將靜態變量添加到每個分支。
  2. 我運行代碼,以便在覆蓋分支時設置靜態變量。

我不知道如何配置語法學習者\重寫器來識別同一解決方案中的其他類。

+0

你想達到什麼目的?語法walker在單個文檔(單個語法樹)上運行。你的步行者試圖達到什麼目標? – JoshVarty

+0

基本上我想分析入口點的代碼。用戶給我一個方法名稱,然後從這一點開始,我要遍歷他在解決方案中的所有引用。更像代碼覆蓋工具或自動工具,它向方法中添加一些註釋,並且必須遍歷所有用戶方法(但僅限於使用的方法)。 我在上面的主要問題中添加了一些註釋。 – user3733340

+0

您是否可以訪問整個項目/解決方案?你不能用它來到第二個文件嗎? – svick

回答

0

您將需要訪問Symbol API。一個簡單的經驗法則我嘗試去:

  • 的語法API是單個文件
  • 象徵API允許你與跨越跨文件信息的工作。

你在評論中提到你想要遍歷方法並找出關於每個方法聲明的一些信息。這裏有一些(天真的)代碼可以讓你開始使用符號API。

我假設您有權訪問您正在分析的Project

Project myProject; 
public void ProcessMethod(MethodDeclarationSyntax method) 
{ 
    //Get the semantic model 
    var filePath = method.SyntaxTree.FilePath; 
    var containingDocument = myProject.Documents.Where(n => n.FilePath == filePath).Single(); 
    var model = containingDocument.GetSemanticModelAsync().Result; 

    //... 
    //Do your processing on the current method here... 
    //... 

    //Process the invoked methods. 
    var invocations = method.DescendantNodes().OfType<InvocationExpressionSyntax>(); 
    foreach(var invocation in invocations) 
    { 
     var invokedSymbol = model.GetSymbolInfo(invocation).Symbol; //Might be null 
     var invokedSymbolSyntax = (MethodDeclarationSyntax)invokedSymbol.DeclaringSyntaxReferences.First().GetSyntax(); //Partial methods might be declared in multiple places 
     ProcessMethod(invokedSymbolSyntax); 
    } 
} 

注:

  • 這種方法不處理構造函數,析構函數,屬性,表達健全成員和其他成員,我忘了。但它應該足以讓你開始並向你介紹符號API。
  • 遞歸會咬你。
  • 您不會處理接口的實現。你必須查看SymbolFinder
+0

您認爲CSharpSyntaxRewriter(具有上述改進)和每個分支的靜態變量是計算測試覆蓋率(就性能而言)的合理方法嗎?有沒有更快的方法來做到這一點? 我知道遞歸,但我的意思是一般概念(靜態變量)罰款? – user3733340

+0

我的回覆不適合評論,所以我會草擬我將作爲您的早期問題的答案:http://stackoverflow.com/questions/30958406/roslyn-dynamic-runtime-flow – JoshVarty

+0

我在重寫時發現測試覆蓋時不會使用上述內容,我只是用'CSharpSyntaxRewriter'獨立地重寫每個文件 – JoshVarty