diff --git a/lib/jsduck/aggregator.rb b/lib/jsduck/aggregator.rb index d34f890cfa415cac9af589d091aaf8db929e19f9..e3de18b62883241af5384d4b32b2aa1b58e7f9bc 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 81ebccc6e5a02a5d9d3314ae331a675b62f576b2..236f983fe3de47ab8020d12e9a8fa7498d7769bb 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 bc2ceee9473ab90dba3e70ac725bf58a38bf57f0..43256c9d1ebc1e5059a59de7b2d835d1ce0ac081 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 5cd70343c25e7fbb9a19087d150269894754b860..9b5272444905d7e159c36f58be6474afe1f2676f 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 d2e4bdf54e5bfc71d54ee87c6cab30effad0a9eb..dcec66901b3052d2f6ab8e914bf2d7f2c548be49 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 2af7dd8a09514b29f8fa64548206df9beeed8d7a..45714d2c750889cef12843f6ecdf5378391d0950 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 44bef33811f0399f89e072d08b7ea64e638df637..6b49194636737640237da811aef449f786c7cdf8 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 a0fc9453addf49ef97aaed9ed69c55d922729424..6de9c5866754720456a461611d7a26fc762e7303 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 4bd3ab06386fe31dfa532d6baea58857db31102c..9795f174af47fe72edccfd35eb325f396bb983d1 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 d6b50542a33b087b9e07b3eba1b02725b8b2ea90..2ad3dd60c42fe9db365ff1f6fdb012c5470387d2 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 {