DataType TypeParser::parseArrayType(bool genericParam) { assert(_helper->next().type() == Token::Type::PunctuationOpenBracket); DataType type = DataType(genericParam ? DataType::Kind::GenericArray : DataType::Kind::Array); if (_helper->peek().type() != Token::Type::PunctuationCloseBracket) { uint32_t value = 0; if (!this->parseIntegerSpecifierValue(&value)) { assert(0 && "Message: unable to parse array size"); return DataType(); } type.setArrayCount(value); } if (!_helper->nextIf(Token::Type::PunctuationCloseBracket)) { assert(0 && "Message: array type element count should be followed by a close bracket"); return DataType(); } type.addSubtype(this->parseType(genericParam)); return this->applyTypePostfixes(type, genericParam); }
DataType TypeParser::parseFunctionOrTupleType() { assert(_helper->nextIf(Token::Type::PunctuationOpenParen)); DataType type; this->parseTypeListWithLabels(Token::Type::PunctuationCloseParen, [&] (const DataType& subtype) { type.addSubtype(subtype); }); if (!_helper->nextIf(Token::Type::PunctuationCloseParen)) { assert(0 && "Message: failed to parse a tuple/function type"); return DataType(); } if (!_helper->nextIf(Token::Type::OperatorArrow)) { type.setKind(DataType::Kind::Tuple); return type; } type.setKind(DataType::Kind::Function); // TODO: clean this up - move the subtypes to parameters type.parameters = type.subtypes; type.subtypes.clear(); type.setReturnType(this->parseType()); return type; }
DataType TypeParser::parsePointerType(bool genericParam) { assert(_helper->next().type() == Token::Type::OperatorStar); DataType type = DataType(genericParam ? DataType::Kind::GenericPointer : DataType::Kind::Pointer); type = this->parseTypePostfixes(type); type.addSubtype(this->parseType(genericParam)); return this->applyTypePostfixes(type, genericParam); }