Debugger: allow evaluate expression in constructors
This commit is contained in:
+14
@@ -93,6 +93,20 @@ public class CodeFragmentAnalyzer(
|
|||||||
val dataFlowInfo: DataFlowInfo
|
val dataFlowInfo: DataFlowInfo
|
||||||
|
|
||||||
when (context) {
|
when (context) {
|
||||||
|
is JetPrimaryConstructor -> {
|
||||||
|
val descriptor = resolveSession.getClassDescriptor(context.getContainingClassOrObject(), NoLookupLocation.FROM_IDE) as ClassDescriptorWithResolutionScopes
|
||||||
|
|
||||||
|
scopeForContextElement = descriptor.getScopeForInitializerResolution()
|
||||||
|
dataFlowInfo = DataFlowInfo.EMPTY
|
||||||
|
}
|
||||||
|
is JetSecondaryConstructor -> {
|
||||||
|
val correctedContext = context.getDelegationCall().calleeExpression!!
|
||||||
|
|
||||||
|
val contextForElement = resolveToElement(correctedContext)
|
||||||
|
|
||||||
|
scopeForContextElement = contextForElement[BindingContext.LEXICAL_SCOPE, correctedContext]
|
||||||
|
dataFlowInfo = DataFlowInfo.EMPTY
|
||||||
|
}
|
||||||
is JetClassOrObject -> {
|
is JetClassOrObject -> {
|
||||||
val descriptor = resolveSession.getClassDescriptor(context, NoLookupLocation.FROM_IDE) as ClassDescriptorWithResolutionScopes
|
val descriptor = resolveSession.getClassDescriptor(context, NoLookupLocation.FROM_IDE) as ClassDescriptorWithResolutionScopes
|
||||||
|
|
||||||
|
|||||||
@@ -209,6 +209,10 @@ private fun addDebugExpressionBeforeContextElement(codeFragment: JetCodeFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
contextElement is JetPrimaryConstructor -> {
|
||||||
|
val classOrObject = contextElement.getContainingClassOrObject()
|
||||||
|
insertNewInitializer(classOrObject.getOrCreateBody())
|
||||||
|
}
|
||||||
contextElement is JetClassOrObject -> {
|
contextElement is JetClassOrObject -> {
|
||||||
insertNewInitializer(contextElement.getBody()!!)
|
insertNewInitializer(contextElement.getBody()!!)
|
||||||
}
|
}
|
||||||
@@ -216,6 +220,11 @@ private fun addDebugExpressionBeforeContextElement(codeFragment: JetCodeFragment
|
|||||||
val block = contextElement.getBodyExpression()!!
|
val block = contextElement.getBodyExpression()!!
|
||||||
block.getStatements().firstOrNull() ?: block.getLastChild()
|
block.getStatements().firstOrNull() ?: block.getLastChild()
|
||||||
}
|
}
|
||||||
|
contextElement is JetDeclarationWithBody && !contextElement.hasBody()-> {
|
||||||
|
val block = psiFactory.createBlock("")
|
||||||
|
val newBlock = contextElement.add(block) as JetBlockExpression
|
||||||
|
newBlock.getRBrace()
|
||||||
|
}
|
||||||
contextElement is JetDeclarationWithBody && !contextElement.hasBlockBody()-> {
|
contextElement is JetDeclarationWithBody && !contextElement.hasBlockBody()-> {
|
||||||
wrapInRunFun(contextElement.getBodyExpression()!!)
|
wrapInRunFun(contextElement.getBodyExpression()!!)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
class A(
|
||||||
|
a: Int
|
||||||
|
<caret>): Base(1) {
|
||||||
|
val c = 1
|
||||||
|
|
||||||
|
init {
|
||||||
|
val d = 1
|
||||||
|
val e = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class Base(i: Int)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a + c + <error>d</error> + <error>e</error>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
class A(a: Int, val a1: Int) {
|
||||||
|
|
||||||
|
<caret>constructor(b: Int): this(b, b) {}
|
||||||
|
|
||||||
|
val c = 1
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<error>a</error> + b + c + a1
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
class A(a: Int, val a1: Int) {
|
||||||
|
|
||||||
|
<caret>constructor(b: Int): this(b, b)
|
||||||
|
|
||||||
|
val c = 1
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
<error>a</error> + b + c + a1
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
LineBreakpoint created at constructors.kt:9
|
||||||
|
LineBreakpoint created at constructors.kt:13
|
||||||
|
LineBreakpoint created at constructors.kt:20
|
||||||
|
LineBreakpoint created at constructors.kt:28
|
||||||
|
!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! constructors.ConstructorsPackage
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
constructors.kt:9
|
||||||
|
Compile bytecode for p
|
||||||
|
constructors.kt:13
|
||||||
|
Compile bytecode for p + 1
|
||||||
|
constructors.kt:20
|
||||||
|
Compile bytecode for p1 + p2
|
||||||
|
constructors.kt:28
|
||||||
|
Compile bytecode for i1
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
package constructors
|
||||||
|
|
||||||
|
class Derived2(): Base(1) {
|
||||||
|
|
||||||
|
// constructor with body
|
||||||
|
// EXPRESSION: p
|
||||||
|
// RESULT: 1: I
|
||||||
|
//Breakpoint!
|
||||||
|
constructor(p: Int): this() {
|
||||||
|
// EXPRESSION: p + 1
|
||||||
|
// RESULT: 2: I
|
||||||
|
//Breakpoint!
|
||||||
|
val a = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// constructor without body
|
||||||
|
// EXPRESSION: p1 + p2
|
||||||
|
// RESULT: 2: I
|
||||||
|
//Breakpoint!
|
||||||
|
constructor(p1: Int, p2: Int): this()
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPRESSION: i1
|
||||||
|
// RESULT: 1: I
|
||||||
|
class Derived1(
|
||||||
|
i1: Int
|
||||||
|
//Breakpoint!
|
||||||
|
): Base(i1)
|
||||||
|
|
||||||
|
open class Base(i: Int)
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
Derived2(1)
|
||||||
|
Derived2(1, 1)
|
||||||
|
|
||||||
|
Derived1(1)
|
||||||
|
}
|
||||||
+18
@@ -97,6 +97,12 @@ public class CodeFragmentHighlightingTestGenerated extends AbstractCodeFragmentH
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("primaryConstructor.kt")
|
||||||
|
public void testPrimaryConstructor() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/primaryConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("privateFunArgumentsResolve.kt")
|
@TestMetadata("privateFunArgumentsResolve.kt")
|
||||||
public void testPrivateFunArgumentsResolve() throws Exception {
|
public void testPrivateFunArgumentsResolve() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/privateFunArgumentsResolve.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/privateFunArgumentsResolve.kt");
|
||||||
@@ -121,6 +127,18 @@ public class CodeFragmentHighlightingTestGenerated extends AbstractCodeFragmentH
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("secondaryConstructor.kt")
|
||||||
|
public void testSecondaryConstructor() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/secondaryConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("secondaryConstructorWithoutBraces.kt")
|
||||||
|
public void testSecondaryConstructorWithoutBraces() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/secondaryConstructorWithoutBraces.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("simpleNameExpression.kt")
|
@TestMetadata("simpleNameExpression.kt")
|
||||||
public void testSimpleNameExpression() throws Exception {
|
public void testSimpleNameExpression() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/simpleNameExpression.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/simpleNameExpression.kt");
|
||||||
|
|||||||
+6
@@ -652,6 +652,12 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
|
|||||||
doMultipleBreakpointsTest(fileName);
|
doMultipleBreakpointsTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("constructors.kt")
|
||||||
|
public void testConstructors() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/constructors.kt");
|
||||||
|
doMultipleBreakpointsTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("exceptions.kt")
|
@TestMetadata("exceptions.kt")
|
||||||
public void testExceptions() throws Exception {
|
public void testExceptions() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/exceptions.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/exceptions.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user