@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;
  }
Exemple #2
0
 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;
 }