nullable: convert lib, tools and tests
[nit.git] / src / nitdoc.nit
index 0fc787f..4c98a84 100644 (file)
@@ -26,7 +26,7 @@ import abstracttool
 class DocContext
 special AbstractCompiler
        # Destination directory
-       readable writable attr _dir: String
+       readable writable attr _dir: String = "."
 
        # Content of a generated file
        attr _stage_context: StageContext = new StageContext(null)
@@ -51,6 +51,7 @@ special AbstractCompiler
                        s.content.add_all(_stage_context.content)
                        s.validate = true
                end
+               assert s != null
                _stage_context = s
        end
 
@@ -66,13 +67,13 @@ special AbstractCompiler
        end
 
        # Currently computed module
-       readable attr _module: MMSrcModule
+       readable attr _module: nullable MMSrcModule
 
        # Is the current directory module computed as a simple modude ?
-       readable writable attr _inside_mode: Bool
+       readable writable attr _inside_mode: Bool = false
 
        # Is the current module computed as a intruded one ?
-       readable writable attr _intrude_mode: Bool
+       readable writable attr _intrude_mode: Bool = false
 
        # Compued introducing entities (for the index)
        attr _entities: Array[MMEntity] = new Array[MMEntity]
@@ -215,12 +216,13 @@ special AbstractCompiler
                _sorter.sort(array)
        end
 
-       readable writable attr _owned_modules: Array[MMModule]
+       readable writable attr _owned_modules: Array[MMModule] = new Array[MMModule]
 
        # Return the known_owner for current module
        # if inside_mode is set, it could be a different result
        meth known_owner_of(m: MMModule): MMModule
        do
+               var module = module
                if module == null then return m
                var res = module.known_owner_of(m)
                if not inside_mode and not intrude_mode and res.directory.owner == module then
@@ -243,7 +245,7 @@ special AbstractCompiler
                self.extract_other_doc
        end
 
-       redef init
+       init
        do
                super
                option_context.add_option(opt_dir)
@@ -252,8 +254,8 @@ special AbstractCompiler
        redef meth process_options
        do
                super
-               dir = opt_dir.value
-               if dir == null then dir = "."
+               var d = opt_dir.value
+               if d != null then dir = d
        end
 end
 
@@ -263,12 +265,12 @@ class StageContext
        readable attr _content: Array[String] = new Array[String]
 
        # Is a normal string already added?
-       readable writable attr _validate: Bool
+       readable writable attr _validate: Bool = false
 
        # Parent stage is any
-       readable attr _parent: StageContext
+       readable attr _parent: nullable StageContext = null
 
-       init(parent: StageContext) do _parent = parent
+       init(parent: nullable StageContext) do _parent = parent
 end
 
 
@@ -314,7 +316,7 @@ class MMEntity
 
        # The doc node from the AST
        # Return null is none
-       meth doc: ADoc do return null
+       meth doc: nullable ADoc do return null
 
        # Human redable location of the entity (module/class/property)
        meth locate(dctx: DocContext): String do return ""
@@ -356,7 +358,7 @@ special MMEntity
        meth owner(from: MMModule): MMModule
        do
                var res = self
-               var d = directory
+               var d: nullable MMDirectory = directory
                while d != null and d != from.directory do
                        var o = d.owner
                        if o != null and o.mhe <= res then res = o
@@ -425,7 +427,7 @@ special MMEntity
 
        redef meth prototype_head(dctx)
        do
-               var res = ""
+               var res = new Buffer
                var intro_class = known_intro_class(dctx)
                var is_redef = local_class != intro_class
 
@@ -444,12 +446,13 @@ special MMEntity
                                res.append(" {intro_class.module.html_link(dctx)}::")
                        end
                end
-               return res
+               return res.to_s
        end
 
        redef meth prototype_body(dctx)
        do
-               var res = signature.to_html(dctx)
+               var res = new Buffer
+               res.append(signature.to_html(dctx))
                var s = self
                if s.node != null then
                        if s.node isa ADeferredMethPropdef then
@@ -458,7 +461,7 @@ special MMEntity
                                res.append(" is intern")
                        end
                end
-               return res
+               return res.to_s
        end
 
        redef meth need_doc(dctx)
@@ -488,15 +491,15 @@ special MMEntity
        redef meth doc
        do
                var n = node
-               if not node isa PPropdef then
+               if n == null or not node isa PPropdef then
                        return null
                end
                assert n isa PPropdef
                var d = n.n_doc
-               assert d isa ADoc
                if d == null then
                        return null
                end
+               assert d isa ADoc
                if d.n_comment.is_empty then
                        return null
                else
@@ -544,7 +547,7 @@ redef class MMSrcModule
                dctx.add_header("Module {self}")
                dctx.add("<h1>Module {self}</h1>\n<dl>")
                var s = ""
-               var d = directory
+               var d: nullable MMDirectory = directory
                while d == null do
                        if d.owner != null and (d.owner != self or dctx.inside_mode or dctx.intrude_mode) then
                                s = "{d.owner.html_link(dctx)}::{s}"
@@ -557,8 +560,8 @@ redef class MMSrcModule
                var intrude_modules = new Array[MMModule]
                var public_modules = new Array[MMModule]
                var private_modules = new Array[MMModule]
