view misc/Error.d @ 93:621cedba53ea new_gen

Removed the Symbol from semantics - it was not needed anymore. From now on you set the type by doing a setType on an Identifier.
author Anders Johnsen <skabet@gmail.com>
date Mon, 05 May 2008 20:53:13 +0200
parents eb5b2c719a39
children
line wrap: on
line source

module misc.Error;

import tango.core.Exception,
       Array = tango.core.Array,
       tango.text.Util;

import llvm.type;

import lexer.Token,
       sema.DType;

class Error : Exception
{

    this(char[] message)
    {
        super(message);
        args ~= message;
    }

    char[] toString()
    {
        char[256] tmp = void;
        char[] msg = layout(tmp, args);
        /*
        if (location.source.name.length > 0)
            msg = location.toString ~ ": " ~ msg;
        else
            msg = msg.dup;

        if (toks.length > 0)
        {
            Array.sort(toks,
                    (Token a, Token b)
                    {
                        return a.location.position - b.location.position;
                    });
            char[] data = toks[0].location.source.data;
            size_t low    = toks[0].location.position;
            size_t high   = toks[$ - 1].location.position;

            size_t line_start = Array.rfind(data[0 .. low], '\n');
            size_t line_end = high + Array.find(data[high .. $], '\n');
            char[] line = trim(data[line_start + 1 .. line_end]);
            char[] marks = line.dup;
            marks[] = ' ';
            foreach (tok; toks[0 .. $])
            {
                size_t p = tok.location.position - (line.ptr - data.ptr);
                marks[p .. p + tok.length] = '~';
            }
            size_t p = main_tok.location.position - (line.ptr - data.ptr);
            marks[p .. p + main_tok.length] = '^';

            msg ~= "\n    ";
            msg ~= line;
            msg ~= "\n    ";
            msg ~= marks;
        }
*/
        return msg;
    }

    Error arg(char[] s)
    {
        if (args.length == 11)
            throw new Exception("Sorry, errors only support up to 10 args");
        args ~= s;
        return this;
    }

    Error arg(char[][] s)
    {
        char[] res = s[0 .. $ - 1].join(", ");
        if (s.length > 1)
            res ~= " and ";
        res ~= s[$ - 1];
        return arg(res);
    }

    Error arg(char c)
    {
        return arg([c]);
    }

    Error arg(DType[] types)
    {
        char[][] res;
        foreach (type; types)
            res ~= type.name();
        return arg(res);
    }

    Error arg(Tok[] toks...)
    {
        char[][] res;
        foreach (t; toks)
            res ~= typeToString[t];
        return arg(res);
    }

    /*
    Error loc(Location loc)
    {
        location = loc;
        return this;
    }
    */

    Error tok(Token tok)
    {
        /*
        if (toks.length > 0)
            assert(tok.location.source == toks[0].location.source,
                    "Tokens must come from the same source");
        else
        {
            main_tok = tok;
            loc = tok.location;
        }
        toks ~= tok;
    */
        return this;
    }

private:
    char[][] args;
    //Location location;
    Token[] toks;
    Token main_tok;
}