JavaClassifierTypeImpl: convert to Kotlin & cleanup
This commit is contained in:
+55
-88
@@ -14,97 +14,67 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.load.java.structure.impl;
|
package org.jetbrains.kotlin.load.java.structure.impl
|
||||||
|
|
||||||
import com.intellij.psi.*;
|
import com.intellij.psi.*
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.kotlin.load.java.structure.JavaClassifierType
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.kotlin.load.java.structure.JavaType
|
||||||
import org.jetbrains.kotlin.load.java.structure.JavaClassifierType;
|
|
||||||
import org.jetbrains.kotlin.load.java.structure.JavaType;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class JavaClassifierTypeImpl extends JavaTypeImpl<PsiClassType> implements JavaClassifierType {
|
class JavaClassifierTypeImpl(psiClassType: PsiClassType) : JavaTypeImpl<PsiClassType>(psiClassType), JavaClassifierType {
|
||||||
private static class ResolutionResult {
|
|
||||||
private final JavaClassifierImpl<?> classifier;
|
|
||||||
private final PsiSubstitutor substitutor;
|
|
||||||
private final boolean isRaw;
|
|
||||||
|
|
||||||
private ResolutionResult(@Nullable JavaClassifierImpl<?> classifier, @NotNull PsiSubstitutor substitutor, boolean isRaw) {
|
private var resolutionResult: ResolutionResult? = null
|
||||||
this.classifier = classifier;
|
|
||||||
this.substitutor = substitutor;
|
|
||||||
this.isRaw = isRaw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ResolutionResult resolutionResult;
|
override val classifier: JavaClassifierImpl<*>?
|
||||||
|
get() = resolve().classifier
|
||||||
|
|
||||||
public JavaClassifierTypeImpl(@NotNull PsiClassType psiClassType) {
|
val substitutor: PsiSubstitutor
|
||||||
super(psiClassType);
|
get() = resolve().substitutor
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
override val classifierQualifiedName: String
|
||||||
@Nullable
|
get() = psi.canonicalText.convertCanonicalNameToQName()
|
||||||
public JavaClassifierImpl<?> getClassifier() {
|
|
||||||
resolve();
|
|
||||||
return resolutionResult.classifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
override val presentableText: String
|
||||||
public PsiSubstitutor getSubstitutor() {
|
get() = psi.presentableText
|
||||||
resolve();
|
|
||||||
return resolutionResult.substitutor;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void resolve() {
|
override val isRaw: Boolean
|
||||||
if (resolutionResult == null) {
|
get() = resolve().isRaw
|
||||||
PsiClassType.ClassResolveResult result = getPsi().resolveGenerics();
|
|
||||||
PsiClass psiClass = result.getElement();
|
|
||||||
PsiSubstitutor substitutor = result.getSubstitutor();
|
|
||||||
resolutionResult = new ResolutionResult(
|
|
||||||
psiClass == null ? null : JavaClassifierImpl.create(psiClass), substitutor, PsiClassType.isRaw(result)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
override// parameters including ones from outer class
|
||||||
@NotNull
|
val typeArguments: List<JavaType?>
|
||||||
public String getClassifierQualifiedName() {
|
get() {
|
||||||
return ClassNamesUtilKt.convertCanonicalNameToQName(getPsi().getCanonicalText());
|
val classifier = classifier as? JavaClassImpl ?: return emptyList()
|
||||||
}
|
val parameters = getTypeParameters(classifier.psi)
|
||||||
|
|
||||||
@Override
|
val substitutor = substitutor
|
||||||
@NotNull
|
|
||||||
public String getPresentableText() {
|
|
||||||
return getPsi().getPresentableText();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
val result = ArrayList<JavaType?>(parameters.size)
|
||||||
public boolean isRaw() {
|
for (typeParameter in parameters) {
|
||||||
resolve();
|
val substitutedType = substitutor.substitute(typeParameter)
|
||||||
return resolutionResult.isRaw;
|
result.add(substitutedType?.let { JavaTypeImpl.create(it) })
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
return result
|
||||||
@NotNull
|
|
||||||
public List<JavaType> getTypeArguments() {
|
|
||||||
JavaClassifierImpl<?> classifier = getClassifier();
|
|
||||||
if (!(classifier instanceof JavaClassImpl)) return Collections.emptyList();
|
|
||||||
|
|
||||||
// parameters including ones from outer class
|
|
||||||
List<PsiTypeParameter> parameters = getTypeParameters(classifier.getPsi());
|
|
||||||
|
|
||||||
PsiSubstitutor substitutor = getSubstitutor();
|
|
||||||
|
|
||||||
List<JavaType> result = new ArrayList<>(parameters.size());
|
|
||||||
for (PsiTypeParameter typeParameter : parameters) {
|
|
||||||
PsiType substitutedType = substitutor.substitute(typeParameter);
|
|
||||||
result.add(substitutedType == null ? null : JavaTypeImpl.create(substitutedType));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
private class ResolutionResult(
|
||||||
|
val classifier: JavaClassifierImpl<*>?,
|
||||||
|
val substitutor: PsiSubstitutor,
|
||||||
|
val isRaw: Boolean
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun resolve(): ResolutionResult {
|
||||||
|
return resolutionResult ?: run {
|
||||||
|
val result = psi.resolveGenerics()
|
||||||
|
val psiClass = result.element
|
||||||
|
val substitutor = result.substitutor
|
||||||
|
ResolutionResult(
|
||||||
|
psiClass?.let { JavaClassifierImpl.create(it) }, substitutor, PsiClassType.isRaw(result)
|
||||||
|
).apply {
|
||||||
|
resolutionResult = this
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy-pasted from PsiUtil.typeParametersIterable
|
// Copy-pasted from PsiUtil.typeParametersIterable
|
||||||
@@ -116,23 +86,20 @@ public class JavaClassifierTypeImpl extends JavaTypeImpl<PsiClassType> implement
|
|||||||
//
|
//
|
||||||
// PsiUtil.typeParametersIterable returns H3, H2, H1
|
// PsiUtil.typeParametersIterable returns H3, H2, H1
|
||||||
// But we would like to have H2, H3, H1 as such order is consistent with our type representation
|
// But we would like to have H2, H3, H1 as such order is consistent with our type representation
|
||||||
@NotNull
|
private fun getTypeParameters(owner: PsiClass): List<PsiTypeParameter> {
|
||||||
private static List<PsiTypeParameter> getTypeParameters(@NotNull PsiClass owner) {
|
var result: List<PsiTypeParameter>? = null
|
||||||
List<PsiTypeParameter> result = null;
|
|
||||||
|
|
||||||
PsiTypeParameterListOwner currentOwner = owner;
|
var currentOwner: PsiTypeParameterListOwner? = owner
|
||||||
while (currentOwner != null) {
|
while (currentOwner != null) {
|
||||||
PsiTypeParameter[] typeParameters = currentOwner.getTypeParameters();
|
val typeParameters = currentOwner.typeParameters
|
||||||
if (typeParameters.length > 0) {
|
if (typeParameters.isNotEmpty()) {
|
||||||
if (result == null) result = new ArrayList<>(typeParameters.length);
|
result = result?.let { it + typeParameters } ?: typeParameters.toList()
|
||||||
Collections.addAll(result, typeParameters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentOwner.hasModifierProperty(PsiModifier.STATIC)) break;
|
if (currentOwner.hasModifierProperty(PsiModifier.STATIC)) break
|
||||||
currentOwner = currentOwner.getContainingClass();
|
currentOwner = currentOwner.containingClass
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == null) return Collections.emptyList();
|
return result ?: emptyList()
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user