[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 com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.name.CallableId 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.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
import java.io.File import java.io.File
import java.nio.file.Path import java.nio.file.Path
@@ -41,24 +41,31 @@ object SymbolByFqName {
} }
sealed class SymbolData { sealed class SymbolData {
abstract fun KtAnalysisSession.toSymbols(): List<KtSymbol> abstract fun KtAnalysisSession.toSymbols(ktFile: KtFile): List<KtSymbol>
data class ClassData(val classId: ClassId) : SymbolData() { 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") val symbol = getClassOrObjectSymbolByClassId(classId) ?: error("Class $classId is not found")
return listOf(symbol) 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() { 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") val symbol = getTypeAliasByClassId(classId) ?: error("Type alias $classId is not found")
return listOf(symbol) return listOf(symbol)
} }
} }
data class CallableData(val callableId: CallableId) : SymbolData() { 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 classId = callableId.classId
val symbols = if (classId == null) { val symbols = if (classId == null) {
getTopLevelCallableSymbols(callableId.packageName, callableId.callableName).toList() getTopLevelCallableSymbols(callableId.packageName, callableId.callableName).toList()
@@ -77,9 +84,10 @@ sealed class SymbolData {
} }
companion object { companion object {
val identifiers = arrayOf("callable:", "class:", "typealias:") val identifiers: List<String> = listOf("callable:", "class:", "typealias:", "script")
fun create(data: String): SymbolData = when { fun create(data: String): SymbolData = when {
data == "script" -> ScriptData
data.startsWith("class:") -> ClassData(ClassId.fromString(data.removePrefix("class:").trim())) data.startsWith("class:") -> ClassData(ClassId.fromString(data.removePrefix("class:").trim()))
data.startsWith("typealias:") -> TypeAliasData(ClassId.fromString(data.removePrefix("typealias:").trim())) data.startsWith("typealias:") -> TypeAliasData(ClassId.fromString(data.removePrefix("typealias:").trim()))
data.startsWith("callable:") -> { data.startsWith("callable:") -> {
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.test.services.TestServices
abstract class AbstractDeclaredMemberScopeTest : AbstractSymbolByFqNameTest() { abstract class AbstractDeclaredMemberScopeTest : AbstractSymbolByFqNameTest() {
override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData { override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData {
val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath) val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath)
val symbols = with(symbolData) { toSymbols() } val symbols = with(symbolData) { toSymbols(ktFile) }
val classSymbol = symbols.singleOrNull() as? KtSymbolWithMembers val classSymbol = symbols.singleOrNull() as? KtSymbolWithMembers
?: error("Should be a single class symbol, but $symbols found") ?: error("Should be a single class symbol, but $symbols found")
return SymbolsData(classSymbol.getDeclaredMemberScope().getAllSymbols().toList()) return SymbolsData(classSymbol.getDeclaredMemberScope().getAllSymbols().toList())
@@ -17,7 +17,7 @@ abstract class AbstractDelegateMemberScopeTest : AbstractSymbolByFqNameTest() {
override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData { override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData {
val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath) val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath)
val symbols = with(symbolData) { toSymbols() } val symbols = with(symbolData) { toSymbols(ktFile) }
val classSymbol = symbols.singleOrNull() as? KtClassOrObjectSymbol val classSymbol = symbols.singleOrNull() as? KtClassOrObjectSymbol
?: error("Should be a single class symbol, but $symbols found") ?: error("Should be a single class symbol, but $symbols found")
return SymbolsData(classSymbol.getDelegatedMemberScope().getCallableSymbols().toList()) return SymbolsData(classSymbol.getDelegatedMemberScope().getCallableSymbols().toList())
@@ -17,7 +17,7 @@ abstract class AbstractMemberScopeByFqNameTest : AbstractSymbolByFqNameTest() {
override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData { override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData {
val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath) val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath)
val symbols = with(symbolData) { toSymbols() } val symbols = with(symbolData) { toSymbols(ktFile) }
val classSymbol = symbols.singleOrNull() as? KtSymbolWithMembers val classSymbol = symbols.singleOrNull() as? KtSymbolWithMembers
?: error("Should be a single class symbol, but $symbols found") ?: error("Should be a single class symbol, but $symbols found")
return SymbolsData(classSymbol.getMemberScope().getAllSymbols().toList()) 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. * 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() { abstract class AbstractSymbolByFqNameTest : AbstractSymbolTest() {
override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData { override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData {
val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath) val symbolData = SymbolByFqName.getSymbolDataFromFile(testDataPath)
return SymbolsData(with(symbolData) { toSymbols() }) return SymbolsData(with(symbolData) { toSymbols(ktFile) })
} }
override fun configureTest(builder: TestConfigurationBuilder) { override fun configureTest(builder: TestConfigurationBuilder) {