summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-02 17:20:41 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-02 17:20:41 +0800
commit48dc2d149e96232a4f0546675fadf7b3f7d6eddf (patch)
tree7a4aadb3e49ad8add056766994ca993a4776fe8f
parentb5674644bdd2f2e9f1caa027632bed9e09af2f6f (diff)
downloadmrust-48dc2d149e96232a4f0546675fadf7b3f7d6eddf.tar.gz
AST - Store the mutability of & patterns
-rw-r--r--src/ast/pattern.hpp4
-rw-r--r--src/expand/derive.cpp10
-rw-r--r--src/parse/pattern.cpp12
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: