lateinit modifier on property

This commit is contained in:
Yan Zhulanow
2015-09-02 21:04:28 +03:00
parent 48bccab31e
commit add13cae82
32 changed files with 129 additions and 24 deletions
@@ -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;
@@ -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
@@ -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);
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.psi.stubs.impl.KotlinFileStubImpl;
import java.io.IOException;
public class JetFileElementType extends IStubFileElementType<KotlinFileStub> {
public static final int STUB_VERSION = 52;
public static final int STUB_VERSION = 53;
private static final String NAME = "kotlin.FILE";
@@ -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.<TypeParameterDescriptor>emptyList(),
@@ -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!
@@ -94,7 +94,8 @@ object DynamicCallableDescriptors {
true,
name,
CallableMemberDescriptor.Kind.DECLARATION,
SourceElement.NO_SOURCE
SourceElement.NO_SOURCE,
false
)
propertyDescriptor.setType(
DynamicType,
@@ -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(),
@@ -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()) {
+4
View File
@@ -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
+43
View File
@@ -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
@@ -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
@@ -53,4 +53,6 @@ public interface PropertyDescriptor extends VariableDescriptor, CallableMemberDe
@Override
PropertyDescriptor substitute(@NotNull TypeSubstitutor substitutor);
boolean isLateInit();
}
@@ -38,6 +38,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
private final Set<PropertyDescriptor> overriddenProperties = new LinkedHashSet<PropertyDescriptor>(); // 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<PropertyAccessorDescriptor> 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
@@ -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)
@@ -400,7 +400,8 @@ public class ErrorUtils {
true,
Name.special("<ERROR PROPERTY>"),
CallableMemberDescriptor.Kind.DECLARATION,
SourceElement.NO_SOURCE
SourceElement.NO_SOURCE,
/*lateInit =*/ false
);
descriptor.setType(ERROR_PROPERTY_TYPE,
Collections.<TypeParameterDescriptor>emptyList(),
@@ -250,6 +250,7 @@ message Callable {
hasGetter
hasSetter
hasConstant
lateinit
*/
optional int32 flags = 1;
@@ -48,6 +48,8 @@ public class Flags {
public static final FlagField<Boolean> HAS_SETTER = FlagField.booleanAfter(HAS_GETTER);
public static final FlagField<Boolean> HAS_CONSTANT = FlagField.booleanAfter(HAS_SETTER);
public static final FlagField<Boolean> LATE_INIT = FlagField.booleanAfter(HAS_CONSTANT);
// Parameters
public static final FlagField<Boolean> 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)
;
}
@@ -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())
@@ -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)
}
}
@@ -35,4 +35,5 @@ class MouseMovedEventArgs
/*why?*/
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
// NOTHING_ELSE
@@ -38,5 +38,6 @@ class B {
/*why?*/
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
/*TODO*/
// NOTHING_ELSE
+1
View File
@@ -38,4 +38,5 @@ class A {
/*why?*/
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
// NOTHING_ELSE
+1
View File
@@ -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
@@ -38,5 +38,6 @@ var a : Int
/*why?*/
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
/*TODO*/
// NOTHING_ELSE
@@ -36,4 +36,5 @@ public class Test {
/*why?*/
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
// NOTHING_ELSE
@@ -30,4 +30,5 @@ class TestClass {
// EXIST: init
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
// NOTHING_ELSE
@@ -29,5 +29,6 @@ package Test
/*why?*/
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
/*TODO*/
// NOTHING_ELSE
@@ -34,4 +34,5 @@ class Some {
// EXIST: init
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
// NOTHING_ELSE
@@ -34,4 +34,5 @@ class Some {
// EXIST: init
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
// NOTHING_ELSE
@@ -36,4 +36,5 @@ class Some {
// EXIST: init
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
// NOTHING_ELSE
+1
View File
@@ -28,5 +28,6 @@
/*why?*/
// EXIST: companion object
// EXIST: sealed
// EXIST: lateinit
/*TODO*/
// NOTHING_ELSE