From 7148821d43ae3d7826f51b163a0e47026bb6be2a Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Mon, 3 Oct 2011 18:11:56 +0300 Subject: [PATCH] Show list of all source files of class. Instead of :filename and :linenr properties being tied to class hash itself, they are now inside :files property, which holds an array of hashes which contain :filename and :linenr. List of files is shown in the hierarchy sidebar. Especially useful for classes like Ext.Element which are made up from many-many files. --- lib/jsduck/aggregator.rb | 6 ++---- lib/jsduck/aliases.rb | 5 +++-- lib/jsduck/app.rb | 5 ++--- lib/jsduck/class.rb | 3 ++- lib/jsduck/class_formatter.rb | 4 ++-- lib/jsduck/lint.rb | 3 ++- lib/jsduck/renderer.rb | 19 +++++++++++++++++-- lib/jsduck/source_file.rb | 19 +++++++++++-------- template/app/view/cls/Header.js | 2 +- template/resources/sass/viewport.scss | 2 +- 10 files changed, 43 insertions(+), 25 deletions(-) diff --git a/lib/jsduck/aggregator.rb b/lib/jsduck/aggregator.rb index d34f890c..e3de18b6 100644 --- a/lib/jsduck/aggregator.rb +++ b/lib/jsduck/aggregator.rb @@ -54,7 +54,7 @@ module JsDuck [:extends, :singleton, :private, :protected].each do |tag| old[tag] = old[tag] || new[tag] end - [:mixins, :alternateClassNames].each do |tag| + [:mixins, :alternateClassNames, :files].each do |tag| old[tag] = old[tag] + new[tag] end new[:xtypes].each_pair do |key, xtypes| @@ -144,9 +144,7 @@ module JsDuck :alternateClassNames => [], :members => Class.default_members_hash, :statics => Class.default_members_hash, - :filename => "", - :html_filename => "", - :linenr => 0, + :files => [{:filename => "", :html_filename => "", :linenr => 0}], }) end diff --git a/lib/jsduck/aliases.rb b/lib/jsduck/aliases.rb index 81ebccc6..236f983f 100644 --- a/lib/jsduck/aliases.rb +++ b/lib/jsduck/aliases.rb @@ -28,16 +28,17 @@ module JsDuck # Given aliased member, finds the original member. # If the original also happens to be an alias, continue recursively. def find_original(al) + context = al[:files][0] al_def = al[:alias] orig = @relations[al_def[:cls]] unless orig - Logger.instance.warn("Class #{al_def[:cls]} not found", al[:filename], al[:linenr]) + Logger.instance.warn("Class #{al_def[:cls]} not found", context[:filename], context[:linenr]) return al end orig = orig.get_member(al_def[:member], al_def[:type] || al[:tagname]) unless orig - Logger.instance.warn("Member #{al_def[:cls]}##{al_def[:member]} not found", al[:filename], al[:linenr]) + Logger.instance.warn("Member #{al_def[:cls]}##{al_def[:member]} not found", context[:filename], context[:linenr]) return al end diff --git a/lib/jsduck/app.rb b/lib/jsduck/app.rb index bc2ceee9..43256c9d 100644 --- a/lib/jsduck/app.rb +++ b/lib/jsduck/app.rb @@ -144,9 +144,8 @@ module JsDuck else type = d[:tagname].to_s name = d[:name] - file = d[:filename] - line = d[:linenr] - Logger.instance.warn("Ignoring #{type}: #{name}", file, line) + file = d[:files][0] + Logger.instance.warn("Ignoring #{type}: #{name}", file[:filename], file[:linenr]) end end Relations.new(classes, @opts.external_classes) diff --git a/lib/jsduck/class.rb b/lib/jsduck/class.rb index 5cd70343..9b527244 100644 --- a/lib/jsduck/class.rb +++ b/lib/jsduck/class.rb @@ -61,7 +61,8 @@ module JsDuck if @relations[classname] @relations[classname] elsif !@relations.ignore?(classname) - Logger.instance.warn("Class #{classname} not found", @doc[:filename], @doc[:linenr]) + context = @doc[:files][0] + Logger.instance.warn("Class #{classname} not found", context[:filename], context[:linenr]) nil end end diff --git a/lib/jsduck/class_formatter.rb b/lib/jsduck/class_formatter.rb index d2e4bdf5..dcec6690 100644 --- a/lib/jsduck/class_formatter.rb +++ b/lib/jsduck/class_formatter.rb @@ -24,7 +24,7 @@ module JsDuck def format(cls) @cls = cls @formatter.class_context = cls[:name] - @formatter.doc_context = cls + @formatter.doc_context = cls[:files][0] cls[:doc] = @formatter.format(cls[:doc]) if cls[:doc] cls[:members].each_pair do |type, members| cls[:members][type] = members.reject {|m| m[:private] }.map {|m| format_member(m) } @@ -46,7 +46,7 @@ module JsDuck end def format_member(m) - @formatter.doc_context = m + @formatter.doc_context = m[:files][0] m[:doc] = @formatter.format(m[:doc]) if m[:doc] m[:deprecated][:text] = @formatter.format(m[:deprecated][:text]) if m[:deprecated] if expandable?(m) || @formatter.too_long?(m[:doc]) diff --git a/lib/jsduck/lint.rb b/lib/jsduck/lint.rb index 2af7dd8a..45714d2c 100644 --- a/lib/jsduck/lint.rb +++ b/lib/jsduck/lint.rb @@ -75,7 +75,8 @@ module JsDuck end # Prints warning + filename and linenumber from doc-context - def warn(msg, context) + def warn(msg, member) + context = member[:files][0] Logger.instance.warn(msg, context[:filename], context[:linenr]) end diff --git a/lib/jsduck/renderer.rb b/lib/jsduck/renderer.rb index 44bef338..6b491946 100644 --- a/lib/jsduck/renderer.rb +++ b/lib/jsduck/renderer.rb @@ -55,14 +55,16 @@ module JsDuck has_parents = @cls[:extends] && @cls[:extends] != "Object" has_alt_names = @cls[:alternateClassNames].length > 0 has_mixins = @cls[:superclasses].length > 0 + has_files = @cls[:files].length > 0 - return if !has_parents && !has_alt_names && !has_mixins + return if !has_parents && !has_alt_names && !has_mixins && !has_files return [ '
',
         render_alternate_class_names,
         render_tree,
         render_mixins,
