Kotlin 프로그래밍 언어를위한 정적 코드 분석 도구 인 Eligos.
현재 버전에서는 다음 13 개의 코드 냄새를 감지 할 수 있습니다.
| 유형 | 상표 | 설명 |
| 원형 참조 | ? | 둘 이상의 클래스 또는 파일에는 폐쇄 루프를 형성하는 상호 의존성이 있습니다. |
| 과도한 매개 변수 | ? | 방법에는 너무 많은 인수가 있습니다 |
| 사용되지 않은 수입 | ? | 파일로 가져 왔지만 사용되지 않은 클래스, 속성, 메소드 또는 패키지 |
| 복잡한 방법 | ? | 루프의 복잡성이 너무 큽니다 |
| 불변의 컬렉션을 제공하십시오 | ? | Kotlin은 Java가 Kotlin의 API를 호출 할 때 불변의 컬렉션 유형을 제공합니다. |
| 내부 노출 | ? | Java는 Kotlin 내부 선언을 공개합니다. |
| 불확실한 무효 플랫폼 표현식 사용 | ? | Kotlin은 로컬로 Null-Agnostic 유형을 반환하는 Java 메소드를 호출 하고이 결과를 완전히 비 널 인수를 기대하는 Kotlin 메소드에서 직접 사용합니다. |
| 불확실한 무효 플랫폼 발신자 | ? | 메소드를 호출하거나 발신자 표현 유형이 Kotlin의 플랫폼 유형 인 속성에 액세스하십시오. |
| Nullable은 플랫폼 매개 변수로 전달되었습니다 | ? | Kotlin은 플랫폼 매개 변수를 취하는 Java 메소드로 무효가 가능한 매개 변수를 전달했습니다. |
| 불확실한 무효 플랫폼 유형의 속성 | ? | Kotlin은 빈 비가스트 자바 방법 또는 속성을 호출 하고이 값을 클래스 속성에 대한 getter의 반환 값으로 사용합니다. |
| 비 JVMSTATIC 동반자 기능 | ? | 동반자 객체의 공개 기능은 @jvmstatic과 정적 메소드로 노출되도록 주석을 달아야합니다. 주석이없는 상태에서 이러한 기능은 정적 컴패니언 필드에서 인스턴스 메소드로만 사용할 수 있습니다. |
| 비 JVMField 동반자 가치 | ? | 동반자 객체에서 효과적인 상수 인 공개적이고 불안정 한 속성은 @jvmfield와 주석을 달아 정적 필드로 노출되어야합니다. |
| 이해할 수없는 Javafacade 이름 | ? | 파일에 최상위 함수 또는 속성이 포함 된 경우 항상 @file : jvmname ( "foo")으로 주석을 달 수 있도록 멋진 이름을 제공합니다. File의 기본적, 최상위 멤버 MyClass.kt는 MyClasskt라는 클래스로 끝나고 언어를 구현 세부 사항으로 누출합니다. |
| 예외를 무시했습니다 | ? | 확인 된 예외를 던질 수있는 함수는 @throws로 문서화해야합니다. 런타임 예외는 kdoc.be에 문서화되어야합니다. API를 염두에 두어야한다. |
| 캐스케이드 대신 if | ? | 캐스케이드가 너무 많은 진술이 문을 대체 해야하는 경우 |
| 암시 적 단일 발현 함수 | ? | Kotlin의 1 발현 방법은 장치 이외의 유형 값을 반환하지만 반환 유형을 지정하지 않습니다. |
| 물체는 던질 수 있습니다 | ? | Kotlin 객체로 장식 된 클래스는 Throwable에서 상속합니다 |
| 최적화 된 꼬리 재귀 | ? | Kotlin의 꼬리 재귀 함수는 그것이 꼬리 재귀임을 나타내지 않습니다. |
테이블에서 노란색은 Java Kotlin에게 일반적이며, Koltin Java가 서로 호출 할 때 녹색이 생성되며 Purple은 Kotlin에 독특합니다.
git clone https://github.com/TnoAlex/Eligos.git| Gradle | 코 틀린 | 자바 목표 레벨 | JDK MIN 버전 |
|---|---|---|---|
8.0+ | 1.9.10 | 17 | 17 |
./gradlew build # on linux
./gradlew.bat build # on windowseligos-cli/build/libs 에서 실행 가능한 CLI JAR을 찾을 수있는 LIBS 및 eligos-plugin/build/distributions 에서 설치 가능한 플러그인을 찾을 수 있습니다.이 저장소를 복제하십시오
git clone https://github.com/TnoAlex/Eligos.git도커 이미지를 빌드하십시오
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 매개 변수 이후에 위치한 2 개의 폴더는 내부 Docker Mappings이며 고정 된 내부 Docker Mappings입니다.
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 설정하여 도구가 이러한 종속성을 찾을 수 있고 일부 외부 종속성을 해결할 수없는 문제를 피할 수 있도록하십시오.
우리는 엘리고를 확장하기위한 간단한 메커니즘을 제공합니다. 다음 단계는 귀하의 규칙을 만들 수 있습니다.
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 주석으로 구성 요소 관리자가 규칙을 스캔 할 수 있습니다.
@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 Architecture Diagram, Execution Process를 참조하십시오.