diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-02 17:20:41 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-02 17:20:41 +0800 |
commit | 48dc2d149e96232a4f0546675fadf7b3f7d6eddf (patch) | |
tree | 7a4aadb3e49ad8add056766994ca993a4776fe8f | |
parent | b5674644bdd2f2e9f1caa027632bed9e09af2f6f (diff) | |
download | mrust-48dc2d149e96232a4f0546675fadf7b3f7d6eddf.tar.gz |
AST - Store the mutability of & patterns
-rw-r--r-- | src/ast/pattern.hpp | 4 | ||||
-rw-r--r-- | src/expand/derive.cpp | 10 | ||||
-rw-r--r-- | src/parse/pattern.cpp | 12 |
3 files changed, 14 insertions, 12 deletions
diff --git a/src/ast/pattern.hpp b/src/ast/pattern.hpp index 687d1e34..f6cf6ea8 100644 --- a/src/ast/pattern.hpp +++ b/src/ast/pattern.hpp @@ -124,9 +124,9 @@ public: struct TagReference {}; - Pattern(TagReference, Pattern sub_pattern): + Pattern(TagReference, bool is_mutable, Pattern sub_pattern): m_data( Data::make_Ref( /*Data::Data_Ref */ { - false, unique_ptr<Pattern>(new Pattern(::std::move(sub_pattern))) + is_mutable, unique_ptr<Pattern>(new Pattern(::std::move(sub_pattern))) }) ) { } diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp index 2995c374..9753b4ef 100644 --- a/src/expand/derive.cpp +++ b/src/expand/derive.cpp @@ -387,7 +387,7 @@ public: ) ::std::vector< AST::Pattern> pats; - pats.push_back( AST::Pattern(AST::Pattern::TagReference(), mv$(pat_a)) ); + pats.push_back( AST::Pattern(AST::Pattern::TagReference(), false, mv$(pat_a)) ); arms.push_back(AST::ExprNode_Match_Arm( mv$(pats), @@ -553,8 +553,8 @@ public: ::std::vector< AST::Pattern> pats; { ::std::vector< AST::Pattern> tuple_pats; - tuple_pats.push_back( AST::Pattern(AST::Pattern::TagReference(), mv$(pat_a)) ); - tuple_pats.push_back( AST::Pattern(AST::Pattern::TagReference(), mv$(pat_b)) ); + tuple_pats.push_back( AST::Pattern(AST::Pattern::TagReference(), false, mv$(pat_a)) ); + tuple_pats.push_back( AST::Pattern(AST::Pattern::TagReference(), false, mv$(pat_b)) ); pats.push_back( AST::Pattern(AST::Pattern::TagTuple(), mv$(tuple_pats)) ); } @@ -703,7 +703,7 @@ public: ) ::std::vector< AST::Pattern> pats; - pats.push_back( AST::Pattern(AST::Pattern::TagReference(), mv$(pat_a)) ); + pats.push_back( AST::Pattern(AST::Pattern::TagReference(), false, mv$(pat_a)) ); arms.push_back(AST::ExprNode_Match_Arm( mv$(pats), @@ -858,7 +858,7 @@ public: ) ::std::vector< AST::Pattern> pats; - pats.push_back( AST::Pattern(AST::Pattern::TagReference(), mv$(pat_a)) ); + pats.push_back( AST::Pattern(AST::Pattern::TagReference(), false, mv$(pat_a)) ); arms.push_back(AST::ExprNode_Match_Arm( mv$(pats), diff --git a/src/parse/pattern.cpp b/src/parse/pattern.cpp index f0b15ffe..3adce90d 100644 --- a/src/parse/pattern.cpp +++ b/src/parse/pattern.cpp @@ -182,14 +182,16 @@ AST::Pattern Parse_PatternReal1(TokenStream& lex, bool is_refutable) return AST::Pattern( AST::Pattern::TagBox(), Parse_Pattern(lex, is_refutable) ); case TOK_DOUBLE_AMP: lex.putback(TOK_AMP); - case TOK_AMP: + case TOK_AMP: { DEBUG("Ref"); // NOTE: Falls back into "Pattern" not "PatternReal" to handle MaybeBind again + bool is_mut = false; if( GET_TOK(tok, lex) == TOK_RWORD_MUT ) - // TODO: Actually use mutability - return AST::Pattern( AST::Pattern::TagReference(), Parse_Pattern(lex, is_refutable) ); - PUTBACK(tok, lex); - return AST::Pattern( AST::Pattern::TagReference(), Parse_Pattern(lex, is_refutable) ); + is_mut = true; + else + PUTBACK(tok, lex); + return AST::Pattern( AST::Pattern::TagReference(), is_mut, Parse_Pattern(lex, is_refutable) ); + } case TOK_RWORD_SELF: case TOK_RWORD_SUPER: case TOK_IDENT: |