require "rubygems"

gem "hoe", "~> 2.3"
require "hoe"

gem "rake-compiler", "~> 0.6"
require "rake/extensiontask"

FILTER = ENV['FILTER'] || ENV['TESTOPTS']

INTERPRETERS = [ "spidermonkey", "tracemonkey" ]

SUFFIXES = {}
SUFFIXES[ "spidermonkey" ] = "c"
SUFFIXES[ "tracemonkey" ] = "cc"

generated_nodes = []

INTERPRETERS.each do |interpreter|

  suffix = SUFFIXES[interpreter]
  
  generated_nodes << "ext/#{interpreter}/immutable_node.#{suffix}"
  
  generated_node = "ext/#{interpreter}/immutable_node.#{suffix}"
  
  file generated_node => "ext/#{interpreter}/immutable_node.#{suffix}.erb"  do |t|
    template = ERB.new(File.open(t.prerequisites.first, "rb") { |x| x.read })
    jsops = jsops interpreter
    tokens = tokens interpreter
    template.result(binding)
    File.open(generated_node, "wb") { |f| f.write template.result(binding) }
  end

  task :"compile:#{interpreter}" => generated_node
  task :compile => :"compile:#{interpreter}"

end

Hoe.plugin :debugging, :doofus, :git

Hoe.spec "smparkes-johnson" do
  developer "John Barnette",   "jbarnette@rubyforge.org"
  developer "Aaron Patterson", "aaron.patterson@gmail.com"
  developer "Yehuda Katz",     "wycats@gmail.com"
  developer "Matthew Draper",  "matthew@trebex.net"

  self.extra_rdoc_files         = FileList["*.rdoc"]
  self.history_file             = "CHANGELOG.rdoc"
  self.readme_file              = "README.rdoc"
  self.spec_extras[:extensions] = %w(ext/spidermonkey/extconf.rb 
                                     ext/tracemonkey/extconf.rb)

  extra_dev_deps << ["rake-compiler", "~> 0.6"]

  clean_globs    << "ext/**/Makefile"
  clean_globs    << "ext/**/*.{o,so,dylib,bundle,a,log}"
  clean_globs    << "vendor/**/*.{o,so,dylib,bundle,a,log}"
  clean_globs    << "ext/spidermonkey/immutable_node.c"
  clean_globs    << "ext/tracemonkey/immutable_node.cc"
  clean_globs    << "lib/johnson/spidermonkey/spidermonkey.bundle"
  clean_globs    << "lib/johnson/tracemonkey/tracemonkey.bundle"
  clean_globs    << "tmp"
  clean_globs    << "vendor/spidermonkey/**/*.OBJ"
  clean_globs    << "vendor/tracemonkey/**/*.OBJ"

  Rake::ExtensionTask.new "spidermonkey", spec do |ext|
    ext.lib_dir = "lib/johnson/spidermonkey"
  end

  Rake::ExtensionTask.new "tracemonkey", spec do |ext|
    ext.lib_dir = "lib/johnson/tracemonkey"
  end
end

task(:test).clear

task :test => :compile

task :clean do
  Dir.chdir "vendor/spidermonkey" do
    sh "make clean -f Makefile.ref" unless Dir["**/libjs.a"].empty?
  end

  Dir.chdir "vendor/tracemonkey" do
    sh "make clean -f Makefile.ref" unless Dir["**/libjs.a"].empty?
  end
end

require "erb"

def jsops interpreter
  ops = []
  File.open("vendor/#{interpreter}/jsopcode.tbl", "rb") { |f|
    f.each_line do |line|
      if line =~ /^OPDEF\((\w+),/
        ops << $1
      end
    end
  }
  ops
end

def tokens interpreter
  toks = []
  File.open("vendor/#{interpreter}/jsscan.h", "rb") { |f|
    f.each_line do |line|
      line.scan(/TOK_\w+/).each do |token|
        next if token == "TOK_ERROR"
        toks << token
      end
    end
  }
  toks.uniq
end

task :"test:default" do
  ruby %(#{Hoe::RUBY_FLAGS} -rrubygems -rjohnson -e 'require "test/johnson/generic/default_test"' #{FILTER})
end

task :test => :"test:default"

INTERPRETERS.each do |interpreter|

  task :"test:#{interpreter}" do
    tests = Dir["test/**/generic/**/*_test.rb"] + Dir["test/**/#{interpreter}/**/*_test.rb"]
    tests.map! { |t| %(require "#{t}";) }
    ruby "#{Hoe::RUBY_FLAGS} -rrubygems -rjohnson -rjohnson/#{interpreter} -e '#{tests.join("; ")}' #{FILTER}"
  end

  task :test => :"test:#{interpreter}"

end

task :package        => generated_nodes
task :check_manifest => generated_nodes

# Local Variables:
# mode:ruby
# End: