Lichen

Annotated results.py

336:8c75cdf1a764
2016-12-06 Paul Boddie Introduced stream classes employing C-level FILE pointers, changing the sys stdin, stdout and stderr objects to be instances of these stream classes. Added fread and fwrite support to the native functions. Added support for raising EOFError.
paul@11 1
#!/usr/bin/env python
paul@11 2
paul@11 3
"""
paul@11 4
Result abstractions.
paul@11 5
paul@11 6
Copyright (C) 2016 Paul Boddie <paul@boddie.org.uk>
paul@11 7
paul@11 8
This program is free software; you can redistribute it and/or modify it under
paul@11 9
the terms of the GNU General Public License as published by the Free Software
paul@11 10
Foundation; either version 3 of the License, or (at your option) any later
paul@11 11
version.
paul@11 12
paul@11 13
This program is distributed in the hope that it will be useful, but WITHOUT
paul@11 14
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
paul@11 15
FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
paul@11 16
details.
paul@11 17
paul@11 18
You should have received a copy of the GNU General Public License along with
paul@11 19
this program.  If not, see <http://www.gnu.org/licenses/>.
paul@11 20
"""
paul@11 21
paul@27 22
from referencing import Reference
paul@27 23
paul@11 24
# Classes representing inspection and translation observations.
paul@11 25
paul@11 26
class Result:
paul@11 27
paul@11 28
    "An abstract expression result."
paul@11 29
paul@11 30
    def is_name(self):
paul@11 31
        return False
paul@118 32
paul@226 33
    def reference(self):
paul@226 34
        return None
paul@226 35
paul@226 36
    def get_name(self):
paul@226 37
        return None
paul@226 38
paul@11 39
    def get_origin(self):
paul@11 40
        return None
paul@11 41
paul@226 42
    def static(self):
paul@118 43
        return None
paul@118 44
paul@226 45
    def final(self):
paul@226 46
        return None
paul@226 47
paul@226 48
    def has_kind(self, kinds):
paul@226 49
        return False
paul@226 50
paul@11 51
class AccessRef(Result):
paul@11 52
paul@11 53
    """
paul@11 54
    A reference to an attribute access that is generally only returned from a
paul@11 55
    processed access for possible initialiser resolution for assignments.
paul@11 56
    """
paul@11 57
paul@11 58
    def __init__(self, original_name, attrnames, number):
paul@11 59
        self.original_name = original_name
paul@11 60
        self.attrnames = attrnames
paul@11 61
        self.number = number
paul@11 62
paul@11 63
    def __repr__(self):
paul@11 64
        return "AccessRef(%r, %r, %r)" % (self.original_name, self.attrnames, self.number)
paul@11 65
paul@11 66
class InvocationRef(Result):
paul@11 67
paul@11 68
    "An invocation of a name reference."
paul@11 69
paul@11 70
    def __init__(self, name_ref):
paul@11 71
        self.name_ref = name_ref
paul@11 72
paul@27 73
    def reference(self):
paul@27 74
        origin = self.name_ref.get_origin()
paul@27 75
        if origin:
paul@27 76
            return Reference("<invoke>", origin)
paul@27 77
        else:
paul@27 78
            return Reference("<var>")
paul@27 79
paul@11 80
    def __repr__(self):
paul@11 81
        return "InvocationRef(%r)" % self.name_ref
paul@11 82
paul@11 83
class NameRef(Result):
paul@11 84
paul@11 85
    "A reference to a name."
paul@11 86
paul@11 87
    def __init__(self, name, expr=None):
paul@11 88
        self.name = name
paul@11 89
        self.expr = expr
paul@11 90
paul@11 91
    def is_name(self):
paul@11 92
        return True
paul@11 93
paul@11 94
    def final(self):
paul@11 95
        return None
paul@11 96
paul@11 97
    def __repr__(self):
paul@11 98
        return "NameRef(%r, %r)" % (self.name, self.expr)
paul@11 99
paul@11 100
class LocalNameRef(NameRef):
paul@11 101
paul@11 102
    "A reference to a local name."
paul@11 103
paul@11 104
    def __init__(self, name, number):
paul@11 105
        NameRef.__init__(self, name)
paul@11 106
        self.number = number
paul@11 107
paul@11 108
    def __repr__(self):
paul@11 109
        return "LocalNameRef(%r, %r)" % (self.name, self.number)
paul@11 110
paul@317 111
class ResolvedRef:
paul@11 112
paul@317 113
    "A resolved reference mix-in."
paul@11 114
paul@11 115
    def reference(self):
paul@11 116
        return self.ref
paul@11 117
paul@11 118
    def get_name(self):
paul@11 119
        return self.ref and self.ref.get_name() or None
paul@11 120
paul@11 121
    def get_origin(self):
paul@11 122
        return self.ref and self.ref.get_origin() or None
paul@11 123
paul@11 124
    def static(self):
paul@11 125
        return self.ref and self.ref.static() or None
paul@11 126
paul@11 127
    def final(self):
paul@11 128
        return self.ref and self.ref.final() or None
paul@11 129
paul@11 130
    def has_kind(self, kinds):
paul@11 131
        return self.ref and self.ref.has_kind(kinds)
paul@11 132
paul@317 133
class ResolvedNameRef(ResolvedRef, NameRef):
paul@317 134
paul@317 135
    "A resolved name-based reference."
paul@317 136
paul@317 137
    def __init__(self, name, ref, expr=None):
paul@317 138
        NameRef.__init__(self, name, expr)
paul@317 139
        self.ref = ref
paul@317 140
paul@11 141
    def __repr__(self):
paul@11 142
        return "ResolvedNameRef(%r, %r, %r)" % (self.name, self.ref, self.expr)
paul@11 143
paul@11 144
class ConstantValueRef(ResolvedNameRef):
paul@11 145
paul@11 146
    "A constant reference representing a single literal value."
paul@11 147
paul@11 148
    def __init__(self, name, ref, value, number=None):
paul@11 149
        ResolvedNameRef.__init__(self, name, ref)
paul@11 150
        self.value = value
paul@11 151
        self.number = number
paul@11 152
paul@11 153
    def __repr__(self):
paul@11 154
        return "ConstantValueRef(%r, %r, %r, %r)" % (self.name, self.ref, self.value, self.number)
paul@11 155
paul@317 156
class InstanceRef(ResolvedRef, Result):
paul@11 157
paul@11 158
    "An instance reference."
paul@11 159
paul@11 160
    def __init__(self, ref):
paul@11 161
        self.ref = ref
paul@11 162
paul@11 163
    def reference(self):
paul@11 164
        return self.ref
paul@11 165
paul@11 166
    def __repr__(self):
paul@11 167
        return "InstanceRef(%r)" % self.ref
paul@11 168
paul@11 169
class LiteralSequenceRef(ResolvedNameRef):
paul@11 170
paul@11 171
    "A reference representing a sequence of values."
paul@11 172
paul@11 173
    def __init__(self, name, ref, node, items=None):
paul@11 174
        ResolvedNameRef.__init__(self, name, ref)
paul@11 175
        self.node = node
paul@11 176
        self.items = items
paul@11 177
paul@11 178
    def __repr__(self):
paul@11 179
        return "LiteralSequenceRef(%r, %r, %r, %r)" % (self.name, self.ref, self.node, self.items)
paul@11 180
paul@226 181
class VariableRef(Result):
paul@226 182
paul@226 183
    "A variable reference."
paul@226 184
paul@226 185
    def __repr__(self):
paul@226 186
        return "VariableRef()"
paul@226 187
paul@11 188
# vim: tabstop=4 expandtab shiftwidth=4