Evaluate: Fix annotation value evaluation (#KT-23058)
This commit is contained in:
@@ -202,7 +202,15 @@ public class JvmCodegenUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!isCallInsideSameClassAsFieldRepresentingProperty(property, context)) {
|
if (!isCallInsideSameClassAsFieldRepresentingProperty(property, context)) {
|
||||||
if (!isDebuggerContext(context)) {
|
DeclarationDescriptor propertyOwner = property.getContainingDeclaration();
|
||||||
|
boolean isAnnotationValue;
|
||||||
|
if (propertyOwner instanceof ClassDescriptor) {
|
||||||
|
isAnnotationValue = ((ClassDescriptor) propertyOwner).getKind() == ANNOTATION_CLASS;
|
||||||
|
} else {
|
||||||
|
isAnnotationValue = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isAnnotationValue || !isDebuggerContext(context)) {
|
||||||
// Unless we are evaluating expression in debugger context, only properties of the same class can be directly accessed
|
// Unless we are evaluating expression in debugger context, only properties of the same class can be directly accessed
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
package annotationValue
|
||||||
|
|
||||||
|
annotation class Anno(val value: String)
|
||||||
|
|
||||||
|
@Anno("abc")
|
||||||
|
class SomeClass
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
//Breakpoint!
|
||||||
|
val a = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPRESSION: (SomeClass::class.java.annotations[0] as Anno).value
|
||||||
|
// RESULT: "abc": Ljava/lang/String;
|
||||||
|
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
LineBreakpoint created at annotationValue.kt:10
|
||||||
|
Run Java
|
||||||
|
Connected to the target VM
|
||||||
|
annotationValue.kt:10
|
||||||
|
Compile bytecode for (SomeClass::class.java.annotations[0] as Anno).value
|
||||||
|
Disconnected from the target VM
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
Generated
+6
@@ -39,6 +39,12 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("annotationValue.kt")
|
||||||
|
public void testAnnotationValue() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/annotationValue.kt");
|
||||||
|
doSingleBreakpointTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("anonymousObjects.kt")
|
@TestMetadata("anonymousObjects.kt")
|
||||||
public void testAnonymousObjects() throws Exception {
|
public void testAnonymousObjects() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/anonymousObjects.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/anonymousObjects.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user