-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRouteInfoMapper.kt
More file actions
60 lines (52 loc) · 2.16 KB
/
RouteInfoMapper.kt
File metadata and controls
60 lines (52 loc) · 2.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.angrypodo.wisp.mapper
import com.angrypodo.wisp.model.ClassRouteInfo
import com.angrypodo.wisp.model.ObjectRouteInfo
import com.angrypodo.wisp.model.ParameterInfo
import com.angrypodo.wisp.model.RouteInfo
import com.google.devtools.ksp.symbol.ClassKind
import com.google.devtools.ksp.symbol.KSClassDeclaration
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.ksp.toClassName
import com.squareup.kotlinpoet.ksp.toTypeName
private const val WISP_SIMPLE_NAME = "Wisp"
private const val WISP_PATH_ARGUMENT = "path"
internal fun KSClassDeclaration.toRouteInfo(): RouteInfo? {
val wispPath = getWispPath() ?: return null
val routeClassName = toClassName()
val factoryClassName = ClassName(packageName.asString(), "${simpleName.asString()}RouteFactory")
if (classKind == ClassKind.OBJECT) {
return ObjectRouteInfo(
routeClassName = routeClassName,
factoryClassName = factoryClassName,
wispPath = wispPath
)
}
return ClassRouteInfo(
routeClassName = routeClassName,
factoryClassName = factoryClassName,
wispPath = wispPath,
parameters = extractParameters()
)
}
private fun KSClassDeclaration.getWispPath(): String? {
val wispAnnotation = annotations.find { it.shortName.asString() == WISP_SIMPLE_NAME }
?: return null
val pathArgument =
wispAnnotation.arguments.firstOrNull { it.name?.asString() == WISP_PATH_ARGUMENT }
?: wispAnnotation.arguments.firstOrNull()
return pathArgument?.value as? String
}
private fun KSClassDeclaration.extractParameters(): List<ParameterInfo> {
return primaryConstructor?.parameters?.mapNotNull { parameter ->
val parameterName = parameter.name?.asString() ?: return@mapNotNull null
val resolvedType = parameter.type.resolve()
val isEnum =
(resolvedType.declaration as? KSClassDeclaration)?.classKind == ClassKind.ENUM_CLASS
ParameterInfo(
name = parameterName,
typeName = resolvedType.toTypeName(),
isNullable = resolvedType.isMarkedNullable,
isEnum = isEnum
)
} ?: emptyList()
}