Fixed generic type references when read from cls files (IDEA-141230)

https://github.com/JetBrains/intellij-community/pull/273
This commit is contained in:
Sebastian Zarnekow
2015-06-09 15:35:12 +03:00
committed by Roman Shevchenko
parent 4b4671f860
commit 8c20a632da
4 changed files with 73 additions and 3 deletions
@@ -22,7 +22,9 @@ import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiClassType
import com.intellij.psi.PsiMethod
import com.intellij.psi.impl.JavaPsiFacadeEx
import com.intellij.psi.impl.source.PsiFileImpl
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.searches.ClassInheritorsSearch
@@ -236,4 +238,51 @@ class TestCase {
assert method.hierarchicalMethodSignature.superSignatures.size() == 0
}
public void "test nested generic signature from binary"() {
myFixture.testDataPath = PathManagerEx.getTestDataPath() + "/libResolve/genericSignature"
myFixture.copyDirectoryToProject("", "lib")
PsiTestUtil.addLibrary(myModule, "lib", myFixture.tempDirFixture.getFile("").path, "lib");
def javaPsiFacade = JavaPsiFacadeEx.getInstanceEx(project)
def factory = javaPsiFacade.elementFactory
def parameterizedTypes = JavaPsiFacade.getInstance(project).findClass('pkg.ParameterizedTypes', GlobalSearchScope.allScope(project))
assert parameterizedTypes
def parameterP = parameterizedTypes.typeParameters[0]
assert parameterP.name == 'P'
def classInner = parameterizedTypes.innerClasses[0]
assert classInner.name == 'Inner'
def parameterI = classInner.typeParameters[0]
assert parameterI.name == 'I'
def unspecificMethod = parameterizedTypes.findMethodsByName("getUnspecificInner", false)[0]
def unspecificReturnType = unspecificMethod.returnType as PsiClassType
assert unspecificReturnType.canonicalText == 'pkg.ParameterizedTypes<P>.Inner<java.lang.String>'
def unspecificResolveResult = unspecificReturnType.resolveGenerics()
assert unspecificResolveResult.element == classInner
def unspecificOuter = factory.createType(parameterizedTypes, unspecificResolveResult.substitutor);
assert unspecificOuter.canonicalText == 'pkg.ParameterizedTypes<P>'
def specificMethod = parameterizedTypes.findMethodsByName("getSpecificInner", false)[0]
def specificReturnType = specificMethod.returnType as PsiClassType
assert specificReturnType.canonicalText == 'pkg.ParameterizedTypes<java.lang.Number>.Inner<java.lang.String>'
def specificResolveResult = specificReturnType.resolveGenerics()
assert specificResolveResult.element == classInner
def substitutor = specificResolveResult.substitutor
def substitutionMap = substitutor.substitutionMap
assert substitutionMap.containsKey(parameterI)
assert substitutionMap.containsKey(parameterP)
assert substitutor.substitute(parameterP).canonicalText == 'java.lang.Number'
def specificOuter = factory.createType(parameterizedTypes, specificResolveResult.substitutor);
assert specificOuter.canonicalText == 'pkg.ParameterizedTypes<java.lang.Number>'
}
}