Skip to content

Commit c859300

Browse files
BlaBlaHumanSpace Team
authored andcommitted
[Analysis API] Introduce KaSymbolRelationProvider.hasConflictingSignatureWith
^KT-74009 fixed
1 parent c3710bd commit c859300

File tree

71 files changed

+1311
-9
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+1311
-9
lines changed

analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KaFe10SymbolRelationProvider.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,18 @@ import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
3535
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
3636
import org.jetbrains.kotlin.load.kotlin.asNioPath
3737
import org.jetbrains.kotlin.platform.TargetPlatform
38+
import org.jetbrains.kotlin.platform.jvm.isJvm
3839
import org.jetbrains.kotlin.psi.KtDeclaration
3940
import org.jetbrains.kotlin.psi.KtFile
4041
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
4142
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
43+
import org.jetbrains.kotlin.resolve.OverloadChecker
44+
import org.jetbrains.kotlin.resolve.calls.components.ClassicTypeSystemContextForCS
45+
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
4246
import org.jetbrains.kotlin.resolve.descriptorUtil.denotedClassDescriptor
4347
import org.jetbrains.kotlin.resolve.descriptorUtil.platform
4448
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
49+
import org.jetbrains.kotlin.resolve.jvm.JvmTypeSpecificityComparatorDelegate
4550
import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver
4651
import org.jetbrains.kotlin.resolve.multiplatform.isCompatibleOrWeaklyIncompatible
4752
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
@@ -260,6 +265,24 @@ internal class KaFe10SymbolRelationProvider(
260265
return inheritorsProvider.computeSealedSubclasses(classDescriptor, allowInDifferentFiles)
261266
.mapNotNull { it.toKtClassifierSymbol(analysisContext) as? KaNamedClassSymbol }
262267
}
268+
269+
override fun KaFunctionSymbol.hasConflictingSignatureWith(other: KaFunctionSymbol, targetPlatform: TargetPlatform): Boolean =
270+
withValidityAssertion {
271+
val thisDescriptor = getDescriptor() ?: return false
272+
val otherDescriptor = other.getDescriptor() ?: return false
273+
274+
val typeSpecificityComparator = when {
275+
targetPlatform.isJvm() -> JvmTypeSpecificityComparatorDelegate(
276+
ClassicTypeSystemContextForCS(
277+
analysisContext.builtIns,
278+
analysisContext.kotlinTypeRefiner
279+
)
280+
)
281+
else -> TypeSpecificityComparator.NONE
282+
}
283+
284+
!OverloadChecker(typeSpecificityComparator).isOverloadable(thisDescriptor, otherDescriptor)
285+
}
263286
}
264287

