Debugger: cannot evaluate expression with raw types
#KT-11831 Fixed
This commit is contained in:
@@ -136,10 +136,6 @@ abstract class DescriptorRenderer {
|
|||||||
modifiers = DescriptorRendererModifier.ALL
|
modifiers = DescriptorRendererModifier.ALL
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmField val FLEXIBLE_TYPES_FOR_CODE: DescriptorRenderer = withOptions {
|
|
||||||
flexibleTypesForCode = true
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmField val HTML: DescriptorRenderer = withOptions {
|
@JvmField val HTML: DescriptorRenderer = withOptions {
|
||||||
textFormat = RenderingFormat.HTML
|
textFormat = RenderingFormat.HTML
|
||||||
modifiers = DescriptorRendererModifier.ALL
|
modifiers = DescriptorRendererModifier.ALL
|
||||||
@@ -187,7 +183,6 @@ interface DescriptorRendererOptions {
|
|||||||
var withoutSuperTypes: Boolean
|
var withoutSuperTypes: Boolean
|
||||||
var typeNormalizer: (KotlinType) -> KotlinType
|
var typeNormalizer: (KotlinType) -> KotlinType
|
||||||
var renderDefaultValues: Boolean
|
var renderDefaultValues: Boolean
|
||||||
var flexibleTypesForCode: Boolean
|
|
||||||
var secondaryConstructorsAsPrimary: Boolean
|
var secondaryConstructorsAsPrimary: Boolean
|
||||||
var renderAccessors: Boolean
|
var renderAccessors: Boolean
|
||||||
var renderDefaultAnnotationArguments: Boolean
|
var renderDefaultAnnotationArguments: Boolean
|
||||||
|
|||||||
@@ -138,10 +138,6 @@ internal class DescriptorRendererImpl(
|
|||||||
if (debugMode) {
|
if (debugMode) {
|
||||||
return renderFlexibleTypeWithBothBounds(type.flexibility().lowerBound, type.flexibility().upperBound)
|
return renderFlexibleTypeWithBothBounds(type.flexibility().lowerBound, type.flexibility().upperBound)
|
||||||
}
|
}
|
||||||
else if (flexibleTypesForCode) {
|
|
||||||
val prefix = if (classifierNamePolicy == ClassifierNamePolicy.SHORT) "" else Flexibility.FLEXIBLE_TYPE_CLASSIFIER.packageFqName.asString() + "."
|
|
||||||
return prefix + Flexibility.FLEXIBLE_TYPE_CLASSIFIER.relativeClassName + lt() + renderNormalizedType(type.flexibility().lowerBound) + ", " + renderNormalizedType(type.flexibility().upperBound) + gt()
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
return renderFlexibleType(type)
|
return renderFlexibleType(type)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions {
|
|||||||
override var withoutSuperTypes by property(false)
|
override var withoutSuperTypes by property(false)
|
||||||
override var typeNormalizer by property<(KotlinType) -> KotlinType>({ it })
|
override var typeNormalizer by property<(KotlinType) -> KotlinType>({ it })
|
||||||
override var renderDefaultValues by property(true)
|
override var renderDefaultValues by property(true)
|
||||||
override var flexibleTypesForCode by property(false)
|
|
||||||
override var secondaryConstructorsAsPrimary by property(true)
|
override var secondaryConstructorsAsPrimary by property(true)
|
||||||
override var overrideRenderingPolicy by property(OverrideRenderingPolicy.RENDER_OPEN)
|
override var overrideRenderingPolicy by property(OverrideRenderingPolicy.RENDER_OPEN)
|
||||||
override var valueParametersHandler: DescriptorRenderer.ValueParametersHandler by property(DescriptorRenderer.ValueParametersHandler.DEFAULT)
|
override var valueParametersHandler: DescriptorRenderer.ValueParametersHandler by property(DescriptorRenderer.ValueParametersHandler.DEFAULT)
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ import org.jetbrains.kotlin.resolve.AnalyzingUtils
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
import org.jetbrains.kotlin.types.Flexibility
|
|
||||||
import org.jetbrains.org.objectweb.asm.*
|
import org.jetbrains.org.objectweb.asm.*
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes.ASM5
|
import org.jetbrains.org.objectweb.asm.Opcodes.ASM5
|
||||||
import org.jetbrains.org.objectweb.asm.Type
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
@@ -454,7 +453,7 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
|
|||||||
}
|
}
|
||||||
|
|
||||||
val filesToAnalyze = if (contextFile == null) listOf(this) else listOf(this, contextFile)
|
val filesToAnalyze = if (contextFile == null) listOf(this) else listOf(this, contextFile)
|
||||||
val resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacade(filesToAnalyze + createFlexibleTypesFile())
|
val resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacade(filesToAnalyze)
|
||||||
val analysisResult = resolutionFacade.analyzeFullyAndGetResult(filesToAnalyze)
|
val analysisResult = resolutionFacade.analyzeFullyAndGetResult(filesToAnalyze)
|
||||||
|
|
||||||
if (analysisResult.isError()) {
|
if (analysisResult.isError()) {
|
||||||
@@ -527,16 +526,6 @@ private fun createFileForDebugger(codeFragment: KtCodeFragment,
|
|||||||
return jetFile
|
return jetFile
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun PsiElement.createFlexibleTypesFile(): KtFile {
|
|
||||||
return createKtFile(
|
|
||||||
"FLEXIBLE_TYPES.kt",
|
|
||||||
"""
|
|
||||||
package ${Flexibility.FLEXIBLE_TYPE_CLASSIFIER.packageFqName}
|
|
||||||
public class ${Flexibility.FLEXIBLE_TYPE_CLASSIFIER.relativeClassName}<L, U>
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun PsiElement.createKtFile(fileName: String, fileText: String): KtFile {
|
private fun PsiElement.createKtFile(fileName: String, fileText: String): KtFile {
|
||||||
// Not using KtPsiFactory because we need a virtual file attached to the JetFile
|
// Not using KtPsiFactory because we need a virtual file attached to the JetFile
|
||||||
val virtualFile = LightVirtualFile(fileName, KotlinLanguage.INSTANCE, fileText)
|
val virtualFile = LightVirtualFile(fileName, KotlinLanguage.INSTANCE, fileText)
|
||||||
|
|||||||
@@ -104,7 +104,6 @@ fun getFunctionForExtractedFragment(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val generatorOptions = ExtractionGeneratorOptions(inTempFile = true,
|
val generatorOptions = ExtractionGeneratorOptions(inTempFile = true,
|
||||||
flexibleTypesAllowed = true,
|
|
||||||
dummyName = GENERATED_FUNCTION_NAME,
|
dummyName = GENERATED_FUNCTION_NAME,
|
||||||
allowExpressionBody = false)
|
allowExpressionBody = false)
|
||||||
return ExtractionGeneratorConfiguration(validationResult.descriptor, generatorOptions).generateDeclaration()
|
return ExtractionGeneratorConfiguration(validationResult.descriptor, generatorOptions).generateDeclaration()
|
||||||
|
|||||||
-1
@@ -468,7 +468,6 @@ val propertyTargets: List<ExtractionTarget> = listOf(ExtractionTarget.PROPERTY_W
|
|||||||
data class ExtractionGeneratorOptions(
|
data class ExtractionGeneratorOptions(
|
||||||
val inTempFile: Boolean = false,
|
val inTempFile: Boolean = false,
|
||||||
val target: ExtractionTarget = ExtractionTarget.FUNCTION,
|
val target: ExtractionTarget = ExtractionTarget.FUNCTION,
|
||||||
val flexibleTypesAllowed: Boolean = false,
|
|
||||||
val dummyName: String? = null,
|
val dummyName: String? = null,
|
||||||
val allowExpressionBody: Boolean = true,
|
val allowExpressionBody: Boolean = true,
|
||||||
val delayInitialOccurrenceReplacement: Boolean = false
|
val delayInitialOccurrenceReplacement: Boolean = false
|
||||||
|
|||||||
+1
-3
@@ -111,9 +111,7 @@ private fun buildSignature(config: ExtractionGeneratorConfiguration, renderer: D
|
|||||||
fun ExtractionGeneratorConfiguration.getSignaturePreview(renderer: DescriptorRenderer) = buildSignature(this, renderer).asString()
|
fun ExtractionGeneratorConfiguration.getSignaturePreview(renderer: DescriptorRenderer) = buildSignature(this, renderer).asString()
|
||||||
|
|
||||||
fun ExtractionGeneratorConfiguration.getDeclarationPattern(
|
fun ExtractionGeneratorConfiguration.getDeclarationPattern(
|
||||||
descriptorRenderer: DescriptorRenderer = if (generatorOptions.flexibleTypesAllowed)
|
descriptorRenderer: DescriptorRenderer = IdeDescriptorRenderers.SOURCE_CODE
|
||||||
DescriptorRenderer.FLEXIBLE_TYPES_FOR_CODE
|
|
||||||
else IdeDescriptorRenderers.SOURCE_CODE
|
|
||||||
): String {
|
): String {
|
||||||
val extractionTarget = generatorOptions.target
|
val extractionTarget = generatorOptions.target
|
||||||
if (!extractionTarget.isAvailable(descriptor)) {
|
if (!extractionTarget.isAvailable(descriptor)) {
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@ LineBreakpoint created at checkNotNull.kt:8
|
|||||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! checkNotNull.CheckNotNullKt
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! checkNotNull.CheckNotNullKt
|
||||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
checkNotNull.kt:8
|
checkNotNull.kt:8
|
||||||
MyJavaClass.java:12
|
MyJavaClass.java:13
|
||||||
checkNotNull.kt:8
|
checkNotNull.kt:8
|
||||||
checkNotNull.kt:9
|
checkNotNull.kt:9
|
||||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@ LineBreakpoint created at javaFun.kt:8
|
|||||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! javaFun.JavaFunKt
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! javaFun.JavaFunKt
|
||||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
javaFun.kt:8
|
javaFun.kt:8
|
||||||
MyJavaClass.java:7
|
MyJavaClass.java:8
|
||||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
Process finished with exit code 0
|
Process finished with exit code 0
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
LineBreakpoint created at rawTypeskt11831.kt:7
|
||||||
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! rawTypeskt11831.RawTypeskt11831Kt
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
rawTypeskt11831.kt:7
|
||||||
|
Compile bytecode for foo
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
+2
-2
@@ -4,9 +4,9 @@ Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socke
|
|||||||
samAdapter.kt:5
|
samAdapter.kt:5
|
||||||
samAdapter.kt:6
|
samAdapter.kt:6
|
||||||
samAdapter.kt:10
|
samAdapter.kt:10
|
||||||
MyJavaClass.java:20
|
MyJavaClass.java:21
|
||||||
samAdapter.kt:6
|
samAdapter.kt:6
|
||||||
MyJavaClass.java:20
|
MyJavaClass.java:21
|
||||||
samAdapter.kt:10
|
samAdapter.kt:10
|
||||||
samAdapter.kt:6
|
samAdapter.kt:6
|
||||||
samAdapter.kt:7
|
samAdapter.kt:7
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ smartStepIntoInterfaceImpl.kt:36
|
|||||||
smartStepIntoInterfaceImpl.kt:130
|
smartStepIntoInterfaceImpl.kt:130
|
||||||
smartStepIntoInterfaceImpl.kt:41
|
smartStepIntoInterfaceImpl.kt:41
|
||||||
smartStepIntoInterfaceImpl.kt:138
|
smartStepIntoInterfaceImpl.kt:138
|
||||||
MyJavaClass.java:16
|
MyJavaClass.java:17
|
||||||
smartStepIntoInterfaceImpl.kt:143
|
smartStepIntoInterfaceImpl.kt:143
|
||||||
smartStepIntoInterfaceImpl.kt:59
|
smartStepIntoInterfaceImpl.kt:59
|
||||||
smartStepIntoInterfaceImpl.kt:148
|
smartStepIntoInterfaceImpl.kt:148
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ LineBreakpoint created at stepIntoSpecificKotlinClasses.kt:8
|
|||||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! stepIntoSpecificKotlinClasses.StepIntoSpecificKotlinClassesKt
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! stepIntoSpecificKotlinClasses.StepIntoSpecificKotlinClassesKt
|
||||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
stepIntoSpecificKotlinClasses.kt:8
|
stepIntoSpecificKotlinClasses.kt:8
|
||||||
MyJavaClass.java:12
|
MyJavaClass.java:13
|
||||||
stepIntoSpecificKotlinClasses.kt:8
|
stepIntoSpecificKotlinClasses.kt:8
|
||||||
Intrinsics.!EXT!
|
Intrinsics.!EXT!
|
||||||
Intrinsics.!EXT!
|
Intrinsics.!EXT!
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
package rawTypeskt11831
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val raw = forTests.MyJavaClass.RawADerived()
|
||||||
|
val foo = raw.foo(emptyList<String>())
|
||||||
|
//Breakpoint!
|
||||||
|
val a = foo
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPRESSION: foo
|
||||||
|
// RESULT: 1: I
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package forTests;
|
package forTests;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class MyJavaClass {
|
public class MyJavaClass {
|
||||||
public void testFun() {
|
public void testFun() {
|
||||||
@@ -38,4 +39,14 @@ public class MyJavaClass {
|
|||||||
public static class InnerClass extends BaseClass {
|
public static class InnerClass extends BaseClass {
|
||||||
public final int i = 1;
|
public final int i = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class RawA<T> {
|
||||||
|
public int foo(List<T> p) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class RawADerived extends RawA {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -301,6 +301,12 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
|
|||||||
doSingleBreakpointTest(fileName);
|
doSingleBreakpointTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("rawTypeskt11831.kt")
|
||||||
|
public void testRawTypeskt11831() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/rawTypeskt11831.kt");
|
||||||
|
doSingleBreakpointTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("simple.kt")
|
@TestMetadata("simple.kt")
|
||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/simple.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/simple.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user