view sema/ObjectOriented.d @ 168:7982eb63c0eb

Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
author Anders Johnsen <skabet@gmail.com>
date Thu, 24 Jul 2008 12:06:48 +0200
parents
children
line wrap: on
line source

module sema.ObjectOriented;

import sema.Visitor,
       sema.Symbol,
       sema.DType;

import tango.io.Stdout,
       Array = tango.core.Array;

import basic.SourceLocation,
       basic.Message;

class ObjectOriented : Visitor!(void)
{
    this(MessageHandler messages)
    {
        this.messages = messages;
    }

    override void visit(Module[] m)
    {
        super.visit(m);

        ClassDecl[] visitBaseClass(ClassDecl current, ClassDecl[] visited)
        {
            visited ~= current;
            foreach (d ; current.baseClasses)
                if (d.type.isClass)
                    if(Array.find(visited,
                                (cast(ClassDecl)d.getSymbol.decl)) - visited.length)
                        assert(0,"Circulair base class");
                    else
                        return visitBaseClass((cast(ClassDecl)d.getSymbol.decl), visited);
            return visited;
        }

        while (classes.length)
        {
            ClassDecl current = classes[$-1];
            ClassDecl[] visited;
            visited = visitBaseClass(current, visited);
            foreach (v; visited)
                classes.length = Array.remove(classes, v);
        }
    }

    override void visitClassDecl(ClassDecl decl)
    {
        classes ~= decl;
    }

    ClassDecl[] classNoBase;
    ClassDecl[] classes;
    MessageHandler messages;
}

class FindClassNoBase : Visitor!(void)
{
    override void visitClassDecl(ClassDecl decl)
    {
    }

    ClassDecl[] classes;
}