diff options
Diffstat (limited to 'plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrAnnotationUtil.java')
-rw-r--r-- | plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrAnnotationUtil.java | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrAnnotationUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrAnnotationUtil.java index 387db8400b1e..b43ee28c1ece 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrAnnotationUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrAnnotationUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -15,11 +15,11 @@ */ package org.jetbrains.plugins.groovy.lang.psi.impl; -import com.intellij.psi.PsiAnnotation; -import com.intellij.psi.PsiAnnotationMemberValue; -import com.intellij.psi.PsiLiteral; +import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; /** * @author Max Medvedev @@ -54,4 +54,52 @@ public class GrAnnotationUtil { } return null; } + + @Nullable + public static PsiClass inferClassAttribute(@NotNull PsiAnnotation annotation, @NotNull String attributeName) { + final PsiAnnotationMemberValue targetValue = annotation.findAttributeValue(attributeName); + if (targetValue instanceof PsiClassObjectAccessExpression) { + PsiType type = ((PsiClassObjectAccessExpression)targetValue).getOperand().getType(); + if (type instanceof PsiClassType) { + return ((PsiClassType)type).resolve(); + } + } + else if (targetValue instanceof GrReferenceExpression) { + if ("class".equals(((GrReferenceExpression)targetValue).getReferenceName())) { + GrExpression qualifier = ((GrReferenceExpression)targetValue).getQualifier(); + if (qualifier instanceof GrReferenceExpression) { + PsiElement resolved = ((GrReferenceExpression)qualifier).resolve(); + if (resolved instanceof PsiClass) { + return (PsiClass)resolved; + } + } + } + PsiElement resolved = ((GrReferenceExpression)targetValue).resolve(); + if (resolved instanceof PsiClass) return (PsiClass)resolved; + } + return null; + } + + @Nullable + public static PsiType extractClassTypeFromClassAttributeValue(PsiAnnotationMemberValue targetValue) { + if (targetValue instanceof PsiClassObjectAccessExpression) { + return ((PsiClassObjectAccessExpression)targetValue).getOperand().getType(); + } + else if (targetValue instanceof GrReferenceExpression) { + if ("class".equals(((GrReferenceExpression)targetValue).getReferenceName())) { + GrExpression qualifier = ((GrReferenceExpression)targetValue).getQualifier(); + if (qualifier instanceof GrReferenceExpression) { + PsiElement resolved = ((GrReferenceExpression)qualifier).resolve(); + if (resolved instanceof PsiClass) { + return qualifier.getType(); + } + } + } + PsiElement resolved = ((GrReferenceExpression)targetValue).resolve(); + if (resolved instanceof PsiClass) { + return ((GrReferenceExpression)targetValue).getType(); + } + } + return null; + } } |