Debugger: cannot evaluate expression with raw types

#KT-11831 Fixed
This commit is contained in:
Natalia Ukhorskaya
2016-04-11 13:00:14 +03:00
parent 070ee10872
commit d42823d4ee
16 changed files with 44 additions and 33 deletions
@@ -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()
@@ -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
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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!
@@ -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 {
}
} }
@@ -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");