[AA] extend SymbolData API to support scripts

^KT-61431
This commit is contained in:
Dmitrii Gridin
2023-08-23 20:58:15 +02:00
committed by Space Team
parent b6f34ad8c0
commit adc853ebd0
5 changed files with 19 additions and 11 deletions
@@ -8,11 +8,11 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test
import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
import java.io.File
import java.nio.file.Path
@@ -41,24 +41,31 @@ object SymbolByFqName {
}
sealed class SymbolData {
abstract fun KtAnalysisSession.toSymbols(): List<KtSymbol>
abstract fun KtAnalysisSession.toSymbols(ktFile: KtFile): List<KtSymbol>
data class ClassData(val classId: ClassId) : SymbolData() {
override fun KtAnalysisSession.toSymbols(): List<KtSymbol> {
override fun KtAnalysisSession.toSymbols(ktFile: KtFile): List<KtSymbol> {
val symbol = getClassOrObjectSymbolByClassId(classId) ?: error("Class $classId is not found")
return listOf(symbol)
}
}
object ScriptData : SymbolData() {
override fun KtAnalysisSession.toSymbols(ktFile: KtFile): List<KtSymbol> {
val script = ktFile.script ?: error("KtScript is not found")
return listOf(script.getScriptSymbol())
}
}
data class TypeAliasData(val classId: ClassId) : SymbolData() {
override fun KtAnalysisSession.toSymbols(): List<KtSymbol> {
override fun KtAnalysisSession.toSymbols(ktFile: KtFile): List<KtSymbol> {
val symbol = getTypeAliasByClassId(classId) ?: error("Type alias $classId is not found")
return listOf(symbol)
}
}
data class CallableData(val callableId: CallableId) : SymbolData() {
override fun KtAnalysisSession.toSymbols(): List<KtSymbol> {
override fun KtAnalysisSession.toSymbols(ktFile: KtFile): List<KtSymbol> {
val classId = callableId.classId
val symbols = if (classId == null) {
getTopLevelCallableSymbols(callableId.packageName, callableId.callableName).toList()
@@ -77,9 +84,10 @@ sealed class SymbolData {
}
companion object {
val identifiers = arrayOf("callable:", "class:", "typealias:")
val identifiers: List<String> = listOf("callable:", "class:", "typealias:", "script")
fun create(data: String): SymbolData = when {
data == "script" -> ScriptData
data.startsWith("class:") -> ClassData(ClassId.fromString(data.removePrefix("class:").trim()))
data.startsWith("typealias:") -> TypeAliasData(ClassId.fromString(data.removePrefix("typealias:").trim()))
data.startsWith("callable:") -> {
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.test.services.TestServices
abstract class AbstractDeclaredMemberScopeTest : AbstractSymbolByFqNameTest() {
override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData {
val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath)
val symbols = with(symbolData) { toSymbols() }
val symbols = with(symbolData) { toSymbols(ktFile) }
val classSymbol = symbols.singleOrNull() as? KtSymbolWithMembers
?: error("Should be a single class symbol, but $symbols found")
return SymbolsData(classSymbol.getDeclaredMemberScope().getAllSymbols().toList())
@@ -17,7 +17,7 @@ abstract class AbstractDelegateMemberScopeTest : AbstractSymbolByFqNameTest() {
override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData {
val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath)
val symbols = with(symbolData) { toSymbols() }
val symbols = with(symbolData) { toSymbols(ktFile) }
val classSymbol = symbols.singleOrNull() as? KtClassOrObjectSymbol
?: error("Should be a single class symbol, but $symbols found")
return SymbolsData(classSymbol.getDelegatedMemberScope().getCallableSymbols().toList())
@@ -17,7 +17,7 @@ abstract class AbstractMemberScopeByFqNameTest : AbstractSymbolByFqNameTest() {
override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData {
val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath)
val symbols = with(symbolData) { toSymbols() }
val symbols = with(symbolData) { toSymbols(ktFile) }
val classSymbol = symbols.singleOrNull() as? KtSymbolWithMembers
?: error("Should be a single class symbol, but $symbols found")
return SymbolsData(classSymbol.getMemberScope().getAllSymbols().toList())
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.test.services.TestServices
abstract class AbstractSymbolByFqNameTest : AbstractSymbolTest() {
override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData {
val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath)
return SymbolsData(with(symbolData) { toSymbols() })
return SymbolsData(with(symbolData) { toSymbols(ktFile) })
}
override fun configureTest(builder: TestConfigurationBuilder) {