Skip to content

Commit 7026668

Browse files
committed
GH-147 Support inheritance (Resolve #147)
1 parent 947ffce commit 7026668

File tree

4 files changed

+52
-4
lines changed

4 files changed

+52
-4
lines changed

openapi-annotation-processor/src/main/kotlin/io/javalin/openapi/processor/generators/OpenApiGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ internal class OpenApiGenerator {
370370
}
371371
}
372372

373-
fun detectContentType(typeMirror: TypeMirror): String = context.inContext {
373+
private fun detectContentType(typeMirror: TypeMirror): String = context.inContext {
374374
val model = typeMirror.toClassDefinition()
375375

376376
when {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package io.javalin.openapi.processor
2+
3+
import io.javalin.openapi.OpenApi
4+
import io.javalin.openapi.OpenApiContent
5+
import io.javalin.openapi.OpenApiResponse
6+
import io.javalin.openapi.processor.specification.OpenApiAnnotationProcessorSpecification
7+
import net.javacrumbs.jsonunit.assertj.JsonAssertions.json
8+
import net.javacrumbs.jsonunit.assertj.assertThatJson
9+
import org.junit.jupiter.api.Test
10+
11+
internal class SchemeTest : OpenApiAnnotationProcessorSpecification() {
12+
13+
private open class BaseType {
14+
val baseField: String = "Test"
15+
}
16+
17+
private class FinalClass : BaseType() {
18+
val finalField: String = "Test"
19+
}
20+
21+
@OpenApi(
22+
path = "content-types",
23+
versions = ["should_generate_reference_with_inherited_properties"],
24+
responses = [OpenApiResponse(status = "200", content = [OpenApiContent(from = FinalClass::class)])]
25+
)
26+
@Test
27+
fun should_generate_reference_with_inherited_properties() = withOpenApi("should_generate_reference_with_inherited_properties") {
28+
assertThatJson(it)
29+
.inPath("$.components.schemas.FinalClass.properties")
30+
.isObject
31+
.isEqualTo(json("""
32+
{
33+
"baseField": {
34+
"type": "string"
35+
},
36+
"finalField": {
37+
"type": "string"
38+
}
39+
}
40+
"""))
41+
}
42+
43+
}

openapi-specification/src/main/kotlin/io/javalin/openapi/experimental/AnnotationProcessorContext.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@ class AnnotationProcessorContext(
4141
fun getClassDefinitions(mirrors: Set<TypeMirror>): Set<ClassDefinition> =
4242
mirrors.map { getClassDefinition(it) }.toSet()
4343

44-
fun forTypeElement(name: String): TypeElement? = env.elementUtils.getTypeElement(name)
44+
fun forTypeElement(name: String): TypeElement? =
45+
env.elementUtils.getTypeElement(name)
4546

46-
fun isAssignable(implementation: TypeMirror, superclass: TypeMirror): Boolean = env.typeUtils.isAssignable(implementation, superclass)
47+
fun forTypeElement(mirror: TypeMirror): TypeElement =
48+
env.typeUtils.asElement(mirror) as TypeElement
49+
50+
fun isAssignable(implementation: TypeMirror, superclass: TypeMirror): Boolean =
51+
env.typeUtils.isAssignable(implementation, superclass)
4752

4853
fun hasElement(type: TypeElement, element: Element): Boolean =
4954
when (element) {

openapi-specification/src/main/kotlin/io/javalin/openapi/experimental/processor/generators/TypeSchemaGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ internal fun ClassDefinition.findAllProperties(requireNonNulls: Boolean): Collec
199199
inDebug { it.info("TypeSchemaGenerator#findAllProperties | Enclosed elements of ${mirror}: ${source.enclosedElements}") }
200200
val properties = mutableListOf<Property>()
201201

202-
for (property in source.enclosedElements) {
202+
for (property in context.env.elementUtils.getAllMembers(context.forTypeElement(mirror))) {
203203
if (property is Element) {
204204
if (context.configuration.propertyInSchemeFilter?.filter(context, this@findAllProperties, property) == false) {
205205
continue

0 commit comments

Comments
 (0)