blob: 65c682b2328dace6b6c3888071f5453360a5c0e7 [file] [log] [blame]
/*
* Copyright 2020 Google LLC
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.devtools.ksp.processor
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.symbol.*
class AllFunctionsProcessor : AbstractTestProcessor() {
val visitor = AllFunctionsVisitor()
override fun toResult(): List<String> {
return visitor.toResult()
}
override fun process(resolver: Resolver): List<KSAnnotated> {
resolver.getNewFiles().forEach { it.accept(visitor, Unit) }
return emptyList()
}
class AllFunctionsVisitor : KSVisitorVoid() {
private val declarationsByClass = mutableMapOf<String, MutableList<String>>()
fun toResult(): List<String> {
return declarationsByClass.entries
.sortedBy {
it.key
}.flatMap {
listOf(it.key) + it.value
}
}
fun KSFunctionDeclaration.toSignature(): String {
return this.simpleName.asString() +
"(${this.parameters.map {
buildString {
append(it.type.resolve().declaration.qualifiedName?.asString())
if (it.hasDefault) {
append("(hasDefault)")
}
if (it.isVararg) {
append(" ...")
}
}
}.joinToString(",")})" +
": ${this.returnType?.resolve()?.declaration?.qualifiedName?.asString() ?: ""}"
}
override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) {
val declarations = mutableListOf<String>()
// first add properties
declarations.addAll(
classDeclaration.getAllProperties().map {
it.toString()
}.sorted()
)
// then add functions
declarations.addAll(
classDeclaration.getAllFunctions().map {
it.toSignature()
}.sorted()
)
declarationsByClass["class: ${classDeclaration.simpleName.asString()}"] = declarations
}
override fun visitFile(file: KSFile, data: Unit) {
file.declarations.forEach { it.accept(this, Unit) }
}
}
}