#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

require "qpid/spec"

spec = Spec.load(File.new($*[0]))

class Symbol
  def <=>(sym)
    to_s <=> sym.to_s
  end
end

def diff(classes)
  sets = classes.map {|c| yield(c).to_set}
  common = sets[0]
  sets[1..-1].each {|s|
    common = common & s
  }

  sep = "\n  "

  puts "Common:\n  #{common.to_a.sort.join(sep)}"
  classes.zip(sets).each {|c, s|
    specific = (s - common).to_a.sort
    puts "\n#{c.name}:\n  #{specific.join(sep)}"
  }
end

classes = $*[1..-1].map {|c|
  spec.classes[c]
}

diff(classes) {|c|
  result = []
  c.methods.each {|m| m.fields.each {|f| result << :"#{m.name}.#{f.name}"}}
  result
}

puts

diff(classes) {|c|
  c.fields.map {|f| f.name}
}
