diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt index 07768df47c5..42c0cda046c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt @@ -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 SymbolLightClassBase.createJvmOverloadsIfNeeded( + declaration: T, + result: MutableList, + 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, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt index 5a09741f7ed..62cede31d15 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt @@ -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