@Nullable public static GrExpression getRuntimeQualifier(GrReferenceExpression refExpr) { GrExpression qualifier = refExpr.getQualifierExpression(); if (qualifier != null) return qualifier; for (GrClosableBlock closure = PsiTreeUtil.getParentOfType(refExpr, GrClosableBlock.class); closure != null; closure = PsiTreeUtil.getParentOfType(closure, GrClosableBlock.class)) { PsiElement parent = closure.getParent(); if (parent instanceof GrArgumentList) parent = parent.getParent(); if (!(parent instanceof GrMethodCall)) continue; GrExpression funExpr = ((GrMethodCall) parent).getInvokedExpression(); if (!(funExpr instanceof GrReferenceExpression)) return funExpr; final PsiElement resolved = ((GrReferenceExpression) funExpr).resolve(); if (!(resolved instanceof PsiMethod)) return funExpr; if (resolved instanceof GrGdkMethod && isFromDGM((GrGdkMethod) resolved) && !GdkMethodUtil.isWithName(((GrGdkMethod) resolved).getStaticMethod().getName())) { continue; } qualifier = ((GrReferenceExpression) funExpr).getQualifierExpression(); if (qualifier != null) return qualifier; } return null; }
public static int getPrecendence(GrExpression expression) { if (expression instanceof GrThisReferenceExpression || expression instanceof GrLiteral || expression instanceof GrSuperReferenceExpression) { return LITERAL_PRECEDENCE; } if (expression instanceof GrReferenceExpression) { final GrReferenceExpression referenceExpression = (GrReferenceExpression) expression; if (referenceExpression.getQualifierExpression() != null) { return METHOD_CALL_PRECEDENCE; } else { return LITERAL_PRECEDENCE; } } if (expression instanceof GrMethodCallExpression) { return METHOD_CALL_PRECEDENCE; } if (expression instanceof GrTypeCastExpression || expression instanceof GrNewExpression) { return TYPE_CAST_PRECEDENCE; } if (expression instanceof GrPostfixExpression) { return POSTFIX_PRECEDENCE; } if (expression instanceof GrUnaryExpression) { return PREFIX_PRECEDENCE; } if (expression instanceof GrBinaryExpression) { final GrBinaryExpression binaryExpression = (GrBinaryExpression) expression; final IElementType sign = binaryExpression.getOperationTokenType(); if (sign != null) return precedenceForBinaryOperator(sign); } if (expression instanceof GrConditionalExpression) { return CONDITIONAL_PRECEDENCE; } if (expression instanceof GrAssignmentExpression) { return ASSIGNMENT_PRECEDENCE; } if (expression instanceof GrParenthesizedExpression) { return PARENTHESIZED_PRECEDENCE; } return -1; }