+        render_files,
         '
' ] end @@ -83,6 +85,19 @@ module JsDuck ] end + def render_files + return if @cls[:files].length == 0 + + return [ + "

Files

", + @cls[:files].map do |file| + url = "source/" + file[:href] + title = File.basename(file[:filename]) + "
#{title}
" + end + ] + end + # Take care of the special case where class has parent for which we have no docs. # In that case the "extends" property exists but "superclasses" is empty. # We still create the tree, but without links in it. @@ -173,7 +188,7 @@ module JsDuck "
", "
", "#{owner}
", - "view source", + "view source", "
", # method params signature or property type signature render_signature(m), diff --git a/lib/jsduck/source_file.rb b/lib/jsduck/source_file.rb index a0fc9453..6de9c586 100644 --- a/lib/jsduck/source_file.rb +++ b/lib/jsduck/source_file.rb @@ -38,9 +38,9 @@ module JsDuck def html_filename=(html_filename) @html_filename = html_filename @links.each_value do |line| - line.each do |doc| - doc[:html_filename] = @html_filename - doc[:href] = @html_filename + "#" + id(doc) + line.each do |link| + link[:file][:html_filename] = @html_filename + link[:file][:href] = @html_filename + "#" + id(link[:doc]) end end end @@ -55,8 +55,8 @@ module JsDuck line = CGI.escapeHTML(line) # wrap the line in as many spans as there are links to this line number. if @links[linenr] - @links[linenr].each do |doc| - line = "#{line}" + @links[linenr].each do |link| + line = "#{line}" end end lines << line @@ -90,9 +90,12 @@ module JsDuck # Returns the modified doc-object after done. def link(linenr, doc) @links[linenr] = [] unless @links[linenr] - @links[linenr] << doc - doc[:filename] = @filename - doc[:linenr] = linenr + file = { + :filename => @filename, + :linenr => linenr, + } + @links[linenr] << {:doc => doc, :file => file} + doc[:files] = [file] if doc[:tagname] == :class doc[:members][:cfg].each {|cfg| link(linenr, cfg) } doc[:members][:method].each {|method| link(linenr, method) } diff --git a/template/app/view/cls/Header.js b/template/app/view/cls/Header.js index 4bd3ab06..9795f174 100644 --- a/template/app/view/cls/Header.js +++ b/template/app/view/cls/Header.js @@ -16,7 +16,7 @@ Ext.define('Docs.view.cls.Header', { '', 'Private', '', - '{name}', + '{name}', '{[this.renderXTypes(values.xtypes)]}', '', Docs.showPrintButton ? 'Print' : '', diff --git a/template/resources/sass/viewport.scss b/template/resources/sass/viewport.scss index d6b50542..2ad3dd60 100644 --- a/template/resources/sass/viewport.scss +++ b/template/resources/sass/viewport.scss @@ -418,7 +418,7 @@ a { margin: 0 0 20px 20px; font-size: 12px; @include gray-h4; - .mixin, .alternate-class-name { + .mixin, .alternate-class-name, .file { padding: 0 0 0 12px; margin-top: 3px; } .alternate-class-name { -- GitLab