Eligos, un outil d'analyse de code statique pour le langage de programmation Kotlin .
Dans la version actuelle, nous pouvons détecter l'odeur de code 13 suivante:
| Taper | Étiquette | Description |
| Références circulaires | ? | Deux classes ou fichiers ou plus ont des interdépendances qui forment une boucle fermée |
| Paramètres excessifs | ? | Une méthode a trop d'arguments |
| Importation inutilisée | ? | Classes, attributs, méthodes ou packages qui ont été importés dans un fichier, mais n'ont jamais été utilisés |
| Méthode complexe | ? | La complexité de la boucle est trop grande |
| Fournir une collection immuable | ? | Kotlin fournit des types de collection immuables lorsque Java appelle l'API de Kotlin |
| Exposé interne | ? | Java exposent la déclaration interne de Kotlin au public. |
| Utilisation de l'expression de la plate-forme nullable incertaine | ? | Kotlin appelle localement une méthode Java qui renvoie un type null-agnostique et utilise ce résultat directement dans une méthode Kotlin qui attend des arguments complètement non nuls |
| Appelant de plate-forme nullable incertain | ? | Appelez une méthode ou accédez à une propriété dont le type d'expression de l'appelant est le type de plate-forme dans Kotlin. |
| Nullable transmis au paramètre de plate-forme | ? | Kotlin a passé un paramètre nullable à une méthode Java qui prend le paramètre de plate-forme. |
| Type de plate-forme nullable incertain dans la propriété | ? | Kotlin appelle une méthode ou une propriété Java agnostique vide et utilise cette valeur comme valeur de retour du Getter pour la propriété de classe |
| Fonction compagnon non JVMSTATIQUE | ? | Les fonctions publiques dans un objet complémentaire doivent être annotées avec @jvmstatic pour être exposées comme méthode statique. Sans l'annotation, ces fonctions ne sont disponibles que comme méthodes d'instance sur un champ compagnon statique. |
| Valeur complémentaire non jvmfield | ? | Les propriétés publiques et non conformes qui sont des constantes efficaces dans un objet compagnon doivent être annotées avec @jvmfield pour être exposées comme champ statique. |
| Nom de Javafacade incompréhensible | ? | Lorsqu'un fichier contient des fonctions ou des propriétés de niveau supérieur, annotez toujours avec @file: jvmname ("foo") pour fournir un joli nom. par défaut, les membres de niveau supérieur dans un fichier myclass.kt se retrouveront dans une classe appelée MyClasskt qui est peu attrayante et dénonce la langue comme détail d'implémentation. |
| Exception ignorée | ? | Les fonctions qui peuvent lancer des exceptions vérifiées devraient les documenter avec @throws. Les exceptions d'exécution doivent être documentées dans KDOC.be Mindful of the API Une fonction délégue car ils peuvent lancer des exceptions vérifiées que Kotlin permet autrement de propager silencieusement. |
| Quand au lieu de cascade si | ? | Si les déclarations avec trop de cascades doivent être remplacées par des déclarations |
| Fonction d'expression unique implicite | ? | La méthode d'expression de Kotlin renvoie une valeur de type autre que l'unité, mais ne spécifie pas le type de retour |
| L'objet s'étend comme jetable | ? | La classe décorée d'objet Kotlin hérite de Thrownable |
| Recursion de queue optimisée | ? | La fonction de récursivité de la queue à Kotlin n'indique pas qu'elle est récursive de la queue |
Dans le tableau, le jaune est commun à Java Kotlin, le vert est généré lorsque Koltin Java s'appelle et le violet est unique à Kotlin.
git clone https://github.com/TnoAlex/Eligos.git| Grade | Kotlin | Niveau cible Java | Version JDK MIN |
|---|---|---|---|
8.0+ | 1.9.10 | 17 | 17 |
./gradlew build # on linux
./gradlew.bat build # on windowseligos-cli/build/libs et le plugin instalable à eligos-plugin/build/distributions .Cloner ce repo
git clone https://github.com/TnoAlex/Eligos.gitConstruire l'image Docker
docker build -t eligos:1.0 .Run Eligos par Docker
docker run -v $PROJECT :/dist/project -v $RESULT :/dist/result eligos:1.0 kotlin ./project ./result --with java Dans la commande ci-dessus, $PRJECT fait référence à l'emplacement local de l'élément à analyser, $RESULT de l'emplacement où les résultats locaux sont stockés , Assurez-vous qu'ils sont tous présents avant d'utiliser cette commande . Les deux dossiers situés après le paramètre Kotlin sont les mappages de Docker internes, qui sont fixes.
L'utilisation de l'outil CLI pourrait être répertoriée par eligos --help , comme suivre:
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 utilise des bibliothèques tierces ou utilisez des outils de construction comme Maven ou Gradlle , veuillez définir le classpath correct afin que l'outil puisse trouver ces dépendances et éviter le problème que certaines dépendances externes ne peuvent pas être résolues.
Nous fournissons un mécanisme simple pour étendre les Eligos. Les étapes suivantes vous permettent de créer une règle qui vous appartient:
Créez un processeur de fichiers PSI qui implémente PsiProcessor et définissez un problème qui étend Issue
Ajoutez un écouteur de fichier PSI avec @EventListener Annotation et signalez le problème comme ceci:
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 ) Faites de votre règle @Component
@Component
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
} Si vous voulez que cette règle ne s'exécute que sur le plugin, veuillez utiliser @Suitable Annotation
@Component
@Suitable( LaunchEnvironment . IDE_PLUGIN )
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
}C'est tout?. Si vous souhaitez personnaliser les Eligos plus en détail, veuillez vous référer au diagramme d'architecture Eligos, processus d'exécution.