forward-declare non-managed actors

This commit is contained in:
Chris Jones 2009-08-12 15:51:39 -05:00
parent 96fa9d431b
commit 6a2a26a706
3 changed files with 39 additions and 1 deletions

View File

@ -64,6 +64,9 @@ class Visitor:
tdef.fromtype.accept(self)
tdef.totype.accept(self)
def visitForwardDecl(self, fd):
pass
def visitDecl(self, decl):
decl.type.accept(self)
@ -263,6 +266,14 @@ class Typedef(Node):
self.fromtype = fromtype
self.totype = totype
class ForwardDecl(Node):
def __init__(self, pqname, cls=0, struct=0):
assert (not cls and struct) or (cls and not struct)
self.pqname = pqname
self.cls = cls
self.struct = struct
class Decl(Node):
'''represents |Foo bar|, e.g. in a function signature'''
def __init__(self, type, name):

View File

@ -87,6 +87,12 @@ class CxxCodeGen(CodePrinter, Visitor):
td.totype.accept(self)
self.println(';')
def visitForwardDecl(self, fd):
if fd.cls: self.printdent('class ')
elif fd.struct: self.printdent('struct ')
self.write(str(fd.pqname))
self.println(';')
def visitDecl(self, d):
d.type.accept(self)
if d.name:

View File

@ -50,6 +50,22 @@ def _protocolHeaderFilename(p, pname):
def _protocolHeaderName(pname):
return pname +'Protocol'
def _makeForwardDecl(p, namesuffix=''):
clsname = p.decl.type.qname.baseid + namesuffix
fd = cxx.ForwardDecl(clsname, cls=1)
if 0 == len(p.namespaces):
return fd
outerns = cxx.Namespace(p.namespaces[0].namespace)
innerns = outerns
for ns in p.namespaces[1:]:
tmpns = cxx.Namespace(ns.namespace)
innerns.addstmt(tmpns)
innerns = tmpns
innerns.addstmt(fd)
return outerns
class _struct: pass
@ -495,10 +511,15 @@ class GenerateProtocolActorHeader(Visitor):
def visitProtocolInclude(self, pi):
p = pi.tu.protocol
if self.protocol.decl.type.isManagerOf(p.decl.type):
header = _protocolHeaderFilename(
p, _protocolHeaderName(p.name)+ self.myside)
self.file.addthing(cxx.CppDirective('include', '"'+ header +'"'))
else:
self.file.addthing(_makeForwardDecl(p, 'Protocol'+ self.myside))
if p.decl.fullname is not None:
self.typedefs.append(cxx.Typedef(
cxx.Type(_protocolHeaderName(p.decl.fullname) + self.myside),
cxx.Type(_protocolHeaderName(p.decl.shortname) + self.myside)))
@ -559,7 +580,7 @@ class GenerateProtocolActorHeader(Visitor):
if p.decl.type.isManaged():
cls.addstmt(cxx.FriendClassDecl(
_protocolHeaderName(p.decl.type.manager.name())
_protocolHeaderName(p.decl.type.manager.fullname())
+ self.myside))
cls.addstmt(cxx.Whitespace.NL)