Skip to content
This repository was archived by the owner on Jan 28, 2025. It is now read-only.

Commit a08b944

Browse files
author
Gregory Lureau
committed
Handle top-level functions.
1 parent 1ae666a commit a08b944

File tree

10 files changed

+267
-102
lines changed

10 files changed

+267
-102
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ plugins {
2424

2525
allprojects {
2626
group = "deezer.kustomexport"
27-
version = "0.3.1"
27+
version = "0.4.0"
2828

2929
repositories {
3030
mavenLocal()

compiler/src/main/kotlin/deezer/kustomexport/compiler/ExportCompiler.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.google.devtools.ksp.symbol.KSAnnotated
2727
import com.google.devtools.ksp.symbol.KSAnnotation
2828
import com.google.devtools.ksp.symbol.KSClassDeclaration
2929
import com.google.devtools.ksp.symbol.KSFile
30+
import com.google.devtools.ksp.symbol.KSFunctionDeclaration
3031
import com.google.devtools.ksp.symbol.KSType
3132
import com.google.devtools.ksp.symbol.KSTypeAlias
3233
import com.google.devtools.ksp.symbol.KSTypeReference
@@ -41,11 +42,14 @@ import deezer.kustomexport.compiler.js.ClassDescriptor
4142
import deezer.kustomexport.compiler.js.EnumDescriptor
4243
import deezer.kustomexport.compiler.js.InterfaceDescriptor
4344
import deezer.kustomexport.compiler.js.SealedClassDescriptor
45+
import deezer.kustomexport.compiler.js.TopLevelFunctionDescriptor
4446
import deezer.kustomexport.compiler.js.ValueClassDescriptor
4547
import deezer.kustomexport.compiler.js.pattern.`class`.transform
4648
import deezer.kustomexport.compiler.js.pattern.`interface`.transform
4749
import deezer.kustomexport.compiler.js.pattern.enum.transform
50+
import deezer.kustomexport.compiler.js.pattern.function.transform
4851
import deezer.kustomexport.compiler.js.pattern.parseClass
52+
import deezer.kustomexport.compiler.js.pattern.parseFunction
4953
import deezer.kustomexport.compiler.js.pattern.value.transform
5054

5155
// Trick to share the Logger everywhere without injecting the dependency everywhere
@@ -170,6 +174,14 @@ class ExportCompiler(private val environment: SymbolProcessorEnvironment) : Symb
170174
parseAndWrite(targetClassDeclaration, targetTypeNames)
171175
}
172176

177+
override fun visitFunctionDeclaration(function: KSFunctionDeclaration, data: Unit) {
178+
super.visitFunctionDeclaration(function, data)
179+
val descriptor: TopLevelFunctionDescriptor = parseFunction(function)
180+
Logger.warn("FUNCTION: ${function.simpleName.asString()}")
181+
descriptor.transform()
182+
.writeCode(environment, function.containingFile!!)
183+
}
184+
173185
private fun parseAndWrite(
174186
classDeclaration: KSClassDeclaration,
175187
targetTypeNames: List<Pair<String, ClassName>>,
@@ -188,9 +200,6 @@ class ExportCompiler(private val environment: SymbolProcessorEnvironment) : Symb
188200
.writeCode(environment, *allSources)
189201
is InterfaceDescriptor -> descriptor.transform()
190202
.writeCode(environment, *allSources)
191-
null -> {
192-
// Cannot parse this class, parsing error already reported on the parser
193-
}
194203
}
195204
}
196205
}

compiler/src/main/kotlin/deezer/kustomexport/compiler/js/Structs.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ data class ParameterDescriptor(
4242
inline fun portMethod(import: Boolean) = if (import) importedMethod else exportedMethod
4343
}
4444

