Compare commits
No commits in common. "info-generator" and "master" have entirely different histories.
info-gener
...
master
4 changed files with 0 additions and 117 deletions
|
@ -16,7 +16,6 @@ java.sourceCompatibility = JavaVersion.VERSION_17
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven { url = uri("https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven") }
|
maven { url = uri("https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven") }
|
||||||
maven { url = uri("https://jitpack.io") }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val exposedVersion = "0.41.1"
|
val exposedVersion = "0.41.1"
|
||||||
|
@ -55,19 +54,10 @@ dependencies {
|
||||||
implementation("io.github.microutils:kotlin-logging-jvm:$loggingVersion")
|
implementation("io.github.microutils:kotlin-logging-jvm:$loggingVersion")
|
||||||
implementation("org.postgresql:postgresql:$postgresVersion")
|
implementation("org.postgresql:postgresql:$postgresVersion")
|
||||||
|
|
||||||
implementation("nl.devhaan:KotlinPoetDSL:0.1.1")
|
|
||||||
|
|
||||||
//testImplementation("org.springframework.security:spring-security-test:$securityTestVersion")
|
//testImplementation("org.springframework.security:spring-security-test:$securityTestVersion")
|
||||||
testImplementation("org.springframework.boot:spring-boot-starter-test:$springBootVersion")
|
testImplementation("org.springframework.boot:spring-boot-starter-test:$springBootVersion")
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
main {
|
|
||||||
java.srcDirs(File("C:\\Users\\Andrey\\IdeaProjects\\sicamp-helper\\build\\generated\\source"))
|
|
||||||
kotlin.srcDirs(File("C:\\Users\\Andrey\\IdeaProjects\\sicamp-helper\\build\\generated\\source"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
configurations.all {
|
configurations.all {
|
||||||
resolutionStrategy {
|
resolutionStrategy {
|
||||||
eachDependency {
|
eachDependency {
|
||||||
|
|
|
@ -4,15 +4,11 @@ import org.jetbrains.exposed.dao.LongEntity
|
||||||
import org.jetbrains.exposed.dao.LongEntityClass
|
import org.jetbrains.exposed.dao.LongEntityClass
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.dao.id.EntityID
|
||||||
import ru.sicamp.sicamphelper.db.table.Rooms
|
import ru.sicamp.sicamphelper.db.table.Rooms
|
||||||
import ru.sicamp.sicamphelper.generator.Info
|
|
||||||
|
|
||||||
class Room(id: EntityID<Long>) : LongEntity(id) {
|
class Room(id: EntityID<Long>) : LongEntity(id) {
|
||||||
companion object : LongEntityClass<Room>(Rooms)
|
companion object : LongEntityClass<Room>(Rooms)
|
||||||
|
|
||||||
@Info
|
|
||||||
var name by Rooms.name
|
var name by Rooms.name
|
||||||
@Info
|
|
||||||
var type by Rooms.type
|
var type by Rooms.type
|
||||||
@Info
|
|
||||||
var description by Rooms.description
|
var description by Rooms.description
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,28 +6,20 @@ import org.jetbrains.exposed.dao.id.EntityID
|
||||||
import org.springframework.security.core.GrantedAuthority
|
import org.springframework.security.core.GrantedAuthority
|
||||||
import org.springframework.security.core.userdetails.UserDetails
|
import org.springframework.security.core.userdetails.UserDetails
|
||||||
import ru.sicamp.sicamphelper.db.table.Users
|
import ru.sicamp.sicamphelper.db.table.Users
|
||||||
import ru.sicamp.sicamphelper.generator.Info
|
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
class User(id: EntityID<Long>) : LongEntity(id), UserDetails {
|
class User(id: EntityID<Long>) : LongEntity(id), UserDetails {
|
||||||
companion object : LongEntityClass<User>(Users)
|
companion object : LongEntityClass<User>(Users)
|
||||||
|
|
||||||
@Info
|
|
||||||
var login by Users.login
|
var login by Users.login
|
||||||
@Info
|
|
||||||
var name by Users.name
|
var name by Users.name
|
||||||
var supervisor by User optionalReferencedOn Users.supervisor
|
var supervisor by User optionalReferencedOn Users.supervisor
|
||||||
var _password by Users.password
|
var _password by Users.password
|
||||||
@Info
|
|
||||||
var tgId by Users.tgId
|
var tgId by Users.tgId
|
||||||
@Info
|
|
||||||
var tgUsername by Users.tgUsername
|
var tgUsername by Users.tgUsername
|
||||||
@Info
|
|
||||||
var role by Users.role
|
var role by Users.role
|
||||||
var group by Group referencedOn Users.group
|
var group by Group referencedOn Users.group
|
||||||
@Info
|
|
||||||
var sex by Users.sex
|
var sex by Users.sex
|
||||||
@Info
|
|
||||||
var age by Users.age
|
var age by Users.age
|
||||||
var locked by Users.locked
|
var locked by Users.locked
|
||||||
var enabled by Users.enabled
|
var enabled by Users.enabled
|
||||||
|
|
|
@ -1,95 +0,0 @@
|
||||||
package ru.sicamp.sicamphelper.generator
|
|
||||||
|
|
||||||
import com.squareup.kotlinpoet.asTypeName
|
|
||||||
import mu.KLogging
|
|
||||||
import nl.devhaan.kotlinpoetdsl.classes.clazz
|
|
||||||
import nl.devhaan.kotlinpoetdsl.constructorBuilder.buildConstructor
|
|
||||||
import nl.devhaan.kotlinpoetdsl.constructorBuilder.constructor
|
|
||||||
import nl.devhaan.kotlinpoetdsl.constructorBuilder.thiz
|
|
||||||
import nl.devhaan.kotlinpoetdsl.files.file
|
|
||||||
import nl.devhaan.kotlinpoetdsl.of
|
|
||||||
import nl.devhaan.kotlinpoetdsl.packaged
|
|
||||||
import nl.devhaan.kotlinpoetdsl.public
|
|
||||||
import nl.devhaan.kotlinpoetdsl.valOf
|
|
||||||
import ru.sicamp.sicamphelper.db.entity.Room
|
|
||||||
import ru.sicamp.sicamphelper.db.entity.User
|
|
||||||
import java.io.File
|
|
||||||
import kotlin.reflect.KClass
|
|
||||||
import kotlin.reflect.full.memberProperties
|
|
||||||
|
|
||||||
class InfoGenerator {
|
|
||||||
fun <T : Any> generateInfo(kClass: KClass<T>) {
|
|
||||||
val className = "${kClass.simpleName}Info"
|
|
||||||
logger.info("Beginning generating $className")
|
|
||||||
val file = File("C:\\Users\\Andrey\\IdeaProjects\\sicamp-helper\\build\\generated\\source")
|
|
||||||
file(GENERATED_PACKAGE, className) {
|
|
||||||
val constructorParameters = kClass.infoVariables()
|
|
||||||
val secondaryConstructor = buildConstructor {
|
|
||||||
val entityName = "entity"
|
|
||||||
constructor(entityName of kClass).thiz(
|
|
||||||
*constructorParameters.map {
|
|
||||||
"$entityName.${it.name}"
|
|
||||||
}.toTypedArray()
|
|
||||||
) {}
|
|
||||||
}
|
|
||||||
logger.info("Found ${constructorParameters.size} parameters")
|
|
||||||
clazz(className, *constructorParameters.toTypedArray()) {
|
|
||||||
public.constructor(secondaryConstructor)
|
|
||||||
}.packaged(GENERATED_PACKAGE)
|
|
||||||
}.writeTo(file)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun KClass<*>.infoPropertiesWithAnnotations() = memberProperties.mapNotNull { property ->
|
|
||||||
property.annotations.firstOrNull { it is Info }?.let { annotation ->
|
|
||||||
property to annotation
|
|
||||||
}
|
|
||||||
}.also { logger.info("Found ${it.size} properties") }
|
|
||||||
|
|
||||||
private fun KClass<*>.infoVariables() = infoPropertiesWithAnnotations()
|
|
||||||
.map { (property, annotation) ->
|
|
||||||
logger.info("Getting type for ${property.name}")
|
|
||||||
val typeName = property.returnType.asTypeName()
|
|
||||||
property.name.valOf(
|
|
||||||
if (annotation is Info) {
|
|
||||||
if (property.returnType.isMarkedNullable) {
|
|
||||||
typeName.asNullable()
|
|
||||||
} else {
|
|
||||||
typeName
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
error("Annotation $annotation is not of type Info")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object : KLogging() {
|
|
||||||
const val GENERATED_PACKAGE = "ru.sicamp.helper.generated"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS)
|
|
||||||
annotation class GeneratorTarget
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.PROPERTY)
|
|
||||||
@Retention(AnnotationRetention.SOURCE)
|
|
||||||
annotation class Info
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.PROPERTY)
|
|
||||||
@Retention(AnnotationRetention.SOURCE)
|
|
||||||
annotation class Dto
|
|
||||||
|
|
||||||
@GeneratorTarget
|
|
||||||
class A(
|
|
||||||
@Info
|
|
||||||
val a: String? = "a",
|
|
||||||
@Info
|
|
||||||
val c: String = "c",
|
|
||||||
@Dto
|
|
||||||
val b: String = "b"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
fun main() {
|
|
||||||
InfoGenerator().generateInfo(User::class)
|
|
||||||
InfoGenerator().generateInfo(Room::class)
|
|
||||||
}
|
|
Loading…
Reference in a new issue