Eligos
Eligos 1.0-alpha
Eligos是Kotlin編程語言的靜態代碼分析工具。
在當前版本中,我們可以檢測到以下13個代碼氣味:
| 類型 | 標籤 | 描述 |
| 循環引用 | ? | 兩個或多個類或文件具有形成封閉循環的相互依賴性 |
| 過多的參數 | ? | 一種方法有太多參數 |
| 未使用的導入 | ? | 已導入到文件的類,屬性,方法或軟件包,但從未使用過 |
| 複雜方法 | ? | 循環的複雜性太大 |
| 提供不變的收藏 | ? | 當Java調用Kotlin的API時,Kotlin提供不變的收集類型 |
| 內部暴露 | ? | Java向公眾公開Kotlin內部聲明。 |
| 不確定的無效平台表達式用法 | ? | Kotlin本地調用Java方法,該方法返回null-agnostic類型,並直接以Kotlin方法使用此結果,該方法期望完全非null參數 |
| 不確定的無效平台呼叫者 | ? | 調用方法或訪問其呼叫者表達式類型的屬性是kotlin中的平台類型。 |
| 無效傳遞給平台參數 | ? | Kotlin將無效的參數傳遞給採用平台參數的Java方法。 |
| 不確定的無效平台類型屬性 | ? | kotlin稱為空的無關Java方法或屬性,並將此值用作class屬性的getter的返回值 |
| 非jvmstatic伴侶功能 | ? | 必須用@jvmstatic註釋伴隨對像中的公共功能,以作為靜態方法暴露。沒有註釋,這些函數只能作為靜態伴隨字段上的實例方法可用。 |
| 非JVMFIELD伴侶價值 | ? | 必須用@jvmfield註釋的公共,非const屬性是伴隨對像中有效的常數,以作為靜態字段暴露。 |
| 難以理解的Javafacade名稱 | ? | 當文件包含頂級函數或屬性時,請始終用@file:jvmname(“ foo”)提供註釋,以提供一個不錯的名稱。默認,文件myClass.kt中的頂級成員最終將進入一個名為MyClasskt的類,該類別稱為myClasskt,該類別是不適合的,並且將語言洩露為實施細節。 |
| 忽略了異常 | ? | 可以投擲檢查異常的功能應使用@throw進行記錄。運行時異常應記錄在KDOC中。請注意函數委託的API,因為它們可能會拋出kotlin允許靜默傳播的檢查例外。 |
| 當而不是級聯 | ? | 如果在陳述時應替換具有太多級聯反應的陳述 |
| 隱式單個表達函數 | ? | Kotlin的單表達方法返回單元以外的類型值,但未指定返回類型 |
| 對象可延伸 | ? | 用kotlin對象裝飾的課程從可拋光的 |
| 優化的尾部遞歸 | ? | Kotlin中的尾遞歸功能並不表示它是尾部遞歸的 |
在桌子中,黃色是Java Kotlin的常見,當Koltin Java互相呼叫時,生成綠色,而紫色是Kotlin獨有的。
git clone https://github.com/TnoAlex/Eligos.git| gradle | 科特林 | Java目標級別 | JDK Min版本 |
|---|---|---|---|
8.0+ | 1.9.10 | 17 | 17 |
./gradlew build # on linux
./gradlew.bat build # on windowseligos-cli/build/libs和eligos-plugin/build/distributions上找到可執行的CLI JAR,在Eligos-CLI/build/libs上找到可執行的CLI JAR。克隆這個倉庫
git clone https://github.com/TnoAlex/Eligos.git構建Docker圖像
docker build -t eligos:1.0 .運行Docker的Eligos
docker run -v $PROJECT :/dist/project -v $RESULT :/dist/result eligos:1.0 kotlin ./project ./result --with java在上述命令中, $PRJECT指的是要分析的項目的本地位置, $RESULT存儲本地結果的位置,請確保它們在使用此命令之前都存在。 Kotlin參數之後的兩個文件夾是固定的內部Docker映射。
CLI工具的使用可以由eligos --help ,如以下:
Usage: command-parser [<options>] <major language> <source path> [<result
output path>]
Options:
-w, --with=<text> Secondary languages that are analyzed in
collaboration with the primary language
-ecp, --class-path=<path> The classpath of the project to be analyzed.
(Default is source path and '.',If your project
has external jar dependencies, add the paths of
them)
-jh, --jdk-home=<path> The path of 'JAVA_HOME'. (Default is current jvm's
base dir)
-kv, --kotlin-v=<text> The version of kotlin in the project
-jt, --jvm-target=<text> The target of project's bytecode
-kl, --kotlin-lib=<path> The path of kotlin-std-lib. (Default is current
kotlin lib's path)
-p, --prefix=<text> The result file name prefix
-f, --format=(JSON|XML|HTML|TEXT)
The Presentation of results
-r, --rules=<path> Specify the rules to use
-D, --debug Out put exception stack
-Nr, --no-report Disable reporter (debug only)
-h, --help Show this message and exit
Arguments:
<major language> The major language to be analyzed
<source path> The path of source files
<result output path> The path to out put result
如果YOB使用第三方庫,或使用Maven或Gradlle等構建工具,請設置正確的類classpath ,以便該工具可以找到這些依賴項並避免無法解決某些外部依賴關係的問題。
我們提供了一種簡單的機制來擴展Eligos。以下步驟使您可以創建一個屬於您的規則:
創建一個實現PsiProcessor PSI文件處理器,並定義一個問題,該問題是擴展Issue
使用@EventListener註釋添加PSI文件偵聽器,並報告這樣的問題:
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
context.reportIssue( MyIssue (hashSetOf(ktFile.virtualFilePath)))
}
}
class MyIssue ( affectedFiles : HashSet < String >) : Issue( AnalysisHierarchyEnum . FILE , affectedFiles, " My Issue " , null )用@Component andation掃描組件管理器可以掃描您的規則
@Component
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
}如果您只想在插件上運行此規則,請使用@Suitable註釋
@Component
@Suitable( LaunchEnvironment . IDE_PLUGIN )
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
}就這樣? 。如果您想更詳細地自定義Eligos,請參閱Eligos體系結構圖,執行過程。