Skip to content

Commit

Permalink
Add C lexer from opal/c_lexer. (#1806)
Browse files Browse the repository at this point in the history
* Add C lexer from opal/c_lexer.
  • Loading branch information
iliabylich committed Apr 21, 2018
1 parent dbec19c commit b6b8af4
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 30 deletions.
4 changes: 4 additions & 0 deletions Gemfile
Expand Up @@ -40,3 +40,7 @@ end unless ENV['CI']
group :doc do
gem 'redcarpet'
end

platforms :ruby, :mswin, :mswin64, :mingw, :x64_mingw do
gem 'c_lexer', '2.5.1.0.pre2'
end
65 changes: 40 additions & 25 deletions lib/opal/parser.rb
Expand Up @@ -13,41 +13,56 @@ def self.recognize_encoding(string)
end
end

class Parser < ::Parser::Ruby25
class << self
attr_accessor :diagnostics_consumer

def default_parser
parser = super
module Parser
module DefaultConfig
module ClassMethods
attr_accessor :diagnostics_consumer

parser.diagnostics.all_errors_are_fatal = true
parser.diagnostics.ignore_warnings = false
def default_parser
parser = super
parser.diagnostics.all_errors_are_fatal = true
parser.diagnostics.ignore_warnings = false
parser.diagnostics.consumer = diagnostics_consumer
parser
end
end

parser.diagnostics.consumer =
if RUBY_ENGINE == 'opal'
->(diag) {}
else
diagnostics_consumer
def self.included(klass)
klass.extend(ClassMethods)
klass.diagnostics_consumer = ->(diagnostic) do
if RUBY_ENGINE != 'opal'
$stderr.puts(diagnostic.render)
end
end
end

parser
def initialize(*)
super(Opal::AST::Builder.new)
end
end

self.diagnostics_consumer = ->(diagnostic) { $stderr.puts(diagnostic.render) }
def parse(source_buffer)
parsed = super
rewriten = rewrite(parsed)
rewriten
end

def initialize(*)
super(Opal::AST::Builder.new)
def rewrite(node)
Opal::Rewriter.new(node).process
end
end

def parse(source_buffer)
parsed = super
rewriten = rewrite(parsed)
rewriten
end
class << self
attr_accessor :default_parser_class

def rewrite(node)
Opal::Rewriter.new(node).process
def default_parser
default_parser_class.default_parser
end
end
end
end

require 'opal/parser/with_ruby_lexer'

if RUBY_ENGINE != 'opal'
require 'opal/parser/with_c_lexer'
end
14 changes: 14 additions & 0 deletions lib/opal/parser/with_c_lexer.rb
@@ -0,0 +1,14 @@
# frozen_string_literal: true

begin
require 'c_lexer'
rescue LoadError
$stderr.puts 'Failed to load CLexer, using pure Ruby lexer'
end

if defined? Parser::Ruby25WithCLexer
class Opal::Parser::WithCLexer < Parser::Ruby25WithCLexer
include Opal::Parser::DefaultConfig
Opal::Parser.default_parser_class = self
end
end
6 changes: 6 additions & 0 deletions lib/opal/parser/with_ruby_lexer.rb
@@ -0,0 +1,6 @@
# frozen_string_literal: true

class Opal::Parser::WithRubyLexer < Parser::Ruby25
include Opal::Parser::DefaultConfig
Opal::Parser.default_parser_class = self
end
2 changes: 1 addition & 1 deletion opal.gemspec
Expand Up @@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
spec.add_dependency 'sourcemap', '~> 0.1.0'
spec.add_dependency 'hike', '~> 1.2'
spec.add_dependency 'ast', '>= 2.3.0'
spec.add_dependency 'parser', '= 2.5.0.5'
spec.add_dependency 'parser', '= 2.5.1.0'

spec.add_development_dependency 'rake', '~> 10.0'
spec.add_development_dependency 'racc'
Expand Down
6 changes: 3 additions & 3 deletions spec/lib/compiler_spec.rb
Expand Up @@ -453,10 +453,10 @@ def expect_number_of_warnings(code)
let(:diagnostics) { [] }

around(:each) do |e|
original_diagnostics_consumer = Opal::Parser.diagnostics_consumer
Opal::Parser.diagnostics_consumer = ->(diagnostic) { diagnostics << diagnostic }
original_diagnostics_consumer = Opal::Parser.default_parser_class.diagnostics_consumer
Opal::Parser.default_parser_class.diagnostics_consumer = ->(diagnostic) { diagnostics << diagnostic }
e.run
Opal::Parser.diagnostics_consumer = original_diagnostics_consumer
Opal::Parser.default_parser_class.diagnostics_consumer = original_diagnostics_consumer
end

let(:encoding_comment) { '' }
Expand Down
2 changes: 1 addition & 1 deletion spec/support/rewriters_helper.rb
Expand Up @@ -29,7 +29,7 @@ def parse(source)
def parse_without_rewriting(source)
buffer = Opal::Source::Buffer.new('(eval)')
buffer.source = source
parser = Opal::Parser.superclass.new
parser = Parser::Ruby25.new
parser.parse(buffer)
end
end
Expand Down

0 comments on commit b6b8af4

Please sign in to comment.