Skip to content

Commit 98cfcfd

Browse files
Refactor
1 parent 585b42b commit 98cfcfd

File tree

13 files changed

+46
-113
lines changed

13 files changed

+46
-113
lines changed

convertible-core/src/main/kotlin/pro/vlprojects/convertible/core/processor/ConvertibleProcessor.kt

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,20 @@ import com.google.devtools.ksp.validate
1212
import com.squareup.kotlinpoet.FileSpec
1313
import pro.vlprojects.convertible.core.annotation.Convertible
1414
import pro.vlprojects.convertible.core.definition.ConvertibleDefinition
15-
import pro.vlprojects.convertible.core.strategy.ConvertibleStrategyLoader
15+
import pro.vlprojects.convertible.core.strategy.ConvertibleStrategy
1616
import java.io.OutputStreamWriter
1717

1818
class ConvertibleProcessor(
19+
private val strategy: ConvertibleStrategy,
1920
private val generator: CodeGenerator,
2021
private val logger: KSPLogger,
2122
) : SymbolProcessor {
2223

23-
private val strategies = ConvertibleStrategyLoader(logger)
24-
.load()
25-
.also { logger.info("${it.size} strategies found for code generating") }
26-
2724
private val definitions = mutableListOf<ConvertibleDefinition>()
28-
private val visitor = ConvertibleVisitor(definitions)
2925

3026
override fun process(resolver: Resolver): List<KSAnnotated> {
27+
val visitor = ConvertibleVisitor(strategy.scope(), definitions)
28+
3129
resolver
3230
.getSymbolsWithAnnotation(Convertible::class.qualifiedName!!)
3331
.filterIsInstance<KSClassDeclaration>()
@@ -45,16 +43,15 @@ class ConvertibleProcessor(
4543
.forEach { definition ->
4644
logger.info("Processing definition: $definition")
4745
val targetPackage = "${definition.objectClassName.packageName}.${definition.scope.lowercase()}"
48-
strategies
49-
.filter { it.supports(definition) }
50-
.forEach { strategy ->
51-
val specification = strategy.build(definition)
52-
logger.info("Generating file: $targetPackage.${specification.name}")
53-
specification.writeWith(generator, targetPackage, definition.source)
54-
logger.info("Generated file: $targetPackage.${specification.name}")
55-
}
46+
47+
check(strategy.supports(definition)) { "The strategy does not support the definition: $definition" }
48+
49+
val specification = strategy.build(definition)
50+
specification.writeWith(generator, targetPackage, definition.source)
51+
logger.info("Generated file: $targetPackage.${specification.name}")
5652
}
5753

54+
5855
override fun onError() {
5956
super.onError()
6057
logger.error("Failed to process @Convertible")

convertible-core/src/main/kotlin/pro/vlprojects/convertible/core/processor/ConvertibleProcessorProvider.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

convertible-core/src/main/kotlin/pro/vlprojects/convertible/core/processor/ConvertibleVisitor.kt

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import pro.vlprojects.convertible.core.definition.ConvertibleDefinition.ValueAcc
1919
import kotlin.reflect.KClass
2020

2121
class ConvertibleVisitor(
22+
private val scope: String,
2223
private val definitions: MutableList<ConvertibleDefinition>,
2324
) : KSVisitorVoid() {
2425

@@ -36,23 +37,21 @@ class ConvertibleVisitor(
3637
val nullable = annotation.getArgument<Boolean>("nullable").let(::checkNotNull)
3738
val scopes = annotation.getScopes()
3839

39-
check(scopes.isNotEmpty()) { "At least one scope must be specified for @Convertible in $className" }
40+
check(scopes.contains(scope)) { "Scope $scope not specified in @Convertible annotation for class $className" }
4041

41-
scopes.forEach { scope ->
42-
val valueAccessor = resolveValueAccessor(classDeclaration, scope)
43-
val factoryAccessor = resolveFactoryAccessor(classDeclaration, valueAccessor.returnType, scope)
42+
val valueAccessor = resolveValueAccessor(classDeclaration, scope)
43+
val factoryAccessor = resolveFactoryAccessor(classDeclaration, valueAccessor.returnType, scope)
4444

45-
val definition = ConvertibleDefinition(
46-
objectClassName = className,
47-
source = classDeclaration.containingFile.let(::checkNotNull),
48-
scope = scope,
49-
nullable = nullable,
50-
valueAccessor = valueAccessor,
51-
factoryAccessor = factoryAccessor,
52-
)
45+
val definition = ConvertibleDefinition(
46+
objectClassName = className,
47+
source = classDeclaration.containingFile.let(::checkNotNull),
48+
scope = scope,
49+
nullable = nullable,
50+
valueAccessor = valueAccessor,
51+
factoryAccessor = factoryAccessor,
52+
)
5353

54-
definitions.add(definition)
55-
}
54+
definitions.add(definition)
5655
}
5756
}
5857

convertible-core/src/main/kotlin/pro/vlprojects/convertible/core/strategy/ConvertibleStrategy.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.squareup.kotlinpoet.FileSpec
44
import pro.vlprojects.convertible.core.definition.ConvertibleDefinition
55

66
interface ConvertibleStrategy {
7-
fun supports(definition: ConvertibleDefinition): Boolean
7+
fun scope(): String
8+
fun supports(definition: ConvertibleDefinition): Boolean = scope() == definition.scope
89
fun build(definition: ConvertibleDefinition): FileSpec
910
}

convertible-core/src/main/kotlin/pro/vlprojects/convertible/core/strategy/ConvertibleStrategyLoader.kt

Lines changed: 0 additions & 66 deletions
This file was deleted.

convertible-core/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider

Lines changed: 0 additions & 1 deletion
This file was deleted.

convertible-jpa/build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ repositories {
1212
dependencies {
1313
implementation(project(":convertible-core"))
1414

15+
implementation("com.google.devtools.ksp:symbol-processing-api:2.1.21-2.0.1")
16+
implementation("com.squareup:kotlinpoet:2.2.0")
17+
1518
implementation("jakarta.persistence:jakarta.persistence-api:3.1.0")
1619
implementation("org.springframework:spring-context:6.2.6")
1720

18-
implementation("com.squareup:kotlinpoet:2.2.0")
19-
2021
testImplementation(kotlin("test"))
2122

2223
testImplementation("dev.zacsweers.kctfork:core:0.7.1")

convertible-jpa/src/main/kotlin/pro/vlprojects/convertible/jpa/JpaAttributeConverter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import pro.vlprojects.convertible.core.strategy.ConvertibleStrategy
1717

1818
class JpaAttributeConverter : ConvertibleStrategy {
1919

20-
override fun supports(definition: ConvertibleDefinition): Boolean = definition.scope == Scope.JPA
20+
override fun scope() = Scope.JPA
2121

2222
override fun build(definition: ConvertibleDefinition): FileSpec {
2323

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pro.vlprojects.convertible.jpa
2+
3+
import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
4+
import com.google.devtools.ksp.processing.SymbolProcessorProvider
5+
import pro.vlprojects.convertible.core.processor.ConvertibleProcessor
6+
7+
class JpaConvertibleProcessorProvider : SymbolProcessorProvider {
8+
override fun create(environment: SymbolProcessorEnvironment) = ConvertibleProcessor(
9+
strategy = JpaAttributeConverter(),
10+
generator = environment.codeGenerator,
11+
logger = environment.logger,
12+
)
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pro.vlprojects.convertible.jpa.JpaConvertibleProcessorProvider

0 commit comments

Comments
 (0)