summaryrefslogtreecommitdiffstats
path: root/lib/tolua++/src/bin/lua/feature.lua
blob: 14f01d325012f095f24b282f9d441081f7fedea8 (plain) (blame)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
-- tolua: abstract feature class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $

-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.


-- Feature class
-- Represents the base class of all mapped feature.
classFeature = {
}
classFeature.__index = classFeature

-- write support code
function classFeature:supcode ()
end

-- output tag
function classFeature:decltype ()
end

-- register feature
function classFeature:register (pre)
end

-- translate verbatim
function classFeature:preamble ()
end

-- check if it is a variable
function classFeature:isvariable ()
 return false
end

-- check if it requires collection
function classFeature:requirecollection (t)
 return false
end

-- build names
function classFeature:buildnames ()
 if self.name and self.name~='' then
  local n = split(self.name,'@')
  self.name = n[1]
  self.name = string.gsub(self.name, ":%d*$", "")
  if not n[2] then
   n[2] = applyrenaming(n[1])
  end
  self.lname = n[2] or gsub(n[1],"%[.-%]","")
  self.lname = string.gsub(self.lname, ":%d*$", "")
  self.original_name = self.name
  self.lname = clean_template(self.lname)
 end
 if not self.is_parameter then
	 self.name = getonlynamespace() .. self.name
 end

 local parent = classContainer.curr
 if parent then
 	self.access = parent.curr_member_access
	self.global_access = self:check_public_access()
 else
 end
end

function classFeature:check_public_access()

	if type(self.global_access) == "boolean" then
		return self.global_access
	end

	if self.access and self.access ~= 0 then
		return false
	end

	local parent = classContainer.curr
	while parent do
		if parent.access and parent.access ~= 0 then
			return false
		end
		parent = parent.prox
	end
	return true
end

function clean_template(t)

	return string.gsub(t, "[<>:, %*]", "_")
end

-- check if feature is inside a container definition
-- it returns the container class name or nil.
function classFeature:incontainer (which)
 if self.parent then
  local parent = self.parent
  while parent do
   if parent.classtype == which then
    return parent.name
   end
   parent = parent.parent
  end
 end
 return nil
end

function classFeature:inclass ()
 return self:incontainer('class')
end

function classFeature:inmodule ()
 return self:incontainer('module')
end

function classFeature:innamespace ()
 return self:incontainer('namespace')
end

-- return C binding function name based on name
-- the client specifies a prefix
function classFeature:cfuncname (n)

 if self.parent then
  n = self.parent:cfuncname(n)
 end

 local fname = self.lname
 if not fname or fname == '' then
 	fname = self.name
 end
  n = string.gsub(n..'_'.. (fname), "[<>:, %.%*&]", "_")

  return n
end