SLC: handle @JvmOverloads on constructor
This commit is contained in:
committed by
Ilya Kirillov
parent
d4efc8d81d
commit
5225c51a5a
+38
-17
@@ -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>,
|
||||
|
||||
+9
-1
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user