Eligos, инструмент анализа статического кода для языка программирования Kotlin .
В текущей версии мы можем обнаружить следующий 13 кодового запаха:
| Тип | Этикетка | Описание |
| Круглые ссылки | ? | Два или более класса или файлы имеют взаимозависимости, которые образуют закрытый цикл |
| Чрезмерные параметры | ? | Метод имеет слишком много аргументов |
| Неиспользованный импорт | ? | Классы, атрибуты, методы или пакеты, которые были импортированы в файл, но никогда не использовались |
| Сложный метод | ? | Сложность петли слишком велика |
| Обеспечить неизменную коллекцию | ? | Kotlin предоставляет неизменные типы сбора, когда Java вызывает API Kotlin's API |
| Внутренний выставлен | ? | Java разоблачает внутреннюю декларацию Котлина общественному. |
| Неопределенное нулевое использование выражения платформы | ? | Котлин локально вызывает метод Java, который возвращает нулевой агрессивный тип, и использует этот результат непосредственно в методе Kotlin, который ожидает полностью не нулевых аргументов |
| Неопределенный нулевой абонент платформы | ? | Вызовите метод или доступ к свойству, тип выражения абонента, тип платформы в Kotlin. |
| Nullable перенесено в параметр платформы | ? | Котлин передал нулевой параметр методу Java, который принимает параметр платформы. |
| Неопределенный нулевой тип платформы в свойство | ? | Kotlin вызывает пустой метод или свойство agnostic java и использует это значение в качестве возвращаемого значения Getter для свойства класса |
| Не JVMstatic Companion функция | ? | Общественные функции в компаньоном объекте должны быть аннотированы с помощью @jvmstatic, чтобы быть выставленными в качестве статического метода. Без аннотации эти функции доступны только в качестве методов экземпляра в статическом поле. |
| Неослабная компаньонная ценность | ? | Публичные, неконтролируемые свойства, которые являются эффективными постоянными в компаньоне, должны быть аннотированы с @jvmfield, чтобы быть выставленными в качестве статического поля. |
| Непостижимое имя Javafacade | ? | Когда файл содержит функции или свойства верхнего уровня, всегда аннотируйте его с помощью @file: jvmname («foo»), чтобы предоставить хорошее имя. По умолчанию участники высшего уровня в файле myclass.kt в конечном итоге окажутся в классе под названием MyClasskt, который не приспосабливает и вытекает на язык в качестве детали реализации. |
| Игнорируется исключение | ? | Функции, которые могут выбросить проверенные исключения, должны документировать их с помощью @Throws. Исключения во время выполнения должны быть задокументированы в KDOC.BE, помните об API, которые функционируют делегаты, поскольку они могут бросить проверенные исключения, которые Котлин в противном случае молча позволяет распространять. |
| Когда вместо каскада, если | ? | Если операторы с слишком большим количеством каскадов должны быть заменены на высказывания |
| Неявная функция экспрессии | ? | Метод одноэкспрессии Котлина возвращает значение типа, кроме единицы, но не указывает тип возврата |
| Объект расширяет | ? | Класс, украшенный котлин объект, наследует от броска |
| Оптимизированная хвостовая рекурсия | ? | Функция хвостовой рекурсии в котлине не указывает на то, что она рекурсивная |
В таблице желтый является общим для Java Kotlin, зеленый генерируется, когда Koltin Java называет друг друга, а фиолетовый уникален для Kotlin.
git clone https://github.com/TnoAlex/Eligos.git| Градл | Котлин | Целевой уровень Java | JDK MIN версия |
|---|---|---|---|
8.0+ | 1.9.10 | 17 | 17 |
./gradlew build # on linux
./gradlew.bat build # on windowseligos-cli/build/libs и установите плагин в eligos-plugin/build/distributions .Клонировать это репо
git clone https://github.com/TnoAlex/Eligos.gitСтройте изображение Docker
docker build -t eligos:1.0 .Запустить Eligos от Docker
docker run -v $PROJECT :/dist/project -v $RESULT :/dist/result eligos:1.0 kotlin ./project ./result --with java В вышеупомянутой команде $PRJECT относится к локальному расположению элемента, который необходимо проанализировать, $RESULT место, где хранятся локальные результаты , убедитесь, что все они присутствуют перед использованием этой команды . Две папки, расположенные после параметра Kotlin, представляют собой внутренние отображения Docker, которые фиксируются.
Использование инструмента 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 , чтобы инструмент мог найти эти зависимости и избежать проблемы, что некоторые внешние зависимости не могут быть разрешены.
Мы предоставляем простой механизм для расширения Eligos. Следующие шаги позволяют создать правило, которое вам принадлежит:
Создайте процессор файлового процессора PSI, который реализует PsiProcessor , и определяет проблему, которая расширяет Issue
Добавьте прослушивание файлов PSI с аннотацией @EventListener и сообщите о проблеме следующим образом:
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 Annotation
@Component
@Suitable( LaunchEnvironment . IDE_PLUGIN )
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
}Вот и все?. Если вы хотите более подробно настроить Eligos, пожалуйста, обратитесь к схеме архитектуры Eligos, процессу выполнения.