From ffa42cda83c04b475d83837118cead4e595d0e56 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 16 Oct 2015 16:03:46 +0200 Subject: [PATCH] cls: ensure canonical text don't miss whitespaces around wildcards (IDEA-146452) --- .../src/com/intellij/psi/PsiNameHelper.java | 1 - .../ClsReferenceParameterListImpl.java | 34 +++++++++++------- .../clsHighlighting/IDEA146452.java | 11 ++++++ .../clsHighlighting/libs/IDEA146452.jar | Bin 0 -> 2620 bytes .../ClsGenerics15HighlightingTest.java | 1 + 5 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/clsHighlighting/IDEA146452.java create mode 100644 java/java-tests/testData/codeInsight/clsHighlighting/libs/IDEA146452.jar diff --git a/java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java b/java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java index 8026d4673fd6..be2427b4e62a 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java @@ -181,7 +181,6 @@ public abstract class PsiNameHelper { @NotNull public static String[] getClassParametersText(@NotNull String referenceText) { if (referenceText.indexOf('<') < 0) return ArrayUtil.EMPTY_STRING_ARRAY; - referenceText = removeWhitespace(referenceText); final char[] chars = referenceText.toCharArray(); int afterLastDotIndex = 0; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsReferenceParameterListImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsReferenceParameterListImpl.java index aa2fae39657d..002563098c53 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsReferenceParameterListImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsReferenceParameterListImpl.java @@ -16,14 +16,20 @@ package com.intellij.psi.impl.compiled; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReferenceParameterList; +import com.intellij.psi.PsiType; +import com.intellij.psi.PsiTypeElement; import com.intellij.psi.impl.source.tree.TreeElement; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class ClsReferenceParameterListImpl extends ClsElementImpl implements PsiReferenceParameterList { - @NonNls private static final String EXTENDS_PREFIX = "?extends"; - @NonNls private static final String SUPER_PREFIX = "?super"; + @NonNls private static final Pattern EXTENDS_PREFIX = Pattern.compile("^(\\?\\s*extends\\s*)(.*)"); + @NonNls private static final Pattern SUPER_PREFIX = Pattern.compile("^(\\?\\s*super\\s*)(.*)"); private final PsiElement myParent; private final ClsTypeElementImpl[] myTypeParameters; @@ -38,17 +44,21 @@ public class ClsReferenceParameterListImpl extends ClsElementImpl implements Psi for (int i = 0; i < length; i++) { String s = classParameters[length - i - 1]; char variance = ClsTypeElementImpl.VARIANCE_NONE; - if (s.startsWith(EXTENDS_PREFIX)) { + final Matcher extendsMatcher = EXTENDS_PREFIX.matcher(s); + if (extendsMatcher.find()) { variance = ClsTypeElementImpl.VARIANCE_EXTENDS; - s = s.substring(EXTENDS_PREFIX.length()); + s = extendsMatcher.group(2); } - else if (s.startsWith(SUPER_PREFIX)) { - variance = ClsTypeElementImpl.VARIANCE_SUPER; - s = s.substring(SUPER_PREFIX.length()); - } - else if (StringUtil.startsWithChar(s, '?')) { - variance = ClsTypeElementImpl.VARIANCE_INVARIANT; - s = s.substring(1); + else { + final Matcher superMatcher = SUPER_PREFIX.matcher(s); + if (superMatcher.find()) { + variance = ClsTypeElementImpl.VARIANCE_SUPER; + s = superMatcher.group(2); + } + else if (StringUtil.startsWithChar(s, '?')) { + variance = ClsTypeElementImpl.VARIANCE_INVARIANT; + s = s.substring(1); + } } myTypeParameters[i] = new ClsTypeElementImpl(this, s, variance); diff --git a/java/java-tests/testData/codeInsight/clsHighlighting/IDEA146452.java b/java/java-tests/testData/codeInsight/clsHighlighting/IDEA146452.java new file mode 100644 index 000000000000..8b43cd54574d --- /dev/null +++ b/java/java-tests/testData/codeInsight/clsHighlighting/IDEA146452.java @@ -0,0 +1,11 @@ +package com.badinterface; + +import java.util.List; +import java.util.concurrent.Future; + +class Test { + private void foo(BadInterface2 b, BadInterface3 b3) { + final Future process = b.process(); + final Future> process3 = b3.process(); + } +} diff --git a/java/java-tests/testData/codeInsight/clsHighlighting/libs/IDEA146452.jar b/java/java-tests/testData/codeInsight/clsHighlighting/libs/IDEA146452.jar new file mode 100644 index 0000000000000000000000000000000000000000..91b3024f41df4f28972fac996b216c5912b6368c GIT binary patch literal 2620 zcmWIWW@h1H0D-Bs0q$T1l;8x?zOEsTx}JV+`TRsgZ*3~+9=KSU$gDb`lo)&4HJ)?QCbk&xif-|SRuY5kY z{?ti*@0O0`FRGTNG+&wdTJp&38J~(Q#h0p0Te8eyinxke`Vy@lYSWfJ)0BA4sHi_Z zIk3nrEiy~+P+!BGD_xh8SZA>4i|dOsz?{gy5R#1Q6BeKolk;=op1}00AXG(CVoGLS zNorAAVsa{6IR`js)a!b@mI9T10b*rr%AFEZJYjnEl5-M^i><%rU$McD`V3u zW6N`6`_{DR&yy>UlHAw?d41=vIkL&+@0=rhN^1WvS##xyP_`S}xd&&y>^U;&(xMPI zHZ$I{6BaluSg_1DV1ekeEbAP$0@ml##Z;H?N`1!QD^TL)^YM(fr>>W`kKa}1m1!vx ze9xV~>hI-qvZeF2vUXC6fP?vz-ieJ98#@_UBqAjwXGlgg)PyPYcQ*2NDC(54@fn=u zga;eMmzPEUtX>E7oh%~*g9;&E8lihL4`^l?n;+1#C?07G!Sw0;Cx2r8E;%yg%$`YC z7Hv85B&2rv5fOih<7|r-Zc#CIx3{#{-??RlhUt2j`)fr~=JlFQDy&<&({rWkwK9hj zCk}|tiI18x=hd{C%v(Y@ZaOI2P7rfrv)pq{%Fu{o!R{#&9mUqmnYppKv8gGfr7v=@@8#D3q1N{%r=(&kysd@0EkEvJzQ!y}W z>0!+{n7Xxy(2XqvK1mF4Kk@fY(_5hab-<`HB*~ltpaUy%b6O{y%{#0h(DL4f^-*5I zEEz3s;jclaLH|^ihprb1Zr5sHz4Gm`xTDa{_EmRg{7p+YEwO#cEwkkFsaaCG1)U2_ z4sAPCVp?TuE8d@Rmf`K(zmt>>cu2=DF6O9p?ReH~GUI#99Mx^>l#d_oTT>vpouQ)o zWRP#%-Q33(j|yk<@Tcxnc)vSW*gPXn<1w?j)48{Cp?1F8!#+$n_s3lBpR3Qlvq=*z zWd3(7HCUCat)IV>bK0^ge=a#Zvr6Cp+xK+K)gR5r7d4g4kMZ!zn|!8FJmiYANZJ{n zvp2R@i>=n5_4o3|O3OJKlJ90VOv?Vr^9LzggG$4h2UiP$3hZhiwjep|3X1XzQj1D5 zQ;UPk{Lgypdg*xj270Ut`QWSLefIIwpfc@KAs_tp0u4-p4NNu}8ErP&7En;e%NJ;1 zWMK02sTQ;XFuh`Yf%jW6568C;{12ac>7UZq{ou0^RAzYt%Pd$)_VlTjj@C(*OKh;vqysI}z_eqpZ(s&2X_N+L01WMzwGYAv*o$_Afs9N941^Z+ z=q92Uo(K~^5;755lp;*TEGt085(Ee^{Qv)w87ZD%g%m8rFf}W{^a7*k|9>%H3jiL; z5Y1Q$E!?JoiY*8LnHEBXX~=~b%v=rzY{eMN