[FE 1.0] Implement deprecation PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING warning

^KT-55179
^KT-56171 Fixed
This commit is contained in:
Dmitriy Novozhilov
2023-01-25 11:33:06 +02:00
committed by Space Team
parent d01a2c7271
commit a83caec94f
10 changed files with 68 additions and 0 deletions
@@ -18069,6 +18069,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.kt");
}
@Test
@TestMetadata("kt55179.kt")
public void testKt55179() throws Exception {
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt55179.kt");
}
@Test
@TestMetadata("localClass.kt")
public void testLocalClass() throws Exception {
@@ -18075,6 +18075,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.kt");
}
@Test
@TestMetadata("kt55179.kt")
public void testKt55179() throws Exception {
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt55179.kt");
}
@Test
@TestMetadata("localClass.kt")
public void testLocalClass() throws Exception {
@@ -18069,6 +18069,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.kt");
}
@Test
@TestMetadata("kt55179.kt")
public void testKt55179() throws Exception {
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt55179.kt");
}
@Test
@TestMetadata("localClass.kt")
public void testLocalClass() throws Exception {
@@ -1292,6 +1292,8 @@ public interface Errors {
DiagnosticFactory0<KtElement> DEPRECATED_IMPLICIT_NON_PUBLIC_API_ACCESS = DiagnosticFactory0.create(WARNING, CALL_ELEMENT);
DiagnosticFactory2<KtElement, DeclarationDescriptor, DeclarationDescriptor> PRIVATE_CLASS_MEMBER_FROM_INLINE =
DiagnosticFactory2.create(ERROR, CALL_ELEMENT);
DiagnosticFactory2<KtElement, DeclarationDescriptor, DeclarationDescriptor> PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING =
DiagnosticFactory2.create(WARNING, CALL_ELEMENT);
DiagnosticFactory1<KtElement, KtElement> NON_LOCAL_RETURN_NOT_ALLOWED = DiagnosticFactory1.create(ERROR, CALL_ELEMENT);
DiagnosticFactory1<KtDeclaration, String> NOT_YET_SUPPORTED_IN_INLINE =
DiagnosticFactory1.create(ERROR, NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT);
@@ -1121,6 +1121,7 @@ public class DefaultErrorMessages {
MAP.put(NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, "Public-API inline function cannot access non-public-API ''{0}''", SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
MAP.put(DEPRECATED_IMPLICIT_NON_PUBLIC_API_ACCESS, "Deprecated implicit access of non-public-API from public-API inline function");
MAP.put(PRIVATE_CLASS_MEMBER_FROM_INLINE, "Non-private inline function cannot access members of private classes: ''{0}''", SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
MAP.put(PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING, "Non-private inline function cannot access members of private classes: ''{0}''. This warning will become an error in 2.0", SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
MAP.put(NOT_YET_SUPPORTED_IN_INLINE, "{0} are not yet supported in inline functions", STRING);
MAP.put(DECLARATION_CANT_BE_INLINED, "'inline' modifier is not allowed on virtual members. Only private or final members can be inlined");
MAP.put(DECLARATION_CANT_BE_INLINED_WARNING, "'inline' modifier is not allowed on virtual enum members. Only private or final members can be inlined. This warning will become an error in K2");
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPrivateApi
import org.jetbrains.kotlin.resolve.descriptorUtil.isInsidePrivateClass
import org.jetbrains.kotlin.resolve.descriptorUtil.isMemberOfCompanionOfPrivateClass
import org.jetbrains.kotlin.resolve.inline.InlineUtil
import org.jetbrains.kotlin.resolve.inline.InlineUtil.allowsNonLocalReturns
import org.jetbrains.kotlin.resolve.inline.InlineUtil.checkNonLocalReturnUsage
@@ -314,6 +315,9 @@ internal class InlineChecker(private val descriptor: FunctionDescriptor) : CallC
if (declarationDescriptor.isInsidePrivateClass) {
context.trace.report(PRIVATE_CLASS_MEMBER_FROM_INLINE.on(expression, declarationDescriptor, descriptor))
context.reportDeprecationOnReplacement(expression, replacementForReport)
} else if (declarationDescriptor.isMemberOfCompanionOfPrivateClass) {
context.trace.report(PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING.on(expression, declarationDescriptor, descriptor))
context.reportDeprecationOnReplacement(expression, replacementForReport)
}
}
}
@@ -0,0 +1,15 @@
// ISSUE: KT-55179
// SKIP_TXT
private class Foo {
companion object {
fun buildFoo() = Foo()
}
}
internal <!NOTHING_TO_INLINE!>inline<!> fun foo() {
<!PRIVATE_CLASS_MEMBER_FROM_INLINE!>Foo<!>()
Foo.Companion
Foo.buildFoo()
}
@@ -0,0 +1,15 @@
// ISSUE: KT-55179
// SKIP_TXT
private class Foo {
companion object {
fun buildFoo() = Foo()
}
}
internal <!NOTHING_TO_INLINE!>inline<!> fun foo() {
<!PRIVATE_CLASS_MEMBER_FROM_INLINE!>Foo<!>()
Foo.<!PRIVATE_CLASS_MEMBER_FROM_INLINE!>Companion<!>
Foo.<!PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING!>buildFoo<!>()
}
@@ -18075,6 +18075,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.kt");
}
@Test
@TestMetadata("kt55179.kt")
public void testKt55179() throws Exception {
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt55179.kt");
}
@Test
@TestMetadata("localClass.kt")
public void testLocalClass() throws Exception {
@@ -135,6 +135,13 @@ val DeclarationDescriptor.isInsidePrivateClass: Boolean
return parent != null && DescriptorVisibilities.isPrivate(parent.visibility)
}
val DeclarationDescriptor.isMemberOfCompanionOfPrivateClass: Boolean
get() {
val parent = containingDeclaration as? ClassDescriptor ?: return false
if (!parent.isCompanionObject) return false
return parent.isInsidePrivateClass
}
val DeclarationDescriptor.isInsideInterface: Boolean
get() {
val parent = containingDeclaration as? ClassDescriptor