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体系结构图,执行过程。