# HG changeset patch # User Anders Johnsen # Date 1210235561 -7200 # Node ID cd066f3b539afcb59052c247c9128f74ccf28946 # Parent fea8d61a2451688154a002623801bbe6bdae71fa Parsing methods in structs - error on semantics though. diff -r fea8d61a2451 -r cd066f3b539a ast/Decl.d --- 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; } diff -r fea8d61a2451 -r cd066f3b539a parser/Action.d --- 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; } diff -r fea8d61a2451 -r cd066f3b539a parser/Parser.d --- 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); diff -r fea8d61a2451 -r cd066f3b539a sema/AstAction.d --- 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) diff -r fea8d61a2451 -r cd066f3b539a sema/ScopeBuilder.d --- 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); } diff -r fea8d61a2451 -r cd066f3b539a sema/Visitor.d --- 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)) diff -r fea8d61a2451 -r cd066f3b539a tests/parser/struct_method_1.d --- /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); +} diff -r fea8d61a2451 -r cd066f3b539a tools/AstPrinter.d --- 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;