class JsDuck::Parser

Performs the actual parsing of SCSS or JS source.

This is the class that brings together all the different steps of parsing the source.

Public Class Methods

new() click to toggle source
# File lib/jsduck/parser.rb, line 18
def initialize
  @doc_parser = Doc::Parser.new
  @class_doc_expander = ClassDocExpander.new
  @doc_processor = Doc::Processor.new
  @merger = Merger.new
  @filename = ""
end

Public Instance Methods

parse(contents, filename="", options={}) click to toggle source

Parses file into final docset that can be fed into Aggregator

# File lib/jsduck/parser.rb, line 27
def parse(contents, filename="", options={})
  @doc_processor.filename = @filename = filename

  parse_js_or_scss(contents, filename, options).map do |docset|
    expand(docset)
  end.flatten.map do |docset|
    merge(docset)
  end
end

Private Instance Methods

expand(docset) click to toggle source

Parses the docs, detects tagname and expands class docset

# File lib/jsduck/parser.rb, line 50
def expand(docset)
  docset[:comment] = @doc_parser.parse(docset[:comment], @filename, docset[:linenr])
  docset[:doc_map] = Doc::Map.build(docset[:comment])
  docset[:tagname] = BaseType.detect(docset[:doc_map], docset[:code])

  if docset[:tagname] == :class
    # expand class into several docsets, and rebuild doc-maps for all of them.
    @class_doc_expander.expand(docset).map do |ds|
      ds[:doc_map] = Doc::Map.build(ds[:comment])
      ds
    end
  else
    docset
  end
end
merge(docset) click to toggle source

Merges comment and code parts of docset

# File lib/jsduck/parser.rb, line 67
def merge(docset)
  @doc_processor.linenr = docset[:linenr]
  docset[:comment] = @doc_processor.process(docset[:tagname], docset[:doc_map])
  docset.delete(:doc_map)

  @merger.merge(docset, @filename, docset[:linenr])
end
parse_js_or_scss(contents, filename, options) click to toggle source

Parses the file depending on filename as JS or SCSS

# File lib/jsduck/parser.rb, line 40
def parse_js_or_scss(contents, filename, options)
  if filename =~ /\.scss$/
    docs = Css::Parser.new(contents, options).parse
  else
    docs = Js::Parser.new(contents, options).parse
    docs = Js::Ast.new(docs).detect_all!
  end
end