Skip to content

Commit

Permalink
AA: include java files for class declaration index.
Browse files Browse the repository at this point in the history
* minor fix to property qualified name.
  • Loading branch information
neetopia committed Mar 13, 2023
1 parent 94203ed commit 97774aa
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ class KotlinSymbolProcessing(
ktFiles.map {
analyze { it.getFileSymbol() }
},
javaFiles
options,
project
)
ResolverAAImpl.instance = resolver
processors.forEach { it.process(resolver) }
Expand All @@ -119,7 +120,7 @@ fun main(args: Array<String>) {
val commandLineProcessor = KSPCommandLineProcessor(compilerConfiguration)
val logger = CommandLineKSPLogger()

val analysisSession = buildStandaloneAnalysisAPISession {
val analysisSession = buildStandaloneAnalysisAPISession(withPsiDeclarationFromBinaryModuleProvider = true) {
buildKtModuleProviderByCompilerConfiguration(compilerConfiguration)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.google.devtools.ksp.impl

import com.google.devtools.ksp.KspExperimental
import com.google.devtools.ksp.KspOptions
import com.google.devtools.ksp.impl.symbol.kotlin.KSClassDeclarationEnumEntryImpl
import com.google.devtools.ksp.impl.symbol.kotlin.KSClassDeclarationImpl
import com.google.devtools.ksp.impl.symbol.kotlin.KSFileImpl
Expand Down Expand Up @@ -46,10 +47,15 @@ import com.google.devtools.ksp.symbol.KSType
import com.google.devtools.ksp.symbol.KSTypeArgument
import com.google.devtools.ksp.symbol.KSTypeReference
import com.google.devtools.ksp.symbol.Modifier
import com.google.devtools.ksp.symbol.Origin
import com.google.devtools.ksp.symbol.Variance
import com.google.devtools.ksp.toKSName
import com.google.devtools.ksp.visitor.CollectAnnotatedSymbolsVisitor
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiJavaFile
import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
Expand All @@ -64,17 +70,33 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name
import java.io.File
import java.nio.file.Files

@OptIn(KspExperimental::class)
class ResolverAAImpl(
val ktFiles: List<KtFileSymbol>,
val javaFiles: List<PsiJavaFile>
val options: KspOptions,
val project: Project
) : Resolver {
companion object {
lateinit var instance: ResolverAAImpl
lateinit var ktModule: KtModule
}

val javaFiles: List<PsiJavaFile>
init {
val psiManager = PsiManager.getInstance(project)
val localFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL)
// Get non-symbolic paths first
javaFiles = options.javaSourceRoots.sortedBy { Files.isSymbolicLink(it.toPath()) }
.flatMap { root -> root.walk().filter { it.isFile && it.extension == "java" }.toList() }
// This time is for .java files
.sortedBy { Files.isSymbolicLink(it.toPath()) }
.distinctBy { it.canonicalPath }
.mapNotNull { localFileSystem.findFileByPath(it.path)?.let { psiManager.findFile(it) } as? PsiJavaFile }
}

private val ksFiles by lazy {
ktFiles.map { KSFileImpl.getCached(it) } + javaFiles.map { KSFileJavaImpl.getCached(it) }
}
Expand Down Expand Up @@ -166,10 +188,36 @@ class ResolverAAImpl(
else -> null
}
}
}.asSequence()
}.plus(javaPackageToClassMap.getOrDefault(packageName, emptyList()).asSequence()).asSequence()
}
}

private val javaPackageToClassMap: Map<String, List<KSDeclaration>> by lazy {
val packageToClassMapping = mutableMapOf<String, List<KSDeclaration>>()
ksFiles
.filter { file ->
file.origin == Origin.JAVA &&
options.javaSourceRoots.any { root ->
file.filePath.startsWith(root.absolutePath) &&
file.filePath.substringAfter(root.absolutePath)
.dropLastWhile { c -> c != File.separatorChar }.dropLast(1).drop(1)
.replace(File.separatorChar, '.') == file.packageName.asString()
}
}
.forEach {
packageToClassMapping.put(
it.packageName.asString(),
packageToClassMapping.getOrDefault(it.packageName.asString(), emptyList())
.plus(
it.declarations.filterNot {
it.containingFile?.fileName?.split(".")?.first() == it.simpleName.asString()
}
)
)
}
packageToClassMapping
}

override fun getDeclarationsInSourceOrder(container: KSDeclarationContainer): Sequence<KSDeclaration> {
TODO("Not yet implemented")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,9 @@ class KSPropertyDeclarationImpl private constructor(internal val ktPropertySymbo
}

override val qualifiedName: KSName? by lazy {
KSNameImpl.getCached("${parentDeclaration?.qualifiedName?.asString()}.${this.simpleName.asString()}")
val name = ktPropertySymbol.callableIdIfNonLocal?.asSingleFqName()?.asString()
?: ("${parentDeclaration?.qualifiedName?.asString()}.${this.simpleName.asString()}")
KSNameImpl.getCached(name)
}

override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ abstract class AbstractKSPAATest : AbstractKSPTest(FrontendKinds.FIR) {
cachesDir = File(testRoot, "kspTest/kspCaches")
kspOutputDir = File(testRoot, "kspTest")
}.build()
val analysisSession = buildStandaloneAnalysisAPISession {
val analysisSession = buildStandaloneAnalysisAPISession(withPsiDeclarationFromBinaryModuleProvider = true) {
buildKtModuleProviderByCompilerConfiguration(compilerConfiguration)
}
val ksp = KotlinSymbolProcessing(
Expand Down

0 comments on commit 97774aa

Please sign in to comment.