1.1 --- a/common.py Sat Sep 03 22:37:23 2016 +0200
1.2 +++ b/common.py Sat Sep 03 22:38:21 2016 +0200
1.3 @@ -23,6 +23,7 @@
1.4 from errors import *
1.5 from os import listdir, makedirs, remove
1.6 from os.path import exists, isdir, join, split
1.7 +from results import ConstantValueRef, LiteralSequenceRef, NameRef
1.8 import compiler
1.9
1.10 class CommonOutput:
1.11 @@ -228,6 +229,12 @@
1.12
1.13 def get_literal_reference(self, name, ref, items, cls):
1.14
1.15 + """
1.16 + Return a literal reference for the given type 'name', literal 'ref',
1.17 + node 'items' and employing the given 'cls' as the class of the returned
1.18 + reference object.
1.19 + """
1.20 +
1.21 # Construct an invocation using the items as arguments.
1.22
1.23 typename = "$L%s" % name
1.24 @@ -465,6 +472,8 @@
1.25 self.next_iterator()
1.26 self.process_structure_node(node)
1.27
1.28 + # Node rewriting, without processing.
1.29 +
1.30 def convert_ifexp_node(self, n):
1.31
1.32 """
1.33 @@ -580,6 +589,8 @@
1.34 compiler.ast.CallFunc(
1.35 compiler.ast.Getattr(compiler.ast.Name(temp), "append"), [expr]))
1.36
1.37 + # More node processing.
1.38 +
1.39 def process_literal_sequence_node(self, n, name, ref, cls):
1.40
1.41 """
1.42 @@ -795,114 +806,6 @@
1.43 l.append(arg)
1.44 return l
1.45
1.46 -# Classes representing inspection and translation observations.
1.47 -
1.48 -class Result:
1.49 -
1.50 - "An abstract expression result."
1.51 -
1.52 - def is_name(self):
1.53 - return False
1.54 - def get_origin(self):
1.55 - return None
1.56 -
1.57 -class NameRef(Result):
1.58 -
1.59 - "A reference to a name."
1.60 -
1.61 - def __init__(self, name, expr=None):
1.62 - self.name = name
1.63 - self.expr = expr
1.64 -
1.65 - def is_name(self):
1.66 - return True
1.67 -
1.68 - def reference(self):
1.69 - return None
1.70 -
1.71 - def final(self):
1.72 - return None
1.73 -
1.74 - def __repr__(self):
1.75 - return "NameRef(%r, %r)" % (self.name, self.expr)
1.76 -
1.77 -class LocalNameRef(NameRef):
1.78 -
1.79 - "A reference to a local name."
1.80 -
1.81 - def __init__(self, name, number):
1.82 - NameRef.__init__(self, name)
1.83 - self.number = number
1.84 -
1.85 - def __repr__(self):
1.86 - return "LocalNameRef(%r, %r)" % (self.name, self.number)
1.87 -
1.88 -class ResolvedNameRef(NameRef):
1.89 -
1.90 - "A resolved name-based reference."
1.91 -
1.92 - def __init__(self, name, ref, expr=None):
1.93 - NameRef.__init__(self, name, expr)
1.94 - self.ref = ref
1.95 -
1.96 - def reference(self):
1.97 - return self.ref
1.98 -
1.99 - def get_name(self):
1.100 - return self.ref and self.ref.get_name() or None
1.101 -
1.102 - def get_origin(self):
1.103 - return self.ref and self.ref.get_origin() or None
1.104 -
1.105 - def static(self):
1.106 - return self.ref and self.ref.static() or None
1.107 -
1.108 - def final(self):
1.109 - return self.ref and self.ref.final() or None
1.110 -
1.111 - def has_kind(self, kinds):
1.112 - return self.ref and self.ref.has_kind(kinds)
1.113 -
1.114 - def __repr__(self):
1.115 - return "ResolvedNameRef(%r, %r, %r)" % (self.name, self.ref, self.expr)
1.116 -
1.117 -class ConstantValueRef(ResolvedNameRef):
1.118 -
1.119 - "A constant reference representing a single literal value."
1.120 -
1.121 - def __init__(self, name, ref, value, number=None):
1.122 - ResolvedNameRef.__init__(self, name, ref)
1.123 - self.value = value
1.124 - self.number = number
1.125 -
1.126 - def __repr__(self):
1.127 - return "ConstantValueRef(%r, %r, %r, %r)" % (self.name, self.ref, self.value, self.number)
1.128 -
1.129 -class InstanceRef(Result):
1.130 -
1.131 - "An instance reference."
1.132 -
1.133 - def __init__(self, ref):
1.134 - self.ref = ref
1.135 -
1.136 - def reference(self):
1.137 - return self.ref
1.138 -
1.139 - def __repr__(self):
1.140 - return "InstanceRef(%r)" % self.ref
1.141 -
1.142 -class LiteralSequenceRef(ResolvedNameRef):
1.143 -
1.144 - "A reference representing a sequence of values."
1.145 -
1.146 - def __init__(self, name, ref, node, items=None):
1.147 - ResolvedNameRef.__init__(self, name, ref)
1.148 - self.node = node
1.149 - self.items = items
1.150 -
1.151 - def __repr__(self):
1.152 - return "LiteralSequenceRef(%r, %r, %r, %r)" % (self.name, self.ref, self.node, self.items)
1.153 -
1.154 # Dictionary utilities.
1.155
1.156 def init_item(d, key, fn):
1.157 @@ -996,18 +899,31 @@
1.158 # Attribute chain decoding.
1.159
1.160 def get_attrnames(attrnames):
1.161 +
1.162 + """
1.163 + Split the qualified attribute chain 'attrnames' into its components,
1.164 + handling special attributes starting with "#" that indicate type
1.165 + conformance.
1.166 + """
1.167 +
1.168 if attrnames.startswith("#"):
1.169 return [attrnames]
1.170 else:
1.171 return attrnames.split(".")
1.172
1.173 def get_attrname_from_location(location):
1.174 +
1.175 + """
1.176 + Extract the first attribute from the attribute names employed in a
1.177 + 'location'.
1.178 + """
1.179 +
1.180 path, name, attrnames, access = location
1.181 return get_attrnames(attrnames)[0]
1.182
1.183 # Useful data.
1.184
1.185 -predefined_constants = "Ellipsis", "False", "None", "NotImplemented", "True"
1.186 +predefined_constants = "False", "None", "NotImplemented", "True"
1.187
1.188 operator_functions = {
1.189