15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)"""
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)This module deals with interpreting the parse tree as Python
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)would have done, in the compiler.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)For now this only covers parse tree to value conversion of
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)compile-time values.
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)"""
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Nodes import *
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from ExprNodes import *
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Errors import CompileError
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class EmptyScope(object):
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def lookup(self, name):
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return None
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)empty_scope = EmptyScope()
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def interpret_compiletime_options(optlist, optdict, type_env=None, type_args=()):
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Tries to interpret a list of compile time option nodes.
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    The result will be a tuple (optlist, optdict) but where
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    all expression nodes have been interpreted. The result is
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    in the form of tuples (value, pos).
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    optlist is a list of nodes, while optdict is a DictNode (the
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    result optdict is a dict)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    If type_env is set, all type nodes will be analysed and the resulting
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    type set. Otherwise only interpretateable ExprNodes
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    are allowed, other nodes raises errors.
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    A CompileError will be raised if there are problems.
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def interpret(node, ix):
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if ix in type_args:
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if type_env:
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                type = node.analyse_as_type(type_env)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                if not type:
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    raise CompileError(node.pos, "Invalid type.")
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                return (type, node.pos)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            else:
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                raise CompileError(node.pos, "Type not allowed here.")
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        else:
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (sys.version_info[0] >=3 and
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                isinstance(node, StringNode) and
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                node.unicode_value is not None):
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                return (node.unicode_value, node.pos)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return (node.compile_time_value(empty_scope), node.pos)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if optlist:
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        optlist = [interpret(x, ix) for ix, x in enumerate(optlist)]
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if optdict:
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        assert isinstance(optdict, DictNode)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        new_optdict = {}
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        for item in optdict.key_value_pairs:
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            new_key, dummy = interpret(item.key, None)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            new_optdict[new_key] = interpret(item.value, item.key.value)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        optdict = new_optdict
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return (optlist, new_optdict)
63