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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user