nitc :: MClassKind :: defaultinit
# A kind of class.
#
# * `abstract_kind`
# * `concrete_kind`
# * `interface_kind`
# * `enum_kind`
# * `extern_kind`
#
# Note this class is basically an enum.
# FIXME: use a real enum once user-defined enums are available
class MClassKind
redef var to_s
# Can a class of kind `self` define a membership predicate?
var can_customize_isa: Bool
# Can a class of kind `self` define a constructor?
var can_init: Bool
# Is a constructor required?
var need_init: Bool
# TODO: private init because enumeration.
# Can a class of kind `self` specializes a class of kind `other`?
fun can_specialize(other: MClassKind): Bool
do
if other == interface_kind then
# everybody can specialize interfaces
return true
else if self == interface_kind or self == enum_kind then
# no other case for interfaces and enums
return false
else if self == subset_kind then
# A subset may specialize anything, except another subset.
# TODO: Allow sub-subsets once we can handle them.
return other != subset_kind
else if self == extern_kind then
# only compatible with themselves
return self == other
else
# assert self == abstract_kind or self == concrete_kind
return other == abstract_kind or other == concrete_kind
end
end
end
src/model/model.nit:2720,1--2765,3