Fix warnings in idea-frontend-fir

This commit is contained in:
Alexander Udalov
2021-07-30 16:30:53 +02:00
parent 069e040af9
commit 45ffe58b9c
20 changed files with 52 additions and 59 deletions
@@ -94,7 +94,7 @@ internal sealed class ReanalyzableStructureElement<KT : KtDeclaration, S : FirBa
override val diagnostics = FileStructureElementDiagnostics( override val diagnostics = FileStructureElementDiagnostics(
firFile, firFile,
lockProvider, lockProvider,
SingleNonLocalDeclarationDiagnosticRetriever(firSymbol.fir as FirDeclaration) SingleNonLocalDeclarationDiagnosticRetriever(firSymbol.fir)
) )
companion object { companion object {
@@ -29,14 +29,14 @@ import org.jetbrains.kotlin.name.Name
@ThreadSafeMutableState @ThreadSafeMutableState
internal class FirIdeProvider( internal class FirIdeProvider(
project: Project, @Suppress("UNUSED_PARAMETER") project: Project,
val session: FirSession, val session: FirSession,
moduleInfo: ModuleSourceInfoBase, @Suppress("UNUSED_PARAMETER") moduleInfo: ModuleSourceInfoBase,
val kotlinScopeProvider: FirKotlinScopeProvider, val kotlinScopeProvider: FirKotlinScopeProvider,
firFileBuilder: FirFileBuilder, firFileBuilder: FirFileBuilder,
val cache: ModuleFileCache, val cache: ModuleFileCache,
private val declarationProvider: DeclarationProvider, private val declarationProvider: DeclarationProvider,
private val packageExistenceChecker: KtPackageProvider, packageExistenceChecker: KtPackageProvider,
) : FirProvider() { ) : FirProvider() {
override val symbolProvider: FirSymbolProvider = SymbolProvider() override val symbolProvider: FirSymbolProvider = SymbolProvider()
@@ -54,7 +54,7 @@ internal class FirIdeProvider(
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile { override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
return getFirClassifierContainerFileIfAny(fqName) return getFirClassifierContainerFileIfAny(fqName)
?: error("Couldn't find container for ${fqName}") ?: error("Couldn't find container for $fqName")
} }
override fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile? { override fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile? {
@@ -8,7 +8,8 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
internal inline class LibrariesCache(private val cache: ConcurrentHashMap<ModuleSourceInfoBase, FirIdeLibrariesSession> = ConcurrentHashMap()) { @JvmInline
internal value class LibrariesCache(private val cache: ConcurrentHashMap<ModuleSourceInfoBase, FirIdeLibrariesSession> = ConcurrentHashMap()) {
fun cached(moduleSourceInfo: ModuleSourceInfoBase, create: (ModuleSourceInfoBase) -> FirIdeLibrariesSession): FirIdeLibrariesSession = fun cached(moduleSourceInfo: ModuleSourceInfoBase, create: (ModuleSourceInfoBase) -> FirIdeLibrariesSession): FirIdeLibrariesSession =
cache.computeIfAbsent(moduleSourceInfo, create) cache.computeIfAbsent(moduleSourceInfo, create)
} }
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.DependencyListForCliModule
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider
import org.jetbrains.kotlin.fir.java.FirJavaElementFinder
import org.jetbrains.kotlin.fir.session.FirModuleInfoBasedModuleData import org.jetbrains.kotlin.fir.session.FirModuleInfoBasedModuleData
import org.jetbrains.kotlin.idea.asJava.IDEKotlinAsJavaFirSupport import org.jetbrains.kotlin.idea.asJava.IDEKotlinAsJavaFirSupport
import org.jetbrains.kotlin.idea.fir.low.level.api.* import org.jetbrains.kotlin.idea.fir.low.level.api.*
@@ -51,7 +50,8 @@ import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.builders.testConfiguration import org.jetbrains.kotlin.test.builders.testConfiguration
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
import org.jetbrains.kotlin.test.frontend.fir.* import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact
import org.jetbrains.kotlin.test.frontend.fir.getAnalyzerServices
import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.*
@@ -328,5 +328,6 @@ private fun reRegisterJavaElementFinder(project: Project) {
IDEKotlinAsJavaFirSupport(project) IDEKotlinAsJavaFirSupport(project)
) )
} }
@Suppress("DEPRECATION")
PsiElementFinder.EP.getPoint(project).registerExtension(JavaElementFinder(project)) PsiElementFinder.EP.getPoint(project).registerExtension(JavaElementFinder(project))
} }
@@ -24,7 +24,6 @@ class IdeTestIgnoreHandler(testServices: TestServices) : AfterAnalysisChecker(te
override fun check(failedAssertions: List<WrappedException>) { override fun check(failedAssertions: List<WrappedException>) {
if (!isFirIdeIgnoreDirectivePresent()) return if (!isFirIdeIgnoreDirectivePresent()) return
if (failedAssertions.isNotEmpty()) return if (failedAssertions.isNotEmpty()) return
val moduleStructure = testServices.moduleStructure
val testDataFile = testServices.moduleStructure.originalTestDataFiles.first() val testDataFile = testServices.moduleStructure.originalTestDataFiles.first()
if (!isTeamCityBuild) { if (!isTeamCityBuild) {
@@ -5,16 +5,14 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.test.base package org.jetbrains.kotlin.idea.fir.low.level.api.test.base
import com.intellij.DynamicBundle
import com.intellij.core.CoreApplicationEnvironment
import com.intellij.mock.MockApplication import com.intellij.mock.MockApplication
import com.intellij.mock.MockProject import com.intellij.mock.MockProject
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Disposer
import com.intellij.psi.impl.source.tree.TreeCopyHandler
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.idea.fir.low.level.api.compiler.based.* import org.jetbrains.kotlin.idea.fir.low.level.api.compiler.based.ModuleRegistrarPreAnalysisHandler
import org.jetbrains.kotlin.idea.fir.low.level.api.compiler.based.TestModuleInfoProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.compiler.based.moduleInfoProvider
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.TestInfrastructureInternals
@@ -57,7 +55,7 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() {
useDirectives(JvmEnvironmentConfigurationDirectives) useDirectives(JvmEnvironmentConfigurationDirectives)
useSourcePreprocessor(::ExpressionMarkersSourceFilePreprocessor) useSourcePreprocessor(::ExpressionMarkersSourceFilePreprocessor)
useAdditionalService(::ExpressionMarkerProvider) useAdditionalService { ExpressionMarkerProvider() }
useAdditionalService(::TestModuleInfoProvider) useAdditionalService(::TestModuleInfoProvider)
usePreAnalysisHandlers(::ModuleRegistrarPreAnalysisHandler.bind(disposable)) usePreAnalysisHandlers(::ModuleRegistrarPreAnalysisHandler.bind(disposable))
configureTest(this) configureTest(this)
@@ -133,9 +131,5 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() {
} }
} }
fun String.indexOfOrNull(substring: String) = fun String.indexOfOrNull(substring: String) =
indexOf(substring).takeIf { it >= 0 } indexOf(substring).takeIf { it >= 0 }
private fun String.indexOfOrNull(substring: String, startingIndex: Int) =
indexOf(substring, startingIndex).takeIf { it >= 0 }
@@ -55,7 +55,7 @@ internal class ExpressionMarkersSourceFilePreprocessor(testServices: TestService
} }
} }
class ExpressionMarkerProvider(testServices: TestServices) : TestService { class ExpressionMarkerProvider : TestService {
private val selected = mutableMapOf<String, TextRange>() private val selected = mutableMapOf<String, TextRange>()
@PrivateForInline @PrivateForInline
@@ -109,7 +109,7 @@ private object FirToKtConversionCreator {
val nullable = type.isMarkedNullable val nullable = type.isMarkedNullable
val kClass = type.classifier as KClass<*> val kClass = type.classifier as KClass<*>
return tryMapAllowedType(kClass) return tryMapAllowedType(kClass)
?: tryMapPsiElementType(type, kClass) ?: tryMapPsiElementType(kClass)
?: tryMapFirTypeToKtType(kClass, nullable) ?: tryMapFirTypeToKtType(kClass, nullable)
?: tryMapPlatformType(type, kClass) ?: tryMapPlatformType(type, kClass)
?: error("Unsupported type $type, consider add corresponding mapping") ?: error("Unsupported type $type, consider add corresponding mapping")
@@ -165,7 +165,7 @@ private object FirToKtConversionCreator {
return null return null
} }
private fun tryMapPsiElementType(type: KType, kClass: KClass<*>): HLParameterConversion? { private fun tryMapPsiElementType(kClass: KClass<*>): HLParameterConversion? {
if (kClass.isSubclassOf(PsiElement::class)) { if (kClass.isSubclassOf(PsiElement::class)) {
return HLIdParameterConversion return HLIdParameterConversion
} }
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.asJava package org.jetbrains.kotlin.idea.asJava
import com.intellij.openapi.util.Comparing
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.impl.InheritanceImplUtil import com.intellij.psi.impl.InheritanceImplUtil
import com.intellij.psi.impl.PsiClassImplUtil import com.intellij.psi.impl.PsiClassImplUtil
@@ -13,16 +12,18 @@ import com.intellij.psi.search.SearchScope
import com.intellij.psi.stubs.IStubElementType import com.intellij.psi.stubs.IStubElementType
import com.intellij.psi.stubs.StubElement import com.intellij.psi.stubs.StubElement
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.classes.* import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper
import org.jetbrains.kotlin.asJava.classes.getOutermostClassOrObject
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier
import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.idea.asJava.classes.checkIsInheritor import org.jetbrains.kotlin.idea.asJava.classes.checkIsInheritor
import org.jetbrains.kotlin.idea.asJava.classes.getOrCreateFirLightClass import org.jetbrains.kotlin.idea.asJava.classes.getOrCreateFirLightClass
import org.jetbrains.kotlin.idea.asJava.elements.FirLightTypeParameterListForSymbol import org.jetbrains.kotlin.idea.asJava.elements.FirLightTypeParameterListForSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
import org.jetbrains.kotlin.psi.KtBlockExpression
import org.jetbrains.kotlin.psi.KtClassBody import org.jetbrains.kotlin.psi.KtClassBody
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.debugText.getDebugText import org.jetbrains.kotlin.psi.debugText.getDebugText
@@ -111,7 +112,7 @@ internal abstract class FirLightClassForClassOrObjectSymbol(
override fun isEquivalentTo(another: PsiElement?): Boolean = override fun isEquivalentTo(another: PsiElement?): Boolean =
basicIsEquivalentTo(this, another) || basicIsEquivalentTo(this, another) ||
another is PsiClass && qualifiedName != null && Comparing.equal(another.qualifiedName, qualifiedName) another is PsiClass && qualifiedName != null && another.qualifiedName == qualifiedName
abstract override fun equals(other: Any?): Boolean abstract override fun equals(other: Any?): Boolean
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.asJava package org.jetbrains.kotlin.idea.asJava
import com.intellij.openapi.util.Comparing
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.impl.light.LightEmptyImplementsList import com.intellij.psi.impl.light.LightEmptyImplementsList
@@ -13,7 +12,9 @@ import com.intellij.psi.impl.light.LightModifierList
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.* import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
@@ -23,8 +24,8 @@ import org.jetbrains.kotlin.idea.asJava.classes.createMethods
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtDeclarationScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtDeclarationScope
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
@@ -225,7 +226,7 @@ class FirLightClassForFacade(
override fun getNavigationElement() = firstFileInFacade override fun getNavigationElement() = firstFileInFacade
override fun isEquivalentTo(another: PsiElement?): Boolean = override fun isEquivalentTo(another: PsiElement?): Boolean =
equals(another) || another is FirLightClassForFacade && Comparing.equal(another.qualifiedName, qualifiedName) equals(another) || another is FirLightClassForFacade && another.qualifiedName == qualifiedName
override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean { override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean {
return baseClass.qualifiedName == CommonClassNames.JAVA_LANG_OBJECT return baseClass.qualifiedName == CommonClassNames.JAVA_LANG_OBJECT
@@ -20,7 +20,10 @@ import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.jvm.jvmTypeMapper import org.jetbrains.kotlin.fir.backend.jvm.jvmTypeMapper
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
import org.jetbrains.kotlin.fir.isPrimitiveType import org.jetbrains.kotlin.fir.isPrimitiveType
@@ -36,7 +39,10 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSimpleConstantValue
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithModality
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations
import org.jetbrains.kotlin.idea.frontend.api.types.KtNonErrorClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtNonErrorClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeNullability import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeNullability
@@ -162,12 +168,11 @@ private fun mapSupertype(
internal fun KtTypeAndAnnotations.mapSupertype( internal fun KtTypeAndAnnotations.mapSupertype(
psiContext: PsiElement, psiContext: PsiElement,
kotlinCollectionAsIs: Boolean = false kotlinCollectionAsIs: Boolean = false
): PsiClassType? = type.mapSupertype(psiContext, kotlinCollectionAsIs, emptyList()) ): PsiClassType? = type.mapSupertype(psiContext, kotlinCollectionAsIs)
internal fun KtType.mapSupertype( internal fun KtType.mapSupertype(
psiContext: PsiElement, psiContext: PsiElement,
kotlinCollectionAsIs: Boolean = false, kotlinCollectionAsIs: Boolean = false,
annotations: List<KtAnnotationCall>
): PsiClassType? { ): PsiClassType? {
if (this !is KtNonErrorClassType) return null if (this !is KtNonErrorClassType) return null
require(this is KtFirType) require(this is KtFirType)
@@ -18,15 +18,14 @@ import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation
import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.asJava.basicIsEquivalentTo import org.jetbrains.kotlin.idea.asJava.basicIsEquivalentTo
import org.jetbrains.kotlin.idea.asJava.invalidAccess import org.jetbrains.kotlin.idea.asJava.invalidAccess
import org.jetbrains.kotlin.idea.asJava.mapSupertype import org.jetbrains.kotlin.idea.asJava.mapSupertype
import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.isValid
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtNonErrorClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtNonErrorClassType
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.psi.KtTypeParameter
import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset
@@ -70,7 +69,6 @@ internal class FirLightTypeParameter(
it.mapSupertype( it.mapSupertype(
psiContext = this, psiContext = this,
kotlinCollectionAsIs = true, kotlinCollectionAsIs = true,
annotations = emptyList()
) )
} }
.forEach { listBuilder.addReference(it) } .forEach { listBuilder.addReference(it) }
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.fir package org.jetbrains.kotlin.idea.fir
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
@@ -19,7 +18,6 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
fun FirFunctionCall.isImplicitFunctionCall(): Boolean { fun FirFunctionCall.isImplicitFunctionCall(): Boolean {
if (dispatchReceiver !is FirQualifiedAccessExpression) return false if (dispatchReceiver !is FirQualifiedAccessExpression) return false
return calleeReference.getCandidateSymbols().any(FirBasedSymbol<*>::isInvokeFunction) return calleeReference.getCandidateSymbols().any(FirBasedSymbol<*>::isInvokeFunction)
@@ -35,9 +33,7 @@ fun FirReference.getResolvedSymbolOfNameReference(): FirBasedSymbol<*>? =
(this as? FirResolvedNamedReference)?.resolvedSymbol (this as? FirResolvedNamedReference)?.resolvedSymbol
internal fun FirReference.getResolvedKtSymbolOfNameReference(builder: KtSymbolByFirBuilder): KtSymbol? = internal fun FirReference.getResolvedKtSymbolOfNameReference(builder: KtSymbolByFirBuilder): KtSymbol? =
(getResolvedSymbolOfNameReference()?.fir as? FirDeclaration)?.let { firDeclaration -> getResolvedSymbolOfNameReference()?.fir?.let(builder::buildSymbol)
builder.buildSymbol(firDeclaration)
}
internal fun FirErrorNamedReference.getCandidateSymbols(): Collection<FirBasedSymbol<*>> = internal fun FirErrorNamedReference.getCandidateSymbols(): Collection<FirBasedSymbol<*>> =
when (val diagnostic = diagnostic) { when (val diagnostic = diagnostic) {
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.components package org.jetbrains.kotlin.idea.frontend.api.fir.components
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -62,7 +61,7 @@ internal class KtFirCompletionCandidateChecker(
val file = originalFile.getOrBuildFirFile(firResolveState) val file = originalFile.getOrBuildFirFile(firResolveState)
val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState) val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState)
val resolver = SingleCandidateResolver(firResolveState.rootModuleSession, file) val resolver = SingleCandidateResolver(firResolveState.rootModuleSession, file)
val implicitReceivers = getImplicitReceivers(originalFile, file, nameExpression) val implicitReceivers = getImplicitReceivers(nameExpression)
for (implicitReceiverValue in implicitReceivers) { for (implicitReceiverValue in implicitReceivers) {
val resolutionParameters = ResolutionParameters( val resolutionParameters = ResolutionParameters(
singleCandidateResolutionMode = SingleCandidateResolutionMode.CHECK_EXTENSION_FOR_COMPLETION, singleCandidateResolutionMode = SingleCandidateResolutionMode.CHECK_EXTENSION_FOR_COMPLETION,
@@ -84,11 +83,7 @@ internal class KtFirCompletionCandidateChecker(
return KtExtensionApplicabilityResult.NonApplicable return KtExtensionApplicabilityResult.NonApplicable
} }
private fun getImplicitReceivers( private fun getImplicitReceivers(fakeNameExpression: KtSimpleNameExpression): Sequence<ImplicitReceiverValue<*>?> {
originalFile: KtFile,
firFile: FirFile,
fakeNameExpression: KtSimpleNameExpression
): Sequence<ImplicitReceiverValue<*>?> {
val towerDataContext = analysisSession.firResolveState.getTowerContextProvider() val towerDataContext = analysisSession.firResolveState.getTowerContextProvider()
.getClosestAvailableParentContext(fakeNameExpression) .getClosestAvailableParentContext(fakeNameExpression)
?: error("Cannot find enclosing declaration for ${fakeNameExpression.getElementTextInContext()}") ?: error("Cannot find enclosing declaration for ${fakeNameExpression.getElementTextInContext()}")
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -169,7 +168,7 @@ internal class KtFirScopeProvider(
KtImplicitReceiver( KtImplicitReceiver(
token, token,
builder.typeBuilder.buildKtType(receiver.type), builder.typeBuilder.buildKtType(receiver.type),
builder.buildSymbol(receiver.boundSymbol.fir as FirDeclaration), builder.buildSymbol(receiver.boundSymbol.fir),
) )
} }
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.idea.frontend.api.types.KtType
internal class KtFirTypeAndAnnotations<T : FirDeclaration>( internal class KtFirTypeAndAnnotations<T : FirDeclaration>(
private val containingDeclaration: FirRefWithValidityCheck<T>, private val containingDeclaration: FirRefWithValidityCheck<T>,
typeResolvePhase: FirResolvePhase, @Suppress("UNUSED_PARAMETER") typeResolvePhase: FirResolvePhase,
_builder: KtSymbolByFirBuilder, _builder: KtSymbolByFirBuilder,
private val typeRef: (T) -> FirTypeRef, private val typeRef: (T) -> FirTypeRef,
) : KtTypeAndAnnotations() { ) : KtTypeAndAnnotations() {
@@ -17,6 +17,7 @@ internal class KtFirBackingFieldSymbolPointer(
) : KtSymbolPointer<KtBackingFieldSymbol>() { ) : KtSymbolPointer<KtBackingFieldSymbol>() {
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtBackingFieldSymbol? { override fun restoreSymbol(analysisSession: KtAnalysisSession): KtBackingFieldSymbol? {
require(analysisSession is KtFirAnalysisSession) require(analysisSession is KtFirAnalysisSession)
@Suppress("DEPRECATION")
val propertySymbol = propertySymbolPointer.restoreSymbol(analysisSession) ?: return null val propertySymbol = propertySymbolPointer.restoreSymbol(analysisSession) ?: return null
check(propertySymbol is KtFirKotlinPropertySymbol) check(propertySymbol is KtFirKotlinPropertySymbol)
return propertySymbol.firRef.withFir { firProperty -> return propertySymbol.firRef.withFir { firProperty ->
@@ -16,7 +16,7 @@ internal object PublicTypeApproximator {
session: FirSession, session: FirSession,
): ConeKotlinType? { ): ConeKotlinType? {
val approximator = session.inferenceComponents.approximator val approximator = session.inferenceComponents.approximator
return approximator.approximateToSuperType(type, PublicApproximatorConfiguration) as ConeKotlinType? return approximator.approximateToSuperType(type, PublicApproximatorConfiguration)
} }
private object PublicApproximatorConfiguration : TypeApproximatorConfiguration.AllFlexibleSameValue() { private object PublicApproximatorConfiguration : TypeApproximatorConfiguration.AllFlexibleSameValue() {
@@ -27,4 +27,4 @@ internal object PublicTypeApproximator {
override val intersectionTypesInContravariantPositions: Boolean get() = true override val intersectionTypesInContravariantPositions: Boolean get() = true
override val localTypes: Boolean get() = true override val localTypes: Boolean get() = true
} }
} }
@@ -48,6 +48,7 @@ class KtAnalysisSessionFe10BindingHolder private constructor(
companion object { companion object {
@InvalidWayOfUsingAnalysisSession @InvalidWayOfUsingAnalysisSession
fun create(firResolveState: FirModuleResolveState, token: ValidityToken, ktElement: KtElement): KtAnalysisSessionFe10BindingHolder { fun create(firResolveState: FirModuleResolveState, token: ValidityToken, ktElement: KtElement): KtAnalysisSessionFe10BindingHolder {
@Suppress("DEPRECATION")
val firAnalysisSession = KtFirAnalysisSession.createAnalysisSessionByResolveState(firResolveState, token, ktElement) val firAnalysisSession = KtFirAnalysisSession.createAnalysisSessionByResolveState(firResolveState, token, ktElement)
return KtAnalysisSessionFe10BindingHolder(firAnalysisSession) return KtAnalysisSessionFe10BindingHolder(firAnalysisSession)
} }
@@ -11,7 +11,7 @@ import java.lang.ref.WeakReference
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
class ReadOnlyWeakRef<V : Any> class ReadOnlyWeakRef<V : Any>
@Deprecated("Consider suing ValidityTokenOwner.weakRef instead") @Deprecated("Consider using ValidityTokenOwner.weakRef instead")
constructor(value: V, val token: ValidityToken) { constructor(value: V, val token: ValidityToken) {
val weakRef = WeakReference(value) val weakRef = WeakReference(value)
@@ -24,7 +24,8 @@ constructor(value: V, val token: ValidityToken) {
} }
} }
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE", "DEPRECATION")
internal inline fun <V : Any> ValidityTokenOwner.weakRef(value: V) = ReadOnlyWeakRef(value, token) internal inline fun <V : Any> ValidityTokenOwner.weakRef(value: V) = ReadOnlyWeakRef(value, token)
internal inline fun <V : Any> ValidityTokenOwner.weakRef(value: () -> V) = ReadOnlyWeakRef(value(), token) @Suppress("DEPRECATION")
internal inline fun <V : Any> ValidityTokenOwner.weakRef(value: () -> V) = ReadOnlyWeakRef(value(), token)