view sema/ScopeCheck.d @ 92:771ac63898e2 new_gen

A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
author Anders Johnsen <skabet@gmail.com>
date Mon, 05 May 2008 18:44:20 +0200
parents sema/Declarations.d@eb5b2c719a39
children 857f0d530789
line wrap: on
line source

module sema.ScopeCheck;

import sema.Visitor,
       sema.DType;

import tango.io.Stdout;

import misc.Error;

class ScopeCheck : Visitor!(void)
{
    int[char[]] types;

    private Error error(uint line, char[] msg)
    {
        return new Error(msg);
    }

    override void visitIdentifier(Identifier i)
    {
        auto symbol = i.env.find(i);

        if(symbol is null)
            throw error(__LINE__, "Undefined identifier: '%0'")
                .arg(i.get);
                //.loc(i.token.location);
    }

    override void visitVarDecl(VarDecl d)
    {
        if(!d.env.findType(d.varType))
            throw error(__LINE__, "Undefined type: '%0'")
                .arg(d.varType.get);
                //.loc(d.varType.token.location);

        visitExp(d.identifier);
        if (d.init)
            visitExp(d.init);
    }

    override void visitFuncDecl(FuncDecl f)
    {
        visitExp(f.identifier);

        foreach (stmt; f.statements)
            visitStmt(stmt);
    }

    override void visitCastExp(CastExp exp)
    {
        visitExp(exp.exp);
    }

    override void visitMemberReference(MemberReference m)
    {
        switch(m.target.expType)
        {
            case ExpType.Identifier:
                auto target = cast(Identifier)m.target;
                auto child = m.child;
                auto st = cast(DStruct)(target.env.find(target).type);
                if((child.get in st.members) is null)
                    throw error(__LINE__, "%0 %1 has no member %2")
                        .arg(st.name)
                        .arg(target.get)
                        .arg(child.get);
                        //.tok(child.token);
                break;
            case ExpType.MemberReference:
                break;
        }
    }

    private bool isType(char[] s)
    {
        return (s in types? true : false);
    }
}