Skip to content

Commit 2e92385

Browse files
dimonchik0036Space Team
authored andcommitted
[SLC] do not generate redundant no-arg constructor
If some secondary constructor produces a variant with no arguments ^KT-80656 Fixed
1 parent 723c132 commit 2e92385

File tree

2 files changed

+13
-13
lines changed

2 files changed

+13
-13
lines changed

analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@ package org.jetbrains.kotlin.light.classes.symbol.methods
88
import com.intellij.openapi.progress.ProgressManager
99
import com.intellij.psi.*
1010
import org.jetbrains.kotlin.analysis.api.KaSession
11-
import org.jetbrains.kotlin.analysis.api.symbols.KaClassKind
12-
import org.jetbrains.kotlin.analysis.api.symbols.KaConstructorSymbol
13-
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolVisibility
11+
import org.jetbrains.kotlin.analysis.api.symbols.*
1412
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KaSymbolPointer
15-
import org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe
1613
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
1714
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_BASE
1815
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_DEFAULT_CTOR
@@ -169,15 +166,21 @@ internal class SymbolLightConstructor private constructor(
169166
constructors: Iterable<KaConstructorSymbol>,
170167
): Boolean {
171168
val classOrObject = lightClass.kotlinOrigin ?: return false
172-
return primaryConstructor.visibility != KaSymbolVisibility.PRIVATE &&
173-
!classOrObject.hasModifier(INNER_KEYWORD) && !lightClass.isEnum &&
169+
return !classOrObject.hasModifier(INNER_KEYWORD) &&
174170
!classOrObject.hasModifier(SEALED_KEYWORD) &&
175-
primaryConstructor.valueParameters.isNotEmpty() &&
176-
primaryConstructor.valueParameters.all { it.hasDefaultValue } &&
177-
constructors.none { it.valueParameters.isEmpty() } &&
178-
!primaryConstructor.hasJvmOverloadsAnnotation()
171+
!lightClass.isEnum &&
172+
primaryConstructor.valueParameters.all(KaValueParameterSymbol::hasDefaultValue) &&
173+
constructors.none { it.isEffectivelyParameterless } &&
174+
primaryConstructor.visibility != KaSymbolVisibility.PRIVATE
179175
}
180176

177+
/**
178+
* Whether the constructor either has no arguments or has [JvmOverloads] which would result in a method with no arguments.
179+
* */
180+
private val KaConstructorSymbol.isEffectivelyParameterless: Boolean
181+
get() = valueParameters.isEmpty() ||
182+
valueParameters.all(KaValueParameterSymbol::hasDefaultValue) && hasJvmOverloadsAnnotation()
183+
181184
private fun SymbolLightClassBase.defaultConstructor(): KtLightMethod {
182185
val classOrObject = kotlinOrigin
183186
val visibility = when {

compiler/testData/asJava/lightClasses/lightClassByFqName/duplicatedNoArg.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ public final class Foo /* test.pkg.Foo*/ {
1111
@test.pkg.B()
1212
public Foo(@org.jetbrains.annotations.NotNull() @org.jetbrains.annotations.NotNull() java.lang.String, int);// .ctor(@org.jetbrains.annotations.NotNull() java.lang.String, int)
1313

14-
@test.pkg.A()
15-
public Foo();// .ctor()
16-
1714
@test.pkg.A()
1815
public Foo(int);// .ctor(int)
1916
}

0 commit comments

Comments
 (0)