[FIR] Use stubs for creating lazy bodies of backing field initializer

Ninth step for ^KT-52615

Merge-request: KT-MR-8756
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2023-02-10 10:02:39 +00:00
committed by Space Team
parent 93a1d61a30
commit 32c3b0cd58
6 changed files with 27 additions and 7 deletions
@@ -1705,7 +1705,7 @@ open class RawFirBuilder(
private fun KtDeclarationWithInitializer.toInitializerExpression() =
runIf(hasInitializer()) {
buildOrLazyExpression(initializer?.toFirSourceElement()) {
buildOrLazyExpression(null) {
initializer.toFirExpression("Should have initializer")
}
}
@@ -62,11 +62,19 @@ public class KtBackingField extends KtDeclarationStub<KotlinBackingFieldStub>
@Nullable
@Override
public KtExpression getInitializer() {
KotlinBackingFieldStub stub = getStub();
if (stub != null && !stub.hasInitializer()) {
return null;
}
return PsiTreeUtil.getNextSiblingOfType(getEqualsToken(), KtExpression.class);
}
@Override
public boolean hasInitializer() {
KotlinBackingFieldStub stub = getStub();
if (stub != null) {
return stub.hasInitializer();
}
return getInitializer() != null;
}
@@ -23,7 +23,7 @@ object KotlinStubVersions {
// Though only kotlin declarations (no code in the bodies) are stubbed, please do increase this version
// if you are not 100% sure it can be avoided.
// Increasing this version will lead to reindexing of all kotlin source files on the first IDE startup with the new version.
const val SOURCE_STUB_VERSION = 145
const val SOURCE_STUB_VERSION = 146
// Binary stub version should be increased if stub format (org.jetbrains.kotlin.psi.stubs.impl) is changed
// or changes are made to the core stub building code (org.jetbrains.kotlin.idea.decompiler.stubBuilder).
@@ -127,7 +127,9 @@ interface KotlinPropertyAccessorStub : StubElement<KtPropertyAccessor> {
fun hasBlockBody(): Boolean
}
interface KotlinBackingFieldStub : StubElement<KtBackingField>
interface KotlinBackingFieldStub : StubElement<KtBackingField> {
fun hasInitializer(): Boolean
}
interface KotlinPropertyStub : KotlinCallableStubBase<KtProperty> {
fun isVar(): Boolean
@@ -34,15 +34,18 @@ public class KtBackingFieldElementType extends KtStubElementType<KotlinBackingFi
@Override
public KotlinBackingFieldStub createStub(@NotNull KtBackingField psi, StubElement parentStub) {
return new KotlinBackingFieldStubImpl(parentStub);
return new KotlinBackingFieldStubImpl(parentStub, psi.hasInitializer());
}
@Override
public void serialize(@NotNull KotlinBackingFieldStub stub, @NotNull StubOutputStream dataStream) throws IOException {}
public void serialize(@NotNull KotlinBackingFieldStub stub, @NotNull StubOutputStream dataStream) throws IOException {
dataStream.writeBoolean(stub.hasInitializer());
}
@NotNull
@Override
public KotlinBackingFieldStub deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
return new KotlinBackingFieldStubImpl(parentStub);
boolean hasInitializer = dataStream.readBoolean();
return new KotlinBackingFieldStubImpl(parentStub, hasInitializer);
}
}
@@ -23,7 +23,14 @@ import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
public class KotlinBackingFieldStubImpl extends KotlinStubBaseImpl<KtBackingField>
implements KotlinBackingFieldStub {
public KotlinBackingFieldStubImpl(StubElement<?> parent) {
private final boolean hasInitializer;
public KotlinBackingFieldStubImpl(StubElement<?> parent, boolean hasInitializer) {
super(parent, KtStubElementTypes.BACKING_FIELD);
this.hasInitializer = hasInitializer;
}
@Override
public boolean hasInitializer() {
return hasInitializer;
}
}