[FE 1.0] Implement deprecation PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING warning
^KT-55179 ^KT-56171 Fixed
This commit is contained in:
committed by
Space Team
parent
d01a2c7271
commit
a83caec94f
+6
@@ -18069,6 +18069,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
|||||||
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.kt");
|
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
|
@Test
|
||||||
@TestMetadata("localClass.kt")
|
@TestMetadata("localClass.kt")
|
||||||
public void testLocalClass() throws Exception {
|
public void testLocalClass() throws Exception {
|
||||||
|
|||||||
+6
@@ -18075,6 +18075,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.kt");
|
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
|
@Test
|
||||||
@TestMetadata("localClass.kt")
|
@TestMetadata("localClass.kt")
|
||||||
public void testLocalClass() throws Exception {
|
public void testLocalClass() throws Exception {
|
||||||
|
|||||||
+6
@@ -18069,6 +18069,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.kt");
|
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
|
@Test
|
||||||
@TestMetadata("localClass.kt")
|
@TestMetadata("localClass.kt")
|
||||||
public void testLocalClass() throws Exception {
|
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);
|
DiagnosticFactory0<KtElement> DEPRECATED_IMPLICIT_NON_PUBLIC_API_ACCESS = DiagnosticFactory0.create(WARNING, CALL_ELEMENT);
|
||||||
DiagnosticFactory2<KtElement, DeclarationDescriptor, DeclarationDescriptor> PRIVATE_CLASS_MEMBER_FROM_INLINE =
|
DiagnosticFactory2<KtElement, DeclarationDescriptor, DeclarationDescriptor> PRIVATE_CLASS_MEMBER_FROM_INLINE =
|
||||||
DiagnosticFactory2.create(ERROR, CALL_ELEMENT);
|
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<KtElement, KtElement> NON_LOCAL_RETURN_NOT_ALLOWED = DiagnosticFactory1.create(ERROR, CALL_ELEMENT);
|
||||||
DiagnosticFactory1<KtDeclaration, String> NOT_YET_SUPPORTED_IN_INLINE =
|
DiagnosticFactory1<KtDeclaration, String> NOT_YET_SUPPORTED_IN_INLINE =
|
||||||
DiagnosticFactory1.create(ERROR, NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT);
|
DiagnosticFactory1.create(ERROR, NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT);
|
||||||
|
|||||||
+1
@@ -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(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(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, "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(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, "'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");
|
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.calls.model.VariableAsFunctionResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPrivateApi
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPrivateApi
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isInsidePrivateClass
|
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
|
||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil.allowsNonLocalReturns
|
import org.jetbrains.kotlin.resolve.inline.InlineUtil.allowsNonLocalReturns
|
||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil.checkNonLocalReturnUsage
|
import org.jetbrains.kotlin.resolve.inline.InlineUtil.checkNonLocalReturnUsage
|
||||||
@@ -314,6 +315,9 @@ internal class InlineChecker(private val descriptor: FunctionDescriptor) : CallC
|
|||||||
if (declarationDescriptor.isInsidePrivateClass) {
|
if (declarationDescriptor.isInsidePrivateClass) {
|
||||||
context.trace.report(PRIVATE_CLASS_MEMBER_FROM_INLINE.on(expression, declarationDescriptor, descriptor))
|
context.trace.report(PRIVATE_CLASS_MEMBER_FROM_INLINE.on(expression, declarationDescriptor, descriptor))
|
||||||
context.reportDeprecationOnReplacement(expression, replacementForReport)
|
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<!>()
|
||||||
|
}
|
||||||
|
|
||||||
Generated
+6
@@ -18075,6 +18075,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.kt");
|
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
|
@Test
|
||||||
@TestMetadata("localClass.kt")
|
@TestMetadata("localClass.kt")
|
||||||
public void testLocalClass() throws Exception {
|
public void testLocalClass() throws Exception {
|
||||||
|
|||||||
@@ -135,6 +135,13 @@ val DeclarationDescriptor.isInsidePrivateClass: Boolean
|
|||||||
return parent != null && DescriptorVisibilities.isPrivate(parent.visibility)
|
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
|
val DeclarationDescriptor.isInsideInterface: Boolean
|
||||||
get() {
|
get() {
|
||||||
val parent = containingDeclaration as? ClassDescriptor
|
val parent = containingDeclaration as? ClassDescriptor
|
||||||
|
|||||||
Reference in New Issue
Block a user