-- tolua: typedef 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.

-- Typedef class
-- Represents a type synonym.
-- The 'de facto' type replaces the typedef before the
-- remaining code is parsed.
-- The following fields are stored:
--   utype = typedef name
--   type = 'the facto' type
--   mod = modifiers to the 'de facto' type
classTypedef = {
	utype = "",
	mod = "",
	type = ""
}
classTypedef.__index = classTypedef

-- Print method
function classTypedef:print(ident, close)
	print(ident .. "Typedef{")
	print(ident .. " utype = '" .. self.utype .. "',")
	print(ident .. " mod = '" .. self.mod .. "',")
	print(ident .. " type = '" .. self.type .. "',")
	print(ident .. "}" .. close)
end

-- Return it's not a variable
function classTypedef:isvariable()
	return false
end

-- Internal constructor
function _Typedef(t)
	setmetatable(t, classTypedef)
	t.type = resolve_template_types(t.type)
	appendtypedef(t)
	return t
end

-- Constructor
-- Expects one string representing the type definition.
function Typedef(s)
	if strfind(string.gsub(s, "%b<>", ""), "[%*&]") then
		tolua_error("#invalid typedef: pointers (and references) are not supported")
	end
	local o = {mod = ""}
	if string.find(s, "[<>]") then
		_, _, o.type, o.utype = string.find(s, "^%s*([^<>]+%b<>[^%s]*)%s+(.-)$")
	else
		local t = split(gsub(s, "%s%s*", " "), " ")
		o = {
			utype = t[t.n],
			type = t[t.n - 1],
			mod = concat(t, 1, t.n - 2)
		}
	end
	return _Typedef(o)
end

