Eligos, uma ferramenta de análise de código estático para a linguagem de programação Kotlin .
Na versão atual, podemos detectar os 13 13 cheiros de código:
| Tipo | Rótulo | Descrição |
| Referências circulares | ? | Duas ou mais classes ou arquivos têm interdependências que formam um loop fechado |
| Parâmetros excessivos | ? | Um método tem muitos argumentos |
| Importação não utilizada | ? | Classes, atributos, métodos ou pacotes que foram importados para um arquivo, mas nunca foram usados |
| Método complexo | ? | A complexidade do loop é muito grande |
| Forneça uma coleção imutável | ? | Kotlin fornece tipos de coleta imutáveis quando Java chamando a API de Kotlin |
| Exposto interno | ? | Java expõe a declaração interna de Kotlin ao público. |
| Uso incerto de expressão de plataforma nullável | ? | Kotlin chama localmente um método Java que retorna um tipo nulo de agnóstico e usa esse resultado diretamente em um método Kotlin que espera argumentos completamente não nulos |
| Chamador de plataforma Nullável incerto | ? | Ligue para um método ou acesse uma propriedade cujo tipo de expressão de chamadas é o tipo de plataforma em Kotlin. |
| Nullável passou para o parâmetro da plataforma | ? | Kotlin passou um parâmetro anulável para um método Java que pega o parâmetro da plataforma. |
| Tipo de plataforma Nullável incerto na propriedade | ? | Kotlin chama um método ou propriedade agnóstica vazia e a propriedade e usa esse valor como o valor de retorno do getter para a propriedade da classe |
| Função de Companheiro Não JVMstático | ? | As funções públicas em um objeto complementar devem ser anotadas com @jvmstatic para ser exposto como um método estático. Sem a anotação, essas funções estão disponíveis apenas como métodos de instância em um campo de companhia estática. |
| Valor de companhia não JVMField | ? | Propriedades públicas e não consagras que são constantes eficazes em um objeto complementar devem ser anotadas com @jvmfield para serem expostas como um campo estático. |
| Nome de Javafacade incompreensível | ? | Quando um arquivo contém funções ou propriedades de nível superior, sempre anote-o com @File: JVMName ("Foo") para fornecer um bom nome. Por padrão, os membros de nível superior em um arquivo myclass.kt terminarão em uma classe chamada myclasskt, que não é depelida e vazar a linguagem como um detalhe de implementação. |
| Exceção ignorada | ? | As funções que podem lançar exceções verificadas devem documentá -las com @THOWS. As exceções de tempo de execução devem ser documentadas no KDOC.Aring das APIs, uma função delega, pois eles podem lançar exceções verificadas que Kotlin, de outra forma, permite se propagar. |
| Quando em vez de cascata se | ? | Se declarações com muitas cascatas deverão ser substituídas quando declarações |
| Função de expressão única implícita | ? | O método de expressão de Kotlin retorna um valor diferente de unidade, mas não especifica o tipo de retorno |
| O objeto se estende como jogável | ? | A aula decorada com objeto Kotlin herda de arremesso |
| Recursão de cauda otimizada | ? | A função de recursão da cauda em Kotlin não indica que é recursiva de cauda |
Na mesa, o amarelo é comum a Java Kotlin, o verde é gerado quando Koltin Java se chama e o roxo é exclusivo de Kotlin.
git clone https://github.com/TnoAlex/Eligos.git| Gradle | Kotlin | Java Nível -alvo | Versão JDK Min |
|---|---|---|---|
8.0+ | 1.9.10 | 17 | 17 |
./gradlew build # on linux
./gradlew.bat build # on windowseligos-cli/build/libs e plug-in instalável em eligos-plugin/build/distributions .Clone este repo
git clone https://github.com/TnoAlex/Eligos.gitConstrua a imagem do Docker
docker build -t eligos:1.0 .Execute elegos por Docker
docker run -v $PROJECT :/dist/project -v $RESULT :/dist/result eligos:1.0 kotlin ./project ./result --with java No comando acima, $PRJECT refere -se à localização local do item a ser analisada, $RESULT o local em que os resultados locais são armazenados, verifique se eles estão todos presentes antes de usar este comando . As duas pastas localizadas após o parâmetro Kotlin são os mapeamentos internos do Docker, que são fixos.
O uso da ferramenta da CLI pode ser listado por eligos --help , como a 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
Se o YOB usar bibliotecas de terceiros ou usar ferramentas de construção como Maven ou Gradlle , defina o classpath correto para que a ferramenta possa encontrar essas dependências e evitar o problema de que algumas dependências externas não possam ser resolvidas.
Fornecemos um mecanismo simples para estender os elegos. As etapas a seguir permitem criar uma regra que pertence a você:
Crie um processador de arquivos PSI que implemente PsiProcessor e defina um problema que estende Issue
Adicione um ouvinte de arquivo PSI com a anotação @EventListener e relate o 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 ) Faça sua regra pode ser examinada pelo gerenciador de componentes com anotação @Component como esta
@Component
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
} Se você deseja que esta regra seja executada apenas no plug -in, use @Suitable Anotation
@Component
@Suitable( LaunchEnvironment . IDE_PLUGIN )
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
}Isso é tudo?. Se você deseja personalizar os elegos com mais detalhes, consulte o diagrama de arquitetura Eligos, processo de execução.