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);
|
super(stub, KtStubElementTypes.IMPORT_DIRECTIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private volatile FqName importedFqName;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <R, D> R accept(@NotNull KtVisitor<R, D> visitor, D data) {
|
public <R, D> R accept(@NotNull KtVisitor<R, D> visitor, D data) {
|
||||||
return visitor.visitImportDirective(this, data);
|
return visitor.visitImportDirective(this, data);
|
||||||
@@ -78,7 +80,16 @@ public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveSt
|
|||||||
if (stub != null) {
|
if (stub != null) {
|
||||||
return stub.getImportedFqName();
|
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
|
@Nullable
|
||||||
@@ -106,6 +117,12 @@ public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveSt
|
|||||||
return !PsiTreeUtil.hasErrorElements(this);
|
return !PsiTreeUtil.hasErrorElements(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void subtreeChanged() {
|
||||||
|
super.subtreeChanged();
|
||||||
|
importedFqName = null;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static FqName fqNameFromExpression(@Nullable KtExpression expression) {
|
private static FqName fqNameFromExpression(@Nullable KtExpression expression) {
|
||||||
if (expression == null) {
|
if (expression == null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user