lib/ruby2js.rb in ruby2js-1.14.1 vs lib/ruby2js.rb in ruby2js-1.15.0
- old
+ new
@@ -1,9 +1,12 @@
require 'parser/current'
require 'ruby2js/converter'
module Ruby2JS
+ class SyntaxError < RuntimeError
+ end
+
module Filter
DEFAULTS = []
module SEXP
# construct an AST Node
@@ -61,11 +64,11 @@
options[:file] = file
elsif Parser::AST::Node === source
ast = source
source = ast.loc.expression.source_buffer.source
else
- ast = parse( source )
+ ast = parse( source, options[:file] )
end
filters = options[:filters] || Filter::DEFAULTS
unless filters.empty?
@@ -94,28 +97,28 @@
ruby2js.width = options[:width] if options[:width]
if source.include? "\n"
ruby2js.enable_vertical_whitespace
lines = ruby2js.to_js.split("\n")
- pre = ''
+ pre = []
pending = false
blank = true
lines.each do |line|
next if line.empty?
if ')}]'.include? line[0]
- pre.sub!(/^ /,'')
+ pre.pop
line.sub!(/([,;])$/,"\\1\n")
pending = true
else
pending = false
end
- line.sub! /^/, pre
+ line.insert 0, pre.join
if '({['.include? line[-1]
- pre += ' '
- line.sub!(/^/,"\n") unless blank or pending
+ pre.push ' '
+ line.insert 0, "\n" unless blank or pending
pending = true
end
blank = pending
end
@@ -124,14 +127,20 @@
else
ruby2js.to_js
end
end
- def self.parse(source)
+ def self.parse(source, file=nil)
# workaround for https://github.com/whitequark/parser/issues/112
- buffer = Parser::Source::Buffer.new('__SOURCE__')
+ buffer = Parser::Source::Buffer.new(file || '__SOURCE__')
buffer.raw_source = source.encode('utf-8')
Parser::CurrentRuby.new.parse(buffer)
+ rescue Parser::SyntaxError => e
+ split = source[0..e.diagnostic.location.begin_pos].split("\n")
+ line, col = split.length, split.last.length
+ message = "line #{line}, column #{col}: #{e.diagnostic.message}"
+ message += "\n in file #{file}" if file
+ raise Ruby2JS::SyntaxError.new(message)
end
def self.find_block(ast, line)
if ast.type == :block and ast.loc.expression.line == line
return ast.children.last