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
}
@JvmField val FLEXIBLE_TYPES_FOR_CODE: DescriptorRenderer = withOptions {
flexibleTypesForCode = true
}
@JvmField val HTML: DescriptorRenderer = withOptions {
textFormat = RenderingFormat.HTML
modifiers = DescriptorRendererModifier.ALL
@@ -187,7 +183,6 @@ interface DescriptorRendererOptions {
var withoutSuperTypes: Boolean
var typeNormalizer: (KotlinType) -> KotlinType
var renderDefaultValues: Boolean
var flexibleTypesForCode: Boolean
var secondaryConstructorsAsPrimary: Boolean
var renderAccessors: Boolean
var renderDefaultAnnotationArguments: Boolean
@@ -138,10 +138,6 @@ internal class DescriptorRendererImpl(
if (debugMode) {
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 {
return renderFlexibleType(type)
}
@@ -80,7 +80,6 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions {
override var withoutSuperTypes by property(false)
override var typeNormalizer by property<(KotlinType) -> KotlinType>({ it })
override var renderDefaultValues by property(true)
override var flexibleTypesForCode by property(false)
override var secondaryConstructorsAsPrimary by property(true)
override var overrideRenderingPolicy by property(OverrideRenderingPolicy.RENDER_OPEN)
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.BindingTrace
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.Opcodes.ASM5
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 resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacade(filesToAnalyze + createFlexibleTypesFile())
val resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacade(filesToAnalyze)
val analysisResult = resolutionFacade.analyzeFullyAndGetResult(filesToAnalyze)
if (analysisResult.isError()) {
@@ -527,16 +526,6 @@ private fun createFileForDebugger(codeFragment: KtCodeFragment,
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 {
// Not using KtPsiFactory because we need a virtual file attached to the JetFile
val virtualFile = LightVirtualFile(fileName, KotlinLanguage.INSTANCE, fileText)
@@ -104,7 +104,6 @@ fun getFunctionForExtractedFragment(
}
val generatorOptions = ExtractionGeneratorOptions(inTempFile = true,
flexibleTypesAllowed = true,
dummyName = GENERATED_FUNCTION_NAME,
allowExpressionBody = false)
return ExtractionGeneratorConfiguration(validationResult.descriptor, generatorOptions).generateDeclaration()
@@ -468,7 +468,6 @@ val propertyTargets: List<ExtractionTarget> = listOf(ExtractionTarget.PROPERTY_W
data class ExtractionGeneratorOptions(
val inTempFile: Boolean = false,
val target: ExtractionTarget = ExtractionTarget.FUNCTION,
val flexibleTypesAllowed: Boolean = false,
val dummyName: String? = null,
val allowExpressionBody: Boolean = true,
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.getDeclarationPattern(
descriptorRenderer: DescriptorRenderer = if (generatorOptions.flexibleTypesAllowed)
DescriptorRenderer.FLEXIBLE_TYPES_FOR_CODE
else IdeDescriptorRenderers.SOURCE_CODE
descriptorRenderer: DescriptorRenderer = IdeDescriptorRenderers.SOURCE_CODE
): String {
val extractionTarget = generatorOptions.target
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
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
checkNotNull.kt:8
MyJavaClass.java:12
MyJavaClass.java:13
checkNotNull.kt:8
checkNotNull.kt:9
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
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
javaFun.kt:8
MyJavaClass.java:7
MyJavaClass.java:8
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
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:6
samAdapter.kt:10
MyJavaClass.java:20
MyJavaClass.java:21
samAdapter.kt:6
MyJavaClass.java:20
MyJavaClass.java:21
samAdapter.kt:10
samAdapter.kt:6
samAdapter.kt:7
@@ -28,7 +28,7 @@ smartStepIntoInterfaceImpl.kt:36
smartStepIntoInterfaceImpl.kt:130
smartStepIntoInterfaceImpl.kt:41
smartStepIntoInterfaceImpl.kt:138
MyJavaClass.java:16
MyJavaClass.java:17
smartStepIntoInterfaceImpl.kt:143
smartStepIntoInterfaceImpl.kt:59
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
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
stepIntoSpecificKotlinClasses.kt:8
MyJavaClass.java:12
MyJavaClass.java:13
stepIntoSpecificKotlinClasses.kt:8
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;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class MyJavaClass {
public void testFun() {
@@ -38,4 +39,14 @@ public class MyJavaClass {
public static class InnerClass extends BaseClass {
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);
}
@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")
public void testSimple() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/simple.kt");