diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt index 17e352d7e75..74ee8da90a2 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt @@ -18,10 +18,6 @@ import com.intellij.psi.scope.PsiScopeProcessor import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.PsiUtil import org.jetbrains.annotations.NonNls -import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol -import org.jetbrains.kotlin.analysis.api.symbols.receiverType import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment @@ -195,14 +191,4 @@ abstract class SymbolLightClassBase protected constructor(val ktModule: KtModule visitor.visitElement(this) } } - - context(KtAnalysisSession) - protected fun KtCallableSymbol.hasTypeForValueClassInSignature(ignoreReturnType: Boolean = false): Boolean { - if (!ignoreReturnType && returnType.typeForValueClass) return true - if (receiverType?.typeForValueClass == true) return true - if (this is KtFunctionLikeSymbol) { - return valueParameters.any { it.returnType.typeForValueClass } - } - return false - } } 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 ae6eb7aadd8..f0b3b8ce925 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 @@ -287,7 +287,8 @@ internal fun SymbolLightClassBase.createPropertyAccessors( if (declaration.getter?.hasBody != true && declaration.setter?.hasBody != true && declaration.visibility.isPrivateOrPrivateToThis()) return if (declaration.hasJvmFieldAnnotation()) return - val propertyTypeIsValueClass = declaration.returnType.typeForValueClass + val propertyTypeIsValueClass = declaration.hasTypeForValueClassInSignature() + /* * For top-level properties with value class in return type compiler mangles only setter * @@ -621,6 +622,21 @@ internal fun SymbolLightClassBase.addPropertyBackingFields( propertyGroups[false]?.forEach(::addPropertyBackingField) } +context(KtAnalysisSession) +internal fun KtCallableSymbol.hasTypeForValueClassInSignature(ignoreReturnType: Boolean = false): Boolean { + if (!ignoreReturnType) { + val psiDeclaration = sourcePsiSafe() + if (psiDeclaration?.typeReference != null && returnType.typeForValueClass) return true + } + + if (receiverType?.typeForValueClass == true) return true + if (this is KtFunctionLikeSymbol) { + return valueParameters.any { it.returnType.typeForValueClass } + } + + return false +} + context(KtAnalysisSession) internal val KtType.typeForValueClass: Boolean get() { diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.descriptors.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.descriptors.java new file mode 100644 index 00000000000..fe0b31f1d24 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.descriptors.java @@ -0,0 +1,62 @@ +public final class RegularClass /* RegularClass*/ { + @org.jetbrains.annotations.NotNull() + private java.lang.String classProp; + + @org.jetbrains.annotations.NotNull() + private java.lang.String classPropImplicit; + + @org.jetbrains.annotations.NotNull() + public final java.lang.String classFunInImplicitReturn();// classFunInImplicitReturn() + + @org.jetbrains.annotations.NotNull() + public final java.lang.String classFunInReturn();// classFunInReturn() + + @org.jetbrains.annotations.NotNull() + public final java.lang.String getClassProp();// getClassProp() + + @org.jetbrains.annotations.NotNull() + public final java.lang.String getClassPropImplicit();// getClassPropImplicit() + + public RegularClass();// .ctor() + + public final int getClassPropInExtension(@org.jetbrains.annotations.NotNull() java.lang.String);// getClassPropInExtension(java.lang.String) + + public final void classFunInExtension(@org.jetbrains.annotations.NotNull() java.lang.String);// classFunInExtension(java.lang.String) + + public final void classFunInParameter(@org.jetbrains.annotations.NotNull() java.lang.String);// classFunInParameter(java.lang.String) + + public final void setClassProp(@org.jetbrains.annotations.NotNull() java.lang.String);// setClassProp(java.lang.String) + + public final void setClassPropImplicit(@org.jetbrains.annotations.NotNull() java.lang.String);// setClassPropImplicit(java.lang.String) + + public final void setClassPropInExtension(@org.jetbrains.annotations.NotNull() java.lang.String, int);// setClassPropInExtension(java.lang.String, int) +} + +public abstract interface RegularInterface /* RegularInterface*/ { + @org.jetbrains.annotations.NotNull() + public abstract java.lang.String getInterfaceProp();// getInterfaceProp() + + @org.jetbrains.annotations.NotNull() + public abstract java.lang.String interfaceFunInReturn();// interfaceFunInReturn() + + public abstract int getInterfacePropInExtension(@org.jetbrains.annotations.NotNull() java.lang.String);// getInterfacePropInExtension(java.lang.String) + + public abstract void interfaceFunInExtension(@org.jetbrains.annotations.NotNull() java.lang.String);// interfaceFunInExtension(java.lang.String) + + public abstract void interfaceFunInParameter(@org.jetbrains.annotations.NotNull() java.lang.String);// interfaceFunInParameter(java.lang.String) + + public abstract void setInterfaceProp(@org.jetbrains.annotations.NotNull() java.lang.String);// setInterfaceProp(java.lang.String) + + public abstract void setInterfacePropInExtension(@org.jetbrains.annotations.NotNull() java.lang.String, int);// setInterfacePropInExtension(java.lang.String, int) +} + +@kotlin.jvm.JvmInline() +public final class Some /* Some*/ { + @org.jetbrains.annotations.NotNull() + private final java.lang.String value; + + @org.jetbrains.annotations.NotNull() + public final java.lang.String getValue();// getValue() + + public Some(@org.jetbrains.annotations.NotNull() java.lang.String);// .ctor(java.lang.String) +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.fir.java deleted file mode 100644 index a5c25cff899..00000000000 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.fir.java +++ /dev/null @@ -1,21 +0,0 @@ -public final class RegularClass /* RegularClass*/ { - @org.jetbrains.annotations.NotNull() - private java.lang.String classProp; - - public RegularClass();// .ctor() -} - -public abstract interface RegularInterface /* RegularInterface*/ { - class DefaultImpls ... -} - -@kotlin.jvm.JvmInline() -public final class Some /* Some*/ { - @org.jetbrains.annotations.NotNull() - private final java.lang.String value; - - @org.jetbrains.annotations.NotNull() - public final java.lang.String getValue();// getValue() - - public Some(@org.jetbrains.annotations.NotNull() java.lang.String);// .ctor(java.lang.String) -} diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.java index b800e8a24cc..32e2a034d22 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.java @@ -3,42 +3,20 @@ public final class RegularClass /* RegularClass*/ { private java.lang.String classProp; @org.jetbrains.annotations.NotNull() - public final java.lang.String classFunInReturn();// classFunInReturn() + private java.lang.String classPropImplicit; @org.jetbrains.annotations.NotNull() - public final java.lang.String getClassProp();// getClassProp() + public final java.lang.String classFunInImplicitReturn();// classFunInImplicitReturn() + + @org.jetbrains.annotations.NotNull() + public final java.lang.String getClassPropImplicit();// getClassPropImplicit() public RegularClass();// .ctor() - public final int getClassPropInExtension(@org.jetbrains.annotations.NotNull() java.lang.String);// getClassPropInExtension(java.lang.String) - - public final void classFunInExtension(@org.jetbrains.annotations.NotNull() java.lang.String);// classFunInExtension(java.lang.String) - - public final void classFunInParameter(@org.jetbrains.annotations.NotNull() java.lang.String);// classFunInParameter(java.lang.String) - - public final void setClassProp(@org.jetbrains.annotations.NotNull() java.lang.String);// setClassProp(java.lang.String) - - public final void setClassPropInExtension(@org.jetbrains.annotations.NotNull() java.lang.String, int);// setClassPropInExtension(java.lang.String, int) + public final void setClassPropImplicit(@org.jetbrains.annotations.NotNull() java.lang.String);// setClassPropImplicit(java.lang.String) } public abstract interface RegularInterface /* RegularInterface*/ { - @org.jetbrains.annotations.NotNull() - public abstract java.lang.String getInterfaceProp();// getInterfaceProp() - - @org.jetbrains.annotations.NotNull() - public abstract java.lang.String interfaceFunInReturn();// interfaceFunInReturn() - - public abstract int getInterfacePropInExtension(@org.jetbrains.annotations.NotNull() java.lang.String);// getInterfacePropInExtension(java.lang.String) - - public abstract void interfaceFunInExtension(@org.jetbrains.annotations.NotNull() java.lang.String);// interfaceFunInExtension(java.lang.String) - - public abstract void interfaceFunInParameter(@org.jetbrains.annotations.NotNull() java.lang.String);// interfaceFunInParameter(java.lang.String) - - public abstract void setInterfaceProp(@org.jetbrains.annotations.NotNull() java.lang.String);// setInterfaceProp(java.lang.String) - - public abstract void setInterfacePropInExtension(@org.jetbrains.annotations.NotNull() java.lang.String, int);// setInterfacePropInExtension(java.lang.String, int) - - class DefaultImpls ... } @kotlin.jvm.JvmInline() diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.kt b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.kt index bd3cc4a6d59..8f1acb7ea57 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.kt +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.kt @@ -1,15 +1,15 @@ -// CHECK_BY_JAVA_FILE - @JvmInline value class Some(val value: String) class RegularClass { var classProp: Some = Some("1") + var classPropImplicit = Some("1") var Some.classPropInExtension: Int get() = 1 set(value) {} fun classFunInReturn(): Some = Some("1") + fun classFunInImplicitReturn() = Some("1") fun classFunInParameter(s: Some) {} fun Some.classFunInExtension() {} } @@ -18,7 +18,7 @@ interface RegularInterface { var interfaceProp: Some var Some.interfacePropInExtension: Int - fun interfaceFunInReturn(): Some = Some("1") - fun interfaceFunInParameter(s: Some) {} - fun Some.interfaceFunInExtension() {} + fun interfaceFunInReturn(): Some + fun interfaceFunInParameter(s: Some) + fun Some.interfaceFunInExtension() } diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.lib.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.lib.java index cdbff9c18d1..2f58ac00977 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.lib.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.lib.java @@ -2,12 +2,21 @@ public final class RegularClass /* RegularClass*/ { @org.jetbrains.annotations.NotNull() private java.lang.String classProp; + @org.jetbrains.annotations.NotNull() + private java.lang.String classPropImplicit; + + @org.jetbrains.annotations.NotNull() + public final java.lang.String classFunInImplicitReturn-YO-7n-0();// classFunInImplicitReturn-YO-7n-0() + @org.jetbrains.annotations.NotNull() public final java.lang.String classFunInReturn-YO-7n-0();// classFunInReturn-YO-7n-0() @org.jetbrains.annotations.NotNull() public final java.lang.String getClassProp-YO-7n-0();// getClassProp-YO-7n-0() + @org.jetbrains.annotations.NotNull() + public final java.lang.String getClassPropImplicit-YO-7n-0();// getClassPropImplicit-YO-7n-0() + public RegularClass();// .ctor() public final int getClassPropInExtension-5lyY9Q4(@org.jetbrains.annotations.NotNull() java.lang.String);// getClassPropInExtension-5lyY9Q4(java.lang.String) @@ -18,6 +27,8 @@ public final class RegularClass /* RegularClass*/ { public final void setClassProp-5lyY9Q4(@org.jetbrains.annotations.NotNull() java.lang.String);// setClassProp-5lyY9Q4(java.lang.String) + public final void setClassPropImplicit-5lyY9Q4(@org.jetbrains.annotations.NotNull() java.lang.String);// setClassPropImplicit-5lyY9Q4(java.lang.String) + public final void setClassPropInExtension-54afNMI(@org.jetbrains.annotations.NotNull() java.lang.String, int);// setClassPropInExtension-54afNMI(java.lang.String, int) } @@ -37,8 +48,6 @@ public abstract interface RegularInterface /* RegularInterface*/ { public abstract void setInterfaceProp-5lyY9Q4(@org.jetbrains.annotations.NotNull() java.lang.String);// setInterfaceProp-5lyY9Q4(java.lang.String) public abstract void setInterfacePropInExtension-54afNMI(@org.jetbrains.annotations.NotNull() java.lang.String, int);// setInterfacePropInExtension-54afNMI(java.lang.String, int) - - class DefaultImpls ... } @kotlin.jvm.JvmInline()