2012-01-04 8 views
1

Java標準ライブラリクラス(java.*/javax.*のもの)とメソッドがいくつかのScalaソースコード(および使用頻度)で使用されている統計をいくつか構築したいとします。ScalaソースのJavaクラスの依存関係を検出するにはどうすればよいですか?

これを行う最も簡単な方法は何ですか?過渡的な依存関係をカバーする機会はあるか? g。一部のLiftクラスがScalaの標準ライブラリメソッドに依存している場合、これはJava標準ライブラリメソッドに依存します。

答えて

0

私はこの問題を解決したScalaコンパイラプラグインを作成しました。それはかなりではありませんが、その仕事をしています。

仕事をしている主要部分は次のようになります。

for (tree <- unit.body) { 
    tree match { 
    case [email protected](mods, name, tparams, vparamss, tpt, rhs) 
     if isJavaAndNotAccessor(mods, rhs.symbol) => 
     printJava(rhs, "DefDef") 

    case [email protected](mods, name, tpt, rhs) => 
     if (isJavaAndNotAccessor(mods, tpt.symbol)) 
     printJava(tpt, "ValDef") 
     tpt.tpe.typeArgs.foreach(t => findAllJavaTypes(t.baseTypeSeq.toList).foreach(sym => printJavaCustom(sym, posWithFallback(sym.pos, tree.pos), "TpeArg"))) 

    case [email protected](parents, self, body) => 
     parents.foreach(p => findAllJavaTypes(p.tpe.baseTypeSeq.toList).foreach(sym => printJavaCustom(sym, posWithFallback(p.pos, tree.pos), "TpeDef"))) 

    case [email protected](qual, name) => 
     if (isJavaAndNotJLObjectInit(tree.symbol) && (tree.symbol.isMethod || tree.symbol.isValue || tree.symbol.isStaticMember)) 
     printJava(tree, "Select") 

    case _ => 
    } 
} 

private def findAllJavaTypes(types: List[Type]): List[Symbol] = { 
    def find0(types: List[Type], result: List[Type]): List[Type] = 
    if (types == List()) 
     result 
    else 
     find0(types.flatMap(_.typeArgs), types.filter(tpe => isJavaAndNotJLObject(tpe.typeSymbol)) ::: result) 

    find0(types, List()).distinct.map(_.typeSymbol) 
} 

コードはここでホストされていますhttps://github.com/soc/scala-compilerplugin-javausagecounter

1

をあなたはおそらくあなたの問題を解決するために適合させることができるthis questionへの答えを見てみたいのでしょうか?

1

Structure101でこれを行うことができます。 Scala/JavaバイトコードからS101プロジェクトをロードし、Collaborationパースペクティブ(構造タブ)に行き、左側のツリービューのScalaコードのルートパッケージとrhsのJavaパッケージを選択します。これにより、Scalaプロジェクトで使用されるJavaアイテム(package.class.method /フィールドレベルの詳細レベル)と、ScalaアイテムがJavaライブラリ内のものを使用することが示され、特定の依存関係を調べるためにドリルダウンできます。

タグ付けを使用して推移的な依存関係を取得することもできます。項目を選択し、右クリックし、タグ/使用/間接を選択します。これは、それぞれのパースペクティブをロールアップする青い点でアイテムをマークします。推移閉包以外のすべてを非表示にすることができます(タグを逆転させ、タグを非表示にします)。 Sliceのパースペクティブに行き、 "外側のクラス"のスライス、メインクラスタを選択し、parent by groupオプションを使用すると、役に立つビューが得られるはずです。これにより、親パッケージでグループ化された1つの図のすべてのクラスが表示されます。非常に大きなプロジェクトがある場合は、DSMビューに切り替えることができます.DSMビューは、有向グラフよりも拡張性があります。

0

IntelliJ IDEAには、依存関係分析機能があり、必要な機能を実行します。

あなたは、テキストファイルに依存関係の分析をエクスポートすることができ、それはのようなエントリが含まれます:

<file path="$PROJECT_DIR$/src/main/scala/com/foo/config/Bootstrap.scala"> 
    <dependency path="$PROJECT_DIR$/src/main/scala/com/foo/ws/auth/Auth.scala" /> 
    <dependency path="$PROJECT_DIR$/src/main/scala/com/foo/domain/auth/User.scala" /> 
    <dependency path="$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.9.1/scala-library-2.9.1.jar!/scala/package.class" /> 
    <dependency path="/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/../Classes/classes.jar!/java/io/InputStream.class" /> 
    .... 

記載されている最後の行は、JavaのInputStreamクラスへの依存性がどのようにご注意を。

推移的な依存関係も同様にします。

関連する問題