Add a cache for KtImportDirective::importedFqName

It's very useful for Spring users because KotlinAnnotatedElementsSearcher
calls PsiBasedClassResolver::canBeTargetReference rather frequently
on a file and the latter function retreives importedFqName for each
import in the file that becomes a problem because computing fq-name
from PSI is a heavy computation

 #KT-23380 In Progress
This commit is contained in:
Denis Zharkov
2018-03-22 13:05:00 +03:00
parent 673d1aa91d
commit f060604d98
@@ -37,6 +37,8 @@ public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveSt
super(stub, KtStubElementTypes.IMPORT_DIRECTIVE);
}
private volatile FqName importedFqName;
@Override
public <R, D> R accept(@NotNull KtVisitor<R, D> visitor, D data) {
return visitor.visitImportDirective(this, data);
@@ -78,7 +80,16 @@ public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveSt
if (stub != null) {
return stub.getImportedFqName();
}
return fqNameFromExpression(getImportedReference());
FqName importedFqName = this.importedFqName;
if (importedFqName != null) return importedFqName;
KtExpression importedReference = getImportedReference();
// in case it's not parsed
if (importedReference == null) return null;
importedFqName = fqNameFromExpression(importedReference);
this.importedFqName = importedFqName;
return importedFqName;
}
@Nullable
@@ -106,6 +117,12 @@ public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveSt
return !PsiTreeUtil.hasErrorElements(this);
}
@Override
public void subtreeChanged() {
super.subtreeChanged();
importedFqName = null;
}
@Nullable
private static FqName fqNameFromExpression(@Nullable KtExpression expression) {
if (expression == null) {