+
+ # Collect undefined attributes
+ var mparameters = new Array[MParameter]
+ var initializers = new Array[MProperty]
+ var anode: nullable ANode = null
+ for npropdef in nclassdef.n_propdefs do
+ if npropdef isa AAttrPropdef then
+ if npropdef.mpropdef == null then return # Skip broken attribute
+ var at = npropdef.get_single_annotation("noinit", self)
+ if at != null then
+ npropdef.noinit = true
+ if npropdef.n_expr != null then
+ self.error(at, "Error: `noinit` attributes cannot have an initial value")
+ end
+ continue # Skip noinit attributes
+ end
+ if npropdef.n_expr != null then continue
+ var paramname = npropdef.mpropdef.mproperty.name.substring_from(1)
+ var ret_type = npropdef.mpropdef.static_mtype
+ if ret_type == null then return
+ var mparameter = new MParameter(paramname, ret_type, false)
+ mparameters.add(mparameter)
+ var msetter = npropdef.mwritepropdef
+ if msetter == null then
+ # No setter, it is a old-style attribute, so just add it
+ initializers.add(npropdef.mpropdef.mproperty)
+ else
+ # Add the setter to the list
+ initializers.add(msetter.mproperty)
+ end
+ if anode == null then anode = npropdef
+ end
+ end
+ if anode == null then anode = nclassdef
+