mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
forward-declare non-managed actors
This commit is contained in:
parent
96fa9d431b
commit
6a2a26a706
@ -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):
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user