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