1 | -- tolua: abstract feature class |
---|
2 | -- Written by Waldemar Celes |
---|
3 | -- TeCGraf/PUC-Rio |
---|
4 | -- Jul 1998 |
---|
5 | -- $Id: $ |
---|
6 | |
---|
7 | -- This code is free software; you can redistribute it and/or modify it. |
---|
8 | -- The software provided hereunder is on an "as is" basis, and |
---|
9 | -- the author has no obligation to provide maintenance, support, updates, |
---|
10 | -- enhancements, or modifications. |
---|
11 | |
---|
12 | |
---|
13 | -- Feature class |
---|
14 | -- Represents the base class of all mapped feature. |
---|
15 | classFeature = { |
---|
16 | } |
---|
17 | classFeature.__index = classFeature |
---|
18 | |
---|
19 | -- write support code |
---|
20 | function classFeature:supcode () |
---|
21 | end |
---|
22 | |
---|
23 | -- output tag |
---|
24 | function classFeature:decltype () |
---|
25 | end |
---|
26 | |
---|
27 | -- register feature |
---|
28 | function classFeature:register (pre) |
---|
29 | end |
---|
30 | |
---|
31 | -- translate verbatim |
---|
32 | function classFeature:preamble () |
---|
33 | end |
---|
34 | |
---|
35 | -- check if it is a variable |
---|
36 | function classFeature:isvariable () |
---|
37 | return false |
---|
38 | end |
---|
39 | |
---|
40 | -- check if it requires collection |
---|
41 | function classFeature:requirecollection (t) |
---|
42 | return false |
---|
43 | end |
---|
44 | |
---|
45 | -- build names |
---|
46 | function classFeature:buildnames () |
---|
47 | if self.name and self.name~='' then |
---|
48 | local n = split(self.name,'@') |
---|
49 | self.name = n[1] |
---|
50 | if not n[2] then |
---|
51 | n[2] = applyrenaming(n[1]) |
---|
52 | end |
---|
53 | self.lname = n[2] or gsub(n[1],"%[.-%]","") |
---|
54 | self.original_name = self.name |
---|
55 | self.lname = clean_template(self.lname) |
---|
56 | end |
---|
57 | if not self.is_parameter then |
---|
58 | self.name = getonlynamespace() .. self.name |
---|
59 | end |
---|
60 | |
---|
61 | local parent = classContainer.curr |
---|
62 | if parent then |
---|
63 | self.access = parent.curr_member_access |
---|
64 | else |
---|
65 | end |
---|
66 | end |
---|
67 | |
---|
68 | function classFeature:check_public_access() |
---|
69 | |
---|
70 | if self.access and self.access ~= 0 then |
---|
71 | return false |
---|
72 | end |
---|
73 | |
---|
74 | local parent = classContainer.curr |
---|
75 | while parent do |
---|
76 | if parent.access and parent.access ~= 0 then |
---|
77 | return false |
---|
78 | end |
---|
79 | parent = parent.prox |
---|
80 | end |
---|
81 | return true |
---|
82 | end |
---|
83 | |
---|
84 | function clean_template(t) |
---|
85 | |
---|
86 | return string.gsub(t, "[<>:, %*]", "_") |
---|
87 | end |
---|
88 | |
---|
89 | -- check if feature is inside a container definition |
---|
90 | -- it returns the container class name or nil. |
---|
91 | function classFeature:incontainer (which) |
---|
92 | if self.parent then |
---|
93 | local parent = self.parent |
---|
94 | while parent do |
---|
95 | if parent.classtype == which then |
---|
96 | return parent.name |
---|
97 | end |
---|
98 | parent = parent.parent |
---|
99 | end |
---|
100 | end |
---|
101 | return nil |
---|
102 | end |
---|
103 | |
---|
104 | function classFeature:inclass () |
---|
105 | return self:incontainer('class') |
---|
106 | end |
---|
107 | |
---|
108 | function classFeature:inmodule () |
---|
109 | return self:incontainer('module') |
---|
110 | end |
---|
111 | |
---|
112 | function classFeature:innamespace () |
---|
113 | return self:incontainer('namespace') |
---|
114 | end |
---|
115 | |
---|
116 | -- return C binding function name based on name |
---|
117 | -- the client specifies a prefix |
---|
118 | function classFeature:cfuncname (n) |
---|
119 | |
---|
120 | if self.parent then |
---|
121 | n = self.parent:cfuncname(n) |
---|
122 | end |
---|
123 | |
---|
124 | n = string.gsub(n..'_'.. (self.lname or self.name), "[<>:, \.%*&]", "_") |
---|
125 | |
---|
126 | return n |
---|
127 | end |
---|
128 | |
---|