Eligos, ein Tool zur statischen Codeanalyse für die Kotlin -Programmiersprache.
In der aktuellen Version können wir den folgenden 13 -Code -Geruch erkennen:
| Typ | Etikett | Beschreibung |
| Rundschreiben | ? | Zwei oder mehr Klassen oder Dateien haben Interdependenzen, die eine geschlossene Schleife bilden |
| Übermäßige Parameter | ? | Eine Methode hat zu viele Argumente |
| Unbenutzter Import | ? | Klassen, Attribute, Methoden oder Pakete, die in eine Datei importiert wurden, aber noch nie verwendet wurden |
| Komplexe Methode | ? | Die Komplexität der Schleife ist zu groß |
| Eine unveränderliche Sammlung anbieten | ? | Kotlin bietet unveränderliche Sammlungstypen, wenn Java Kotlins API anruft |
| Intern exponiert | ? | Java gibt die interne Erklärung der Kotlin der Öffentlichkeit aus. |
| Ungewöhnliche Nullable -Plattform -Expressionsverbrauch | ? | Kotlin ruft lokal eine Java |
| Unsicherer nullierbarer Plattformanrufer | ? | Rufen Sie eine Methode auf oder greifen Sie auf eine Eigenschaft zu, deren Caller -Expressionstyp in Kotlin Plattformtyp ist. |
| Nullierbar an Plattformparameter übergeben | ? | Kotlin übergab einen nullbaren Parameter an eine Java -Methode, die den Plattformparameter einnimmt. |
| Unsicherer nullierbarer Plattformtyp in der Eigenschaft | ? | Kotlin ruft eine leere agnostische Java -Methode oder -material auf und verwendet diesen Wert als Rückgabewert des Getter für die Klasseneigenschaft |
| Nicht -JVMstatische Begleitfunktion | ? | Öffentliche Funktionen in einem Begleitobjekt müssen mit @JVMstatic als statische Methode ausgesetzt werden. Insbesondere die Annotation sind diese Funktionen nur als Instanzmethoden auf einem statischen Begleitfeld verfügbar. |
| Nicht -JVMfield -Begleiterwert | ? | Öffentliche, nicht konstete Eigenschaften, die wirksame Konstanten in einem Begleitobjekt sind, müssen mit @jvmfield als statisches Feld ausgesetzt werden. |
| Unverständlicher Javafacade -Name | ? | Wenn eine Datei Funktionen oder Eigenschaften auf höchstem Niveau enthält, kommentieren Sie sie immer mit @File: JVMName ("Foo"), um einen schönen Namen anzugeben. Standardeinstellige, obere Mitglieder in einer Datei in einer Datei myclass.kt wird in einer Klasse namens MyClassKT enden, die das Sprache nicht als Implementierungsdetail läuft. |
| Ausnahme ignorierte | ? | Funktionen, die überprüfte Ausnahmen ausführen können, sollten sie mit @throws dokumentieren. Die Laufzeitausnahmen sollten in Kdoc dokumentiert werden, ob die APIs eine Funktion delegiert, da sie überprüfte Ausnahmen ausführen können, die Kotlin ansonsten stillschweigend zulässt, sich zu vermehren. |
| Wenn statt kaskade wenn | ? | Wenn Aussagen mit zu vielen Kaskaden ersetzt werden sollten, wenn Aussagen angegeben werden |
| Implizite Einzelexpressionsfunktion | ? | Kotlins Ein-Expressionsmethode gibt einen anderen Wert des Typs als Einheit zurück, gibt jedoch den Rückgabetyp nicht an |
| Das Objekt erstreckt sich | ? | Die mit Kotlin -Objekt dekorierte Klasse erbt von Throwable |
| Optimierte Schwanzrekursion | ? | Die Schwanzrekursionsfunktion in Kotlin zeigt nicht an, dass es sich um Schwanz rekursiv handelt |
In der Tabelle ist Gelb für Java Kotlin gemeinsam, grün wird erzeugt, wenn Koltin Java sich gegenseitig anruft, und Lila ist einzigartig in Kotlin.
git clone https://github.com/TnoAlex/Eligos.git| Gradle | Kotlin | Java -Zielebene | JDK MIN -Version |
|---|---|---|---|
8.0+ | 1.9.10 | 17 | 17 |
./gradlew build # on linux
./gradlew.bat build # on windowseligos-cli/build/libs und installierbares Plugin unter eligos-plugin/build/distributions .Klonen Sie dieses Repo
git clone https://github.com/TnoAlex/Eligos.gitBauen Sie das Docker -Bild
docker build -t eligos:1.0 .Führen Sie Eligos von Docker aus
docker run -v $PROJECT :/dist/project -v $RESULT :/dist/result eligos:1.0 kotlin ./project ./result --with java Im obigen Befehl bezieht sich $PRJECT auf den lokalen Standort des zu analysierenden Elements $RESULT Die beiden nach dem Kotlin -Parameter gefundenen Ordner sind die internen Docker -Zuordnungen, die festgelegt werden.
Die Verwendung von CLI -Tools kann von eligos --help aufgeführt werden, wie folgt:
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
Wenn YOB Bibliotheken von Drittanbietern verwendet oder Build-Tools wie Maven oder Gradlle verwenden, legen Sie bitte den richtigen classpath fest, damit das Tool diese Abhängigkeiten finden und das Problem vermeiden kann, dass einige externe Abhängigkeiten nicht behoben werden können.
Wir bieten einen einfachen Mechanismus, um Eligos zu erweitern. Mit den folgenden Schritten können Sie eine Regel erstellen, die Ihnen gehört:
Erstellen Sie einen PSI -Dateiprozessor, der PsiProcessor implementiert, und definieren Sie ein Problem, bei dem das Issue erweitert wird
Fügen Sie einen PSI -Datei -Listener mit @EventListener Annotation hinzu und melden Sie das Problem wie folgt:
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 ) Machen Sie Ihre Regel, die vom Komponentenmanager mit @Component Annotation wie dieser abgeschaltet werden kann
@Component
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
} Wenn Sie möchten, dass diese Regel nur auf Plugin ausgeführt wird, verwenden Sie bitte @Suitable Annotation
@Component
@Suitable( LaunchEnvironment . IDE_PLUGIN )
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
}Das ist alles? Wenn Sie Eligos genauer anpassen möchten, lesen Sie das Eligos -Architekturdiagramm und Ausführungsprozess.