dub 0.2.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of dub might be problematic. Click here for more details.
- data/History.txt +92 -0
- data/LICENSE +20 -0
- data/README.rdoc +115 -0
- data/Rakefile +59 -0
- data/dub.gemspec +197 -0
- data/lib/dub/argument.rb +286 -0
- data/lib/dub/entities_unescape.rb +9 -0
- data/lib/dub/function.rb +177 -0
- data/lib/dub/function_group.rb +72 -0
- data/lib/dub/generator.rb +15 -0
- data/lib/dub/group.rb +20 -0
- data/lib/dub/klass.rb +338 -0
- data/lib/dub/lua/class.cpp.erb +114 -0
- data/lib/dub/lua/class_gen.rb +96 -0
- data/lib/dub/lua/function.cpp.erb +15 -0
- data/lib/dub/lua/function_gen.rb +329 -0
- data/lib/dub/lua/group.cpp.erb +9 -0
- data/lib/dub/lua/lua_cpp_helper.cpp +259 -0
- data/lib/dub/lua/lua_cpp_helper.h +219 -0
- data/lib/dub/lua/lua_object.cpp +158 -0
- data/lib/dub/lua/lua_object.h +69 -0
- data/lib/dub/lua/namespace.cpp.erb +42 -0
- data/lib/dub/lua/namespace_gen.rb +69 -0
- data/lib/dub/lua.rb +24 -0
- data/lib/dub/member_extraction.rb +128 -0
- data/lib/dub/namespace.rb +295 -0
- data/lib/dub/opts_parser.rb +30 -0
- data/lib/dub/parser.rb +46 -0
- data/lib/dub/templates/lua_template.erb +21 -0
- data/lib/dub/version.rb +3 -0
- data/lib/dub.rb +24 -20
- data/test/argument_test.rb +581 -0
- data/test/fixtures/app/CMakeLists.txt +54 -0
- data/test/fixtures/app/Doxyfile +1600 -0
- data/test/fixtures/app/bindings/all_lua.cpp +299 -0
- data/test/fixtures/app/include/matrix.h +283 -0
- data/test/fixtures/app/make_lua_bindings.rb +13 -0
- data/test/fixtures/app/vendor/lua/CMakeLists.txt +25 -0
- data/test/fixtures/app/vendor/lua/COPYRIGHT +34 -0
- data/test/fixtures/app/vendor/lua/HISTORY +183 -0
- data/test/fixtures/app/vendor/lua/INSTALL +99 -0
- data/test/fixtures/app/vendor/lua/Makefile +183 -0
- data/test/fixtures/app/vendor/lua/README +37 -0
- data/test/fixtures/app/vendor/lua/lapi.c +1080 -0
- data/test/fixtures/app/vendor/lua/lapi.h +16 -0
- data/test/fixtures/app/vendor/lua/lauxlib.c +653 -0
- data/test/fixtures/app/vendor/lua/lauxlib.h +174 -0
- data/test/fixtures/app/vendor/lua/lbaselib.c +643 -0
- data/test/fixtures/app/vendor/lua/lcode.c +839 -0
- data/test/fixtures/app/vendor/lua/lcode.h +76 -0
- data/test/fixtures/app/vendor/lua/ldblib.c +397 -0
- data/test/fixtures/app/vendor/lua/ldebug.c +622 -0
- data/test/fixtures/app/vendor/lua/ldebug.h +33 -0
- data/test/fixtures/app/vendor/lua/ldo.c +516 -0
- data/test/fixtures/app/vendor/lua/ldo.h +57 -0
- data/test/fixtures/app/vendor/lua/ldump.c +164 -0
- data/test/fixtures/app/vendor/lua/lfunc.c +174 -0
- data/test/fixtures/app/vendor/lua/lfunc.h +34 -0
- data/test/fixtures/app/vendor/lua/lgc.c +711 -0
- data/test/fixtures/app/vendor/lua/lgc.h +110 -0
- data/test/fixtures/app/vendor/lua/liblua.a +0 -0
- data/test/fixtures/app/vendor/lua/linit.c +38 -0
- data/test/fixtures/app/vendor/lua/liolib.c +532 -0
- data/test/fixtures/app/vendor/lua/llex.c +461 -0
- data/test/fixtures/app/vendor/lua/llex.h +81 -0
- data/test/fixtures/app/vendor/lua/llimits.h +128 -0
- data/test/fixtures/app/vendor/lua/lmathlib.c +263 -0
- data/test/fixtures/app/vendor/lua/lmem.c +86 -0
- data/test/fixtures/app/vendor/lua/lmem.h +49 -0
- data/test/fixtures/app/vendor/lua/loadlib.c +664 -0
- data/test/fixtures/app/vendor/lua/lobject.c +214 -0
- data/test/fixtures/app/vendor/lua/lobject.h +381 -0
- data/test/fixtures/app/vendor/lua/lopcodes.c +102 -0
- data/test/fixtures/app/vendor/lua/lopcodes.h +268 -0
- data/test/fixtures/app/vendor/lua/loslib.c +244 -0
- data/test/fixtures/app/vendor/lua/lparser.c +1337 -0
- data/test/fixtures/app/vendor/lua/lparser.h +82 -0
- data/test/fixtures/app/vendor/lua/lstate.c +214 -0
- data/test/fixtures/app/vendor/lua/lstate.h +168 -0
- data/test/fixtures/app/vendor/lua/lstring.c +111 -0
- data/test/fixtures/app/vendor/lua/lstring.h +31 -0
- data/test/fixtures/app/vendor/lua/lstrlib.c +868 -0
- data/test/fixtures/app/vendor/lua/ltable.c +588 -0
- data/test/fixtures/app/vendor/lua/ltable.h +40 -0
- data/test/fixtures/app/vendor/lua/ltablib.c +278 -0
- data/test/fixtures/app/vendor/lua/ltm.c +75 -0
- data/test/fixtures/app/vendor/lua/ltm.h +54 -0
- data/test/fixtures/app/vendor/lua/lua.c +695 -0
- data/test/fixtures/app/vendor/lua/lua.h +385 -0
- data/test/fixtures/app/vendor/lua/lua_dub_helper.h +77 -0
- data/test/fixtures/app/vendor/lua/luac +0 -0
- data/test/fixtures/app/vendor/lua/luac.c +200 -0
- data/test/fixtures/app/vendor/lua/luaconf.h +762 -0
- data/test/fixtures/app/vendor/lua/lualib.h +53 -0
- data/test/fixtures/app/vendor/lua/lundump.c +223 -0
- data/test/fixtures/app/vendor/lua/lundump.h +36 -0
- data/test/fixtures/app/vendor/lua/lvm.c +765 -0
- data/test/fixtures/app/vendor/lua/lvm.h +36 -0
- data/test/fixtures/app/vendor/lua/lzio.c +82 -0
- data/test/fixtures/app/vendor/lua/lzio.h +67 -0
- data/test/fixtures/app/vendor/lua/matrix.h +102 -0
- data/test/fixtures/app/vendor/lua/print.c +227 -0
- data/test/fixtures/app/vendor/lua/test/README +26 -0
- data/test/fixtures/app/vendor/lua/test/bisect.lua +27 -0
- data/test/fixtures/app/vendor/lua/test/cf.lua +16 -0
- data/test/fixtures/app/vendor/lua/test/echo.lua +5 -0
- data/test/fixtures/app/vendor/lua/test/env.lua +7 -0
- data/test/fixtures/app/vendor/lua/test/factorial.lua +32 -0
- data/test/fixtures/app/vendor/lua/test/fib.lua +40 -0
- data/test/fixtures/app/vendor/lua/test/fibfor.lua +13 -0
- data/test/fixtures/app/vendor/lua/test/globals.lua +13 -0
- data/test/fixtures/app/vendor/lua/test/hello.lua +3 -0
- data/test/fixtures/app/vendor/lua/test/life.lua +111 -0
- data/test/fixtures/app/vendor/lua/test/luac.lua +7 -0
- data/test/fixtures/app/vendor/lua/test/printf.lua +7 -0
- data/test/fixtures/app/vendor/lua/test/readonly.lua +12 -0
- data/test/fixtures/app/vendor/lua/test/sieve.lua +29 -0
- data/test/fixtures/app/vendor/lua/test/sort.lua +66 -0
- data/test/fixtures/app/vendor/lua/test/table.lua +12 -0
- data/test/fixtures/app/vendor/lua/test/trace-calls.lua +32 -0
- data/test/fixtures/app/vendor/lua/test/trace-globals.lua +38 -0
- data/test/fixtures/app/vendor/lua/test/xd.lua +14 -0
- data/test/fixtures/app/xml/classdub_1_1_base.xml +85 -0
- data/test/fixtures/app/xml/classdub_1_1_custom_destructor.xml +67 -0
- data/test/fixtures/app/xml/classdub_1_1_deletable_out_of_lua.xml +43 -0
- data/test/fixtures/app/xml/classdub_1_1_matrix.xml +482 -0
- data/test/fixtures/app/xml/classdub_1_1_no_destructor.xml +49 -0
- data/test/fixtures/app/xml/classdub_1_1_priv_sub_base.xml +89 -0
- data/test/fixtures/app/xml/classdub_1_1_private_constr.xml +68 -0
- data/test/fixtures/app/xml/classdub_1_1_static_constr.xml +69 -0
- data/test/fixtures/app/xml/classdub_1_1_sub_base.xml +89 -0
- data/test/fixtures/app/xml/classdub_1_1_t_mat.xml +252 -0
- data/test/fixtures/app/xml/combine.xslt +15 -0
- data/test/fixtures/app/xml/compound.xsd +814 -0
- data/test/fixtures/app/xml/dir_53661a2bdeb1d55e60581a7e15deb763.xml +12 -0
- data/test/fixtures/app/xml/index.xml +91 -0
- data/test/fixtures/app/xml/index.xsd +66 -0
- data/test/fixtures/app/xml/matrix_8h.xml +310 -0
- data/test/fixtures/app/xml/namespacedub.xml +48 -0
- data/test/fixtures/classcv_1_1_mat.xml +1996 -0
- data/test/fixtures/classcv_1_1_point__.xml +341 -0
- data/test/fixtures/classcv_1_1_scalar__.xml +269 -0
- data/test/fixtures/classcv_1_1_size__.xml +270 -0
- data/test/fixtures/dummy_class.cpp.erb +1 -0
- data/test/fixtures/dummy_function.cpp.erb +1 -0
- data/test/fixtures/group___magic_type.xml +406 -0
- data/test/fixtures/namespacecv.xml +12659 -0
- data/test/function_group_test.rb +43 -0
- data/test/function_test.rb +405 -0
- data/test/group_test.rb +241 -0
- data/test/helper.rb +34 -0
- data/test/klass_test.rb +551 -0
- data/test/lua_function_gen_test.rb +242 -0
- data/test/namespace_test.rb +220 -0
- data/test/parser_test.rb +36 -0
- metadata +229 -272
- checksums.yaml +0 -7
- data/lib/open_api_sdk/analytics.rb +0 -99
- data/lib/open_api_sdk/domains.rb +0 -353
- data/lib/open_api_sdk/dub.rb +0 -88
- data/lib/open_api_sdk/links.rb +0 -766
- data/lib/open_api_sdk/metatags.rb +0 -54
- data/lib/open_api_sdk/models/operations/bulkcreatelinks_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/bulkupdatelinks_requestbody.rb +0 -27
- data/lib/open_api_sdk/models/operations/bulkupdatelinks_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/color.rb +0 -24
- data/lib/open_api_sdk/models/operations/createdomain_requestbody.rb +0 -33
- data/lib/open_api_sdk/models/operations/createdomain_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/createlink_requestbody.rb +0 -95
- data/lib/open_api_sdk/models/operations/createlink_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/createtag_requestbody.rb +0 -32
- data/lib/open_api_sdk/models/operations/createtag_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/data.rb +0 -83
- data/lib/open_api_sdk/models/operations/deletedomain_request.rb +0 -24
- data/lib/open_api_sdk/models/operations/deletedomain_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/deletedomain_responsebody.rb +0 -24
- data/lib/open_api_sdk/models/operations/deletelink_request.rb +0 -24
- data/lib/open_api_sdk/models/operations/deletelink_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/deletelink_responsebody.rb +0 -24
- data/lib/open_api_sdk/models/operations/event.rb +0 -21
- data/lib/open_api_sdk/models/operations/getlinkinfo_request.rb +0 -33
- data/lib/open_api_sdk/models/operations/getlinkinfo_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/getlinks_request.rb +0 -51
- data/lib/open_api_sdk/models/operations/getlinks_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/getlinkscount_request.rb +0 -48
- data/lib/open_api_sdk/models/operations/getlinkscount_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/getmetatags_request.rb +0 -24
- data/lib/open_api_sdk/models/operations/getmetatags_response.rb +0 -33
- data/lib/open_api_sdk/models/operations/getmetatags_responsebody.rb +0 -30
- data/lib/open_api_sdk/models/operations/getqrcode_request.rb +0 -39
- data/lib/open_api_sdk/models/operations/getqrcode_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/gettags_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/getworkspace_request.rb +0 -24
- data/lib/open_api_sdk/models/operations/getworkspace_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/groupby.rb +0 -28
- data/lib/open_api_sdk/models/operations/interval.rb +0 -25
- data/lib/open_api_sdk/models/operations/level.rb +0 -21
- data/lib/open_api_sdk/models/operations/listdomains_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/paymentprocessor.rb +0 -20
- data/lib/open_api_sdk/models/operations/requestbody.rb +0 -95
- data/lib/open_api_sdk/models/operations/retrieveanalytics_request.rb +0 -81
- data/lib/open_api_sdk/models/operations/retrieveanalytics_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/sort.rb +0 -20
- data/lib/open_api_sdk/models/operations/trackcustomer_requestbody.rb +0 -33
- data/lib/open_api_sdk/models/operations/trackcustomer_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/trackcustomer_responsebody.rb +0 -33
- data/lib/open_api_sdk/models/operations/tracklead_requestbody.rb +0 -42
- data/lib/open_api_sdk/models/operations/tracklead_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/tracklead_responsebody.rb +0 -42
- data/lib/open_api_sdk/models/operations/tracksale_requestbody.rb +0 -42
- data/lib/open_api_sdk/models/operations/tracksale_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/tracksale_responsebody.rb +0 -42
- data/lib/open_api_sdk/models/operations/updatedomain_request.rb +0 -27
- data/lib/open_api_sdk/models/operations/updatedomain_requestbody.rb +0 -33
- data/lib/open_api_sdk/models/operations/updatedomain_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/updatelink_request.rb +0 -27
- data/lib/open_api_sdk/models/operations/updatelink_requestbody.rb +0 -95
- data/lib/open_api_sdk/models/operations/updatelink_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/updatetag_color.rb +0 -24
- data/lib/open_api_sdk/models/operations/updatetag_request.rb +0 -27
- data/lib/open_api_sdk/models/operations/updatetag_requestbody.rb +0 -32
- data/lib/open_api_sdk/models/operations/updatetag_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/updateworkspace_request.rb +0 -27
- data/lib/open_api_sdk/models/operations/updateworkspace_requestbody.rb +0 -27
- data/lib/open_api_sdk/models/operations/updateworkspace_response.rb +0 -60
- data/lib/open_api_sdk/models/operations/upsertlink_requestbody.rb +0 -95
- data/lib/open_api_sdk/models/operations/upsertlink_response.rb +0 -60
- data/lib/open_api_sdk/models/operations.rb +0 -74
- data/lib/open_api_sdk/models/shared/badrequest.rb +0 -24
- data/lib/open_api_sdk/models/shared/code.rb +0 -18
- data/lib/open_api_sdk/models/shared/color.rb +0 -24
- data/lib/open_api_sdk/models/shared/conflict.rb +0 -24
- data/lib/open_api_sdk/models/shared/conflict_code.rb +0 -18
- data/lib/open_api_sdk/models/shared/conflict_error.rb +0 -30
- data/lib/open_api_sdk/models/shared/countrycode.rb +0 -267
- data/lib/open_api_sdk/models/shared/domains.rb +0 -27
- data/lib/open_api_sdk/models/shared/domainschema.rb +0 -48
- data/lib/open_api_sdk/models/shared/error.rb +0 -30
- data/lib/open_api_sdk/models/shared/forbidden.rb +0 -24
- data/lib/open_api_sdk/models/shared/forbidden_code.rb +0 -18
- data/lib/open_api_sdk/models/shared/forbidden_error.rb +0 -30
- data/lib/open_api_sdk/models/shared/geo.rb +0 -771
- data/lib/open_api_sdk/models/shared/internalservererror.rb +0 -24
- data/lib/open_api_sdk/models/shared/internalservererror_code.rb +0 -18
- data/lib/open_api_sdk/models/shared/internalservererror_error.rb +0 -30
- data/lib/open_api_sdk/models/shared/inviteexpired.rb +0 -24
- data/lib/open_api_sdk/models/shared/inviteexpired_code.rb +0 -18
- data/lib/open_api_sdk/models/shared/inviteexpired_error.rb +0 -30
- data/lib/open_api_sdk/models/shared/linkgeotargeting.rb +0 -771
- data/lib/open_api_sdk/models/shared/linkschema.rb +0 -142
- data/lib/open_api_sdk/models/shared/notfound.rb +0 -24
- data/lib/open_api_sdk/models/shared/notfound_code.rb +0 -18
- data/lib/open_api_sdk/models/shared/notfound_error.rb +0 -30
- data/lib/open_api_sdk/models/shared/plan.rb +0 -24
- data/lib/open_api_sdk/models/shared/ratelimitexceeded.rb +0 -24
- data/lib/open_api_sdk/models/shared/ratelimitexceeded_code.rb +0 -18
- data/lib/open_api_sdk/models/shared/ratelimitexceeded_error.rb +0 -30
- data/lib/open_api_sdk/models/shared/role.rb +0 -19
- data/lib/open_api_sdk/models/shared/security.rb +0 -24
- data/lib/open_api_sdk/models/shared/tagschema.rb +0 -30
- data/lib/open_api_sdk/models/shared/unauthorized.rb +0 -24
- data/lib/open_api_sdk/models/shared/unauthorized_code.rb +0 -18
- data/lib/open_api_sdk/models/shared/unauthorized_error.rb +0 -30
- data/lib/open_api_sdk/models/shared/unprocessableentity.rb +0 -24
- data/lib/open_api_sdk/models/shared/unprocessableentity_code.rb +0 -18
- data/lib/open_api_sdk/models/shared/unprocessableentity_error.rb +0 -30
- data/lib/open_api_sdk/models/shared/users.rb +0 -24
- data/lib/open_api_sdk/models/shared/workspaceschema.rb +0 -81
- data/lib/open_api_sdk/models/shared.rb +0 -49
- data/lib/open_api_sdk/qr_codes.rb +0 -97
- data/lib/open_api_sdk/sdkconfiguration.rb +0 -52
- data/lib/open_api_sdk/tags.rb +0 -272
- data/lib/open_api_sdk/track.rb +0 -276
- data/lib/open_api_sdk/utils/metadata_fields.rb +0 -150
- data/lib/open_api_sdk/utils/t.rb +0 -59
- data/lib/open_api_sdk/utils/utils.rb +0 -772
- data/lib/open_api_sdk/workspaces.rb +0 -192
data/lib/dub/klass.rb
ADDED
@@ -0,0 +1,338 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
module Dub
|
3
|
+
module MemberExtraction
|
4
|
+
end
|
5
|
+
end
|
6
|
+
require 'dub/member_extraction'
|
7
|
+
|
8
|
+
module Dub
|
9
|
+
class Klass
|
10
|
+
include MemberExtraction
|
11
|
+
attr_reader :name, :xml, :prefix, :constructor, :alias_names, :enums, :ancestors, :parent, :instanciations
|
12
|
+
attr_accessor :opts
|
13
|
+
|
14
|
+
def initialize(parent, name, xml, prefix = '')
|
15
|
+
@parent, @name, @xml, @prefix = parent, name, xml, prefix
|
16
|
+
|
17
|
+
@alias_names = []
|
18
|
+
@enums = []
|
19
|
+
@ignores = []
|
20
|
+
@instanciations = {}
|
21
|
+
@opts = {}
|
22
|
+
parse_xml
|
23
|
+
end
|
24
|
+
|
25
|
+
def bind(generator)
|
26
|
+
self.gen = generator.class_generator
|
27
|
+
end
|
28
|
+
|
29
|
+
def gen=(generator)
|
30
|
+
@gen = generator
|
31
|
+
@gen_members = nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
generator.klass(self)
|
36
|
+
end
|
37
|
+
|
38
|
+
def generator
|
39
|
+
@gen || (@parent && @parent.class_generator)
|
40
|
+
end
|
41
|
+
|
42
|
+
def function_generator
|
43
|
+
if generator = self.generator
|
44
|
+
generator.function_generator
|
45
|
+
else
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
alias gen generator
|
51
|
+
|
52
|
+
def ignore(list)
|
53
|
+
list = [list].flatten
|
54
|
+
@ignores += list
|
55
|
+
@ignores.uniq!
|
56
|
+
@gen_members = nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def members
|
60
|
+
list = super(@ignores)
|
61
|
+
if self.generator
|
62
|
+
list = @gen_members ||= self.generator.members_list(list.reject {|m| m.constructor?})
|
63
|
+
end
|
64
|
+
# Copy members from super classes
|
65
|
+
superclasses = (@opts[:super] || '').split(',').map(&:strip)
|
66
|
+
@super_members ||= superclasses.map do |id_name|
|
67
|
+
if id_name =~ /([^\.])\.(.*)/
|
68
|
+
namespace = Dub::Namespace.find($1)
|
69
|
+
class_name = $2
|
70
|
+
else
|
71
|
+
namespace = self.parent
|
72
|
+
class_name = id_name
|
73
|
+
end
|
74
|
+
if x = namespace[class_name]
|
75
|
+
x.members
|
76
|
+
else
|
77
|
+
Dub.logger.warn "Could not find superclass '#{id_name}'"
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
end.compact.flatten
|
81
|
+
(list + @super_members).sort do |a,b|
|
82
|
+
a.name <=> b.name
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def <=>(other)
|
87
|
+
(name || "") <=> (other.name || "")
|
88
|
+
end
|
89
|
+
|
90
|
+
def [](name)
|
91
|
+
name.to_s == @name ? constructor : get_member(name.to_s)
|
92
|
+
end
|
93
|
+
|
94
|
+
def class_methods
|
95
|
+
[]
|
96
|
+
end
|
97
|
+
|
98
|
+
def template?
|
99
|
+
!@template_params.nil?
|
100
|
+
end
|
101
|
+
|
102
|
+
def has_constants?
|
103
|
+
has_enums?
|
104
|
+
end
|
105
|
+
|
106
|
+
def has_enums?
|
107
|
+
!@enums.empty?
|
108
|
+
end
|
109
|
+
|
110
|
+
# Special or no destructor: class construction
|
111
|
+
# and method calls are treated differently because
|
112
|
+
# the object can be destroyed out of Lua (and Lua
|
113
|
+
# should call a special method on garbage collection).
|
114
|
+
def custom_destructor?
|
115
|
+
@opts[:destructor]
|
116
|
+
end
|
117
|
+
|
118
|
+
# Use a static method as constructor.
|
119
|
+
def custom_constructor?
|
120
|
+
@opts[:constructor]
|
121
|
+
end
|
122
|
+
|
123
|
+
def template_params
|
124
|
+
@template_params
|
125
|
+
end
|
126
|
+
|
127
|
+
def class_with_params(template_params)
|
128
|
+
@instanciations[template_params]
|
129
|
+
end
|
130
|
+
|
131
|
+
def register_instanciation(template_params, klass)
|
132
|
+
@instanciations[template_params] = klass
|
133
|
+
end
|
134
|
+
|
135
|
+
def source
|
136
|
+
loc = (@xml/'location').first.attributes
|
137
|
+
"#{loc['file'].split('/')[-3..-1].join('/')}:#{loc['line']}"
|
138
|
+
end
|
139
|
+
|
140
|
+
def header
|
141
|
+
@opts[:header] ||= (@xml/'location').first.attributes['file'].split('/').last
|
142
|
+
end
|
143
|
+
|
144
|
+
def full_type
|
145
|
+
@parent ? "#{@parent.full_type}::#{name}" : name
|
146
|
+
end
|
147
|
+
|
148
|
+
def lib_name
|
149
|
+
@opts[:lib_name] || name
|
150
|
+
end
|
151
|
+
|
152
|
+
def id_name(name = self.name)
|
153
|
+
"#{prefix}.#{name}"
|
154
|
+
end
|
155
|
+
|
156
|
+
def destructor_name
|
157
|
+
"#{name}_destructor"
|
158
|
+
end
|
159
|
+
|
160
|
+
def is_deleted_name
|
161
|
+
"#{name}_deleted"
|
162
|
+
end
|
163
|
+
|
164
|
+
def tostring_name
|
165
|
+
"#{name}__tostring"
|
166
|
+
end
|
167
|
+
|
168
|
+
def constructor
|
169
|
+
if custom_constructor?
|
170
|
+
# Using a static member built with member list
|
171
|
+
return nil
|
172
|
+
end
|
173
|
+
|
174
|
+
if defined?(@constructor)
|
175
|
+
@constructor
|
176
|
+
else
|
177
|
+
self.members
|
178
|
+
@constructor ||= nil
|
179
|
+
end
|
180
|
+
@constructor
|
181
|
+
end
|
182
|
+
|
183
|
+
def names
|
184
|
+
[@name] + @alias_names
|
185
|
+
end
|
186
|
+
|
187
|
+
# Uses the bind declaration to read function bodies from a yml file:
|
188
|
+
# @dub bind: Foo.yml
|
189
|
+
def custom_bind(lang)
|
190
|
+
if !@bind_hash then
|
191
|
+
if file = @opts[:bind] then
|
192
|
+
header = (@xml/'location').first[:file]
|
193
|
+
path = header.split('/')
|
194
|
+
path.pop
|
195
|
+
path = (path + [file]).join('/')
|
196
|
+
if File.exist?(path) then
|
197
|
+
data = File.read(path)
|
198
|
+
@bind_hash = YAML::load(data)
|
199
|
+
else
|
200
|
+
@bind_hash = {}
|
201
|
+
Dub.logger.warn "Missing binding file '#{path}'"
|
202
|
+
end
|
203
|
+
else
|
204
|
+
@bind_hash = {}
|
205
|
+
end
|
206
|
+
end
|
207
|
+
@bind_hash[lang] ||= {}
|
208
|
+
end
|
209
|
+
|
210
|
+
private
|
211
|
+
def parse_xml
|
212
|
+
parse_opts_hash
|
213
|
+
parse_ancestors
|
214
|
+
parse_enums
|
215
|
+
parse_members
|
216
|
+
parse_template_params
|
217
|
+
parse_instanciations
|
218
|
+
parse_alias_names
|
219
|
+
end
|
220
|
+
|
221
|
+
def parse_opts_hash
|
222
|
+
if hash = Dub::OptsParser.extract_hash(@xml)
|
223
|
+
if hash.kind_of?(Hash)
|
224
|
+
if ignore = hash[:ignore]
|
225
|
+
self.ignore(ignore.split(',').map(&:strip))
|
226
|
+
end
|
227
|
+
@opts.merge!(hash)
|
228
|
+
else
|
229
|
+
raise "Could not parse @dub parameters #{hash.inspect}"
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
def parse_enums
|
235
|
+
@enums = (@xml/"enumvalue/name").map{|e| e.innerHTML}
|
236
|
+
end
|
237
|
+
|
238
|
+
def parse_ancestors
|
239
|
+
@ancestors = (@xml/'inheritancegraph'/'label').map{|a| a.innerHTML}
|
240
|
+
end
|
241
|
+
|
242
|
+
def parse_template_params
|
243
|
+
template_params = (@xml/'/templateparamlist/param')
|
244
|
+
if !template_params.empty?
|
245
|
+
@template_params = template_params.map do |param|
|
246
|
+
(param/'/type').innerHTML.gsub(/^\s*(typename|class)\s+/,'')
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
def parse_instanciations
|
252
|
+
(@xml/'instanciation').each do |klass|
|
253
|
+
name = (klass/'name').innerHTML
|
254
|
+
params = (klass/'param').map do |p|
|
255
|
+
p.innerHTML
|
256
|
+
end
|
257
|
+
|
258
|
+
@instanciations[params] = @parent[name]
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
def parse_alias_names
|
263
|
+
(@xml/'aliases/name').each do |name|
|
264
|
+
name = name.innerHTML
|
265
|
+
if name.size < @name.size
|
266
|
+
@alias_names << @name
|
267
|
+
change_name(name)
|
268
|
+
else
|
269
|
+
@alias_names << name
|
270
|
+
end
|
271
|
+
|
272
|
+
if @parent
|
273
|
+
@parent.register_alias(name, self)
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
def make_member(name, xml)
|
279
|
+
member = super
|
280
|
+
return nil unless member
|
281
|
+
|
282
|
+
if names.include?(name)
|
283
|
+
member.name = @name # force key name
|
284
|
+
member.set_as_constructor
|
285
|
+
|
286
|
+
# special handling of constructors
|
287
|
+
if @constructor.kind_of?(FunctionGroup)
|
288
|
+
@constructor << member
|
289
|
+
elsif @constructor
|
290
|
+
list = Dub::FunctionGroup.new(self)
|
291
|
+
list << @constructor
|
292
|
+
list << member
|
293
|
+
@constructor = list
|
294
|
+
else
|
295
|
+
@constructor = member
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
member
|
300
|
+
end
|
301
|
+
|
302
|
+
def change_name(new_name)
|
303
|
+
@name = new_name
|
304
|
+
if @constructor.kind_of?(Array)
|
305
|
+
@constructor.each do |c|
|
306
|
+
c.name = new_name
|
307
|
+
end
|
308
|
+
elsif @constructor
|
309
|
+
@constructor.name = new_name
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
def method_missing(met, *args)
|
314
|
+
if args.empty? && @opts.has_key?(met.to_sym)
|
315
|
+
@opts[met.to_sym]
|
316
|
+
elsif args.size == 1 && met.to_s =~ /^(.+)=$/
|
317
|
+
@opts[$1.to_sym] = args.first
|
318
|
+
else
|
319
|
+
super
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
def ignore_member?(member)
|
324
|
+
if custom_destructor?
|
325
|
+
if member.name == opts[:destructor] || member.name == 'set_userdata_ptr'
|
326
|
+
return true
|
327
|
+
end
|
328
|
+
end
|
329
|
+
if custom_constructor?
|
330
|
+
if member.constructor?
|
331
|
+
return true
|
332
|
+
end
|
333
|
+
end
|
334
|
+
super
|
335
|
+
end
|
336
|
+
|
337
|
+
end
|
338
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#include "<%= @class.header %>"
|
2
|
+
|
3
|
+
#include "lua_cpp_helper.h"
|
4
|
+
|
5
|
+
<%# We need this to serialize superclass members properly %>
|
6
|
+
<% Lua.function_generator.klass = @class %>
|
7
|
+
|
8
|
+
<% if @class.prefix %>
|
9
|
+
using namespace <%= @class.prefix %>;
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
/* ============================ Constructors ====================== */
|
13
|
+
|
14
|
+
<%= @class.constructor %>
|
15
|
+
|
16
|
+
<% if @class.opts[:destructor] == '' %>
|
17
|
+
// Destructor disabled for this class
|
18
|
+
<% else %>
|
19
|
+
/* ============================ Destructor ====================== */
|
20
|
+
|
21
|
+
static int <%= @class.destructor_name %>(lua_State *L) {
|
22
|
+
<%= @class.name %> **userdata = (<%= @class.name %>**)dubL_checksdata_n(L, 1, <%= @class.id_name.inspect %>);
|
23
|
+
|
24
|
+
<% if @class.custom_destructor? %>
|
25
|
+
// custom destructor
|
26
|
+
if (*userdata) (*userdata)-><%= @class.opts[:destructor] %>();
|
27
|
+
<% else %>
|
28
|
+
if (*userdata) delete *userdata;
|
29
|
+
<% end %>
|
30
|
+
*userdata = NULL;
|
31
|
+
return 0;
|
32
|
+
}
|
33
|
+
<% end %>
|
34
|
+
|
35
|
+
<% if @class.custom_destructor? %>
|
36
|
+
|
37
|
+
// test if class is deleted
|
38
|
+
static int <%= @class.is_deleted_name %>(lua_State *L) {
|
39
|
+
<%= @class.name %> **userdata = (<%= @class.name %>**)dubL_checksdata_n(L, 1, <%= @class.id_name.inspect %>);
|
40
|
+
lua_pushboolean(L, *userdata == NULL);
|
41
|
+
return 1;
|
42
|
+
}
|
43
|
+
<% end %>
|
44
|
+
/* ============================ tostring ====================== */
|
45
|
+
|
46
|
+
static int <%= @class.tostring_name %>(lua_State *L) {
|
47
|
+
<%= @class.name %> **userdata = (<%= @class.name %>**)dubL_checksdata_n(L, 1, <%= @class.id_name.inspect %>);
|
48
|
+
<% if @class.custom_destructor? %>
|
49
|
+
if (!*userdata) {
|
50
|
+
lua_pushstring(L, "<<%= @class.id_name %>: NULL>");
|
51
|
+
return 1;
|
52
|
+
}
|
53
|
+
<% end %>
|
54
|
+
<% if @class.opts[:string_format] %>
|
55
|
+
lua_pushfstring(L, "<<%= @class.id_name %>: %p <%= @class.string_format %>>", *userdata, <%= @class.string_args %>);
|
56
|
+
<% else %>
|
57
|
+
lua_pushfstring(L, "<<%= @class.id_name %>: %p>", *userdata);
|
58
|
+
<% end %>
|
59
|
+
return 1;
|
60
|
+
}
|
61
|
+
|
62
|
+
/* ============================ Member Methods ====================== */
|
63
|
+
|
64
|
+
<% if @class.members; @class.members.each do |function| %>
|
65
|
+
<%= function %>
|
66
|
+
|
67
|
+
<% end; end %>
|
68
|
+
|
69
|
+
|
70
|
+
/* ============================ Lua Registration ====================== */
|
71
|
+
|
72
|
+
static const struct luaL_Reg <%= @class.name %>_member_methods[] = {
|
73
|
+
<%= indent(method_registration, 2) %>,
|
74
|
+
{NULL, NULL},
|
75
|
+
};
|
76
|
+
|
77
|
+
static const struct luaL_Reg <%= @class.name %>_namespace_methods[] = {
|
78
|
+
<%= indent(namespace_methods_registration, 2) %>,
|
79
|
+
{NULL, NULL},
|
80
|
+
};
|
81
|
+
|
82
|
+
<% if @class.has_constants? %>
|
83
|
+
static const struct lua_constants_Reg <%= @class.name %>_namespace_constants[] = {
|
84
|
+
<%= indent(constants_registration, 2) %>,
|
85
|
+
{NULL, NULL},
|
86
|
+
};
|
87
|
+
<% end %>
|
88
|
+
|
89
|
+
#ifdef DUB_LUA_NO_OPEN
|
90
|
+
int luaload_<%= @class.prefix %>_<%= @class.lib_name %>(lua_State *L) {
|
91
|
+
#else
|
92
|
+
extern "C" int luaopen_<%= @class.prefix %>_<%= @class.lib_name %>(lua_State *L) {
|
93
|
+
#endif
|
94
|
+
// Create the metatable which will contain all the member methods
|
95
|
+
luaL_newmetatable(L, <%= @class.id_name.inspect %>);
|
96
|
+
|
97
|
+
// metatable.__index = metatable (find methods in the table itself)
|
98
|
+
lua_pushvalue(L, -1);
|
99
|
+
lua_setfield(L, -2, "__index");
|
100
|
+
|
101
|
+
// register member methods
|
102
|
+
luaL_register(L, NULL, <%= @class.name %>_member_methods);
|
103
|
+
// save meta-table in <%= @class.prefix %>.<%= @class.name %>_
|
104
|
+
register_mt(L, <%= @class.prefix.inspect %>, <%= @class.name.inspect %>);
|
105
|
+
|
106
|
+
// register class methods in a global namespace table
|
107
|
+
luaL_register(L, <%= @class.prefix.inspect %>, <%= @class.name %>_namespace_methods);
|
108
|
+
|
109
|
+
<% if @class.has_constants? %>
|
110
|
+
// register class enums
|
111
|
+
register_constants(L, <%= (@class.id_name + '_const').inspect %>, <%= @class.name %>_namespace_constants);
|
112
|
+
<% end %>
|
113
|
+
return 1;
|
114
|
+
}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
|
2
|
+
require 'dub/generator'
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
module Dub
|
6
|
+
module Lua
|
7
|
+
class ClassGen < Dub::Generator
|
8
|
+
attr_accessor :template_path
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
load_erb
|
12
|
+
end
|
13
|
+
|
14
|
+
def template_path=(template_path)
|
15
|
+
@template_path = template_path
|
16
|
+
load_erb
|
17
|
+
end
|
18
|
+
|
19
|
+
def klass(klass)
|
20
|
+
@class = klass
|
21
|
+
@class_template.result(binding)
|
22
|
+
end
|
23
|
+
|
24
|
+
def function_generator
|
25
|
+
Lua.function_generator
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_registration(klass = @class)
|
29
|
+
member_methods = (klass.members || []).map do |method|
|
30
|
+
next if method.static?
|
31
|
+
"{%-20s, #{method.method_name(0)}}" % method.name.inspect
|
32
|
+
end.compact
|
33
|
+
|
34
|
+
member_methods << "{%-20s, #{klass.tostring_name}}" % "__tostring".inspect
|
35
|
+
if klass.opts[:destructor] != ''
|
36
|
+
member_methods << "{%-20s, #{klass.destructor_name}}" % "__gc".inspect
|
37
|
+
end
|
38
|
+
if klass.custom_destructor?
|
39
|
+
member_methods << "{%-20s, #{klass.is_deleted_name}}" % "deleted".inspect
|
40
|
+
end
|
41
|
+
|
42
|
+
member_methods.join(",\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
def namespace_methods_registration(klass = @class)
|
46
|
+
if custom_ctor = klass.opts[:constructor]
|
47
|
+
ctor = klass[custom_ctor.to_sym]
|
48
|
+
raise "#{klass.name} custom constructor '#{custom_ctor}' not found !" unless ctor
|
49
|
+
raise "#{klass.name} custom constructor '#{custom_ctor}' not a static function !" unless ctor.static?
|
50
|
+
|
51
|
+
global_methods = klass.names.map do |name|
|
52
|
+
"{%-20s, #{ctor.method_name(0)}}" % name.inspect
|
53
|
+
end
|
54
|
+
else
|
55
|
+
global_methods = klass.names.map do |name|
|
56
|
+
"{%-20s, #{(klass[klass.opts[:constructor]] || klass.constructor).method_name(0)}}" % name.inspect
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
(klass.members || []).map do |method|
|
61
|
+
next unless method.static?
|
62
|
+
next if method.name == custom_ctor
|
63
|
+
global_methods << "{%-20s, #{method.method_name(0)}}" % "#{klass.name}_#{method.name}".inspect
|
64
|
+
end
|
65
|
+
|
66
|
+
global_methods.join(",\n")
|
67
|
+
end
|
68
|
+
|
69
|
+
def constants_registration(klass = @class)
|
70
|
+
klass.enums.map do |name|
|
71
|
+
"{%-20s, #{klass.full_type}::#{name}}" % name.inspect
|
72
|
+
end.join(",\n")
|
73
|
+
end
|
74
|
+
|
75
|
+
def members_list(all_members)
|
76
|
+
all_members
|
77
|
+
#list = all_members.map do |member_or_group|
|
78
|
+
# if member_or_group.kind_of?(Array)
|
79
|
+
# members_list(member_or_group)
|
80
|
+
# elsif ignore_member?(member_or_group)
|
81
|
+
# nil
|
82
|
+
# else
|
83
|
+
# member_or_group
|
84
|
+
# end
|
85
|
+
#end
|
86
|
+
#
|
87
|
+
#list.compact!
|
88
|
+
#list == [] ? nil : list
|
89
|
+
end
|
90
|
+
|
91
|
+
def load_erb
|
92
|
+
@class_template = ::ERB.new(File.read(@template_path || File.join(File.dirname(__FILE__), 'class.cpp.erb')))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%= comment(@function) %>
|
2
|
+
<%= signature(@function) %> {
|
3
|
+
<% if @function.throws? -%>
|
4
|
+
try {
|
5
|
+
<%= indent(body(@function, 'dub'), 4) %>
|
6
|
+
} catch (std::exception &e) {
|
7
|
+
lua_pushfstring(L, "<%= @function.name %>: %s", e.what());
|
8
|
+
} catch (...) {
|
9
|
+
lua_pushfstring(L, "<%= @function.name %>: Unknown exception");
|
10
|
+
}
|
11
|
+
return lua_error(L);
|
12
|
+
<% else -%>
|
13
|
+
<%= indent(body(@function, 'lua'), 2) %>
|
14
|
+
<% end -%>
|
15
|
+
}
|