Fix JavaClassifierType.getTypeArguments impls

Make them return arguments both for current classifier and for the outer one
This commit is contained in:
Denis Zharkov
2015-11-03 18:17:28 +03:00
parent 910718ff45
commit c5103f9ac4
11 changed files with 102 additions and 9 deletions
@@ -17,14 +17,13 @@
package org.jetbrains.kotlin.load.java.structure.impl;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.load.java.structure.*;
import java.util.*;
import static org.jetbrains.kotlin.load.java.structure.impl.JavaElementCollectionFromPsiArrayUtil.types;
public class JavaClassifierTypeImpl extends JavaTypeImpl<PsiClassType> implements JavaClassifierType {
private static class ResolutionResult {
private final JavaClassifier classifier;
@@ -110,6 +109,33 @@ public class JavaClassifierTypeImpl extends JavaTypeImpl<PsiClassType> implement
@Override
@NotNull
public List<JavaType> getTypeArguments() {
return types(getPsi().getParameters());
JavaClassifier classifier = getClassifier();
// parameters including ones from outer class
Iterable<PsiTypeParameter> parameters = classifier instanceof JavaClassImpl
? getReversedTypeParameters((JavaClassImpl) classifier)
: Collections.<PsiTypeParameter>emptyList();
JavaTypeSubstitutor substitutor = getSubstitutor();
List<JavaType> result = new ArrayList<JavaType>();
for (PsiTypeParameter typeParameter : parameters) {
result.add(substitutor.substitute(new JavaTypeParameterImpl(typeParameter)));
}
return result;
}
private static Collection<PsiTypeParameter> getReversedTypeParameters(@NotNull JavaClassImpl classifier) {
Iterable<PsiTypeParameter> parameters = PsiUtil.typeParametersIterable(classifier.getPsi());
List<PsiTypeParameter> result = new ArrayList<PsiTypeParameter>();
for (PsiTypeParameter parameter : parameters) {
result.add(parameter);
}
Collections.reverse(result);
return result;
}
}