From 94d9fd8b722396a7055b2559e278803df7f03b83 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 1 Nov 2018 10:59:07 +0300 Subject: [PATCH] Add our own version of LightReferenceListBuilder There are some issues with one from the platform that may be backported at some moment, but now it's faster to have our own implementation --- .../KotlinLightReferenceListBuilder.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightReferenceListBuilder.java diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightReferenceListBuilder.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightReferenceListBuilder.java new file mode 100644 index 00000000000..35a0e656478 --- /dev/null +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightReferenceListBuilder.java @@ -0,0 +1,94 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.asJava.classes; + +import com.intellij.lang.Language; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.psi.*; +import com.intellij.psi.impl.light.LightReferenceListBuilder; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Copy-pasted mostly from com.intellij.psi.impl.light.LightReferenceListBuilder + */ +public class KotlinLightReferenceListBuilder extends LightReferenceListBuilder implements PsiReferenceList { + private final List myRefs = new ArrayList<>(); + private PsiJavaCodeReferenceElement[] myCachedRefs; + private PsiClassType[] myCachedTypes; + private final Role myRole; + private final PsiElementFactory myFactory; + + public KotlinLightReferenceListBuilder(PsiManager manager, Role role) { + this(manager, JavaLanguage.INSTANCE, role); + } + + public KotlinLightReferenceListBuilder(PsiManager manager, Language language, Role role) { + super(manager, language, role); + myRole = role; + myFactory = JavaPsiFacade.getElementFactory(getProject()); + } + + @Override + public void addReference(PsiClass aClass) { + addReference(aClass.getQualifiedName()); + } + + @Override + public void addReference(String qualifiedName) { + final PsiJavaCodeReferenceElement ref = myFactory.createReferenceElementByFQClassName(qualifiedName, getResolveScope()); + myRefs.add(ref); + } + + @Override + public void addReference(PsiClassType type) { + final PsiClass resolved = type.resolve(); + if (resolved == null) return; + + final PsiJavaCodeReferenceElement ref = myFactory.createReferenceElementByType(type); + myRefs.add(ref); + } + + @NotNull + @Override + public PsiJavaCodeReferenceElement[] getReferenceElements() { + if (myCachedRefs == null) { + if (myRefs.isEmpty()) { + myCachedRefs = PsiJavaCodeReferenceElement.EMPTY_ARRAY; + } + else { + myCachedRefs = myRefs.toArray(PsiJavaCodeReferenceElement.EMPTY_ARRAY); + } + } + return myCachedRefs; + } + + @NotNull + @Override + public PsiClassType[] getReferencedTypes() { + if (myCachedTypes == null) { + if (myRefs.isEmpty()) { + myCachedTypes = PsiClassType.EMPTY_ARRAY; + } + else { + final int size = myRefs.size(); + myCachedTypes = new PsiClassType[size]; + for (int i = 0; i < size; i++) { + myCachedTypes[i] = myFactory.createType(myRefs.get(i)); + } + } + } + + return myCachedTypes; + } + + @Override + public Role getRole() { + return myRole; + } +}