All Downloads are FREE. Search and download functionalities are using the official Maven repository.

moxy.compiler.Extensions.kt Maven / Gradle / Ivy

package moxy.compiler

import com.squareup.javapoet.ClassName
import com.squareup.javapoet.JavaFile
import com.squareup.javapoet.ParameterSpec
import com.squareup.javapoet.ParameterizedTypeName
import com.squareup.javapoet.TypeName
import com.squareup.javapoet.TypeSpec
import com.squareup.javapoet.TypeVariableName
import com.squareup.javapoet.WildcardTypeName
import javax.lang.model.element.AnnotationMirror
import javax.lang.model.element.Element
import javax.lang.model.element.TypeElement
import javax.lang.model.type.DeclaredType
import javax.lang.model.type.TypeMirror
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
import kotlin.reflect.KClass
import kotlin.reflect.KProperty1

/**
 * TypeMirror must be of kind TypeKind.DECLARED
 */
@UseExperimental(ExperimentalContracts::class)
fun TypeMirror.asTypeElement(): TypeElement {
    contract {
        returns() implies (this@asTypeElement is DeclaredType)
    }
    return (this as DeclaredType).asElement() as TypeElement
}

fun Element.asTypeElement() = this as TypeElement
fun Element.asDeclaredType() = this.asType() as DeclaredType

fun ClassName.parametrizedWith(type: TypeName) = ParameterizedTypeName.get(this, type)
fun ClassName.parametrizedWith(types: List): ParameterizedTypeName {
    return ParameterizedTypeName.get(this, *types.toTypedArray())
}

fun KClass<*>.className(): ClassName = ClassName.get(java)
fun KClass<*>.subtypeWildcard(): WildcardTypeName = WildcardTypeName.subtypeOf(java)
fun KClass<*>.supertypeWildcard(): WildcardTypeName = WildcardTypeName.supertypeOf(java)
fun ClassName.supertypeWildcard(): WildcardTypeName = WildcardTypeName.supertypeOf(this)

fun TypeSpec.toJavaFile(className: ClassName): JavaFile = toJavaFile(className.packageName())
fun TypeSpec.toJavaFile(packageName: String): JavaFile {
    return JavaFile.builder(packageName, this)
        .indent("\t")
        .build()
}

fun  Element.getAnnotationMirror(type: KClass): AnnotationMirror? {
    return Util.getAnnotation(this, type.java.name)
}

// Pass property name, like StateStrategyType::value
fun AnnotationMirror.getValueAsString(property: KProperty1<*, *>): String? {
    return Util.getAnnotationValueAsString(this, property.name)
}

// Pass property name, like StateStrategyType::value
fun AnnotationMirror.getValueAsTypeMirror(property: KProperty1<*, *>): TypeMirror? {
    return Util.getAnnotationValueAsTypeMirror(this, property.name)
}

fun TypeMirror.getFullClassName(): String = Util.getFullClassName(this)

fun List.equalsByType(other: List): Boolean {
    return Util.equalsBy(this, other) { first, second ->
        first.type == second.type
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy