Eligos, una herramienta de análisis de código estático para el lenguaje de programación de Kotlin .
En la versión actual, podemos detectar los siguientes 13 olor en código:
| Tipo | Etiqueta | Descripción |
| Referencias circulares | ? | Dos o más clases o archivos tienen interdependencias que forman un circuito cerrado |
| Parámetros excesivos | ? | Un método tiene demasiados argumentos |
| Importación no utilizada | ? | Clases, atributos, métodos o paquetes que se han importado a un archivo, pero que nunca se han utilizado |
| Método complejo | ? | La complejidad del bucle es demasiado grande |
| Proporcionar colección inmutable | ? | Kotlin proporciona tipos de colección inmutables cuando Java llama a la API de Kotlin |
| Expuesto interno | ? | Java expone la declaración interna de Kotlin al público. |
| Uso de expresión de plataforma anulable incierto | ? | Kotlin llama localmente un método Java que devuelve un tipo nulo-agnóstico, y utiliza este resultado directamente en un método Kotlin que espera argumentos completamente no nulos |
| Llamadora de plataforma anulable incierta | ? | Llame a un método o acceda a una propiedad cuyo tipo de expresión de llamadas es el tipo de plataforma en Kotlin. |
| Nullable Pasado al parámetro de plataforma | ? | Kotlin pasó un parámetro anulable a un método Java que toma el parámetro de la plataforma. |
| Tipo de plataforma anulable incierto en propiedad | ? | Kotlin llama a un método o propiedad de Java agnóstico vacío y utiliza este valor como el valor de retorno del Getter para la propiedad de la clase |
| Función complementaria no jvmstatic | ? | Las funciones públicas en un objeto complementario deben anotarse con @jvmstatic para expuestos como un método estático. Sin la anotación, estas funciones solo están disponibles como métodos de instancia en un campo de compañía estática. |
| Valor complementario no jvmfield | ? | Las propiedades públicas que no son de constio son constantes efectivas en un objeto complementario deben anotarse con @jvmfield para expuestos como un campo estático. |
| Nombre de javafacade incomprensible | ? | Cuando un archivo contiene funciones o propiedades de nivel superior, siempre anotarlo con @file: jvmname ("foo") para proporcionar un buen nombre. Los miembros de nivel predeterminado predeterminado en un archivo myclass.kt terminarán en una clase llamada myclasskt que no es apropiada y filtra el idioma como un detalle de implementación. |
| Excepción ignorada | ? | Las funciones que pueden lanzar excepciones verificadas deben documentarlas con @throws. Las excepciones de tiempo de ejecución deben documentarse en kdoc.s conscientes de las API que una función delega, ya que pueden lanzar excepciones verificadas que Kotlin de otro modo en silencio permite propagar. |
| Cuando en lugar de cascade si | ? | Si las declaraciones con demasiadas cascadas deben reemplazarse cuando las declaraciones |
| Función de expresión única implícita | ? | El método de una expresión de Kotlin devuelve un valor de tipo que no sea unidad, pero no especifica el tipo de retorno |
| El objeto se extiende lanzando | ? | La clase decorada con objeto Kotlin hereda de lanzamiento |
| Recursión de cola optimizada | ? | La función de recursión de la cola en Kotlin no indica que sea recursiva de la cola |
En la mesa, el amarillo es común a Java Kotlin, el verde se genera cuando Koltin Java se llama entre sí y Purple es exclusivo de Kotlin.
git clone https://github.com/TnoAlex/Eligos.git| Graduarse | Kotlín | Nivel objetivo de Java | Versión jdk min |
|---|---|---|---|
8.0+ | 1.9.10 | 17 | 17 |
./gradlew build # on linux
./gradlew.bat build # on windowseligos-cli/build/libs y el complemento instalable en eligos-plugin/build/distributions .Clon este repositorio
git clone https://github.com/TnoAlex/Eligos.gitImagen de Docker de construcción
docker build -t eligos:1.0 .Run Eligos de Docker
docker run -v $PROJECT :/dist/project -v $RESULT :/dist/result eligos:1.0 kotlin ./project ./result --with java En el comando anterior, $PRJECT se refiere a la ubicación local del elemento que se analizará, $RESULT la ubicación donde se almacenan los resultados locales, asegúrese de que estén presentes antes de usar este comando . Las dos carpetas ubicadas después del parámetro Kotlin son las asignaciones internas de Docker, que se fijan.
El uso de la herramienta CLI podría ser enumerada por eligos --help , como seguir:
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
Si YOB usa bibliotecas de terceros, o usa herramientas de compilación como Maven o Gradlle , establezca el classpath correcto para que la herramienta pueda encontrar estas dependencias y evitar el problema de que algunas dependencias externas no se pueden resolver.
Proporcionamos un mecanismo simple para extender los eligos. Los siguientes pasos le permiten crear una regla que le pertenece:
Cree un procesador de archivos PSI que implementa PsiProcessor y defina un problema que extienda Issue
Agregue un oyente de archivos PSI con la anotación @EventListener e informe el problema como este:
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 ) Hacer que su regla pueda escanear por el administrador de componentes con anotación @Component como esta
@Component
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
} Si desea que esta regla solo se ejecute en el complemento, use la anotación @Suitable
@Component
@Suitable( LaunchEnvironment . IDE_PLUGIN )
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
}¿Eso es todo?. Si desea personalizar los ELIGOS con más detalle, consulte el Diagrama de Arquitectura de Eligos, Proceso de ejecución.