Merge PR #312 (https://github.com/JetBrains/intellij-community/pull/312)
[idea/community.git] / plugins / groovy / groovy-psi / src / org / jetbrains / plugins / groovy / lang / psi / util / PsiUtil.java
index 6a3262ef3adf90ad06f88c041388f5b3d0665e45..15e7087baa5d35ae99bd66f08357e85004e55d95 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * Copyright 2000-2016 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -54,6 +54,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.
 import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature;
 import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.*;
 import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrClosureSignature;
 import org.jetbrains.plugins.groovy.lang.psi.api.signatures.GrSignature;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.*;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrSpreadArgument;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrSpreadArgument;
@@ -83,6 +84,7 @@ import org.jetbrains.plugins.groovy.lang.psi.dataFlow.types.TypeInferenceHelper;
 import org.jetbrains.plugins.groovy.lang.psi.impl.*;
 import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil;
 import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
 import org.jetbrains.plugins.groovy.lang.psi.impl.*;
 import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil;
 import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
+import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.literals.GrLiteralImpl;
 import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrBindingVariable;
 import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass;
 import org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.ClosureParameterEnhancer;
 import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrBindingVariable;
 import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass;
 import org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.ClosureParameterEnhancer;
@@ -1157,7 +1159,7 @@ public class PsiUtil {
   public static boolean isExpressionUsed(PsiElement expr) {
     while (expr.getParent() instanceof GrParenthesizedExpression) expr = expr.getParent();
 
   public static boolean isExpressionUsed(PsiElement expr) {
     while (expr.getParent() instanceof GrParenthesizedExpression) expr = expr.getParent();
 
-    final PsiElement parent = expr.getParent();
+    PsiElement parent = expr.getParent();
     if (parent instanceof GrBinaryExpression ||
         parent instanceof GrUnaryExpression ||
         parent instanceof GrConditionalExpression ||
     if (parent instanceof GrBinaryExpression ||
         parent instanceof GrUnaryExpression ||
         parent instanceof GrConditionalExpression ||
@@ -1171,16 +1173,29 @@ public class PsiUtil {
         parent instanceof GrThrowStatement ||
         parent instanceof GrSwitchStatement ||
         parent instanceof GrVariable ||
         parent instanceof GrThrowStatement ||
         parent instanceof GrSwitchStatement ||
         parent instanceof GrVariable ||
-        parent instanceof GrReferenceExpression ||
         parent instanceof GrWhileStatement) {
       return true;
     }
 
         parent instanceof GrWhileStatement) {
       return true;
     }
 
+    if (parent instanceof GrReferenceExpression) {
+      if (ResolveUtil.isClassReference(parent)) {
+        parent = parent.getParent();
+      }
+      if (parent instanceof GrReferenceExpression) {
+        PsiElement resolved = ((GrReferenceExpression)parent).resolve();
+        if (resolved instanceof PsiMember) {
+          PsiClass containingClass = ((PsiMember)resolved).getContainingClass();
+          return containingClass != null && CommonClassNames.JAVA_LANG_CLASS.equals(containingClass.getQualifiedName());
+        }
+      }
+      return true;
+    }
+
     if (parent instanceof GrTraditionalForClause) {
       GrTraditionalForClause forClause = (GrTraditionalForClause)parent;
       return expr == forClause.getCondition();
     }
     if (parent instanceof GrTraditionalForClause) {
       GrTraditionalForClause forClause = (GrTraditionalForClause)parent;
       return expr == forClause.getCondition();
     }
-    
+
     return isReturnStatement(expr);
   }
 
     return isReturnStatement(expr);
   }
 
@@ -1447,4 +1462,21 @@ public class PsiUtil {
     while (next != null && next.getNode().getElementType() == TokenType.WHITE_SPACE) next = PsiTreeUtil.prevLeaf(next);
     return next;
   }
     while (next != null && next.getNode().getElementType() == TokenType.WHITE_SPACE) next = PsiTreeUtil.prevLeaf(next);
     return next;
   }
+
+  @Nullable
+  public static Object getLabelValue(@Nullable GrArgumentLabel label) {
+    if (label == null) return null;
+    final PsiElement element = label.getNameElement();
+    if (element instanceof GrExpression) {
+      final Object value = JavaPsiFacade.getInstance(label.getProject()).getConstantEvaluationHelper().computeConstantExpression(element);
+      if (value != null) return value;
+    }
+
+    final IElementType elemType = element.getNode().getElementType();
+    if (GroovyTokenTypes.mIDENT == elemType || TokenSets.KEYWORDS.contains(elemType)) {
+      return element.getText();
+    }
+
+    return GrLiteralImpl.getLiteralValue(element);
+  }
 }
 }