1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env ruby

require 'rubygems'
require 'bundler'

require 'avm2'
require 'trollop'

opts = Trollop::options do
  opt :input, "Input file", :type => :io, :required => true
end

abc = AVM2::ABC::File.new
abc.read opts[:input]

iface_matcher = Furnace::AST::Matcher.new do
  [ :interface, any,
    subset[
      [ :traits,
        subset[
          [ :method, any, [:q, "void"], [ [ any, [:q, "flash.utils", "IDataInput"] ] ] ],
          [ :method, any, [:q, "void"], [ [ any, [:q, "flash.utils", "IDataOutput"] ] ] ]
        ] ] ] ]
end

iface = iface_matcher.find_one(abc.interfaces)

packet_matcher = Furnace::AST::Matcher.new do
  [ :instance, any,
    subset[
      [ :interfaces, subset[ iface.name.to_astpat(:multiname) ] ],
    ] ]
end

packets = packet_matcher.find_all(abc.instances)

packets.each do |packet|
  p packet.to_astlet
end