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
|
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 }
|
val primaryConstructor = constructors.singleOrNull { it.isPrimary }
|
||||||
if (primaryConstructor != null && shouldGenerateNoArgOverload(primaryConstructor, constructors)) {
|
if (primaryConstructor != null && shouldGenerateNoArgOverload(primaryConstructor, constructors)) {
|
||||||
@@ -186,33 +195,27 @@ internal fun SymbolLightClassBase.createMethods(
|
|||||||
declaration.isHiddenOrSynthetic()
|
declaration.isHiddenOrSynthetic()
|
||||||
) return
|
) return
|
||||||
|
|
||||||
var methodIndex = METHOD_INDEX_BASE
|
|
||||||
result.add(
|
result.add(
|
||||||
SymbolLightSimpleMethod(
|
SymbolLightSimpleMethod(
|
||||||
functionSymbol = declaration,
|
functionSymbol = declaration,
|
||||||
lightMemberOrigin = null,
|
lightMemberOrigin = null,
|
||||||
containingClass = this@createMethods,
|
containingClass = this@createMethods,
|
||||||
|
methodIndex = METHOD_INDEX_BASE,
|
||||||
isTopLevel = isTopLevel,
|
isTopLevel = isTopLevel,
|
||||||
methodIndex = methodIndex,
|
|
||||||
suppressStatic = suppressStatic
|
suppressStatic = suppressStatic
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if (declaration.hasJvmOverloadsAnnotation()) {
|
createJvmOverloadsIfNeeded(declaration, result) { methodIndex, argumentSkipMask ->
|
||||||
val skipMask = BitSet(declaration.valueParameters.size)
|
SymbolLightSimpleMethod(
|
||||||
|
functionSymbol = declaration,
|
||||||
for (i in declaration.valueParameters.size - 1 downTo 0) {
|
lightMemberOrigin = null,
|
||||||
|
containingClass = this@createMethods,
|
||||||
if (!declaration.valueParameters[i].hasDefaultValue) continue
|
methodIndex = methodIndex,
|
||||||
|
isTopLevel = isTopLevel,
|
||||||
skipMask.set(i)
|
argumentsSkipMask = argumentSkipMask,
|
||||||
|
suppressStatic = suppressStatic
|
||||||
result.add(
|
)
|
||||||
SymbolLightSimpleMethod(
|
|
||||||
declaration, null, this@createMethods, methodIndex++, isTopLevel, skipMask.copy()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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)
|
context(KtAnalysisSession)
|
||||||
internal fun SymbolLightClassBase.createPropertyAccessors(
|
internal fun SymbolLightClassBase.createPropertyAccessors(
|
||||||
result: MutableList<KtLightMethod>,
|
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.classes.SymbolLightClassForEnumEntry
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
|
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForMember
|
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForMember
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
context(KtAnalysisSession)
|
context(KtAnalysisSession)
|
||||||
internal class SymbolLightConstructor(
|
internal class SymbolLightConstructor(
|
||||||
@@ -25,7 +26,14 @@ internal class SymbolLightConstructor(
|
|||||||
lightMemberOrigin: LightMemberOrigin?,
|
lightMemberOrigin: LightMemberOrigin?,
|
||||||
containingClass: SymbolLightClassBase,
|
containingClass: SymbolLightClassBase,
|
||||||
methodIndex: Int,
|
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
|
private val _name: String? = containingClass.name
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user