From f1c1c6ee42d1cbc30e83e303d5d9f472198588bb Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 28 Jan 2013 16:16:55 +0400 Subject: [PATCH] support @FunctionalInterface --- .../analysis/AnnotationsHighlightUtil.java | 8 ++++++++ .../impl/analysis/HighlightVisitorImpl.java | 1 + .../src/com/intellij/psi/LambdaUtil.java | 16 ++++++++++++++++ .../FunctionalInterfaceAnnotation.java | 5 +++++ .../daemon/lambda/LambdaHighlightingTest.java | 4 ++++ java/mockJDK-1.7/jre/lib/rt.jar | Bin 772567 -> 772961 bytes 6 files changed, 34 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/FunctionalInterfaceAnnotation.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java index ebdccd98d088..63416fa26746 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java @@ -406,6 +406,14 @@ public class AnnotationsHighlightUtil { return null; } + public static HighlightInfo checkFunctionalInterface(PsiAnnotation annotation) { + final String errorMessage = LambdaUtil.checkFunctionalInterface(annotation); + if (errorMessage != null) { + return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, annotation, errorMessage); + } + return null; + } + public static class AnnotationReturnTypeVisitor extends PsiTypeVisitor { public static final AnnotationReturnTypeVisitor INSTANCE = new AnnotationReturnTypeVisitor(); @Override diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index fdf7506d9e39..88e1377636c2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -182,6 +182,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkTargetAnnotationDuplicates(annotation)); if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkDuplicateAnnotations(annotation)); if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkForeignInnerClassesUsed(annotation)); + if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkFunctionalInterface(annotation)); } @Override diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java index 9739e9467701..07c5d749a859 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -25,6 +25,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.infos.CandidateInfo; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.util.*; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,6 +38,7 @@ import java.util.*; public class LambdaUtil { private static final Logger LOG = Logger.getInstance("#" + LambdaUtil.class.getName()); public static ThreadLocal> ourParams = new ThreadLocal>(); + @NonNls public static final String JAVA_LANG_FUNCTIONAL_INTERFACE = "java.lang.FunctionalInterface"; @Nullable public static PsiType getFunctionalInterfaceReturnType(PsiLambdaExpression expr) { @@ -659,6 +661,20 @@ public class LambdaUtil { return getFunctionalInterfaceReturnType(functionalInterfaceType); } + @Nullable + public static String checkFunctionalInterface(PsiAnnotation annotation) { + if (PsiUtil.isLanguageLevel8OrHigher(annotation) && Comparing.strEqual(annotation.getQualifiedName(), JAVA_LANG_FUNCTIONAL_INTERFACE)) { + final PsiAnnotationOwner owner = annotation.getOwner(); + if (owner instanceof PsiModifierList) { + final PsiElement parent = ((PsiModifierList)owner).getParent(); + if (parent instanceof PsiClass) { + return LambdaHighlightingUtil.checkInterfaceFunctional((PsiClass)parent); + } + } + } + return null; + } + static class TypeParamsChecker extends PsiTypeVisitor { private PsiMethod myMethod; private final PsiClass myClass; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/FunctionalInterfaceAnnotation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/FunctionalInterfaceAnnotation.java new file mode 100644 index 000000000000..05b2585c8405 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/FunctionalInterfaceAnnotation.java @@ -0,0 +1,5 @@ +@FunctionalInterface +interface Test { + void foo(); + void bar(); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java index feaece4407eb..aa42c0b41db0 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java @@ -200,6 +200,10 @@ public class LambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(true); } + public void testFunctionalInterfaceAnnotation() throws Exception { + doTest(); + } + private void doTest() throws Exception { doTest(false); } diff --git a/java/mockJDK-1.7/jre/lib/rt.jar b/java/mockJDK-1.7/jre/lib/rt.jar index f2c43d2be6e65ca3106eaafc984d538a7ffbca2e..797d0c1b75518646f796e041bf02ef2fbdc48721 100644 GIT binary patch delta 5382 zcmaKvdsxls7RT%N+wJ|^`%Ue1zh7l!y10ZGDul|IGLxdH+!{oo$h}f7sgy2@ZbGJ1 z6oZsYB}&62;|wXpc{nr2P{VMPL1(@D-J0f)b9$cr{GQKuz3*D@TJN>H8IF&$9b*$z z6S&j-w2o~mf=W!4^W?}WX`&t#6_qMg6%}jzE)QK7>KGonD$H?O^r}Ts%OX~VhI_7x zTC!$o=%OVKi^42dDIxYJ|{vYl`qHH7A>H@4*;wP_Dx zOpC8fity)(-^`p9C+#v=){>QyclbPKx^czpc*)|AQNik68@ZuxtP|~;boPHyad%Vp z?7D?7-PN6wAoNw~=+>vvkr&n-bxpP{+U{0-=VH6BzgtL3_xPU3yFHt7+a9$)4sMRl zcw;}AbhLTC7%mFc-&DKPwS&i>2!Cq$6XQ>UKLLNzD%TEK+y?jmQC6%h{>9=CUHso7 zgO&@?ho*0c5g&7(hoBCAC|JZ1IT-t)1P^%Fbe|u_Bt6!-HRWt)eu zd1Gi_i*3sNF|g@7g>DZHD~VNh7!iR<05ReY>%gG}L>s&V$Xrg>lmRgj$)P!bxN+-0 zV~W{a62OhOW8gGQWJKKzg&T8;A*W|gWlIp|5l_z7k%8nZu_m|#VRWNWA`Oj!BlH+e zn^?gww7u$B3fABkNM>+9xiGjKh?a$}44i@xCU`I?ps>W7f%<%ed%g@heMC|g@YsCJ zD<^=-h5nyp{RJqO1~a*G0m{J(FhfZgRl>Q7Rm?In7@eM7r|eCkYbymS7!-maif6Df zgm`huNeq6amggx9{6Z1((ivQ)a4d^~<3a?D90qw5iV7G=7a`;yVX%(E{Sv5OL{@SK z%c*DqK8vwFY3C>yLUNTz8%jUT1~C78goD-2#VeCl;zDQ(ll3+`@2dSAJwrMxm~if!?0_`mmgQ#mRa<338}ejVldSV6*iqV7Z#;LPVd)03NNt0G^~@5x_MZqu7~J#T-62 zQ8Q)5`Yjy0)|fFle=ZiwZzV46nxRbDyOIQQ&qwxy8pv1S{+v8zfU;*5nZrfQ{JSCr zc?6ls`OIPR77FT-3^XFt4B5bkMPl@fsD4=jd27`KW;;M_HQT7o5-x33lR{@CCN+0E zRU)|KK))7Hnaw)5aR*K^KgMgYMu*N)Fod)p)I_j*4d$MCyLpDPbUV!Qbb_|=O)mv1w4--GkBSf z7`g_Fhd|H<%we%UL~g`IbYTOwUuZ=qAk4d>E50 zK0_Iox-Fzpd5;5=lkGpX?xk|oXeN)^jA5e3GsvUh>B>ND3qrzF@YzDbxWQgbyh}xi z4+FQYWEOW|4y0`*i}|r(VlZARwqteg2owMPFc&Wq!?Q5)NO~9>LFG1L%WYo{ZQICH zE?@RM4kE%XAj>7}L zGLAU$`H5nPOAy=A7V4lIPt3T~o!}f#CUad$upu7fNRy#9o=oCglA$l2c=A1|Vz{4z zan^0eJbvE`joV2SHzXatNFY=BhIBC$r-?18Ln$0jAeP*W3}{Ut)47C9Fia%woK-Fa zC6XZCvp@{?`C@&L>zghuT5gO(I_?pnFltI+!E^y>c8hy z#{47(qgxnghA&>NS9jp#9KQ{Zci_k?AHtBGWHKMvEe6*v?7wR#u~T&btzCFyweKWj z`0AGmi$2`gNi<;GF04e)p9)D2;wVW~B@n_%bfI|{rriCB>~@ntelxGIIl{0cTw`~3 z6H7i+O(9u=aT1xudq@Op5R8O{IUErGjU z62&ab!8-+g8-6K)58e_J+FK6O10@3=8Eb-|GKIMFD_2XvH&SBG1{Rr$1Dm({Z!Hto zfNLsl{^GTemWoTjFCSXz_ufg6?_Z=My6|ovMlR8X5gE7>p6Q`gSFoXp$)O|z zeO)$yD;dOG85RtZtd!D$0^X7f#+sSCiXV7fXqzd z!GCEjzz8eB0^Vn0SZ4?LEQ@#&>4^SrP;rTv!2T@kGuRnUXJHxq#=zSw;=xJB!K7@= zremrAwNnHuD9gqr9zIO~9}gT4dX$3{FgNQN0!XHR8lsVxAlLtE)q8mN#|n3Z5w18w zpq*yS6yS4j!4Q4~9GUeu&gGwF$9**j`ItH%{iE!@3&B!LtMG} z;n}$u>1s4g%f&;=j(-Jq1{_+{221+VI&y;>n_Bx zT>Os!hu+}It*giL(d`f(9*I2y)ayv~A@;2xp=Xskq#mM&;X9??cnEXu`=BJP!(;@< zt3vvBxbr^tVV5P};jFDajEn9!j>*Ne&DUxSW{IQ{=sk?%ULj%1#3Q&LJ7f&*NTr%k zcm&PugP8K<2pPw{l`|Mqgs@(l!LA~l@&~#M+H|A_@MjTrY%`#WA-EkS6S)pU3YJiK zl#J%?nJ{=@jBPc)!?rUmnBrqDmBR9JOxC9eCnWki96qt3wr{u`TR2pVK#FmkuEQCu zC`NyJP89sPZf7Q%mEdAa9>*Y|gpA@eCop(WLR`2VlNh8-#2ovsVKDz=c*VVShY_Xd z|D&5!&L%>mlt|$GF&u;LG-fmLkjmI9u=14Z447A6FWO)$xBE*tS&IKRJe^H>D0KTu z#W1rBQ*8EUE?VbE^_YuGWf+yrV=`Bc!*mK_;IIIDO$@|ZJTJlFtt-cdLxcNm%2EGJ zWwMY~M<3LW6DMxmW|(vwZvyizaPl;Y`NuKv>@CoI93QGXw^Gpzrk+5tUI8|6ZHsge z2vab~@e}Axbvtci1CnUv5UfnOdbGt86u!pqou|rKggYNG!`i>?FE)aa0_;BerDJ?H|M5b2P#jbMsTKz7EJ|Co+qXtI!9boBOv`8zH~#*q2Vyc3>D|d1g=m_!5m06 zLY#zxEfh*+YOq%<(*Um;EM$5$77}FrHa#ZyQn^RHUseOR8l0a~TK$R$3TrUn76Yn` z2Jv|^PIU@Yo+r*Q&rqgC-KayzDcqV_=h2s$32hh7=~%G#!_8%Su#ryXh6`wZV#(w` zEo7GP>;jhPt~FD-tYk8!vx~UwY#o_A(LtsOCe@!}+`foT?v0|hQP4dS>#VRT9wjv{ zvVr%})A6*GK6JWZ4K`fDP*dFC=p{S{d}hNhm+*RX{TiHV@!8h#wG3)!%dF_hs}7~L z7~VPxeyAl=_>e>y`0khKfK46VAft9DX=NQg4!x3;R8vP>_?A>9$?C}jes`vlg6i?c z(!#X3x-o%Gy0b?Ev<5R*?`Xid6`Ukyen)=sqKZ*R&W_l&XSX? zVee%;a_!GD_^JUjNxwt5_e+4$yAIODo`=48G`<8Nr4+ z^c&xZeslkXf<|2ANgtrIk<8{#eUxQY;Q!fWA8@tUyW?%Ps0nYg>#780WBM#thZ9Zc zbJ}2NX~NgXHX|5(4Ihez#t?K39sO(q`PcAeKWDcOcj;YV+cNk{tM8{N&Nr- delta 5105 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 Z2@DCcP>TO8RGC$orR8+%<~y7N{TI9Nz>oj{