Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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;
    }
Exemplo n.º 3
0
    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);
    }