45+
data class TopLevelFunctionDescriptor(
46+
val packageName: String,
47+
val function: FunctionDescriptor,
48+
)
49+
4550
data class FunctionDescriptor(
4651
val name: String,
4752
val isOverride: Boolean,

compiler/src/main/kotlin/deezer/kustomexport/compiler/js/pattern/ClassDeclarationParser.kt

Lines changed: 64 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@
1919

2020
package deezer.kustomexport.compiler.js.pattern
2121

22-
import com.google.devtools.ksp.getAllSuperTypes
2322
import com.google.devtools.ksp.getConstructors
2423
import com.google.devtools.ksp.getDeclaredFunctions
2524
import com.google.devtools.ksp.getDeclaredProperties
2625
import com.google.devtools.ksp.isPrivate
2726
import com.google.devtools.ksp.isPublic
2827
import com.google.devtools.ksp.symbol.ClassKind
2928
import com.google.devtools.ksp.symbol.KSClassDeclaration
29+
import com.google.devtools.ksp.symbol.KSFunctionDeclaration
30+
import com.google.devtools.ksp.symbol.KSName
31+
import com.google.devtools.ksp.symbol.KSTypeParameter
3032
import com.google.devtools.ksp.symbol.Modifier
3133
import com.squareup.kotlinpoet.TypeName
3234
import com.squareup.kotlinpoet.ksp.KotlinPoetKspPreview
@@ -45,49 +47,37 @@ import deezer.kustomexport.compiler.js.PropertyDescriptor
4547
import deezer.kustomexport.compiler.js.SealedClassDescriptor
4648
import deezer.kustomexport.compiler.js.SealedSubClassDescriptor
4749
import deezer.kustomexport.compiler.js.SuperDescriptor
50+
import deezer.kustomexport.compiler.js.TopLevelFunctionDescriptor
4851
import deezer.kustomexport.compiler.js.TypeParameterDescriptor
4952
import deezer.kustomexport.compiler.js.ValueClassDescriptor
5053
import deezer.kustomexport.compiler.js.mapping.OriginTypeName
5154

55+
fun parseFunction(
56+
function: KSFunctionDeclaration,
57+
forcedConcreteTypeParameters: List<Pair<String, TypeName>>? = null,
58+
): TopLevelFunctionDescriptor = TopLevelFunctionDescriptor(
59+
packageName = function.packageName.asString(),
60+
function = function.toDescriptor(
61+
sequenceOf(),
62+
function.typeParameters.toTypeParameterResolver(),
63+
buildConcreteTypeParameters(forcedConcreteTypeParameters) { function.typeParameters[0] }
64+
)
65+
)
66+
5267
@KotlinPoetKspPreview
5368
fun parseClass(
5469
classDeclaration: KSClassDeclaration,
5570
forcedConcreteTypeParameters: List<Pair<String, TypeName>>? = null,
5671
exportedClassSimpleName: String
57-
): Descriptor? {
72+
): Descriptor {
5873
val typeParamResolver = classDeclaration.typeParameters.toTypeParameterResolver()
5974

60-
val concreteTypeParameters: MutableList<TypeParameterDescriptor> = mutableListOf()
61-
(forcedConcreteTypeParameters ?: emptyList())/* ?: typeParamResolver.parametersMap.values*/
62-
.forEach { (name, type) ->
63-
val className = try {
64-
type.asClassName()
65-
} catch (t: Throwable) {
66-
Logger.error(
67-
"Cannot use @KustomException on a not concrete generics class.",
68-
classDeclaration.typeParameters[0]
69-
)
70-
return null
71-
}
72-
concreteTypeParameters.add(
73-
TypeParameterDescriptor(
74-
name = name,
75-
origin = className.cached(concreteTypeParameters),
76-
)
77-
)
78-
}
75+
val concreteTypeParameters: MutableList<TypeParameterDescriptor> =
76+
buildConcreteTypeParameters(forcedConcreteTypeParameters) { classDeclaration.typeParameters[0] }
7977

8078
val packageName = classDeclaration.packageName.asString()
8179
val classSimpleName = classDeclaration.simpleName.asString()
8280

83-
//val superTypes = classDeclaration.getAllSuperTypes()
84-
85-
Logger.warn(
86-
"PARSING - ${classSimpleName} ${classDeclaration.superTypes.count()} ${
87-
classDeclaration.getAllSuperTypes().count()
88-
}"
89-
)
90-
9181
val superTypes = classDeclaration.superTypes
9282
.map { superType ->
9383
val superTypeName = superType.toTypeNamePatch(typeParamResolver).cached(concreteTypeParameters)
@@ -187,6 +177,32 @@ fun parseClass(
187177
}
188178
}
189179

180+
private fun buildConcreteTypeParameters(
181+
forcedConcreteTypeParameters: List<Pair<String, TypeName>>?,
182+
firstTypeParameterProvider: () -> KSTypeParameter
183+
): MutableList<TypeParameterDescriptor> {
184+
val concreteTypeParameters: MutableList<TypeParameterDescriptor> = mutableListOf()
185+
(forcedConcreteTypeParameters ?: emptyList())/* ?: typeParamResolver.parametersMap.values*/
186+
.forEach { (name, type) ->
187+
val className = try {
188+
type.asClassName()
189+
} catch (t: Throwable) {
190+
Logger.error(
191+
"Cannot use @KustomException on a not concrete generics class.",
192+
firstTypeParameterProvider()
193+
)
194+
error(t)
195+
}
196+
concreteTypeParameters.add(
197+
TypeParameterDescriptor(
198+
name = name,
199+
origin = className.cached(concreteTypeParameters),
200+
)
201+
)
202+
}
203+
return concreteTypeParameters
204+
}
205+
190206
private val nonExportableFunctions = listOf(
191207
"<init>",
192208
"equals",
@@ -216,21 +232,28 @@ fun KSClassDeclaration.parseFunctions(
216232
.filter { it.simpleName.asString() !in nonExportableFunctions }
217233
.filter { it.isPublic() }
218234
.map { func ->
219-
FunctionDescriptor(
220-
name = func.simpleName.asString(),
221-
isOverride = func.findOverridee() != null || !declaredNames.contains(func.simpleName),
222-
isSuspend = func.modifiers.contains(Modifier.SUSPEND),
223-
returnType = func.returnType!!.toTypeNamePatch(typeParamResolver).cached(concreteTypeParameters),
224-
parameters = func.parameters.map { p ->
225-
ParameterDescriptor(
226-
name = p.name?.asString() ?: TODO("not sure what we want here"),
227-
type = p.type.toTypeNamePatch(typeParamResolver).cached(concreteTypeParameters),
228-
)
229-
}
230-
)
235+
func.toDescriptor(declaredNames, typeParamResolver, concreteTypeParameters)
231236
}.toList()
232237
}
233238

239+
private fun KSFunctionDeclaration.toDescriptor(
240+
declaredNames: Sequence<KSName>,
241+
typeParamResolver: TypeParameterResolver,
242+
concreteTypeParameters: MutableList<TypeParameterDescriptor>
243+
) =
244+
FunctionDescriptor(
245+
name = simpleName.asString(),
246+
isOverride = findOverridee() != null || !declaredNames.contains(simpleName),
247+
isSuspend = modifiers.contains(Modifier.SUSPEND),
248+
returnType = returnType!!.toTypeNamePatch(typeParamResolver).cached(concreteTypeParameters),
249+
parameters = parameters.map { p ->
250+
ParameterDescriptor(
251+
name = p.name?.asString() ?: TODO("not sure what we want here"),
252+
type = p.type.toTypeNamePatch(typeParamResolver).cached(concreteTypeParameters),
253+
)
254+
}
255+
)
256+
234257
@OptIn(KotlinPoetKspPreview::class)
235258
fun KSClassDeclaration.parseProperties(
236259
typeParamResolver: TypeParameterResolver,

0 commit comments

Comments
 (0)