VisitResult ExpressionVisitor::Visit(MemberAccessNode* node) { node->Walk(this, false); ValueNode* valNode = static_cast<ValueNode*>(node->mLeft.get()); switch(node->mOperator.mEnumTokenType) { case TokenType::Dot: { if(valNode->mResolvedType->mMode != TypeMode::Class) { ErrorInvalidMemberAccess(node); } break; } case TokenType::Arrow: { if(valNode->mResolvedType->mMode != TypeMode::Pointer) { ErrorInvalidMemberAccess(node); } break; } default: ErrorInvalidMemberAccess(node); } std::string leftExpression(valNode->mToken.mText, valNode->mToken.mLength); std::string rightExpression(node->mName.mText, node->mName.mLength); Variable* leftSide = static_cast<Variable*>(find_symbol_by_name(leftExpression, dependencies_, library_, symbol_stack_)); Variable* rightSide = nullptr;// = ;//find_symbol_by_name(rightExpression, dependencies_, library_, symbol_stack_); Type* lefttype = resolvePointers(leftSide->mType); auto rightIt = lefttype->mMembersByName.find(rightExpression); if(rightIt != lefttype->mMembersByName.end()) { rightSide = static_cast<Variable*>(rightIt->second); } node->mResolvedMember = rightSide; node->mResolvedType = rightSide->mType; return VisitResult::Stop; }
AST* Parser::expression(int pri, Scope* ps) { Position begin = lex_->peek().range_.begin_; if (pri > 11) { if (expect("delete") || expect("++") || expect("--")) { Token op = lex_->get(); AST* expr = leftExpression(ps); Position end = lex_->peek().range_.begin_; auto ret = new UniExpression(PositionRange(begin, end), op, expr); ret->scope_ = ps; return ret; } else if (expect("void") || expect("typeof") || expect("+") || expect("-") || expect("~") || expect("!")) { Token op = lex_->get(); AST* expr = expression(pri, ps); Position end = lex_->peek().range_.begin_; auto ret = new UniExpression(PositionRange(begin, end), op, expr); ret->scope_ = ps; return ret; } else { AST* expr = leftExpression(ps); if (expect("++") || expect("--")) { Token op = lex_->get(); Position end = lex_->peek().range_.begin_; auto ret = new UniExpression(PositionRange(begin, end), expr, op); ret->scope_ = ps; return ret; } return expr; } } AST* left = expression(pri+1, ps); if (!expectOperator(pri)) { return left; } Token op = lex_->get(); if (pri == 1) { AST* first = expression(pri, ps); match(":"); AST* second = expression(pri, ps); Position end = lex_->peek().range_.begin_; auto ret = new TriExpression(PositionRange(begin, end), left, first, second); ret->scope_ = ps; return ret; } AST* right = expression(pri, ps); Position end = lex_->peek().range_.begin_; AST* ret = new BiExpression(PositionRange(begin, end), left, op, right); ret->scope_ = ps; while (expectOperator(pri)) { op = lex_->get(); right = expression(pri+1, ps); ret = new BiExpression(PositionRange(begin, end), left, op, right); ret->scope_ = ps; } return ret; }