Module: JRuby::Lint::Checkers::CheckGemNode

Included in:
Gem, Gemspec
Defined in:
lib/jruby/lint/checkers/gem.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details



3
4
5
6
7
8
9
10
11
12
# File 'lib/jruby/lint/checkers/gem.rb', line 3

def self.add_wiki_link_finding(collector)
  unless @added_wiki_link
    collector.add_finding("For more on gem compatibility see http://wiki.jruby.org/C-Extension-Alternatives", [:gems, :info]).tap do |f|
      def f.to_s
        message
      end
    end
    @added_wiki_link = true
  end
end

Instance Method Details

#check_gem(collector, call_node) ⇒ Object



41
42
43
44
45
46
47
48
49
# File 'lib/jruby/lint/checkers/gem.rb', line 41

def check_gem(collector, call_node)
  @gems ||= collector.project.libraries.gems
  gem_name = gem_name(call_node)
  if gem_name && jruby_gem_entry?(call_node) && instructions = @gems[gem_name]
    CheckGemNode.add_wiki_link_finding(collector)
    msg = "Found gem '#{gem_name}' which is reported to have some issues:\n#{instructions}"
    collector.add_finding(msg, [:gems, :warning], call_node.line+1)
  end
end

#gem_name(node) ⇒ Object



14
15
16
17
# File 'lib/jruby/lint/checkers/gem.rb', line 14

def gem_name(node)
  first_arg = node&.args_node&.child_nodes[0]
  first_arg.value.to_s if first_arg&.node_type&.to_s == "STRNODE"
end

#jruby_gem_entry?(node) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/jruby/lint/checkers/gem.rb', line 19

def jruby_gem_entry?(node)
  node&.args_node&.child_nodes.each do |child|
    if child&.node_type&.to_s == "HASHNODE"
      child.pairs.each do |pair|
        return false if pair.key.name == :platform &&
                        pair.value.name != :jruby
      end
    end
  end

  # platform(:mri, ...) { gem 'rdiscount' }
  # FIXME: Esoteric use of platform(...) { group(...) {} } is still broken
  if grand_parent.kind_of?(org::jruby::ast::CallNode) &&
     grand_parent.name == :platforms
    grand_parent.args_node.child_nodes.each do |child|
      return false if child&.name != :jruby
    end
  end

  true  
end