[AA] implement isExpect/isActual for KtClassLikeSymbol

KT-54846
This commit is contained in:
aleksandrina-streltsova
2023-07-17 15:55:20 +03:00
committed by teamcity
parent 20598cf7d7
commit ca25162574
20 changed files with 652 additions and 14 deletions
@@ -50,6 +50,12 @@ internal class KtFe10DescNamedClassOrObjectSymbol(
override val isExternal: Boolean
get() = withValidityAssertion { descriptor.isExternal }
override val isActual: Boolean
get() = withValidityAssertion { descriptor.isActual }
override val isExpect: Boolean
get() = withValidityAssertion { descriptor.isExpect }
override val companionObject: KtNamedClassOrObjectSymbol?
get() {
withValidityAssertion {
@@ -45,6 +45,9 @@ internal class KtFe10DescTypeAliasSymbol(
override val classIdIfNonLocal: ClassId?
get() = withValidityAssertion { descriptor.classId }
override val isActual: Boolean get() = withValidityAssertion { descriptor.isActual }
override val isExpect: Boolean get() = withValidityAssertion { descriptor.isExpect }
context(KtAnalysisSession)
override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource<KtTypeAliasSymbol>(this) ?: KtFe10NeverRestoringSymbolPointer()
@@ -36,6 +36,8 @@ import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.resolve.BindingContext
internal class KtFe10PsiNamedClassOrObjectSymbol(
@@ -62,6 +64,12 @@ internal class KtFe10PsiNamedClassOrObjectSymbol(
override val isExternal: Boolean
get() = withValidityAssertion { psi.hasModifier(KtTokens.EXTERNAL_KEYWORD) }
override val isActual: Boolean
get() = withValidityAssertion { descriptor?.isActual ?: psi.hasActualModifier() }
override val isExpect: Boolean
get() = withValidityAssertion { descriptor?.isExpect ?: psi.hasExpectModifier() }
override val companionObject: KtNamedClassOrObjectSymbol?
get() = withValidityAssertion {
val companionObject = psi.companionObjects.firstOrNull() ?: return null
@@ -30,6 +30,8 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtTypeAlias
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.resolve.BindingContext
internal class KtFe10PsiTypeAliasSymbol(
@@ -59,6 +61,9 @@ internal class KtFe10PsiTypeAliasSymbol(
override val symbolKind: KtSymbolKind
get() = withValidityAssertion { psi.ktSymbolKind }
override val isActual: Boolean get() = withValidityAssertion { descriptor?.isActual ?: psi.hasActualModifier() }
override val isExpect: Boolean get() = withValidityAssertion { descriptor?.isExpect ?: psi.hasExpectModifier() }
context(KtAnalysisSession)
override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
@@ -0,0 +1,54 @@
/*
* 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.
*/
package org.jetbrains.kotlin.analysis.api.fe10.test.cases.generated.cases.symbols;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.fe10.test.configurator.AnalysisApiFe10TestConfiguratorFactory;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractMultiModuleSymbolByPsiTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi")
@TestDataPath("$PROJECT_ROOT")
public class Fe10IdeNormalAnalysisSourceModuleMultiModuleSymbolByPsiTestGenerated extends AbstractMultiModuleSymbolByPsiTest {
@NotNull
@Override
public AnalysisApiTestConfigurator getConfigurator() {
return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator(
new AnalysisApiTestConfiguratorFactoryData(
FrontendKind.Fe10,
TestModuleKind.Source,
AnalysisSessionMode.Normal,
AnalysisApiMode.Ide
)
);
}
@Test
public void testAllFilesPresentInMultiModuleSymbolByPsi() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("expectActual.kt")
public void testExpectActual() throws Exception {
runTest("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi/expectActual.kt");
}
}
@@ -71,6 +71,8 @@ internal class KtFirNamedClassOrObjectSymbol(
override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline }
override val isFun: Boolean get() = withValidityAssertion { firSymbol.isFun }
override val isExternal: Boolean get() = withValidityAssertion { firSymbol.isExternal }
override val isActual: Boolean get() = withValidityAssertion { firSymbol.isActual }
override val isExpect: Boolean get() = withValidityAssertion { firSymbol.isExpect }
override val contextReceivers: List<KtContextReceiver> get() = withValidityAssertion { firSymbol.createContextReceivers(builder) }
@@ -107,6 +107,9 @@ internal class KtFirPsiJavaClassSymbol(
override val isInline: Boolean get() = withValidityAssertion { false }
override val isFun: Boolean get() = withValidityAssertion { false }
override val isExternal: Boolean get() = withValidityAssertion { false }
override val isActual: Boolean get() = withValidityAssertion { false }
override val isExpect: Boolean get() = withValidityAssertion { false }
override val companionObject: KtNamedClassOrObjectSymbol? get() = withValidityAssertion { null }
override val contextReceivers: List<KtContextReceiver> get() = withValidityAssertion { emptyList() }
@@ -23,6 +23,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.UnsupportedSymbolKind
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.utils.isActual
import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.name.ClassId
@@ -54,6 +56,9 @@ internal class KtFirTypeAliasSymbol(
override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind() }
override val isActual: Boolean get() = withValidityAssertion { firSymbol.isActual }
override val isExpect: Boolean get() = withValidityAssertion { firSymbol.isExpect }
context(KtAnalysisSession)
override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource<KtTypeAliasSymbol>(this)?.let { return it }
@@ -0,0 +1,54 @@
/*
* 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.
*/
package org.jetbrains.kotlin.analysis.api.fir.test.cases.generated.cases.symbols;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractMultiModuleSymbolByPsiTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi")
@TestDataPath("$PROJECT_ROOT")
public class FirIdeNormalAnalysisSourceModuleMultiModuleSymbolByPsiTestGenerated extends AbstractMultiModuleSymbolByPsiTest {
@NotNull
@Override
public AnalysisApiTestConfigurator getConfigurator() {
return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator(
new AnalysisApiTestConfiguratorFactoryData(
FrontendKind.Fir,
TestModuleKind.Source,
AnalysisSessionMode.Normal,
AnalysisApiMode.Ide
)
);
}
@Test
public void testAllFilesPresentInMultiModuleSymbolByPsi() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("expectActual.kt")
public void testExpectActual() throws Exception {
runTest("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi/expectActual.kt");
}
}
@@ -0,0 +1,70 @@
/*
* 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.
*/
package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiRecursiveElementVisitor
import org.jetbrains.kotlin.analysis.api.renderer.declarations.impl.KtDeclarationRendererForDebug
import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter
import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.services.TestModuleStructure
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
abstract class AbstractMultiModuleSymbolByPsiTest : AbstractAnalysisApiBasedTest() {
override fun doTestByModuleStructure(moduleStructure: TestModuleStructure, testServices: TestServices) {
val modules = moduleStructure.modules
val files = modules.flatMap { testServices.ktModuleProvider.getModuleFiles(it).filterIsInstance<KtFile>() }
val debugRenderer = DebugSymbolRenderer()
val debugPrinter = PrettyPrinter()
val prettyPrinter = PrettyPrinter(indentSize = 4)
for (file in files) {
val fileDirective = "// FILE: ${file.name}\n"
debugPrinter.appendLine(fileDirective)
prettyPrinter.appendLine(fileDirective)
analyseForTest(file) {
file.forEachDescendantOfType<KtDeclaration>(predicate = { it.isValidForSymbolCreation }) { declaration ->
val symbol = declaration.getSymbol()
debugPrinter.appendLine(debugRenderer.render(symbol))
debugPrinter.appendLine()
prettyPrinter.withIndents(indentCount = declaration.parentsOfType<KtDeclaration>(withSelf = false).count()) {
prettyPrinter.appendLine(symbol.render(KtDeclarationRendererForDebug.WITH_QUALIFIED_NAMES))
prettyPrinter.appendLine()
}
}
}
}
testServices.assertions.assertEqualsToTestDataFileSibling(debugPrinter.toString())
testServices.assertions.assertEqualsToTestDataFileSibling(prettyPrinter.toString(), extension = ".pretty.txt")
}
/**
* Processes the descendants of the element using the preorder implementation of tree traversal.
*/
private inline fun <reified T : PsiElement> PsiElement.forEachDescendantOfType(
noinline predicate: (T) -> Boolean = { true },
noinline action: (T) -> Unit,
) = this.accept(object : PsiRecursiveElementVisitor() {
override fun visitElement(element: PsiElement) {
if (element is T && predicate(element)) {
action(element)
}
super.visitElement(element)
}
})
}
@@ -6,7 +6,8 @@
package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
import org.jetbrains.kotlin.test.services.TestServices
@@ -23,14 +24,4 @@ abstract class AbstractSymbolByPsiTest : AbstractSymbolTest() {
listOf(ktFile.getFileSymbol()),
)
}
private val KtDeclaration.isValidForSymbolCreation
get() = when (this) {
is KtBackingField -> false
is KtDestructuringDeclaration -> false
is KtPropertyAccessor -> false
is KtParameter -> !this.isFunctionTypeParameter && this.parent !is KtParameterList
is KtNamedFunction -> this.name != null
else -> true
}
}
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSing
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind
import org.jetbrains.kotlin.analysis.test.framework.utils.executeOnPooledThreadInReadAction
import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.directives.model.Directive
import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives
@@ -345,6 +345,16 @@ enum class PrettyRendererOption(val transformation: (KtDeclarationRenderer) -> K
)
}
internal val KtDeclaration.isValidForSymbolCreation
get() = when (this) {
is KtBackingField -> false
is KtDestructuringDeclaration -> false
is KtPropertyAccessor -> false
is KtParameter -> !this.isFunctionTypeParameter && this.parent !is KtParameterList
is KtNamedFunction -> this.name != null
else -> true
}
data class SymbolsData(
val symbols: List<KtSymbol>,
val symbolsForPrettyRendering: List<KtSymbol> = symbols,
@@ -0,0 +1,54 @@
/*
* 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.
*/
package org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.generated.cases.symbols;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.standalone.fir.test.AnalysisApiFirStandaloneModeTestConfiguratorFactory;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractMultiModuleSymbolByPsiTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi")
@TestDataPath("$PROJECT_ROOT")
public class FirStandaloneNormalAnalysisSourceModuleMultiModuleSymbolByPsiTestGenerated extends AbstractMultiModuleSymbolByPsiTest {
@NotNull
@Override
public AnalysisApiTestConfigurator getConfigurator() {
return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator(
new AnalysisApiTestConfiguratorFactoryData(
FrontendKind.Fir,
TestModuleKind.Source,
AnalysisSessionMode.Normal,
AnalysisApiMode.Standalone
)
);
}
@Test
public void testAllFilesPresentInMultiModuleSymbolByPsi() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("expectActual.kt")
public void testExpectActual() throws Exception {
runTest("analysis/analysis-api/testData/symbols/multiModuleSymbolByPsi/expectActual.kt");
}
}
@@ -33,7 +33,7 @@ public abstract class KtTypeParameterSymbol : KtClassifierSymbol(), KtNamedSymbo
public abstract val isReified: Boolean
}
public sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtSymbolWithKind, KtPossibleMemberSymbol {
public sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtSymbolWithKind, KtPossibleMemberSymbol, KtPossibleMultiplatformSymbol {
public abstract val classIdIfNonLocal: ClassId?
context(KtAnalysisSession)
@@ -68,6 +68,8 @@ public abstract class KtAnonymousObjectSymbol : KtClassOrObjectSymbol() {
final override val classIdIfNonLocal: ClassId? get() = withValidityAssertion { null }
final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.LOCAL }
final override val name: Name? get() = withValidityAssertion { null }
final override val isActual: Boolean get() = withValidityAssertion { false }
final override val isExpect: Boolean get() = withValidityAssertion { false }
final override val typeParameters: List<KtTypeParameterSymbol>
get() = withValidityAssertion { emptyList() }
@@ -19,4 +19,27 @@ public interface KtNamedSymbol : KtPossiblyNamedSymbol {
public interface KtSymbolWithTypeParameters : KtSymbol {
public val typeParameters: List<KtTypeParameterSymbol>
}
/**
* A marker interface for symbols which could potentially be `expect` or `actual`. For more details about `expect` and `actual`
* declarations, see [documentation](https://kotlinlang.org/docs/multiplatform-connect-to-apis.html).
*/
public interface KtPossibleMultiplatformSymbol : KtSymbol {
/**
* Returns true if the declaration is a platform-specific implementation in a multiplatform project.
*/
public val isActual: Boolean
/**
* Returns true if the declaration is platform-specific declaration in a multiplatform project. An implementation
* in platform modules is expected. Note, that in the following example:
* ```
* expect class A {
* class Nested
* }
* ```
* `isExpect` returns `true` for both `A` and `A.Nested`.
*/
public val isExpect: Boolean
}
@@ -0,0 +1,30 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: commonMain
// FILE: Common.kt
package sample
expect object A
expect class B {
class Nested
}
expect class C {
class Nested
}
// MODULE: androidMain(commonMain)
// FILE: JvmAndroid.kt
package sample
actual object A
actual class B {
actual class Nested
}
actual typealias C = D
class D {
class Nested
}
@@ -0,0 +1,26 @@
// FILE: Common.kt
object A
class B
class Nested
class C
class Nested
// FILE: JvmAndroid.kt
object A
class B
class Nested
typealias C = sample.D
class D
class Nested
@@ -0,0 +1,278 @@
// FILE: Common.kt
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/A
classKind: OBJECT
companionObject: null
contextReceivers: []
isActual: false
isData: false
isExpect: true
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: A
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: TOP_LEVEL
typeParameters: []
visibility: Public
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/B
classKind: CLASS
companionObject: null
contextReceivers: []
isActual: false
isData: false
isExpect: true
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: B
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: TOP_LEVEL
typeParameters: []
visibility: Public
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/B.Nested
classKind: CLASS
companionObject: null
contextReceivers: []
isActual: false
isData: false
isExpect: true
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: Nested
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: CLASS_MEMBER
typeParameters: []
visibility: Public
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/C
classKind: CLASS
companionObject: null
contextReceivers: []
isActual: false
isData: false
isExpect: true
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: C
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: TOP_LEVEL
typeParameters: []
visibility: Public
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/C.Nested
classKind: CLASS
companionObject: null
contextReceivers: []
isActual: false
isData: false
isExpect: true
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: Nested
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: CLASS_MEMBER
typeParameters: []
visibility: Public
// FILE: JvmAndroid.kt
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/A
classKind: OBJECT
companionObject: null
contextReceivers: []
isActual: true
isData: false
isExpect: false
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: A
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: TOP_LEVEL
typeParameters: []
visibility: Public
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/B
classKind: CLASS
companionObject: null
contextReceivers: []
isActual: true
isData: false
isExpect: false
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: B
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: TOP_LEVEL
typeParameters: []
visibility: Public
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/B.Nested
classKind: CLASS
companionObject: null
contextReceivers: []
isActual: true
isData: false
isExpect: false
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: Nested
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: CLASS_MEMBER
typeParameters: []
visibility: Public
KtTypeAliasSymbol:
annotationsList: []
classIdIfNonLocal: sample/C
expandedType: KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: sample/D
isActual: true
isExpect: false
name: C
origin: SOURCE
symbolKind: TOP_LEVEL
typeParameters: []
visibility: Public
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/D
classKind: CLASS
companionObject: null
contextReceivers: []
isActual: false
isData: false
isExpect: false
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: D
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: TOP_LEVEL
typeParameters: []
visibility: Public
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: sample/D.Nested
classKind: CLASS
companionObject: null
contextReceivers: []
isActual: false
isData: false
isExpect: false
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: Nested
origin: SOURCE
superTypes: [
KtUsualClassType:
annotationsList: []
ownTypeArguments: []
type: kotlin/Any
]
symbolKind: CLASS_MEMBER
typeParameters: []
visibility: Public
@@ -61,6 +61,13 @@ public class PrettyPrinter(public val indentSize: Int = 2) : Appendable {
indent -= 1
}
public inline fun withIndents(indentCount: Int, block: PrettyPrinter.() -> Unit) {
require(indentCount >= 0) { "Number of indents should be non-negative" }
indent += indentCount
block(this)
indent -= indentCount
}
public inline fun withIndentInBraces(block: PrettyPrinter.() -> Unit) {
withIndentWrapped(before = "{", after = "}", block)
}
@@ -44,7 +44,10 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeInf
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeProvider.AbstractAnalysisApiGetSuperTypesTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeProvider.AbstractHasCommonSubtypeTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeProvider.AbstractTypeReferenceTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.*
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceResolveTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceResolveWithResolveExtensionTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceShortenerForWholeFileTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceShortenerTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.*
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.types.AbstractAnalysisApiSubstitutorsTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.types.AbstractTypeByDeclarationReturnTypeTest
@@ -111,6 +114,10 @@ private fun AnalysisApiTestGroup.generateAnalysisApiNonComponentsTests() {
model("symbolRestoreFromDifferentModule")
}
test(AbstractMultiModuleSymbolByPsiTest::class) {
model("multiModuleSymbolByPsi")
}
test(
AbstractSymbolByFqNameTest::class
) {