| [1650] | 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 | |
|---|