[DEBUGGER] Improve computation of source position for breakpoint
in KotlinLineBreakpointType more precise. - make `getOffset` of returned position point to lambda body start. Fix [WEB-29329]
This commit is contained in:
+46
@@ -17,25 +17,32 @@
|
|||||||
package org.jetbrains.kotlin.idea.debugger.breakpoints;
|
package org.jetbrains.kotlin.idea.debugger.breakpoints;
|
||||||
|
|
||||||
import com.intellij.debugger.SourcePosition;
|
import com.intellij.debugger.SourcePosition;
|
||||||
|
import com.intellij.debugger.engine.PositionManagerImpl;
|
||||||
|
import com.intellij.debugger.impl.DebuggerUtilsEx;
|
||||||
import com.intellij.debugger.ui.breakpoints.Breakpoint;
|
import com.intellij.debugger.ui.breakpoints.Breakpoint;
|
||||||
import com.intellij.debugger.ui.breakpoints.BreakpointManager;
|
import com.intellij.debugger.ui.breakpoints.BreakpointManager;
|
||||||
import com.intellij.debugger.ui.breakpoints.JavaLineBreakpointType;
|
import com.intellij.debugger.ui.breakpoints.JavaLineBreakpointType;
|
||||||
import com.intellij.debugger.ui.breakpoints.LineBreakpoint;
|
import com.intellij.debugger.ui.breakpoints.LineBreakpoint;
|
||||||
|
import com.intellij.openapi.application.ReadAction;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.openapi.util.Comparing;
|
import com.intellij.openapi.util.Comparing;
|
||||||
import com.intellij.openapi.util.TextRange;
|
import com.intellij.openapi.util.TextRange;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
|
import com.intellij.psi.PsiFile;
|
||||||
|
import com.intellij.psi.PsiManager;
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
import com.intellij.xdebugger.XSourcePosition;
|
import com.intellij.xdebugger.XSourcePosition;
|
||||||
import com.intellij.xdebugger.breakpoints.XBreakpoint;
|
import com.intellij.xdebugger.breakpoints.XBreakpoint;
|
||||||
import com.intellij.xdebugger.breakpoints.XLineBreakpoint;
|
import com.intellij.xdebugger.breakpoints.XLineBreakpoint;
|
||||||
|
import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointImpl;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.java.debugger.breakpoints.properties.JavaBreakpointProperties;
|
import org.jetbrains.java.debugger.breakpoints.properties.JavaBreakpointProperties;
|
||||||
import org.jetbrains.java.debugger.breakpoints.properties.JavaLineBreakpointProperties;
|
import org.jetbrains.java.debugger.breakpoints.properties.JavaLineBreakpointProperties;
|
||||||
import org.jetbrains.kotlin.idea.debugger.KotlinPositionManager;
|
import org.jetbrains.kotlin.idea.debugger.KotlinPositionManager;
|
||||||
import org.jetbrains.kotlin.psi.KtClassInitializer;
|
import org.jetbrains.kotlin.psi.KtClassInitializer;
|
||||||
|
import org.jetbrains.kotlin.psi.KtElement;
|
||||||
import org.jetbrains.kotlin.psi.KtFunction;
|
import org.jetbrains.kotlin.psi.KtFunction;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -149,4 +156,43 @@ public class KotlinLineBreakpointType extends JavaLineBreakpointType {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static SourcePosition createLineSourcePosition(@NotNull XLineBreakpointImpl breakpoint) {
|
||||||
|
VirtualFile file = breakpoint.getFile();
|
||||||
|
if (file != null) {
|
||||||
|
PsiFile psiFile = PsiManager.getInstance(breakpoint.getProject()).findFile(file);
|
||||||
|
if (psiFile != null) {
|
||||||
|
return SourcePosition.createFromLine(psiFile, breakpoint.getLine());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public XSourcePosition getSourcePosition(@NotNull XBreakpoint<JavaLineBreakpointProperties> breakpoint) {
|
||||||
|
JavaBreakpointProperties javaBreakpointProperties = breakpoint.getProperties();
|
||||||
|
if (javaBreakpointProperties != null) {
|
||||||
|
Integer ordinal = ((JavaLineBreakpointProperties)javaBreakpointProperties).getLambdaOrdinal();
|
||||||
|
SourcePosition sourcePosition = createLineSourcePosition((XLineBreakpointImpl)breakpoint);
|
||||||
|
if (sourcePosition != null) {
|
||||||
|
KtFunction function = getLambdaByOrdinal(sourcePosition, ordinal);
|
||||||
|
if (function != null) {
|
||||||
|
KtElement bodyElement = function.getBodyExpression();
|
||||||
|
if (bodyElement != null) {
|
||||||
|
SourcePosition linePosition = SourcePosition.createFromElement(bodyElement);
|
||||||
|
return ReadAction.compute(() -> {
|
||||||
|
if (linePosition != null) {
|
||||||
|
return DebuggerUtilsEx.toXSourcePosition(new PositionManagerImpl.JavaSourcePosition(linePosition, ordinal));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.getSourcePosition(breakpoint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user