Search in sources :

Example 1 with JVMName

use of com.intellij.debugger.engine.JVMName in project intellij-community by JetBrains.

the class ValueHint method getSelectedExpression.

private static Trinity<PsiElement, TextRange, Value> getSelectedExpression(final Project project, final Editor editor, final Point point, final ValueHintType type) {
    final Ref<PsiElement> selectedExpression = Ref.create(null);
    final Ref<TextRange> currentRange = Ref.create(null);
    final Ref<Value> preCalculatedValue = Ref.create(null);
    PsiDocumentManager.getInstance(project).commitAndRunReadAction(() -> {
        // Point -> offset
        final int offset = calculateOffset(editor, point);
        PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
        if (psiFile == null || !psiFile.isValid()) {
            return;
        }
        int selectionStart = editor.getSelectionModel().getSelectionStart();
        int selectionEnd = editor.getSelectionModel().getSelectionEnd();
        if ((type == ValueHintType.MOUSE_CLICK_HINT || type == ValueHintType.MOUSE_ALT_OVER_HINT) && (selectionStart <= offset && offset <= selectionEnd)) {
            PsiElement ctx = (selectionStart > 0) ? psiFile.findElementAt(selectionStart - 1) : psiFile.findElementAt(selectionStart);
            try {
                String text = editor.getSelectionModel().getSelectedText();
                if (text != null && ctx != null) {
                    final JVMElementFactory factory = JVMElementFactories.getFactory(ctx.getLanguage(), project);
                    if (factory == null) {
                        return;
                    }
                    selectedExpression.set(factory.createExpressionFromText(text, ctx));
                    currentRange.set(new TextRange(editor.getSelectionModel().getSelectionStart(), editor.getSelectionModel().getSelectionEnd()));
                }
            } catch (IncorrectOperationException ignored) {
            }
        }
        if (currentRange.get() == null) {
            PsiElement elementAtCursor = psiFile.findElementAt(offset);
            if (elementAtCursor == null) {
                return;
            }
            Pair<PsiElement, TextRange> pair = findExpression(elementAtCursor, type == ValueHintType.MOUSE_CLICK_HINT || type == ValueHintType.MOUSE_ALT_OVER_HINT);
            if (pair == null) {
                if (type == ValueHintType.MOUSE_OVER_HINT) {
                    final DebuggerSession debuggerSession = DebuggerManagerEx.getInstanceEx(project).getContext().getDebuggerSession();
                    if (debuggerSession != null && debuggerSession.isPaused()) {
                        final Pair<Method, Value> lastExecuted = debuggerSession.getProcess().getLastExecutedMethod();
                        if (lastExecuted != null) {
                            final Method method = lastExecuted.getFirst();
                            if (method != null) {
                                final Pair<PsiElement, TextRange> expressionPair = findExpression(elementAtCursor, true);
                                if (expressionPair != null && expressionPair.getFirst() instanceof PsiMethodCallExpression) {
                                    final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) expressionPair.getFirst();
                                    final PsiMethod psiMethod = methodCallExpression.resolveMethod();
                                    if (psiMethod != null) {
                                        final JVMName jvmSignature = JVMNameUtil.getJVMSignature(psiMethod);
                                        try {
                                            if (method.name().equals(psiMethod.getName()) && method.signature().equals(jvmSignature.getName(debuggerSession.getProcess()))) {
                                                pair = expressionPair;
                                                preCalculatedValue.set(lastExecuted.getSecond());
                                            }
                                        } catch (EvaluateException ignored) {
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (pair == null) {
                return;
            }
            selectedExpression.set(pair.getFirst());
            currentRange.set(pair.getSecond());
        }
    });
    return Trinity.create(selectedExpression.get(), currentRange.get(), preCalculatedValue.get());
}
Also used : JVMName(com.intellij.debugger.engine.JVMName) Method(com.sun.jdi.Method) AbstractValueHint(com.intellij.xdebugger.impl.evaluate.quick.common.AbstractValueHint) DebuggerSession(com.intellij.debugger.impl.DebuggerSession) PrimitiveValue(com.sun.jdi.PrimitiveValue) Value(com.sun.jdi.Value) IncorrectOperationException(com.intellij.util.IncorrectOperationException)

Aggregations

JVMName (com.intellij.debugger.engine.JVMName)1 DebuggerSession (com.intellij.debugger.impl.DebuggerSession)1 IncorrectOperationException (com.intellij.util.IncorrectOperationException)1 AbstractValueHint (com.intellij.xdebugger.impl.evaluate.quick.common.AbstractValueHint)1 Method (com.sun.jdi.Method)1 PrimitiveValue (com.sun.jdi.PrimitiveValue)1 Value (com.sun.jdi.Value)1