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
|
||||
}
|
||||
|
||||
@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()
|
||||
|
||||
-1
@@ -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
|
||||
|
||||
+1
-3
@@ -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
@@ -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
@@ -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
@@ -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!
|
||||
|
||||
+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;
|
||||
|
||||
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 {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+6
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user