changeset 102:cd066f3b539a new_gen

Parsing methods in structs - error on semantics though.
author Anders Johnsen <skabet@gmail.com>
date Thu, 08 May 2008 10:32:41 +0200
parents fea8d61a2451
children 09b4d74cb3f5
files ast/Decl.d parser/Action.d parser/Parser.d sema/AstAction.d sema/ScopeBuilder.d sema/Visitor.d tests/parser/struct_method_1.d tools/AstPrinter.d
diffstat 8 files changed, 33 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/ast/Decl.d	Wed May 07 19:58:13 2008 +0200
+++ b/ast/Decl.d	Thu May 08 10:32:41 2008 +0200
@@ -166,12 +166,11 @@
     {
         super(DeclType.StructDecl);
         this.identifier = identifier;
-        this.vars = vars;
     }
 
-    void addMember(Identifier type, Identifier name, Exp exp)
+    void addMember(Decl decl)
     {
-        vars ~= new VarDecl(type, name, exp);
+        decls ~= decl;
     }
 
     void simplify()
@@ -184,7 +183,7 @@
     }
 
     Identifier identifier;
-    VarDecl[] vars;
+    Decl[] decls;
     private DType myType;
 }
 
--- a/parser/Action.d	Wed May 07 19:58:13 2008 +0200
+++ b/parser/Action.d	Thu May 08 10:32:41 2008 +0200
@@ -156,7 +156,7 @@
     /**
       Add a struct member to a struct.
      */
-    void actOnStructMember(DeclT decl, ref Id type, ref Id name, ExprT init)
+    void actOnStructMember(DeclT st_decl, DeclT m_decl) //ref Id type, ref Id name, ExprT init)
     {
         return null;
     }
--- a/parser/Parser.d	Wed May 07 19:58:13 2008 +0200
+++ b/parser/Parser.d	Thu May 08 10:32:41 2008 +0200
@@ -210,7 +210,9 @@
 
         while(lexer.peek.isBasicType || lexer.peek.isIdentifier)
         {
-            Id var_type = Id(lexer.next);
+            auto m_decl = parseDecl();
+            action.actOnStructMember(decl, m_decl); 
+/*            Id var_type = Id(lexer.next);
             Id var_iden = Id(require(Tok.Identifier));
             Token next = lexer.peek();
             if (next.type == Tok.Seperator)
@@ -227,7 +229,7 @@
                 action.actOnStructMember(decl, var_type, var_iden, exp);
                 continue;
             }
-            messages.report(UnexpectedTok, next.location).arg(next.getType);
+            messages.report(UnexpectedTok, next.location).arg(next.getType);*/
         }
 
         require(Tok.CloseBrace);
--- a/sema/AstAction.d	Wed May 07 19:58:13 2008 +0200
+++ b/sema/AstAction.d	Thu May 08 10:32:41 2008 +0200
@@ -91,14 +91,10 @@
             return new VarDecl(handleType(type), identifierFromTok(id.tok), exp);
     }
     
-    override void actOnStructMember(DeclT decl, ref Id type, ref Id name, ExprT init)
+    override void actOnStructMember(DeclT st_decl, DeclT m_decl) //ref Id type, ref Id name, ExprT init)
     {
-        Exp exp = cast(Exp)init;
-        StructDecl st = cast(StructDecl)decl;
-        st.addMember(
-                identifierFromTok(type.tok), 
-                identifierFromTok(name.tok), 
-                exp);
+        StructDecl st = cast(StructDecl)st_decl;
+        st.addMember(cast(Decl)m_decl);
     }
 
     override ExprT actOnMemberReference(ExprT lhs, SLoc op, Id member)
--- a/sema/ScopeBuilder.d	Wed May 07 19:58:13 2008 +0200
+++ b/sema/ScopeBuilder.d	Thu May 08 10:32:41 2008 +0200
@@ -45,8 +45,9 @@
         DType[char[]] types;
 
         auto st = s.env.types[s.identifier.get].asStruct;
-        foreach(varDecl ; s.vars)
-            st.addMember(typeOf(varDecl.varType, varDecl.env), varDecl.identifier.get);
+        foreach(decl ; s.decls)
+            if(auto varDecl = cast(VarDecl)decl)
+                st.addMember(typeOf(varDecl.varType, varDecl.env), varDecl.identifier.get);
 
         super.visitStructDecl(s);
     }
--- a/sema/Visitor.d	Wed May 07 19:58:13 2008 +0200
+++ b/sema/Visitor.d	Thu May 08 10:32:41 2008 +0200
@@ -158,7 +158,7 @@
     {
         visitExp(s.identifier);
 
-        foreach (arg; s.vars)
+        foreach (arg; s.decls)
             visitDecl(arg);
 
         static if (is(DeclT == void))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/parser/struct_method_1.d	Thu May 08 10:32:41 2008 +0200
@@ -0,0 +1,17 @@
+module struct_method_1;
+
+struct A
+{
+    int x;
+    int foo(int i)
+    {
+        return i;
+    }
+}
+
+int main()
+{
+    A a;
+    a.x = 6;
+    return a.foo(a.x);
+}
--- a/tools/AstPrinter.d	Wed May 07 19:58:13 2008 +0200
+++ b/tools/AstPrinter.d	Thu May 08 10:32:41 2008 +0200
@@ -68,7 +68,7 @@
                 printIdentifier(structDecl.identifier);
                 printEndLine;
                 printOpenBrace;
-                foreach( var ; structDecl.vars)
+                foreach( var ; structDecl.decls)
                     printDecl(var);
                 printCloseBrace;
                 break;