use of com.intellij.debugger.SourcePosition in project intellij-community by JetBrains.
the class JumpToObjectAction method calcPosition.
private static SourcePosition calcPosition(final ValueDescriptor descriptor, final DebugProcessImpl debugProcess) throws ClassNotLoadedException {
Type type = descriptor.getType();
if (type == null) {
return null;
}
try {
if (type instanceof ArrayType) {
type = ((ArrayType) type).componentType();
}
if (type instanceof ClassType) {
ClassType clsType = (ClassType) type;
Method lambdaMethod = MethodBytecodeUtil.getLambdaMethod(clsType, debugProcess.getVirtualMachineProxy());
Location location = lambdaMethod != null ? ContainerUtil.getFirstItem(DebuggerUtilsEx.allLineLocations(lambdaMethod)) : null;
if (location == null) {
location = ContainerUtil.getFirstItem(clsType.allLineLocations());
}
if (location != null) {
SourcePosition position = debugProcess.getPositionManager().getSourcePosition(location);
return ApplicationManager.getApplication().runReadAction(new Computable<SourcePosition>() {
@Override
public SourcePosition compute() {
// adjust position for non-anonymous classes
if (clsType.name().indexOf('$') < 0) {
PsiClass classAt = JVMNameUtil.getClassAt(position);
if (classAt != null) {
SourcePosition classPosition = SourcePosition.createFromElement(classAt);
if (classPosition != null) {
return classPosition;
}
}
}
return position;
}
});
}
}
} catch (ClassNotPreparedException | AbsentInformationException e) {
LOG.debug(e);
}
return null;
}
use of com.intellij.debugger.SourcePosition in project intellij-community by JetBrains.
the class CompoundPositionManager method locationsOfLine.
@Override
@NotNull
public List<Location> locationsOfLine(@NotNull final ReferenceType type, @NotNull SourcePosition position) {
VirtualFile file = position.getFile().getVirtualFile();
if (file != null) {
LineNumbersMapping mapping = file.getUserData(LineNumbersMapping.LINE_NUMBERS_MAPPING_KEY);
if (mapping != null) {
int line = mapping.sourceToBytecode(position.getLine() + 1);
if (line > -1) {
position = SourcePosition.createFromLine(position.getFile(), line - 1);
}
}
}
final SourcePosition finalPosition = position;
return iterate(positionManager -> positionManager.locationsOfLine(type, finalPosition), Collections.emptyList(), position);
}
use of com.intellij.debugger.SourcePosition in project intellij-community by JetBrains.
the class ContextUtil method getContextElement.
@Nullable
public static PsiElement getContextElement(final StackFrameContext context, final SourcePosition position) {
if (LOG.isDebugEnabled()) {
final SourcePosition sourcePosition = getSourcePosition(context);
LOG.assertTrue(Comparing.equal(sourcePosition, position));
}
return ReadAction.compute(() -> {
final PsiElement element = getContextElement(position);
if (element == null) {
return null;
}
// further code is java specific, actually
if (element.getLanguage().getAssociatedFileType() != DefaultCodeFragmentFactory.getInstance().getFileType()) {
return element;
}
final StackFrameProxyImpl frameProxy = (StackFrameProxyImpl) context.getFrameProxy();
if (frameProxy == null) {
return element;
}
try {
List<LocalVariableProxyImpl> list = frameProxy.visibleVariables();
PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(element.getProject()).getResolveHelper();
StringBuilder buf = null;
for (LocalVariableProxyImpl localVariable : list) {
final String varName = localVariable.name();
if (resolveHelper.resolveReferencedVariable(varName, element) == null) {
if (buf == null) {
buf = new StringBuilder("{");
}
buf.append(localVariable.getVariable().typeName()).append(" ").append(varName).append(";");
}
}
if (buf == null) {
return element;
}
buf.append('}');
final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(element.getProject()).getElementFactory();
final PsiCodeBlock codeBlockFromText = elementFactory.createCodeBlockFromText(buf.toString(), element);
final PsiStatement[] statements = codeBlockFromText.getStatements();
for (PsiStatement statement : statements) {
if (statement instanceof PsiDeclarationStatement) {
PsiDeclarationStatement declStatement = (PsiDeclarationStatement) statement;
PsiElement[] declaredElements = declStatement.getDeclaredElements();
for (PsiElement declaredElement : declaredElements) {
declaredElement.putUserData(IS_JSP_IMPLICIT, Boolean.TRUE);
}
}
}
return codeBlockFromText;
} catch (IncorrectOperationException | EvaluateException ignored) {
return element;
}
});
}
use of com.intellij.debugger.SourcePosition in project intellij-community by JetBrains.
the class ToggleFieldBreakpointAction method update.
@Override
public void update(AnActionEvent event) {
SourcePosition place = getPlace(event);
boolean toEnable = place != null;
Presentation presentation = event.getPresentation();
if (ActionPlaces.PROJECT_VIEW_POPUP.equals(event.getPlace()) || ActionPlaces.STRUCTURE_VIEW_POPUP.equals(event.getPlace()) || ActionPlaces.FAVORITES_VIEW_POPUP.equals(event.getPlace())) {
presentation.setVisible(toEnable);
} else if (DebuggerAction.isContextView(event)) {
presentation.setText(DebuggerBundle.message("action.add.field.watchpoint.text"));
Project project = event.getData(CommonDataKeys.PROJECT);
if (project != null && place != null) {
Document document = PsiDocumentManager.getInstance(project).getDocument(place.getFile());
if (document != null) {
final int offset = place.getOffset();
final BreakpointManager breakpointManager = (DebuggerManagerEx.getInstanceEx(project)).getBreakpointManager();
final Breakpoint fieldBreakpoint = offset >= 0 ? breakpointManager.findBreakpoint(document, offset, FieldBreakpoint.CATEGORY) : null;
if (fieldBreakpoint != null) {
presentation.setEnabled(false);
return;
}
}
}
}
presentation.setVisible(toEnable);
}
use of com.intellij.debugger.SourcePosition in project intellij-community by JetBrains.
the class ToggleFieldBreakpointAction method actionPerformed.
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getData(CommonDataKeys.PROJECT);
if (project == null) {
return;
}
final SourcePosition place = getPlace(e);
if (place != null) {
Document document = PsiDocumentManager.getInstance(project).getDocument(place.getFile());
if (document != null) {
DebuggerManagerEx debuggerManager = DebuggerManagerEx.getInstanceEx(project);
BreakpointManager manager = debuggerManager.getBreakpointManager();
final int offset = place.getOffset();
final Breakpoint breakpoint = offset >= 0 ? manager.findBreakpoint(document, offset, FieldBreakpoint.CATEGORY) : null;
if (breakpoint == null) {
FieldBreakpoint fieldBreakpoint = manager.addFieldBreakpoint(document, offset);
if (fieldBreakpoint != null) {
if (DebuggerAction.isContextView(e)) {
final DebuggerTreeNodeImpl selectedNode = DebuggerAction.getSelectedNode(e.getDataContext());
if (selectedNode != null && selectedNode.getDescriptor() instanceof FieldDescriptorImpl) {
ObjectReference object = ((FieldDescriptorImpl) selectedNode.getDescriptor()).getObject();
if (object != null) {
long id = object.uniqueID();
InstanceFilter[] instanceFilters = new InstanceFilter[] { InstanceFilter.create(Long.toString(id)) };
fieldBreakpoint.setInstanceFilters(instanceFilters);
fieldBreakpoint.setInstanceFiltersEnabled(true);
}
}
}
final Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext());
if (editor != null) {
manager.editBreakpoint(fieldBreakpoint, editor);
}
}
} else {
manager.removeBreakpoint(breakpoint);
}
}
}
}
Aggregations