mirror of https://github.com/KLayout/klayout.git
142 lines
3.8 KiB
Ruby
142 lines
3.8 KiB
Ruby
|
|
#
|
|
# Copyright (C) 2006-2025 Matthias Koefferlein
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#
|
|
|
|
# A helper script to detect ambiguous methods
|
|
|
|
# run with
|
|
# klayout -r mkqtdecl_extract_ambigous_methods.rb -z s
|
|
|
|
events = {}
|
|
|
|
classes = {}
|
|
RBA::Class::each_class do |cls|
|
|
classes[cls.name] = true
|
|
end
|
|
|
|
RBA::Class::each_class do |cls|
|
|
|
|
tc = {
|
|
RBA::ArgType.t_void => "",
|
|
RBA::ArgType.t_bool => "b",
|
|
RBA::ArgType.t_char => "i",
|
|
RBA::ArgType.t_schar => "i",
|
|
RBA::ArgType.t_uchar => "i",
|
|
RBA::ArgType.t_short => "i",
|
|
RBA::ArgType.t_ushort => "i",
|
|
RBA::ArgType.t_int => "i",
|
|
RBA::ArgType.t_uint => "i",
|
|
RBA::ArgType.t_long => "i",
|
|
RBA::ArgType.t_ulong => "i",
|
|
RBA::ArgType.t_longlong => "i",
|
|
RBA::ArgType.t_ulonglong => "i",
|
|
RBA::ArgType.t_double => "d",
|
|
RBA::ArgType.t_float => "d",
|
|
RBA::ArgType.t_var => "v",
|
|
RBA::ArgType.t_string => "s",
|
|
RBA::ArgType.t_qstring => "s",
|
|
RBA::ArgType.t_string_ccptr => "s",
|
|
}
|
|
|
|
uc = {
|
|
RBA::ArgType.t_void => "",
|
|
RBA::ArgType.t_bool => "b",
|
|
RBA::ArgType.t_char => "c",
|
|
RBA::ArgType.t_schar => "c",
|
|
RBA::ArgType.t_uchar => "uc",
|
|
RBA::ArgType.t_short => "s",
|
|
RBA::ArgType.t_ushort => "us",
|
|
RBA::ArgType.t_int => "i",
|
|
RBA::ArgType.t_uint => "ui",
|
|
RBA::ArgType.t_long => "l",
|
|
RBA::ArgType.t_ulong => "ul",
|
|
RBA::ArgType.t_longlong => "w",
|
|
RBA::ArgType.t_ulonglong => "uw",
|
|
RBA::ArgType.t_double => "d",
|
|
RBA::ArgType.t_float => "f",
|
|
RBA::ArgType.t_var => "v",
|
|
RBA::ArgType.t_string => "s",
|
|
RBA::ArgType.t_qstring => "qs",
|
|
RBA::ArgType.t_string_ccptr => "t",
|
|
}
|
|
|
|
if cls.name =~ /_Native$/ || !classes[cls.name + "_Native"]
|
|
|
|
m = {}
|
|
cls.each_method do |meth|
|
|
m[meth.name] ||= {}
|
|
csig = ""
|
|
if meth.is_static?
|
|
csig += "s"
|
|
end
|
|
if meth.is_const?
|
|
csig += "c"
|
|
end
|
|
if csig != ""
|
|
csig += "#"
|
|
end
|
|
meth.each_argument do |a|
|
|
if a.is_ptr? || a.is_cptr?
|
|
csig += "p"
|
|
end
|
|
if a.type == RBA::ArgType::t_vector
|
|
csig += "a"
|
|
csig += tc[a.inner.type].to_s
|
|
elsif a.type == RBA::ArgType::t_object || a.type == RBA::ArgType::t_object_new
|
|
csig += "x"
|
|
csig += a.cls.name
|
|
else
|
|
csig += tc[a.type]
|
|
end
|
|
end
|
|
((m[meth.name] ||= {})[csig] ||= []).push(meth)
|
|
end
|
|
|
|
m.each do |n,cs|
|
|
cs.each do |csig,m|
|
|
if m.size > 1
|
|
puts "Ambigous: #{cls.name}::#{n}_#{csig}"
|
|
usigs = []
|
|
m.each do |mm|
|
|
usig = ""
|
|
mm.each_argument do |a|
|
|
if a.is_ptr? || a.is_cptr?
|
|
usig += "p"
|
|
end
|
|
if a.type == RBA::ArgType::t_vector
|
|
usig += "a"
|
|
usig += uc[a.inner.type].to_s
|
|
elsif a.type == RBA::ArgType::t_object || a.type == RBA::ArgType::t_object_new
|
|
usig += "x"
|
|
usig += a.cls.name
|
|
else
|
|
usig += uc[a.type]
|
|
end
|
|
end
|
|
usigs.push(usig)
|
|
end
|
|
puts "-> #{usigs.join(',')}"
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|