Mercurial > projects > dang
comparison 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 |
comparison
equal
deleted
inserted
replaced
166:9cfa33517526 | 168:7982eb63c0eb |
---|---|
1 module sema.ObjectOriented; | |
2 | |
3 import sema.Visitor, | |
4 sema.Symbol, | |
5 sema.DType; | |
6 | |
7 import tango.io.Stdout, | |
8 Array = tango.core.Array; | |
9 | |
10 import basic.SourceLocation, | |
11 basic.Message; | |
12 | |
13 class ObjectOriented : Visitor!(void) | |
14 { | |
15 this(MessageHandler messages) | |
16 { | |
17 this.messages = messages; | |
18 } | |
19 | |
20 override void visit(Module[] m) | |
21 { | |
22 super.visit(m); | |
23 | |
24 ClassDecl[] visitBaseClass(ClassDecl current, ClassDecl[] visited) | |
25 { | |
26 visited ~= current; | |
27 foreach (d ; current.baseClasses) | |
28 if (d.type.isClass) | |
29 if(Array.find(visited, | |
30 (cast(ClassDecl)d.getSymbol.decl)) - visited.length) | |
31 assert(0,"Circulair base class"); | |
32 else | |
33 return visitBaseClass((cast(ClassDecl)d.getSymbol.decl), visited); | |
34 return visited; | |
35 } | |
36 | |
37 while (classes.length) | |
38 { | |
39 ClassDecl current = classes[$-1]; | |
40 ClassDecl[] visited; | |
41 visited = visitBaseClass(current, visited); | |
42 foreach (v; visited) | |
43 classes.length = Array.remove(classes, v); | |
44 } | |
45 } | |
46 | |
47 override void visitClassDecl(ClassDecl decl) | |
48 { | |
49 classes ~= decl; | |
50 } | |
51 | |
52 ClassDecl[] classNoBase; | |
53 ClassDecl[] classes; | |
54 MessageHandler messages; | |
55 } | |
56 | |
57 class FindClassNoBase : Visitor!(void) | |
58 { | |
59 override void visitClassDecl(ClassDecl decl) | |
60 { | |
61 } | |
62 | |
63 ClassDecl[] classes; | |
64 } |