void (@NotNull PsiMethodCallExpression call) { ArrayDeque<PsiMethodCallExpression> calls = new ArrayDeque<>(); while (true) { calls.addFirst(call); startElement(call); if (tryInline(call)) { finishElement(call); calls.removeFirst(); break; } PsiExpression qualifierExpression = call.getMethodExpression().getQualifierExpression(); if (qualifierExpression == null) { DfaValue thisVariable = JavaDfaValueFactory.getQualifierOrThisValue(myFactory, call.getMethodExpression()); if (thisVariable != null) { addInstruction(new JvmPushInstruction(thisVariable, null)); } else { pushUnknown(); } break; } else if (!qualifierExpression.isPhysical() && call.isPhysical()) { // Possible -- see com.intellij.psi.impl.source.jsp.jspJava.JspMethodCallImpl.getMethodExpression pushUnknown(); break; } call = ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(qualifierExpression), PsiMethodCallExpression.class); if (call == null) { qualifierExpression.accept(this); break; } } calls.forEach(this::finishCall); }