-               var owned_modules = new Array[MMModule]
-               dctx.owned_modules = owned_modules
+               var owned_modules = dctx.owned_modules
+               owned_modules.clear
                for m in mhe.greaters do
                        var v = visibility_for(m) 
                        if not dctx.inside_mode and not dctx.intrude_mode and m.directory.owner == self then 
@@ -604,10 +607,12 @@ redef class MMSrcModule
                                end
                        else
                                for m in owned_modules do
-                                       var mc = m[c.global]
-                                       if mc != null and mc.need_doc(dctx) then 
-                                               new_classes.add(c)
-                                               break
+                                       if m.global_classes.has(c.global) then
+                                               var mc = m[c.global]
+                                               if mc.need_doc(dctx) then
+                                                       new_classes.add(c)
+                                                       break
+                                               end
                                        end
                                end
                        end
@@ -649,20 +654,16 @@ redef class MMSrcModule
        redef meth doc
        do
                var n = node
-               if not n isa AModule then
-                       return null
-               end
-               assert n isa AModule
                if n.n_packagedecl == null then
                        return null
                end
                var np = n.n_packagedecl
                assert np isa APackagedecl
                var d = np.n_doc
-               assert d isa ADoc
                if d == null then
                        return null
                end
+               assert d isa ADoc
                if d.n_comment.is_empty then
                        return null
                else
@@ -675,11 +676,11 @@ redef class ADoc
        # Html transcription of the doc
        meth to_html: String
        do
-               var res = new String
+               var res = new Buffer
                for c in n_comment do
                        res.append(c.text.substring_from(1))
                end
-               return res
+               return res.to_s
        end
 
        # Oneliner transcription of the doc
@@ -713,8 +714,10 @@ special MMEntity
        redef meth need_doc(dctx) do
                if module == dctx.module then
                        for m in dctx.owned_modules do
-                               var c = m[global]
-                               if c != null and c.need_doc(dctx) then return true
+                               if m.global_classes.has(global) then
+                                       var c = m[global]
+                                       if c.need_doc(dctx) then return true
+                               end
                        end
                end
                return false
@@ -726,19 +729,19 @@ special MMEntity
 
        redef meth prototype_head(dctx)
        do
-               var res = ""
+               var res = new Buffer
                var ki = known_intro(dctx)
                var is_redef = ki != self
                if is_redef then res.append("redef ")
                if global.visibility_level == 3 then res.append("private ")
                res.append("class ")
                if is_redef then res.append("{ki.module.html_link(dctx)}::")
-               return res
+               return res.to_s
        end
 
        redef meth prototype_body(dctx)
        do
-               var res = ""
+               var res = new Buffer
                if arity > 0 then
                        res.append("[")
                        for i in [0..arity[ do
@@ -749,7 +752,7 @@ special MMEntity
                        end
                        res.append("]")
                end
-               return res
+               return res.to_s
        end
 
        # Extract the doc of a class
@@ -874,10 +877,12 @@ special MMEntity
                        if p.local_class != self or not p.need_doc(dctx) then
                                var cla = new Array[MMLocalClass]
                                for m in dctx.owned_modules do
+                                       if not m.global_classes.has(global) then continue
                                        var c = m[global]
-                                       if c == null or not c isa MMConcreteClass then continue
+                                       if not c isa MMConcreteClass then continue
+                                       if not c.has_global_property(g) then continue
                                        var p2 = c[g]
-                                       if p2 == null or p2.local_class != c or not p2.need_doc(dctx) then continue
+                                       if p2.local_class != c or not p2.need_doc(dctx) then continue
                                        cla.add(c)
                                end
                                if cla.is_empty then continue
@@ -906,7 +911,7 @@ special MMEntity
                                if c isa MMSrcLocalClass then
                                        var km = dctx.known_owner_of(c.module)
                                        var kc = km[c.global]
-                                       if kc == self or not c isa MMConcreteClass then continue
+                                       if kc == self then continue
                                        var props: Array[MMLocalProperty]
                                        if km == module then
                                                if cmap.has_key(kc) then
@@ -1072,10 +1077,10 @@ redef class MMSrcLocalClass
                end
                assert n isa AClassdef
                var d = n.n_doc
-               assert d isa ADoc
                if d == null then
                        return null
                end
+               assert d isa ADoc
                if d.n_comment.is_empty then
                        return null
                else
@@ -1105,7 +1110,7 @@ redef class MMSignature
        # Htlm transcription of the signature (with nested links)
        meth to_html(dctx: DocContext): String
        do
-               var res = new String
+               var res = new Buffer
                if arity > 0 then
                        res.append("(")
                        res.append(self[0].html_link(dctx))
@@ -1119,7 +1124,7 @@ redef class MMSignature
                        res.append(": ")
                        res.append(return_type.html_link(dctx))
                end
-               return res
+               return res.to_s
        end
 end
 
@@ -1135,7 +1140,8 @@ end
 redef class MMTypeGeneric
        redef meth html_link(dctx)
        do
-               var res = local_class.html_link(dctx)
+               var res = new Buffer
+               res.append(local_class.html_link(dctx))
                res.append("[")
                res.append(params[0].html_link(dctx))
                for i in [1..params.length[ do
@@ -1143,7 +1149,7 @@ redef class MMTypeGeneric
                        res.append(params[i].html_link(dctx))
                end
                res.append("]")
-               return res
+               return res.to_s
        end
 end