Description
I wrote an annotation processing libary that can detect annotations in Kotlin Native/JS and Jvm projects, because Kapt is only working with KotlinJvm. The library can be used in Kotlin Compiler plugins. Tested with Kotlin 1.3.41 and 1.3.50
It can detect annotations with following targets:
(CLASS,FUNCTION,PROPERTY,VALUE_PARAMETER,PROPERTY_GETTER,PROPERTY_GETTER,CONSTRUCTOR)
MpApt alternatives and similar libraries
Based on the "Tools" category.
Alternatively, view MpApt alternatives based on common mentions on social networks and blogs.
-
kotlin-android-template
Android + Kotlin + Github Actions + ktlint + Detekt + Gradle Kotlin DSL + buildSrc = β€οΈ -
jtransc
Bytecode to source converting Java & Kotlin code into JavaScript, C++, D, C#, PHP, AS3, Dart and Haxe and run it everywhere. Also use JVM code in your favourite language as a library. -
CrunchyCalendar
A beautiful material calendar with endless scroll, range selection and a lot more! -
BlurTutorial
Library for creating blur effects under Android UI elements -
Ostara
Ostara is a desktop application that provides various features to monitor and interact with Spring Boot Applications via Actuator. -
LiveStream-Kt (Android) π±
LiveStream is a simple class which makes communication easy among different modules of your application. -
ktfmt-gradle
A Gradle plugin to apply ktfmt to your builds, and reformat you Kotlin source code like a glimpse π§Ήπ -
Kotlin Telegram Bot
Telegram Bot API wrapper with handy Kotlin DSL. -
detekt-hint
Detection of design principle violations in Kotlin as a plugin to detekt. -
ARFaceDetection
AR-based library for Android which is capable of detecting faces and overlaying images above the userβs head -
Kotlin Bootstrap
This set of libraries is designed to help developers accomplish various tasks easier and faster -
Credit Card Scanner
Android Credit Card Scanner using CameraX and ML Kit -
EasyDokkaPlugin
Gradle Script plugin to generate documentation by Dokka documentation engine in Javadoc or other formats for Java, Kotlin, Android and non-Android projects. It's very easy, you don't need to add to dependencies section additional classpath or think about compatibility issues, you don't need additional repositories also. -
GradleMavenPush
Helper to upload Gradle Android Artifacts, Gradle Java Artifacts and Gradle Kotlin Artifacts to Maven repositories (JCenter, Maven Central, Corporate staging/snapshot servers and local Maven repositories). -
KotlinW
A small wrapper for the Kotlin compiler that can be used to execute .kts scripts -
AndroidOtpView (With gradient color in lines)
Android Otp View with gradient in kotlin -
buildSrcVersions
Better Gradle dependencies management inside the IDE. Search for available updates.
Appwrite - The Open Source Firebase alternative introduces iOS support
Do you think we are missing an alternative of MpApt or a related project?
README
MpApt - Kotlin (Native/JS/JVM) Annotation Processor library
Introduction πββοΈ πβ
I wrote an annotation processing libary that can detect annotations in Kotlin Native/JS and Jvm projects, because Kapt is only working with KotlinJvm. The library can be used in Kotlin Compiler plugins. Tested with Kotlin 1.3.71,1.4.0
It can detect annotations with following targets:
(CLASS,FUNCTION,PROPERTY,VALUE_PARAMETER,PROPERTY_GETTER,PROPERTY_GETTER,CONSTRUCTOR)
(ANNOTATION_CLASS,TYPE_PARAMETER,FIELD,FILE,LocalVariable)
Example output of my example plugin on Kotlin Native:
Show some :heart: and star the repo to support the project
Projects that use MpApt:
- Native Suspended Functions
- Kvision
- Godot Kotlin
Your project?
Usage
These are the instructions for v0.8.7, check Changelog for changes on the active development branch
Inside your compiler plugin, add the dependency from MavenCentral
repositories {
mavenCentral()
}
dependencies {
compile 'de.jensklingenberg:mpapt-runtime:0.8.7'
}
1) Create a class that extends de.jensklingenberg.mpapt.model.AbstractProcessor
class MpAptTestProcessor() : AbstractProcessor() {
2) Add the names of your annotations that you want to detect:
override fun getSupportedAnnotationTypes(): Set<String> = setOf(TestClass::class.java.name, TestFunction::class.java.name)
3) Do something with detected annotations:
override fun process(roundEnvironment: RoundEnvironment) {
roundEnvironment.getElementsAnnotatedWith(TestClass::class.java.name).forEach {
when (it) {
is Element.ClassElement -> {
log("Found Class: " + it.classDescriptor.name + " Module: " + it.classDescriptor.module.simpleName() + " platform " + activeTargetPlatform.first().platformName)
}
}
}
roundEnvironment.getElementsAnnotatedWith(TestFunction::class.java.name).forEach {
when (it) {
is Element.FunctionElement -> {
log("Found Function: " + it.func.name + " Module: " + it.func.module.simpleName() + " platform " + activeTargetPlatform.first().platformName)
}
}
}
}
4) Init MpApt inside your ComponentRegistrar:
- Pass an instance of your processor and the CompilerConfiguration into MpAptProject
- Then add an instance of MpAptProject to the following extension classes:
Inside a Kotlin Native Compiler Plugin:
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
val processor = MpAptTestProcessor()
val mpapt = MpAptProject(processor,configuration)
StorageComponentContainerContributor.registerExtension(project,mpapt)
IrGenerationExtension.registerExtension(project,mpapt)
}
Inside a Kotlin JVM/JS Compiler Plugin:
override fun registerProjectComponents(
project: MockProject,
configuration: CompilerConfiguration
) {
val processor = MpAptTestProcessor()
val mpapt = MpAptProject(processor,configuration)
StorageComponentContainerContributor.registerExtension(project,mpapt)
ClassBuilderInterceptorExtension.registerExtension(project,mpapt)
JsSyntheticTranslateExtension.registerExtension(project,mpapt)
}
5) That's it
Choose supported target platforms
By default your processor is enabled for every target. You can override
isTargetPlatformSupported(platform: TargetPlatform): Boolean
and return "true" if you want to support the target or "false" you don't.
override fun isTargetPlatformSupported(platform: TargetPlatform): Boolean {
val targetName = platform.first().platformName
return when (targetName) {
KotlinPlatformValues.JS -> true
KotlinPlatformValues.JVM -> true
KotlinPlatformValues.NATIVE -> {
return when (configuration.nativeTargetPlatformName()) {
KonanTargetValues.LINUX_X64, KonanTargetValues.MACOS_X64 -> {
true
}
else -> {
true
}
}
}
else -> {
log(targetName)
true
}
}
}
You can distinguish between the native target platforms you want to support.
configuration.nativeTargetPlatformName() will get you the names of the Native Targets(macos_x64,linux_x64,etc). The values are defined in KonanTargetValues. It needs to be used only on Kotlin Native otherwise it will return an empty string
βοΈ Feedback
Feel free to send feedback on Twitter or file an issue or join the Kotlin Slack and the channel. Feature requests are always welcome. If you wish to contribute, please take a quick look at How to develop?
π· Development Project Structure
- demoProject - An example project that is using MpApt+KotlinPoet to generate code on KotlinJS
- annotations - A Kotlin Multiplatform project which contains test annotations
- example - A Kotlin Multiplatform project which applies a gradle plugin(de.jensklingenberg.mpapt) whichs triggers the compiler plugin.
- buildSrc - This module contains the gradle plugin which trigger the compiler plugin
- kotlin-plugin - This module contains the Kotlin Compiler Plugin for JVM/JS targets, it implements the kotlin-plugin-shared-module
- kotlin-compiler-native-plugin - This module contains the Kotlin Compiler Plugin for Native targets, it implements the kotlin-plugin-shared-module
- kotlin-plugin-shared Contains an implementation of MpApt
Testing
The CompileTest shows you, how you can use Kotlin Compile Testing to test your Processor/Compiler Plugin
See also
- How to use a Kotlin Compiler Plugin from Gradle Plugin
- How to write a Kotlin Compiler Plugin
- How to debug Kotlin Compiler Plugin
- How to develop?
π License
This project is licensed under the Apache License, Version 2.0 - see the LICENSE.md file for details
Copyright 2019 Jens Klingenberg
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*Note that all licence references and agreements mentioned in the MpApt README section above
are relevant to that project's source code only.