From 2c804f626c7212b5a92e1ccb02939a842831ca7e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 23 Jan 2014 19:36:17 +0400 Subject: [PATCH] cls reference ignores passed outer class type arguments (IDEA-118733) --- .../ClsJavaCodeReferenceElementImpl.java | 20 +++ .../clsHighlighting/IDEA118733.java | 5 + .../clsHighlighting/IDEA97887.java | 6 + .../clsHighlighting/libs/IDEA118733.jar | Bin 0 -> 1269 bytes .../clsHighlighting/libs/IDEA97887.jar | Bin 0 -> 1862 bytes .../ClsGenericsHighlightingTest.java | 128 ++++++++++++++++++ 6 files changed, 159 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/clsHighlighting/IDEA118733.java create mode 100644 java/java-tests/testData/codeInsight/clsHighlighting/IDEA97887.java create mode 100644 java/java-tests/testData/codeInsight/clsHighlighting/libs/IDEA118733.jar create mode 100644 java/java-tests/testData/codeInsight/clsHighlighting/libs/IDEA97887.jar create mode 100644 java/java-tests/testSrc/com/intellij/codeInsight/ClsGenericsHighlightingTest.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsJavaCodeReferenceElementImpl.java index 3096f2485d6b..534b4c77a811 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsJavaCodeReferenceElementImpl.java @@ -17,6 +17,7 @@ package com.intellij.psi.impl.compiled; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.PsiSubstitutorImpl; @@ -128,6 +129,7 @@ public class ClsJavaCodeReferenceElementImpl extends ClsElementImpl implements P } index++; } + collectOuterClassTypeArgs(((PsiClass)resolve), myCanonicalText, substitutionMap); return new CandidateInfo(resolve, PsiSubstitutorImpl.createSubstitutor(substitutionMap)); } else { @@ -135,6 +137,24 @@ public class ClsJavaCodeReferenceElementImpl extends ClsElementImpl implements P } } + private void collectOuterClassTypeArgs(final PsiClass psiClass, + final String canonicalText, + final Map substitutionMap) { + final PsiClass containingClass = psiClass.getContainingClass(); + if (containingClass != null && !containingClass.hasModifierProperty(PsiModifier.STATIC)) { + final String outerClassRef = StringUtil.getPackageName(canonicalText); + final String[] classParameters = PsiNameHelper.getClassParametersText(outerClassRef); + final PsiType[] args = classParameters.length == 0 ? null : new ClsReferenceParameterListImpl(this, classParameters).getTypeArguments(); + final PsiTypeParameter[] typeParameters = containingClass.getTypeParameters(); + for (int i = 0; i < typeParameters.length; i++) { + if (args != null && i < args.length) { + substitutionMap.put(typeParameters[i], args[i]); + } + } + collectOuterClassTypeArgs(containingClass, outerClassRef, substitutionMap); + } + } + @Override @NotNull public JavaResolveResult advancedResolve(boolean incompleteCode) { diff --git a/java/java-tests/testData/codeInsight/clsHighlighting/IDEA118733.java b/java/java-tests/testData/codeInsight/clsHighlighting/IDEA118733.java new file mode 100644 index 000000000000..9b2a124cfa6a --- /dev/null +++ b/java/java-tests/testData/codeInsight/clsHighlighting/IDEA118733.java @@ -0,0 +1,5 @@ +public class MyChild { + public void evaluate(Child child) { + Parent.InnerBase i = child.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/clsHighlighting/IDEA97887.java b/java/java-tests/testData/codeInsight/clsHighlighting/IDEA97887.java new file mode 100644 index 000000000000..36c97bdcbfcb --- /dev/null +++ b/java/java-tests/testData/codeInsight/clsHighlighting/IDEA97887.java @@ -0,0 +1,6 @@ +public class MyChild extends Child { + @Override + public void evaluate(InnerImpl impl) { + String s = impl.t; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/clsHighlighting/libs/IDEA118733.jar b/java/java-tests/testData/codeInsight/clsHighlighting/libs/IDEA118733.jar new file mode 100644 index 0000000000000000000000000000000000000000..bd96af38f4a87e39096d9a0819e1f4e03532630f GIT binary patch literal 1269 zcmWIWW@Zs#;Nak3Nb56qVL$@h3@i-J8JRgLddWG7#l`s ztb+gV`PeiV7JT4%sLxpyn0I9Su=rHyqw#%8Smpc&X3@?~<{s*k0(z%Rcw*cdaZx* z1?ROFxa6X%HUtPXakbquFT6Nq$3zv;Kap}SA0F_3aPQ2Y9JWShkGb)g+1q!=-LN%uJ0+T^_p zw^s1DihVFpT>5gkpnsZ8w`hFVF0Ql{au5j?eV|+g1^mTQzp(hcIsKkx_@)*i^Zi4VrEzv6rOnSH{N~HCSD=E_w3gn z#<;LHUklAQ)za^KdAQ`4^|MMXAH_#%ude7O1z&l=Q1<={@0#y@x3mp;%|e@PxU56& z3f;aUePyp{>g+1svzy)}tPXi8mysy^iysusv*QadD+7ag58hzrfd?}ra8oCo^#TTN z>v@xnnU}6yTXl8qgGIYGbieaCacGeOi>TDD`9~J|bqb&Ce~`RWDCP%)-INOTl}@E> z@6PYMZ)@=R=huIX30=E9PCcRV^@GpT6noIA&~Cr*j`5T8`=EOM&)Bd@IUdC8T_ zEXBpFzRYn;lK2y=wsNNI|2nq53ybDoYQLz;++|iey_7#^?!LyoL5T+zz7SX!IQf@e zXdZLmyTE(*0)BnH){w+)Epe?<{Ov7Q>n$Bd`x!w&dg+Maeo0_(ZUP4>Ba;XNqLe^R z)u2)W6`++F0p6&Zk>d)K@DU&jWEIwIfNln|<3O>B02i5HW_|h$jHb5$T2%@ z0V`?^00^-0^A9+t7wwy8c156 zT_P0%iewzf6rA?}t-vnX)DhlFVmt?DBPkptqOt z-HHww)kM$4_2y~pw6!rERI_p9sB>ubL!I2RcpwkWu4))*E!aqtwK z&(2Z606mmSxqW>1gVhy|Km)>dH(4yx#W2Y0HSN8C50y#)!t?y_ZGP8HPt1){3L;lu z2j2|py8m?cvStc4T8{^3oRi^ohQ8UJU7W(&!gPEmT$Q9UqOQofB5t65YSW9KJOBy$;0sd82RRmOGU2H7H6;^% zE7BHJTBL`3koc-Q)Q^krL!Tb#%194?)m=UV0o0iONo$Y2yk7&Y@jH09u~&0!8;;tH z=4bQxRfmj~cey;OeMFlnivi;T%@n|?h~t8*`g=8HXB`yw%cc30MO!3~e6?{GIJrcx z75ciM&qTMCjS;F`>(dLBq9d-H(!R~r;~E8z9qFx~%X+f&0$rM1Ldmq%@((@BDfN6s z&}onxIn&xt<@z0 zz7~XhI0{8XMNwrV^1Mwqs2d7&xf^0*L0Bc38Ofbhh0v!^rL$?$-n{1ZuM^>2)d(PD zqO&2L66ibqW%QF=leRPXMxSv~TcdFGDcG2)x0ixVqcN|%fqP=mp99(Jt?Fr{>d6*R zOhCX3EWSd%-9FNxIbL6lR?NkUtw}fak$%@&;OzcKndPQ8Ni5CM zxj|?tk_PJ;Pta+`aB3^8Qt0eqJ*d+${X?eJxqH}HU&g_|LGGRzUAR=HyGtBA%Mu-! z)Drzh?3GahxIazy%~K++(;V+cg;mJDI6M&`i~E8oIc*j7(V2E0_O0@S`-MHn+%zjU z>tU3tXiTVln2TQ2MA2boVG1V^dldRdIycTrRwmI$Gb^Bl)ubW zpyt9%kr}>vZYoY+yAUCj(379Tig}_fLERC2B^VNr)fjot1>cnSR=y0IGH2jQlE6-4 z2L>>6Q@!WB<#ws|QdA~h+U>e?3BKfg7Srgynn==$@7@;^R|YK4jFsJJac2BjznmZ# z)Q`)ojMrl8TCOJ1rYjoR&p)ojy_mk`+9C0)EdIR4%JVH6W4Q)J2U^PWl1(ruNvXxJ NK+!cXdcwcI{R0U&_sIYN literal 0 HcmV?d00001 diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/ClsGenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/ClsGenericsHighlightingTest.java new file mode 100644 index 000000000000..d9897f516ec5 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/ClsGenericsHighlightingTest.java @@ -0,0 +1,128 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * User: anna + * Date: 27-Jun-2007 + */ +package com.intellij.codeInsight; + +import com.intellij.codeInsight.intention.AddAnnotationPsiFix; +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInsight.intention.impl.DeannotateIntentionAction; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.Result; +import com.intellij.openapi.application.ex.PathManagerEx; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.CaretModel; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.AnnotationOrderRootType; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.roots.libraries.LibraryTable; +import com.intellij.openapi.util.Trinity; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.StreamUtil; +import com.intellij.openapi.vfs.*; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.testFramework.IdeaTestCase; +import com.intellij.testFramework.PsiTestUtil; +import com.intellij.testFramework.UsefulTestCase; +import com.intellij.testFramework.builders.JavaModuleFixtureBuilder; +import com.intellij.testFramework.fixtures.*; +import com.intellij.util.messages.MessageBusConnection; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ClsGenericsHighlightingTest extends UsefulTestCase { + private CodeInsightTestFixture myFixture; + private Module myModule; + + public ClsGenericsHighlightingTest() { + IdeaTestCase.initPlatformPrefix(); + } + + @Override + public void setUp() throws Exception { + super.setUp(); + final TestFixtureBuilder projectBuilder = IdeaTestFixtureFactory.getFixtureFactory().createFixtureBuilder(getName()); + + myFixture = JavaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(projectBuilder.getFixture()); + final String dataPath = PathManagerEx.getTestDataPath() + "/codeInsight/clsHighlighting"; + myFixture.setTestDataPath(dataPath); + final JavaModuleFixtureBuilder builder = projectBuilder.addModule(JavaModuleFixtureBuilder.class); + builder.setMockJdkLevel(JavaModuleFixtureBuilder.MockJdkLevel.jdk15); + + myFixture.setUp(); + myModule = builder.getFixture().getModule(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + myFixture.tearDown(); + myFixture = null; + myModule = null; + } + + private void addLibrary(@NotNull final String... libraryPath) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + final ModifiableRootModel model = ModuleRootManager.getInstance(myModule).getModifiableModel(); + final LibraryTable libraryTable = model.getModuleLibraryTable(); + final Library library = libraryTable.createLibrary("test"); + + final Library.ModifiableModel libraryModel = library.getModifiableModel(); + for (String annotationsDir : libraryPath) { + final VirtualFile libJarLocal = LocalFileSystem.getInstance().findFileByPath(myFixture.getTestDataPath() + "/libs/" + annotationsDir); + assertNotNull(libJarLocal); + final VirtualFile jarRoot = JarFileSystem.getInstance().getJarRootForLocalFile(libJarLocal); + assertNotNull(jarRoot); + libraryModel.addRoot(jarRoot , OrderRootType.CLASSES); + } + libraryModel.commit(); + final String contentUrl = VfsUtilCore.pathToUrl(myFixture.getTempDirPath()); + model.addContentEntry(contentUrl).addSourceFolder(contentUrl, false); + model.commit(); + } + }); + } + + public void testIDEA97887() throws Throwable { + doTest(); + } + + public void testIDEA118733() throws Exception { + doTest(); + } + + private void doTest() { + addLibrary(getTestName(false) + ".jar"); + myFixture.configureByFile(getTestName(false) + ".java"); + myFixture.checkHighlighting(); + } +}