diff options
author | John Hodge <tpg@mutabah.net> | 2016-09-25 11:41:18 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-09-25 11:41:18 +0800 |
commit | 6ca23cb77720210d98903c17fa8ad054edb9da85 (patch) | |
tree | b10a560d1b0b052aa5f0de92f6e3ce43519dd821 /src/parse/token.cpp | |
parent | fdb8db152bd911166ce3eed038b0997ba96025ca (diff) | |
download | mrust-6ca23cb77720210d98903c17fa8ad054edb9da85.tar.gz |
Parse - Support method/field/qmark after blocks in statements
Diffstat (limited to 'src/parse/token.cpp')
-rw-r--r-- | src/parse/token.cpp | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/src/parse/token.cpp b/src/parse/token.cpp index 3f95d9fd..ee884d3b 100644 --- a/src/parse/token.cpp +++ b/src/parse/token.cpp @@ -63,38 +63,68 @@ Token::Token(double val, enum eCoreType datatype): m_data( Data::make_Float({datatype, val}) ) { } -Token::Token(InterpolatedFragment& frag) +Token::Token(const InterpolatedFragment& frag) { switch(frag.m_type) { case InterpolatedFragment::TT: throw ""; case InterpolatedFragment::TYPE: m_type = TOK_INTERPOLATED_TYPE; - m_data = new TypeRef( *reinterpret_cast<TypeRef*>(frag.m_ptr) ); + m_data = new TypeRef( *reinterpret_cast<const TypeRef*>(frag.m_ptr) ); break; case InterpolatedFragment::PAT: m_type = TOK_INTERPOLATED_PATTERN; - m_data = new AST::Pattern( reinterpret_cast<AST::Pattern*>(frag.m_ptr)->clone() ); + m_data = new AST::Pattern( reinterpret_cast<const AST::Pattern*>(frag.m_ptr)->clone() ); break; case InterpolatedFragment::PATH: m_type = TOK_INTERPOLATED_PATH; - m_data = new AST::Path( *reinterpret_cast<AST::Path*>(frag.m_ptr) ); + m_data = new AST::Path( *reinterpret_cast<const AST::Path*>(frag.m_ptr) ); break; case InterpolatedFragment::EXPR: - m_type = TOK_INTERPOLATED_EXPR; - m_data = reinterpret_cast<AST::ExprNode*>(frag.m_ptr)->clone().release(); - break; + m_type = TOK_INTERPOLATED_EXPR; if(0) case InterpolatedFragment::STMT: - m_type = TOK_INTERPOLATED_STMT; - m_data = reinterpret_cast<AST::ExprNode*>(frag.m_ptr)->clone().release(); + m_type = TOK_INTERPOLATED_STMT; if(0) + case InterpolatedFragment::BLOCK: + m_type = TOK_INTERPOLATED_BLOCK; + + m_data = reinterpret_cast<const AST::ExprNode*>(frag.m_ptr)->clone().release(); + break; + case InterpolatedFragment::META: + m_type = TOK_INTERPOLATED_META; + m_data = new AST::MetaItem( reinterpret_cast<const AST::MetaItem*>(frag.m_ptr)->clone() ); break; + } +} +Token::Token(TagTakeIP, InterpolatedFragment frag) +{ + switch(frag.m_type) + { + case InterpolatedFragment::TT: throw ""; + case InterpolatedFragment::TYPE: + m_type = TOK_INTERPOLATED_TYPE; + m_data = new TypeRef( mv$(*reinterpret_cast<TypeRef*>(frag.m_ptr)) ); + break; + case InterpolatedFragment::PAT: + m_type = TOK_INTERPOLATED_PATTERN; + m_data = new AST::Pattern( mv$(*reinterpret_cast<AST::Pattern*>(frag.m_ptr)) ); + break; + case InterpolatedFragment::PATH: + m_type = TOK_INTERPOLATED_PATH; + m_data = new AST::Path( mv$(*reinterpret_cast<AST::Path*>(frag.m_ptr)) ); + break; + case InterpolatedFragment::EXPR: + m_type = TOK_INTERPOLATED_EXPR; if(0) + case InterpolatedFragment::STMT: + m_type = TOK_INTERPOLATED_STMT; if(0) case InterpolatedFragment::BLOCK: m_type = TOK_INTERPOLATED_BLOCK; - m_data = reinterpret_cast<AST::ExprNode*>(frag.m_ptr)->clone().release(); + + m_data = reinterpret_cast<AST::ExprNode*>(frag.m_ptr); + frag.m_ptr = nullptr; break; case InterpolatedFragment::META: m_type = TOK_INTERPOLATED_META; - m_data = new AST::MetaItem( reinterpret_cast<AST::MetaItem*>(frag.m_ptr)->clone() ); + m_data = new AST::MetaItem( mv$(*reinterpret_cast<AST::MetaItem*>(frag.m_ptr)) ); break; } } |