265288
internal fun computeContainingSymbolOrSelf(symbol: KaSymbol, analysisSession: KaSession): KaSymbol = with(analysisSession) {

analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/relationProvider/Fe10IdeNormalAnalysisSourceModuleHasConflictingSignatureWithTestGenerated.java

Lines changed: 214 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirSymbolRelationProvider.kt

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
3131
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile
3232
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration
3333
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
34-
import org.jetbrains.kotlin.fir.FirElementWithResolveState
35-
import org.jetbrains.kotlin.fir.FirSession
36-
import org.jetbrains.kotlin.fir.resolve.getContainingClassSymbol
34+
import org.jetbrains.kotlin.config.LanguageFeature
35+
import org.jetbrains.kotlin.fir.*
3736
import org.jetbrains.kotlin.fir.analysis.checkers.getImplementationStatus
38-
import org.jetbrains.kotlin.fir.containingClassForLocalAttr
3937
import org.jetbrains.kotlin.fir.declarations.*
38+
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOverloadabilityHelper.ContextParameterShadowing.BothWays
4039
import org.jetbrains.kotlin.fir.diagnostics.ConeDestructuringDeclarationsOnTopLevel
4140
import org.jetbrains.kotlin.fir.resolve.FirSamResolver
4241
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
4342
import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol
43+
import org.jetbrains.kotlin.fir.resolve.getContainingClassSymbol
4444
import org.jetbrains.kotlin.fir.resolve.toSymbol
4545
import org.jetbrains.kotlin.fir.scopes.impl.typeAliasConstructorInfo
4646
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
@@ -49,9 +49,10 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
4949
import org.jetbrains.kotlin.fir.types.classId
5050
import org.jetbrains.kotlin.fir.types.coneType
5151
import org.jetbrains.kotlin.fir.types.toLookupTag
52-
import org.jetbrains.kotlin.fir.unwrapFakeOverridesOrDelegated
5352
import org.jetbrains.kotlin.fir.utils.exceptions.withFirSymbolEntry
5453
import org.jetbrains.kotlin.ir.util.kotlinPackageFqn
54+
import org.jetbrains.kotlin.platform.TargetPlatform
55+
import org.jetbrains.kotlin.platform.jvm.isJvm
5556
import org.jetbrains.kotlin.psi
5657
import org.jetbrains.kotlin.psi.*
5758
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
@@ -460,4 +461,55 @@ internal class KaFirSymbolRelationProvider(
460461
inheritorClassIds.mapNotNull { findClass(it) as? KaNamedClassSymbol }
461462
}
462463
}
464+
465+
override fun KaFunctionSymbol.hasConflictingSignatureWith(other: KaFunctionSymbol, targetPlatform: TargetPlatform): Boolean =
466+
withValidityAssertion {
467+
val thisFirSymbol = firSymbol
468+
val otherFirSymbol = other.firSymbol
469+
470+
val thisHasLowPriority = hasLowPriorityAnnotation(thisFirSymbol.resolvedAnnotationsWithClassIds)
471+
val otherHasLowPriority = hasLowPriorityAnnotation(otherFirSymbol.resolvedAnnotationsWithClassIds)
472+
if (thisHasLowPriority != otherHasLowPriority) {
473+
return false
474+
}
475+
476+
/**
477+
* [FirDeclarationOverloadabilityHelper] performs signature comparison only from JVM platform perspective.
478+
* However, as the API needs to be more generic than that, here we perform manual signature comparison
479+
* before calling [FirDeclarationOverloadabilityHelper].
480+
* This is done to handle cases which are considered conflicting on JVM but completely valid on other platforms:
481+
* - Overloads by type parameters
482+
* ```kotlin
483+
* fun <T> foo() // Conflicting on JVM, valid on other platforms
484+
* fun foo()
485+
* ```
486+
* - Overloads by vararg/array parameters
487+
* ```kotlin
488+
* fun foo(vararg ints: Int) // Conflicting on JVM, valid on other platforms
489+
* fun foo(ints: IntArray)
490+
* ```
491+
*/
492+
if (!targetPlatform.isJvm()) {
493+
if (thisFirSymbol.typeParameterSymbols.isEmpty() != otherFirSymbol.typeParameterSymbols.isEmpty()) {
494+
return false
495+
}
496+
497+
val thisVarargParameterPosition = valueParameters.indexOfFirst { it.isVararg }
498+
val otherVarargParameterPosition = other.valueParameters.indexOfFirst { it.isVararg }
499+
if (thisVarargParameterPosition != otherVarargParameterPosition) {
500+
return false
501+
}
502+
}
503+
504+
val overloadabilityHelper = analysisSession.firSession.declarationOverloadabilityHelper
505+
506+
return if (analysisSession.firSession.languageVersionSettings.supportsFeature(LanguageFeature.ContextParameters)) {
507+
return overloadabilityHelper.getContextParameterShadowing(thisFirSymbol, otherFirSymbol) == BothWays
508+
} else {
509+
overloadabilityHelper.isConflicting(
510+
thisFirSymbol,
511+
otherFirSymbol,
512+
)
513+
}
514+
}
463515
}

0 commit comments

Comments
 (0)