Merge CGThing.declare and CGThing.define.

This distincion is carried over from the C++ codegen, but it has no meaning
in Rust.
This commit is contained in:
Ms2ger 2014-03-11 13:34:05 +01:00
parent 8c1f6bc72d
commit dd160b6392
3 changed files with 62 additions and 138 deletions

View file

@ -141,11 +141,9 @@ class CGThing():
"""
def __init__(self):
pass # Nothing for now
def declare(self):
"""Produce code for a header file."""
assert(False) # Override me!
def define(self):
"""Produce code for a cpp file."""
"""Produce code for a Rust file."""
assert(False) # Override me!
class CGMethodCall(CGThing):
@ -1575,9 +1573,7 @@ class CGNativePropertyHooks(CGThing):
def __init__(self, descriptor):
CGThing.__init__(self)
self.descriptor = descriptor
def declare(self):
#return "extern const NativePropertyHooks NativeHooks;\n"
return ""
def define(self):
if self.descriptor.concrete and self.descriptor.proxy:
resolveOwnProperty = "ResolveOwnProperty"
@ -1600,20 +1596,14 @@ class CGIndenter(CGThing):
A class that takes another CGThing and generates code that indents that
CGThing by some number of spaces. The default indent is two spaces.
"""
def __init__(self, child, indentLevel=2, declareOnly=False):
def __init__(self, child, indentLevel=2):
CGThing.__init__(self)
self.child = child
self.indent = " " * indentLevel
self.declareOnly = declareOnly
def declare(self):
decl = self.child.declare()
if decl is not "":
return re.sub(lineStartDetector, self.indent, decl)
else:
return ""
def define(self):
defn = self.child.define()
if defn is not "" and not self.declareOnly:
if defn is not "":
return re.sub(lineStartDetector, self.indent, defn)
else:
return defn
@ -1622,38 +1612,21 @@ class CGWrapper(CGThing):
"""
Generic CGThing that wraps other CGThings with pre and post text.
"""
def __init__(self, child, pre="", post="", declarePre=None,
declarePost=None, definePre=None, definePost=None,
declareOnly=False, defineOnly=False, reindent=False):
def __init__(self, child, pre="", post="", reindent=False):
CGThing.__init__(self)
self.child = child
self.declarePre = declarePre or pre
self.declarePost = declarePost or post
self.definePre = definePre or pre
self.definePost = definePost or post
self.declareOnly = declareOnly
self.defineOnly = defineOnly
self.pre = pre
self.post = post
self.reindent = reindent
def declare(self):
if self.defineOnly:
return ''
decl = self.child.declare()
if self.reindent:
# We don't use lineStartDetector because we don't want to
# insert whitespace at the beginning of our _first_ line.
decl = stripTrailingWhitespace(
decl.replace("\n", "\n" + (" " * len(self.declarePre))))
return self.declarePre + decl + self.declarePost
def define(self):
if self.declareOnly:
return ''
defn = self.child.define()
if self.reindent:
# We don't use lineStartDetector because we don't want to
# insert whitespace at the beginning of our _first_ line.
defn = stripTrailingWhitespace(
defn.replace("\n", "\n" + (" " * len(self.definePre))))
return self.definePre + defn + self.definePost
defn.replace("\n", "\n" + (" " * len(self.pre))))
return self.pre + defn + self.post
class CGImports(CGWrapper):
"""
@ -1681,7 +1654,7 @@ class CGImports(CGWrapper):
statements.extend('use %s;' % i for i in sorted(imports))
CGWrapper.__init__(self, child,
declarePre='\n'.join(statements) + '\n\n')
pre='\n'.join(statements) + '\n\n')
@staticmethod
def getDeclarationFilename(decl):
@ -1698,23 +1671,20 @@ class CGIfWrapper(CGWrapper):
post="\n}")
class CGNamespace(CGWrapper):
def __init__(self, namespace, child, declareOnly=False, public=False):
def __init__(self, namespace, child, public=False):
pre = "%smod %s {\n" % ("pub " if public else "", namespace)
post = "} // mod %s\n" % namespace
CGWrapper.__init__(self, child, pre=pre, post=post,
declareOnly=declareOnly)
CGWrapper.__init__(self, child, pre=pre, post=post)
@staticmethod
def build(namespaces, child, declareOnly=False, public=False):
def build(namespaces, child, public=False):
"""
Static helper method to build multiple wrapped namespaces.
"""
if not namespaces:
return CGWrapper(child, declareOnly=declareOnly)
inner = CGNamespace.build(namespaces[1:], child, declareOnly=declareOnly, public=public)
return CGNamespace(namespaces[0], inner, declareOnly=declareOnly, public=public)
def declare(self):
return ""
return child
inner = CGNamespace.build(namespaces[1:], child, public=public)
return CGNamespace(namespaces[0], inner, public=public)
def DOMClass(descriptor):
protoList = ['PrototypeList::id::' + proto for proto in descriptor.prototypeChain]
@ -1737,9 +1707,7 @@ class CGDOMJSClass(CGThing):
def __init__(self, descriptor):
CGThing.__init__(self)
self.descriptor = descriptor
def declare(self):
#return "extern DOMJSClass Class;\n"
return ""
def define(self):
traceHook = "Some(%s)" % TRACE_HOOK_NAME
if self.descriptor.createGlobal:
@ -1791,9 +1759,7 @@ class CGPrototypeJSClass(CGThing):
def __init__(self, descriptor):
CGThing.__init__(self)
self.descriptor = descriptor
def declare(self):
# We're purely for internal consumption
return ""
def define(self):
return """
static PrototypeClassName__: [u8, ..%s] = %s;
@ -1829,9 +1795,7 @@ class CGInterfaceObjectJSClass(CGThing):
def __init__(self, descriptor):
CGThing.__init__(self)
self.descriptor = descriptor
def declare(self):
# We're purely for internal consumption
return ""
def define(self):
if True:
return ""
@ -1872,8 +1836,7 @@ class CGList(CGThing):
self.children.insert(0, child)
def join(self, generator):
return self.joiner.join(filter(lambda s: len(s) > 0, (child for child in generator)))
def declare(self):
return self.join(child.declare() for child in self.children if child is not None)
def define(self):
return self.join(child.define() for child in self.children if child is not None)
@ -1890,13 +1853,11 @@ class CGGeneric(CGThing):
A class that spits out a fixed string into the codegen. Can spit out a
separate string for the declaration too.
"""
def __init__(self, define="", declare=""):
self.declareText = declare
self.defineText = define
def declare(self):
return self.declareText
def __init__(self, text):
self.text = text
def define(self):
return self.defineText
return self.text
def getTypes(descriptor):
"""
@ -2045,7 +2006,6 @@ class CGAbstractMethod(CGThing):
self.name = name
self.returnType = returnType
self.args = args
self.inline = inline
self.alwaysInline = alwaysInline
self.extern = extern
self.templateArgs = templateArgs
@ -2079,17 +2039,10 @@ class CGAbstractMethod(CGThing):
return "\n unsafe {" if self.unsafe else ""
def _unsafe_close(self):
return "\n }\n" if self.unsafe else ""
def declare(self):
if self.inline:
return self._define()
#return "%sfn %s%s(%s)%s;\n" % (self._decorators(), self.name, self._template(),
# self._argstring(), self._returnType())
return ""
def _define(self, fromDeclare=False):
def define(self, fromDeclare=False):
return self.definition_prologue(fromDeclare) + "\n" + self.definition_body() + self.definition_epilogue()
def define(self):
return "" if self.inline else self._define()
def definition_prologue(self, fromDeclare):
return "%sfn %s%s(%s)%s {%s" % (self._decorators(), self.name, self._template(),
self._argstring(fromDeclare), self._returnType(), self._unsafe_open())
@ -2180,9 +2133,6 @@ class CGAbstractExternMethod(CGAbstractMethod):
def __init__(self, descriptor, name, returnType, args):
CGAbstractMethod.__init__(self, descriptor, name, returnType, args,
inline=False, extern=True)
def declare(self):
# We only have implementation
return ""
class PropertyArrays():
def __init__(self, descriptor):
@ -2380,10 +2330,6 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod):
args = [Argument('&mut JSPageInfo', 'js_info')]
CGAbstractMethod.__init__(self, descriptor, 'DefineDOMInterface', 'bool', args, pub=True)
def declare(self):
#return CGAbstractMethod.declare(self)
return ""
def define(self):
return CGAbstractMethod.define(self)
@ -2945,9 +2891,6 @@ class CGMemberJITInfo(CGThing):
self.member = member
self.descriptor = descriptor
def declare(self):
return ""
def defineJitInfo(self, infoName, opName, infallible):
protoID = "PrototypeList::id::%s as u32" % self.descriptor.name
depth = self.descriptor.interface.inheritanceDepth()
@ -3021,9 +2964,6 @@ class CGEnum(CGThing):
CGThing.__init__(self)
self.enum = enum
def declare(self):
return ""
def define(self):
return """
#[repr(uint)]
@ -3176,7 +3116,7 @@ class CGUnionStruct(CGThing):
self.type = type
self.descriptorProvider = descriptorProvider
def declare(self):
def define(self):
templateVars = map(lambda t: getUnionTypeTemplateVars(t, self.descriptorProvider),
self.type.flatMemberTypes)
enumValues = [
@ -3186,8 +3126,6 @@ class CGUnionStruct(CGThing):
"%s\n"
"}\n") % (self.type, "\n".join(enumValues))
def define(self):
return ""
class CGUnionConversionStruct(CGThing):
def __init__(self, type, descriptorProvider):
@ -3307,7 +3245,7 @@ class CGUnionConversionStruct(CGThing):
pre="pub fn TryConvertTo%s(cx: *JSContext, value: JSVal) -> %s {\n" % (t.name, returnType),
post="\n}")
def declare(self):
def define(self):
methods = [self.from_value_method()]
methods.extend(self.try_method(t) for t in self.type.flatMemberTypes)
return """
@ -3315,8 +3253,6 @@ impl %s {
%s
}""" % (self.type, CGIndenter(CGList(methods, "\n\n")).define())
def define(self):
return ""
class ClassItem:
""" Use with CGClass """
@ -3699,7 +3635,7 @@ class CGClass(CGThing):
in self.templateSpecialization])
return className
def declare(self):
def define(self):
result = ''
if self.templateArgs:
templateArgs = [a.declare() for a in self.templateArgs]
@ -3775,8 +3711,6 @@ class CGClass(CGThing):
result += "}"
return result
def define(self):
return ''
class CGXrayHelper(CGAbstractExternMethod):
def __init__(self, descriptor, name, args, properties):
@ -3930,8 +3864,7 @@ class CGProxyUnwrap(CGAbstractMethod):
def __init__(self, descriptor):
args = [Argument('*JSObject', 'obj')]
CGAbstractMethod.__init__(self, descriptor, "UnwrapProxy", '*' + descriptor.concreteType, args, alwaysInline=True)
def declare(self):
return ""
def definition_body(self):
return """ /*if (xpc::WrapperFactory::IsXrayWrapper(obj)) {
obj = js::UnwrapObject(obj);
@ -4320,9 +4253,7 @@ class CGDOMJSProxyHandlerDOMClass(CGThing):
def __init__(self, descriptor):
CGThing.__init__(self)
self.descriptor = descriptor
def declare(self):
#return "extern const DOMClass Class;\n"
return ""
def define(self):
return """
static Class: DOMClass = """ + DOMClass(self.descriptor) + """;
@ -4382,7 +4313,7 @@ class CGDescriptor(CGThing):
cgThings.append(CGPrototypeJSClass(descriptor))
properties = PropertyArrays(descriptor)
cgThings.append(CGGeneric(define=str(properties)))
cgThings.append(CGGeneric(str(properties)))
cgThings.append(CGCreateInterfaceObjectsMethod(descriptor, properties))
# Set up our Xray callbacks as needed.
@ -4432,8 +4363,6 @@ class CGDescriptor(CGThing):
# post='\n')
self.cgRoot = cgThings
def declare(self):
return self.cgRoot.declare()
def define(self):
return self.cgRoot.define()
@ -4477,8 +4406,6 @@ class CGNamespacedEnum(CGThing):
# Save the result.
self.node = curr
def declare(self):
return self.node.declare()
def define(self):
return self.node.define()
@ -4501,9 +4428,12 @@ class CGDictionary(CGThing):
defaultValue=member.defaultValue))
for member in dictionary.members ]
def declare(self):
def define(self):
if not self.generatable:
return ""
return self.struct() + "\n" + self.impl()
def struct(self):
d = self.dictionary
if d.parent:
inheritance = " parent: %s::%s,\n" % (self.makeModuleName(d.parent),
@ -4524,9 +4454,7 @@ class CGDictionary(CGThing):
"}").substitute( { "selfName": self.makeClassName(d),
"inheritance": inheritance }))
def define(self):
if not self.generatable:
return ""
def impl(self):
d = self.dictionary
if d.parent:
initParent = ("// Per spec, we init the parent's members first\n"
@ -4755,8 +4683,8 @@ class CGBindingRoot(CGThing):
CGList([CGGeneric(" use dom::bindings::utils::EnumEntry;"),
CGEnum(e)]), public=True)
def makeEnumTypedef(e):
return CGGeneric(declare=("pub type %s = self::%sValues::valuelist;\n" %
(e.identifier.name, e.identifier.name)))
return CGGeneric("pub type %s = self::%sValues::valuelist;\n" %
(e.identifier.name, e.identifier.name))
cgthings = [ fun(e) for e in config.getEnums(webIDLFile)
for fun in [makeEnum, makeEnumTypedef] ]
@ -4878,8 +4806,7 @@ class CGBindingRoot(CGThing):
# Store the final result.
self.root = curr
def declare(self):
return stripTrailingWhitespace(self.root.declare())
def define(self):
return stripTrailingWhitespace(self.root.define())
@ -5795,7 +5722,7 @@ class GlobalGenRoots():
return "dom::%s" % descriptor.name.lower()
descriptors = [d.name for d in config.getDescriptors(register=True, hasInterfaceObject=True)]
curr = CGList([CGGeneric(declare="pub use dom::%s::%s;\n" % (name.lower(), name)) for name in descriptors])
curr = CGList([CGGeneric("pub use dom::%s::%s;\n" % (name.lower(), name)) for name in descriptors])
curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT)
return curr
@ -5803,7 +5730,7 @@ class GlobalGenRoots():
def BindingDeclarations(config):
descriptors = [d.name for d in config.getDescriptors(register=True)]
curr = CGList([CGGeneric(declare="pub mod %sBinding;\n" % name) for name in descriptors])
curr = CGList([CGGeneric("pub mod %sBinding;\n" % name) for name in descriptors])
curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT)
return curr
@ -5811,19 +5738,19 @@ class GlobalGenRoots():
def InheritTypes(config):
descriptors = config.getDescriptors(register=True, hasInterfaceObject=True)
allprotos = [CGGeneric(declare="#[allow(unused_imports)];\n"),
CGGeneric(declare="use dom::types::*;\n"),
CGGeneric(declare="use dom::bindings::js::JS;\n"),
CGGeneric(declare="use dom::bindings::trace::Traceable;\n"),
CGGeneric(declare="use extra::serialize::{Encodable, Encoder};\n"),
CGGeneric(declare="use js::jsapi::JSTracer;\n\n")]
allprotos = [CGGeneric("#[allow(unused_imports)];\n"),
CGGeneric("use dom::types::*;\n"),
CGGeneric("use dom::bindings::js::JS;\n"),
CGGeneric("use dom::bindings::trace::Traceable;\n"),
CGGeneric("use extra::serialize::{Encodable, Encoder};\n"),
CGGeneric("use js::jsapi::JSTracer;\n\n")]
for descriptor in descriptors:
name = descriptor.name
protos = [CGGeneric(declare='pub trait %s {}\n' % (name + 'Base'))]
protos = [CGGeneric('pub trait %s {}\n' % (name + 'Base'))]
for proto in descriptor.prototypeChain:
protos += [CGGeneric(declare='impl %s for %s {}\n' % (proto + 'Base',
protos += [CGGeneric('impl %s for %s {}\n' % (proto + 'Base',
descriptor.concreteType))]
derived = [CGGeneric(declare='pub trait %s { fn %s(&self) -> bool; }\n' %
derived = [CGGeneric('pub trait %s { fn %s(&self) -> bool; }\n' %
(name + 'Derived', 'is_' + name.lower()))]
for protoName in descriptor.prototypeChain[1:-1]:
protoDescriptor = config.getDescriptor(protoName)
@ -5836,10 +5763,10 @@ class GlobalGenRoots():
'selfName': name + 'Derived',
'baseName': protoDescriptor.concreteType,
'parentName': protoDescriptor.prototypeChain[-2].lower()})
derived += [CGGeneric(declare=delegate)]
derived += [CGGeneric(declare='\n')]
derived += [CGGeneric(delegate)]
derived += [CGGeneric('\n')]
cast = [CGGeneric(declare=string.Template('''pub trait ${castTraitName} {
cast = [CGGeneric(string.Template('''pub trait ${castTraitName} {
fn from<T: ${fromBound}>(derived: &JS<T>) -> JS<Self> {
unsafe { derived.clone().transmute() }
}
@ -5853,9 +5780,9 @@ class GlobalGenRoots():
'castTraitName': name + 'Cast',
'fromBound': name + 'Base',
'toBound': name + 'Derived'})),
CGGeneric(declare="impl %s for %s {}\n\n" % (name + 'Cast', name))]
CGGeneric("impl %s for %s {}\n\n" % (name + 'Cast', name))]
trace = [CGGeneric(declare=string.Template('''impl Traceable for ${name} {
trace = [CGGeneric(string.Template('''impl Traceable for ${name} {
fn trace(&self, tracer: *mut JSTracer) {
unsafe {
self.encode(&mut *tracer);