SLC: handle @JvmOverloads on constructor

This commit is contained in:
Jinseong Jeon
2022-08-28 17:08:24 -07:00
committed by Ilya Kirillov
parent d4efc8d81d
commit 5225c51a5a
2 changed files with 47 additions and 18 deletions
@@ -117,6 +117,15 @@ internal fun SymbolLightClassBase.createConstructors(
methodIndex = METHOD_INDEX_BASE
)
)
createJvmOverloadsIfNeeded(constructor, result) { methodIndex, argumentSkipMask ->
SymbolLightConstructor(
constructorSymbol = constructor,
lightMemberOrigin = null,
containingClass = this@createConstructors,
methodIndex = methodIndex,
argumentsSkipMask = argumentSkipMask
)
}
}
val primaryConstructor = constructors.singleOrNull { it.isPrimary }
if (primaryConstructor != null && shouldGenerateNoArgOverload(primaryConstructor, constructors)) {
@@ -186,33 +195,27 @@ internal fun SymbolLightClassBase.createMethods(
declaration.isHiddenOrSynthetic()
) return
var methodIndex = METHOD_INDEX_BASE
result.add(
SymbolLightSimpleMethod(
functionSymbol = declaration,
lightMemberOrigin = null,
containingClass = this@createMethods,
methodIndex = METHOD_INDEX_BASE,
isTopLevel = isTopLevel,
methodIndex = methodIndex,
suppressStatic = suppressStatic
)
)
if (declaration.hasJvmOverloadsAnnotation()) {
val skipMask = BitSet(declaration.valueParameters.size)
for (i in declaration.valueParameters.size - 1 downTo 0) {
if (!declaration.valueParameters[i].hasDefaultValue) continue
skipMask.set(i)
result.add(
SymbolLightSimpleMethod(
declaration, null, this@createMethods, methodIndex++, isTopLevel, skipMask.copy()
)
)
}
createJvmOverloadsIfNeeded(declaration, result) { methodIndex, argumentSkipMask ->
SymbolLightSimpleMethod(
functionSymbol = declaration,
lightMemberOrigin = null,
containingClass = this@createMethods,
methodIndex = methodIndex,
isTopLevel = isTopLevel,
argumentsSkipMask = argumentSkipMask,
suppressStatic = suppressStatic
)
}
}
@@ -238,6 +241,24 @@ internal fun SymbolLightClassBase.createMethods(
}
}
context(KtAnalysisSession)
private inline fun <T : KtFunctionLikeSymbol> SymbolLightClassBase.createJvmOverloadsIfNeeded(
declaration: T,
result: MutableList<KtLightMethod>,
lightMethodCreator: (Int, BitSet) -> KtLightMethod
) {
if (!declaration.hasJvmOverloadsAnnotation()) return
var methodIndex = METHOD_INDEX_BASE
val skipMask = BitSet(declaration.valueParameters.size)
for (i in declaration.valueParameters.size - 1 downTo 0) {
if (!declaration.valueParameters[i].hasDefaultValue) continue
skipMask.set(i)
result.add(
lightMethodCreator.invoke(methodIndex++, skipMask.copy())
)
}
}
context(KtAnalysisSession)
internal fun SymbolLightClassBase.createPropertyAccessors(
result: MutableList<KtLightMethod>,
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForEnumEntry
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForMember
import java.util.*
context(KtAnalysisSession)
internal class SymbolLightConstructor(
@@ -25,7 +26,14 @@ internal class SymbolLightConstructor(
lightMemberOrigin: LightMemberOrigin?,
containingClass: SymbolLightClassBase,
methodIndex: Int,
) : SymbolLightMethod(constructorSymbol, lightMemberOrigin, containingClass, methodIndex) {
argumentsSkipMask: BitSet? = null,
) : SymbolLightMethod(
functionSymbol = constructorSymbol,
lightMemberOrigin = lightMemberOrigin,
containingClass = containingClass,
methodIndex = methodIndex,
argumentsSkipMask = argumentsSkipMask
) {
private val _name: String? = containingClass.name