mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
Fixed generic type references when read from cls files (IDEA-141230)
https://github.com/JetBrains/intellij-community/pull/273
This commit is contained in:
committed by
Roman Shevchenko
parent
4b4671f860
commit
8c20a632da
Binary file not shown.
Binary file not shown.
@@ -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>'
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user