import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.editor.Document;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.impl.status.StatusBarUtil;
import com.intellij.psi.CommonClassNames;
-import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.ui.classFilter.ClassFilter;
import com.intellij.ui.classFilter.DebuggerClassFilterProvider;
import com.intellij.util.containers.HashMap;
import com.intellij.util.ui.UIUtil;
import com.intellij.xdebugger.XDebugSession;
+import com.intellij.xdebugger.XSourcePosition;
import com.intellij.xdebugger.impl.XDebugSessionImpl;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
import com.sun.jdi.*;
private final RunToCursorBreakpoint myRunToCursorBreakpoint;
private final boolean myIgnoreBreakpoints;
- private RunToCursorCommand(SuspendContextImpl suspendContext, Document document, int lineIndex, final boolean ignoreBreakpoints) {
+ private RunToCursorCommand(SuspendContextImpl suspendContext, @NotNull XSourcePosition position, final boolean ignoreBreakpoints) {
super(suspendContext);
myIgnoreBreakpoints = ignoreBreakpoints;
- final BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager();
- myRunToCursorBreakpoint = breakpointManager.addRunToCursorBreakpoint(document, lineIndex, ignoreBreakpoints);
+ BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager();
+ myRunToCursorBreakpoint = breakpointManager.addRunToCursorBreakpoint(position, ignoreBreakpoints);
}
@Override
return new StepIntoCommand(suspendContext, ignoreFilters, smartStepFilter, stepSize);
}
- public ResumeCommand createRunToCursorCommand(SuspendContextImpl suspendContext, Document document, int lineIndex,
- final boolean ignoreBreakpoints)
+ public ResumeCommand createRunToCursorCommand(SuspendContextImpl suspendContext,
+ @NotNull XSourcePosition position,
+ boolean ignoreBreakpoints)
throws EvaluateException {
- RunToCursorCommand runToCursorCommand = new RunToCursorCommand(suspendContext, document, lineIndex, ignoreBreakpoints);
- if(runToCursorCommand.myRunToCursorBreakpoint == null) {
- final PsiFile psiFile = PsiDocumentManager.getInstance(getProject()).getPsiFile(document);
- throw new EvaluateException(DebuggerBundle.message("error.running.to.cursor.no.executable.code", psiFile != null? psiFile.getName() : "<No File>", lineIndex), null);
+ RunToCursorCommand runToCursorCommand = new RunToCursorCommand(suspendContext, position, ignoreBreakpoints);
+ if (runToCursorCommand.myRunToCursorBreakpoint == null) {
+ PsiFile psiFile = PsiManager.getInstance(myProject).findFile(position.getFile());
+ throw new EvaluateException(DebuggerBundle.message("error.running.to.cursor.no.executable.code", psiFile != null? psiFile.getName() : "<No File>",
+ position.getLine()), null);
}
return runToCursorCommand;
}
@Override
public void runToPosition(@NotNull XSourcePosition position) {
- Document document = FileDocumentManager.getInstance().getDocument(position.getFile());
- myJavaSession.runToCursor(document, position.getLine(), false);
+ myJavaSession.runToCursor(position, false);
}
@NotNull
}
}
- Method method = location.method();
+ final Method method = location.method();
if (psiFile instanceof PsiCompiledElement || lineNumber < 0) {
final String methodSignature = method.signature();
return LambdaMethodFilter.getLambdaOrdinal(o1.method().name()) - LambdaMethodFilter.getLambdaOrdinal(o2.method().name());
}
});
- lambdaOrdinal = lambdas.indexOf(location);
+ lambdaOrdinal = ContainerUtil.indexOf(lambdas, new Condition<Location>() {
+ @Override
+ public boolean value(Location location) {
+ return location.method().equals(method);
+ }
+ });
}
}
return new JavaSourcePosition(sourcePosition, location.declaringType(), method, lambdaOrdinal);
else if ((method instanceof PsiMethod && myExpectedMethodName.equals(((PsiMethod)method).getName()))) {
if (insideBody(element, ((PsiMethod)method).getBody())) return element;
}
- //else if (method instanceof PsiLambdaExpression && (myLambdaOrdinal < 0 || myLambdaOrdinal == lambdaOrdinal)
- // && LambdaMethodFilter.isLambdaName(myExpectedMethodName)) {
- // if (insideBody(element, ((PsiLambdaExpression)method).getBody())) return element;
- //}
+ else if (method instanceof PsiLambdaExpression && LambdaMethodFilter.isLambdaName(myExpectedMethodName)) {
+ if (insideBody(element, ((PsiLambdaExpression)method).getBody())) return element;
+ }
}
return null;
}
@Override
public PsiElement getElementAt() {
+ checkRemap();
return myDelegate.getElementAt();
}
@Override
public int getLine() {
- int line = myDelegate.getLine();
+ checkRemap();
+ return myDelegate.getLine();
+ }
+
+ private void checkRemap() {
if (!myMapped) {
myMapped = true;
myDelegate = mapDelegate(myDelegate);
- return myDelegate.getLine();
}
- return line;
}
@Override
public int getOffset() {
- int offset = myDelegate.getOffset(); //document loaded here
- if (!myMapped) {
- myMapped = true;
- myDelegate = mapDelegate(myDelegate);
- return myDelegate.getOffset();
- }
- return offset;
+ checkRemap();
+ return myDelegate.getOffset();
}
public abstract SourcePosition mapDelegate(SourcePosition original);
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import com.intellij.util.ui.UIUtil;
import com.intellij.xdebugger.AbstractDebuggerSession;
import com.intellij.xdebugger.XDebugSession;
+import com.intellij.xdebugger.XSourcePosition;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
import com.intellij.xdebugger.impl.evaluate.quick.common.ValueLookupManager;
import com.sun.jdi.ObjectCollectedException;
stepInto(ignoreFilters, smartStepFilter, StepRequest.STEP_LINE);
}
- public void runToCursor(Document document, int line, final boolean ignoreBreakpoints) {
+ public void runToCursor(@NotNull XSourcePosition position, final boolean ignoreBreakpoints) {
try {
- DebugProcessImpl.ResumeCommand runToCursorCommand = myDebugProcess.createRunToCursorCommand(getSuspendContext(), document, line, ignoreBreakpoints);
+ DebugProcessImpl.ResumeCommand runToCursorCommand = myDebugProcess.createRunToCursorCommand(getSuspendContext(), position, ignoreBreakpoints);
mySteppingThroughThreads.add(runToCursorCommand.getContextThread());
resumeAction(runToCursorCommand, EVENT_STEP);
}
import com.intellij.util.containers.ContainerUtil;
import com.intellij.xdebugger.XDebuggerManager;
import com.intellij.xdebugger.XDebuggerUtil;
+import com.intellij.xdebugger.XSourcePosition;
import com.intellij.xdebugger.breakpoints.*;
import com.intellij.xdebugger.impl.DebuggerSupport;
import com.intellij.xdebugger.impl.XDebugSessionImpl;
}
@Nullable
- public RunToCursorBreakpoint addRunToCursorBreakpoint(Document document, int lineIndex, final boolean ignoreBreakpoints) {
- return RunToCursorBreakpoint.create(myProject, document, lineIndex, ignoreBreakpoints);
+ public RunToCursorBreakpoint addRunToCursorBreakpoint(@NotNull XSourcePosition position, final boolean ignoreBreakpoints) {
+ return RunToCursorBreakpoint.create(myProject, position, ignoreBreakpoints);
}
@Nullable
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import com.intellij.debugger.SourcePosition;
import com.intellij.debugger.engine.DebugProcessImpl;
-import com.intellij.openapi.editor.Document;
-import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiManager;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.Computable;
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.xdebugger.XSourcePosition;
+import com.sun.jdi.Location;
+import com.sun.jdi.ReferenceType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
return false; // always enabled
}
- @Nullable
- protected static RunToCursorBreakpoint create(@NotNull Project project, @NotNull Document document, int lineIndex, boolean restoreBreakpoints) {
- VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document);
- if (virtualFile == null) {
- return null;
- }
-
- PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
- SourcePosition pos = SourcePosition.createFromLine(psiFile, lineIndex);
+ @Override
+ protected boolean acceptLocation(final DebugProcessImpl debugProcess, ReferenceType classType, final Location loc) {
+ if (!super.acceptLocation(debugProcess, classType, loc)) return false;
+ return ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() {
+ @Override
+ public Boolean compute() {
+ PsiElement expectedElement = myCustomPosition.getElementAt();
+ if (expectedElement != null) {
+ SourcePosition position = debugProcess.getPositionManager().getSourcePosition(loc);
+ if (position != null) {
+ PsiElement currentElement = position.getElementAt();
+ if (currentElement != null) {
+ NavigatablePsiElement expectedMethod = PsiTreeUtil.getParentOfType(expectedElement, PsiMethod.class, PsiLambdaExpression.class);
+ NavigatablePsiElement currentMethod = PsiTreeUtil.getParentOfType(currentElement, PsiMethod.class, PsiLambdaExpression.class);
+ return Comparing.equal(expectedMethod, currentMethod);
+ }
+ }
+ }
+ return true;
+ }
+ });
+ }
- return new RunToCursorBreakpoint(project, pos, restoreBreakpoints);
+ @Nullable
+ protected static RunToCursorBreakpoint create(@NotNull Project project, @NotNull XSourcePosition position, boolean restoreBreakpoints) {
+ PsiFile psiFile = PsiManager.getInstance(project).findFile(position.getFile());
+ return new RunToCursorBreakpoint(project, SourcePosition.createFromOffset(psiFile, position.getOffset()), restoreBreakpoints);
}
@Override
}
PsiElement element = null;
- int offset = startOffset;
+ int offset = getOffset();
while (true) {
final CharSequence charsSequence = document.getCharsSequence();
for (; offset < charsSequence.length(); offset++) {
if (editor == null) return null;
final Document document = editor.getDocument();
- final int line = editor.getCaretModel().getLogicalPosition().line;
+ int offset = editor.getCaretModel().getOffset();
VirtualFile file = FileDocumentManager.getInstance().getFile(document);
- return XSourcePositionImpl.create(file, line);
+ return XSourcePositionImpl.createByOffset(file, offset);
}
@NotNull