diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.java index 2408a0c4df7..81130a4a11b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.java @@ -48,7 +48,7 @@ public class AccessorForPropertyDescriptor extends PropertyDescriptorImpl implem ) { super(containingDeclaration, null, Annotations.EMPTY, Modality.FINAL, Visibilities.LOCAL, original.isVar(), Name.identifier("access$" + getIndexedAccessorSuffix(original, index)), - Kind.DECLARATION, SourceElement.NO_SOURCE); + Kind.DECLARATION, SourceElement.NO_SOURCE, false); this.calleeDescriptor = original; this.accessorIndex = index; diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt index ceea96af979..a8bc9825c6e 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt @@ -260,7 +260,8 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager) : JetScopeImp name: Name, kind: CallableMemberDescriptor.Kind, source: SourceElement - ) : SyntheticJavaPropertyDescriptor, PropertyDescriptorImpl(containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, source) { + ) : SyntheticJavaPropertyDescriptor, PropertyDescriptorImpl(containingDeclaration, original, annotations, + modality, visibility, isVar, name, kind, source, false) { override var getMethod: FunctionDescriptor by Delegates.notNull() private set diff --git a/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java b/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java index 36b658ea0b5..1af0c6cc46a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java @@ -166,6 +166,8 @@ public interface JetTokens { JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally"); JetModifierKeywordToken FINAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("final"); + JetModifierKeywordToken LATE_INIT_KEYWORD = JetModifierKeywordToken.softKeywordModifier("lateinit"); + TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD, THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD, NULL_KEYWORD, @@ -180,7 +182,8 @@ public interface JetTokens { OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD, DYNAMIC_KEYWORD, COMPANION_KEYWORD, CONSTRUCTOR_KEYWORD, INIT_KEYWORD, SEALED_KEYWORD, - FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD + FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD, + LATE_INIT_KEYWORD ); /* @@ -192,7 +195,7 @@ public interface JetTokens { new JetModifierKeywordToken[] { ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, - REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD + REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATE_INIT_KEYWORD }; TokenSet MODIFIER_KEYWORDS = TokenSet.create(MODIFIER_KEYWORDS_ARRAY); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/JetFileElementType.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/JetFileElementType.java index d247aeae7a1..ff173347d97 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/JetFileElementType.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/JetFileElementType.java @@ -36,7 +36,7 @@ import org.jetbrains.kotlin.psi.stubs.impl.KotlinFileStubImpl; import java.io.IOException; public class JetFileElementType extends IStubFileElementType { - public static final int STUB_VERSION = 52; + public static final int STUB_VERSION = 53; private static final String NAME = "kotlin.FILE"; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 67b660bfa42..0756a37c318 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -641,7 +641,8 @@ public class DescriptorResolver { variable.isVar(), JetPsiUtil.safeName(variable.getName()), CallableMemberDescriptor.Kind.DECLARATION, - toSourceElement(variable) + toSourceElement(variable), + false ); // For a local variable the type must not be deferred type = getVariableType(propertyDescriptor, scope, variable, dataFlowInfo, false, trace); @@ -738,7 +739,8 @@ public class DescriptorResolver { isVar, JetPsiUtil.safeName(property.getName()), CallableMemberDescriptor.Kind.DECLARATION, - toSourceElement(property) + toSourceElement(property), + modifierList != null && modifierList.hasModifier(JetTokens.LATE_INIT_KEYWORD) ); wrapper.setProperty(propertyDescriptor); @@ -1112,7 +1114,8 @@ public class DescriptorResolver { isMutable, name, CallableMemberDescriptor.Kind.DECLARATION, - toSourceElement(parameter) + toSourceElement(parameter), + false ); propertyWrapper.setProperty(propertyDescriptor); propertyDescriptor.setType(type, Collections.emptyList(), diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 6a4c7f51e11..4de665bb46a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -56,7 +56,8 @@ public object ModifierCheckerCore { OUT_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION), REIFIED_KEYWORD to EnumSet.of(TYPE_PARAMETER), VARARG_KEYWORD to EnumSet.of(VALUE_PARAMETER, PROPERTY_PARAMETER), - COMPANION_KEYWORD to EnumSet.of(OBJECT) + COMPANION_KEYWORD to EnumSet.of(OBJECT), + LATE_INIT_KEYWORD to EnumSet.of(MEMBER_PROPERTY) ) // NOTE: redundant targets must be possible! diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt index 2b74874f47c..449f5fca625 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt @@ -94,7 +94,8 @@ object DynamicCallableDescriptors { true, name, CallableMemberDescriptor.Kind.DECLARATION, - SourceElement.NO_SOURCE + SourceElement.NO_SOURCE, + false ) propertyDescriptor.setType( DynamicType, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt index 8f702d26b58..9f36b9afb1b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt @@ -92,7 +92,8 @@ public class LazyScriptClassMemberScope protected constructor( false, Name.identifier(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME), CallableMemberDescriptor.Kind.DECLARATION, - SourceElement.NO_SOURCE + SourceElement.NO_SOURCE, + false ) val returnType = scriptDescriptor.getScriptCodeDescriptor().getReturnType() @@ -132,7 +133,8 @@ public class LazyScriptClassMemberScope protected constructor( false, parameter.getName(), CallableMemberDescriptor.Kind.DECLARATION, - SourceElement.NO_SOURCE + SourceElement.NO_SOURCE, + false ) propertyDescriptor.setType( parameter.getType(), diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java index 698ddb2c3ce..d106bac048f 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java @@ -154,8 +154,11 @@ public class DescriptorSerializer { boolean hasGetter = false; boolean hasSetter = false; boolean hasConstant = false; + boolean lateInit = false; + if (descriptor instanceof PropertyDescriptor) { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; + lateInit = propertyDescriptor.isLateInit(); int propertyFlags = Flags.getAccessorFlags( hasAnnotations(propertyDescriptor), @@ -204,7 +207,8 @@ public class DescriptorSerializer { callableKind(descriptor), hasGetter, hasSetter, - hasConstant + hasConstant, + lateInit )); for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) { diff --git a/compiler/testData/psi/SoftKeywords.kt b/compiler/testData/psi/SoftKeywords.kt index 55e0c82591b..af88fcd315b 100644 --- a/compiler/testData/psi/SoftKeywords.kt +++ b/compiler/testData/psi/SoftKeywords.kt @@ -59,6 +59,7 @@ ref val receiver val param val sparam + val lateinit get() = a set(S : s) {} @@ -92,6 +93,7 @@ ref fun receiver () : receiver fun param () : param fun sparam () : sparam + fun lateinit () : lateinit fun test( abstract : t, @@ -122,6 +124,7 @@ ref receiver : t, param : t, sparam : t, + lateinit : t, public protected private internal abstract open enum @@ -169,6 +172,7 @@ class F(val foo : bar, receiver : t, param : t, sparam : t, + lateinit : t, public protected private internal abstract open enum diff --git a/compiler/testData/psi/SoftKeywords.txt b/compiler/testData/psi/SoftKeywords.txt index baa7d2c5a0e..5f52968d1cf 100644 --- a/compiler/testData/psi/SoftKeywords.txt +++ b/compiler/testData/psi/SoftKeywords.txt @@ -320,6 +320,11 @@ JetFile: SoftKeywords.kt PsiElement(val)('val') PsiWhiteSpace(' ') PsiElement(IDENTIFIER)('sparam') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('lateinit') PsiWhiteSpace('\n ') PROPERTY_ACCESSOR PsiElement(get)('get') @@ -806,6 +811,22 @@ JetFile: SoftKeywords.kt USER_TYPE REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('sparam') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('lateinit') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('lateinit') PsiWhiteSpace('\n\n ') FUN PsiElement(fun)('fun') @@ -1121,6 +1142,17 @@ JetFile: SoftKeywords.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('t') PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('lateinit') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') PsiWhiteSpace('\n ') VALUE_PARAMETER MODIFIER_LIST @@ -1501,6 +1533,17 @@ JetFile: SoftKeywords.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('t') PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('lateinit') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') PsiWhiteSpace('\n ') VALUE_PARAMETER MODIFIER_LIST diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java index 5bcfa77bde4..afc762cf76d 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java @@ -36,7 +36,7 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja @NotNull SourceElement source, @Nullable PropertyDescriptor original ) { - super(containingDeclaration, original, annotations, Modality.FINAL, visibility, isVar, name, Kind.DECLARATION, source); + super(containingDeclaration, original, annotations, Modality.FINAL, visibility, isVar, name, Kind.DECLARATION, source, false); } @Override diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PropertyDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PropertyDescriptor.java index b1de3ff905a..de12acc7630 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PropertyDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PropertyDescriptor.java @@ -53,4 +53,6 @@ public interface PropertyDescriptor extends VariableDescriptor, CallableMemberDe @Override PropertyDescriptor substitute(@NotNull TypeSubstitutor substitutor); + + boolean isLateInit(); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java index c6a82ce6892..301c6c02c16 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java @@ -38,6 +38,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp private final Set overriddenProperties = new LinkedHashSet(); // LinkedHashSet is essential here private final PropertyDescriptor original; private final Kind kind; + private final boolean lateInit; private ReceiverParameterDescriptor dispatchReceiverParameter; private ReceiverParameterDescriptor extensionReceiverParameter; @@ -55,13 +56,15 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp boolean isVar, @NotNull Name name, @NotNull Kind kind, - @NotNull SourceElement source + @NotNull SourceElement source, + boolean lateInit ) { super(containingDeclaration, annotations, name, null, isVar, source); this.modality = modality; this.visibility = visibility; this.original = original == null ? this : original; this.kind = kind; + this.lateInit = lateInit; } @NotNull @@ -73,9 +76,11 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp boolean isVar, @NotNull Name name, @NotNull Kind kind, - @NotNull SourceElement source + @NotNull SourceElement source, + boolean lateInit ) { - return new PropertyDescriptorImpl(containingDeclaration, null, annotations, modality, visibility, isVar, name, kind, source); + return new PropertyDescriptorImpl(containingDeclaration, null, annotations, + modality, visibility, isVar, name, kind, source, lateInit); } public void setType( @@ -168,6 +173,11 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp return setterProjectedOut; } + @Override + public boolean isLateInit() { + return lateInit; + } + @Override @NotNull public List getAccessors() { @@ -288,7 +298,8 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp @NotNull Kind kind ) { return new PropertyDescriptorImpl(newOwner, original, - getAnnotations(), newModality, newVisibility, isVar(), getName(), kind, SourceElement.NO_SOURCE); + getAnnotations(), newModality, newVisibility, + isVar(), getName(), kind, SourceElement.NO_SOURCE, isLateInit()); } @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index 46a93f939a6..56c31535a99 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -458,6 +458,12 @@ internal class DescriptorRendererImpl( } } + private fun renderLateInit(propertyDescriptor: PropertyDescriptor, builder: StringBuilder) { + if (propertyDescriptor.isLateInit) { + builder.append("lateinit ") + } + } + override fun render(declarationDescriptor: DeclarationDescriptor): String { return StringBuilder { declarationDescriptor.accept(RenderDeclarationDescriptorVisitor(), this) @@ -706,6 +712,7 @@ internal class DescriptorRendererImpl( renderVisibility(property.getVisibility(), builder) renderModalityForCallable(property, builder) renderOverride(property, builder) + renderLateInit(property, builder) renderMemberKind(property, builder) renderValVarPrefix(property, builder) renderTypeParameters(property.getTypeParameters(), builder, true) diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index 0c722e2cad2..e16d8b3ff5e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -400,7 +400,8 @@ public class ErrorUtils { true, Name.special(""), CallableMemberDescriptor.Kind.DECLARATION, - SourceElement.NO_SOURCE + SourceElement.NO_SOURCE, + /*lateInit =*/ false ); descriptor.setType(ERROR_PROPERTY_TYPE, Collections.emptyList(), diff --git a/core/deserialization/src/descriptors.proto b/core/deserialization/src/descriptors.proto index e2a60fa1b49..71faf27a7b8 100644 --- a/core/deserialization/src/descriptors.proto +++ b/core/deserialization/src/descriptors.proto @@ -250,6 +250,7 @@ message Callable { hasGetter hasSetter hasConstant + lateinit */ optional int32 flags = 1; diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java index ef6d4069da5..9ad679f1632 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java @@ -48,6 +48,8 @@ public class Flags { public static final FlagField HAS_SETTER = FlagField.booleanAfter(HAS_GETTER); public static final FlagField HAS_CONSTANT = FlagField.booleanAfter(HAS_SETTER); + public static final FlagField LATE_INIT = FlagField.booleanAfter(HAS_CONSTANT); + // Parameters public static final FlagField DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS); @@ -112,7 +114,8 @@ public class Flags { @NotNull ProtoBuf.Callable.CallableKind callableKind, boolean hasGetter, boolean hasSetter, - boolean hasConstant + boolean hasConstant, + boolean lateInit ) { return HAS_ANNOTATIONS.toFlags(hasAnnotations) | MODALITY.toFlags(modality(modality)) @@ -122,6 +125,7 @@ public class Flags { | HAS_GETTER.toFlags(hasGetter) | HAS_SETTER.toFlags(hasSetter) | HAS_CONSTANT.toFlags(hasConstant) + | LATE_INIT.toFlags(lateInit) ; } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt index f607440a87e..5259582b7ba 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt @@ -45,6 +45,8 @@ public class MemberDeserializer(private val c: DeserializationContext) { private fun loadProperty(proto: Callable): PropertyDescriptor { val flags = proto.getFlags() + val lateInit = Flags.LATE_INIT.get(flags) + val property = DeserializedPropertyDescriptor( c.containingDeclaration, null, getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY), @@ -54,7 +56,8 @@ public class MemberDeserializer(private val c: DeserializationContext) { c.nameResolver.getName(proto.getName()), memberKind(Flags.MEMBER_KIND.get(flags)), proto, - c.nameResolver + c.nameResolver, + Flags.LATE_INIT.get(flags) ) val local = c.childContext(property, proto.getTypeParameterList()) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPropertyDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPropertyDescriptor.kt index d6eaf7ea0b8..673a3dd7f8d 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPropertyDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPropertyDescriptor.kt @@ -38,9 +38,11 @@ public class DeserializedPropertyDescriptor( name: Name, kind: Kind, override public val proto: ProtoBuf.Callable, - override public val nameResolver: NameResolver + override public val nameResolver: NameResolver, + lateInit: Boolean ) : DeserializedCallableMemberDescriptor, - PropertyDescriptorImpl(containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, SourceElement.NO_SOURCE) { + PropertyDescriptorImpl(containingDeclaration, original, annotations, + modality, visibility, isVar, name, kind, SourceElement.NO_SOURCE, lateInit) { override fun createSubstitutedCopy( newOwner: DeclarationDescriptor, @@ -50,6 +52,6 @@ public class DeserializedPropertyDescriptor( kind: Kind ): PropertyDescriptorImpl { return DeserializedPropertyDescriptor( - newOwner, original, getAnnotations(), newModality, newVisibility, isVar(), getName(), kind, proto, nameResolver) + newOwner, original, annotations, newModality, newVisibility, isVar, name, kind, proto, nameResolver, isLateInit) } } diff --git a/idea/idea-completion/testData/keywords/AfterClassProperty.kt b/idea/idea-completion/testData/keywords/AfterClassProperty.kt index 93f3851a6e9..6e046108750 100644 --- a/idea/idea-completion/testData/keywords/AfterClassProperty.kt +++ b/idea/idea-completion/testData/keywords/AfterClassProperty.kt @@ -35,4 +35,5 @@ class MouseMovedEventArgs /*why?*/ // EXIST: companion object // EXIST: sealed +// EXIST: lateinit // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/AfterClasses.kt b/idea/idea-completion/testData/keywords/AfterClasses.kt index 46b0c294c42..7c41e063ed9 100644 --- a/idea/idea-completion/testData/keywords/AfterClasses.kt +++ b/idea/idea-completion/testData/keywords/AfterClasses.kt @@ -38,5 +38,6 @@ class B { /*why?*/ // EXIST: companion object // EXIST: sealed +// EXIST: lateinit /*TODO*/ // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/AfterFuns.kt b/idea/idea-completion/testData/keywords/AfterFuns.kt index d7cde5ea482..5cc1b77316d 100644 --- a/idea/idea-completion/testData/keywords/AfterFuns.kt +++ b/idea/idea-completion/testData/keywords/AfterFuns.kt @@ -38,4 +38,5 @@ class A { /*why?*/ // EXIST: companion object // EXIST: sealed +// EXIST: lateinit // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/FileKeyword.kt b/idea/idea-completion/testData/keywords/FileKeyword.kt index 78d5ef641ec..9f24c06ab95 100644 --- a/idea/idea-completion/testData/keywords/FileKeyword.kt +++ b/idea/idea-completion/testData/keywords/FileKeyword.kt @@ -23,4 +23,5 @@ // EXIST: {"lookupString":"val","itemText":"val","attributes":"bold"} // EXIST: {"lookupString":"var","itemText":"var","attributes":"bold"} // EXIST: {"lookupString":"vararg","itemText":"vararg","attributes":"bold"} +// EXIST: {"lookupString":"lateinit","itemText":"lateinit","attributes":"bold"} // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt index 26e88f60f75..fd01faf53e2 100644 --- a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt @@ -38,5 +38,6 @@ var a : Int /*why?*/ // EXIST: companion object // EXIST: sealed +// EXIST: lateinit /*TODO*/ // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt index 32a9133121d..3759955ad03 100644 --- a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt +++ b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt @@ -36,4 +36,5 @@ public class Test { /*why?*/ // EXIST: companion object // EXIST: sealed +// EXIST: lateinit // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InClassScope.kt b/idea/idea-completion/testData/keywords/InClassScope.kt index 93ea7db0a6b..4ac6c6a13eb 100644 --- a/idea/idea-completion/testData/keywords/InClassScope.kt +++ b/idea/idea-completion/testData/keywords/InClassScope.kt @@ -30,4 +30,5 @@ class TestClass { // EXIST: init // EXIST: companion object // EXIST: sealed +// EXIST: lateinit // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt b/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt index 139a7da2242..5da4807ab10 100644 --- a/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt +++ b/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt @@ -29,5 +29,6 @@ package Test /*why?*/ // EXIST: companion object // EXIST: sealed +// EXIST: lateinit /*TODO*/ // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors.kt b/idea/idea-completion/testData/keywords/PropertyAccessors.kt index 8d1a7f35848..6de811c7ebe 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors.kt @@ -34,4 +34,5 @@ class Some { // EXIST: init // EXIST: companion object // EXIST: sealed +// EXIST: lateinit // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt index 5c00b0b9f28..a339a66b8ee 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt @@ -34,4 +34,5 @@ class Some { // EXIST: init // EXIST: companion object // EXIST: sealed +// EXIST: lateinit // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertySetter.kt b/idea/idea-completion/testData/keywords/PropertySetter.kt index 024f79c4062..3a7db32d8c6 100644 --- a/idea/idea-completion/testData/keywords/PropertySetter.kt +++ b/idea/idea-completion/testData/keywords/PropertySetter.kt @@ -36,4 +36,5 @@ class Some { // EXIST: init // EXIST: companion object // EXIST: sealed +// EXIST: lateinit // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/TopScope.kt b/idea/idea-completion/testData/keywords/TopScope.kt index 470e9e640d5..73ebd21b19f 100644 --- a/idea/idea-completion/testData/keywords/TopScope.kt +++ b/idea/idea-completion/testData/keywords/TopScope.kt @@ -28,5 +28,6 @@ /*why?*/ // EXIST: companion object // EXIST: sealed +// EXIST: lateinit /*TODO*/ // NOTHING_ELSE