forked from solstice/solstice
'new' keyword
This commit is contained in:
@@ -1193,7 +1193,7 @@ static inline ResultType(Nothing, charptr) parseLambda(SolsParser* parser) {
|
||||
if (next.as.success.type == STT_TYPE) {
|
||||
tmpType = next.as.success.as.type;
|
||||
} else if (next.as.success.type == STT_IDENTIFIER) {
|
||||
tmpType.identifierType = next.as.success.as.idName;
|
||||
tmpType = createIdentifiedSolsType(next.as.success.as.idName).as.success;
|
||||
} else {
|
||||
return Error(Nothing, charptr, "Expecting a type or identifier of type in lambda argument list");
|
||||
}
|
||||
@@ -1244,7 +1244,7 @@ static inline ResultType(Nothing, charptr) parseLambda(SolsParser* parser) {
|
||||
if (type.as.success.returnType == NULL) {
|
||||
return Error(Nothing, charptr, "Failed to allocate memory for type");
|
||||
}
|
||||
type.as.success.returnType->identifierType = retType.as.success.as.idName;
|
||||
*type.as.success.returnType = createIdentifiedSolsType(retType.as.success.as.idName).as.success;
|
||||
} else {
|
||||
return Error(Nothing, charptr, "Expecting return type or identifier of type after lambda argument list");
|
||||
}
|
||||
@@ -1338,7 +1338,7 @@ static inline ResultType(Nothing, charptr) parseDef(SolsParser* parser) {
|
||||
if (next.as.success.type == STT_TYPE) {
|
||||
tmpType = next.as.success.as.type;
|
||||
} else if (next.as.success.type == STT_IDENTIFIER) {
|
||||
tmpType.identifierType = next.as.success.as.idName;
|
||||
tmpType = createIdentifiedSolsType(next.as.success.as.idName).as.success;
|
||||
} else {
|
||||
return Error(Nothing, charptr, "Expecting a type or identifier of type in def argument list");
|
||||
}
|
||||
@@ -1389,7 +1389,7 @@ static inline ResultType(Nothing, charptr) parseDef(SolsParser* parser) {
|
||||
if (type.as.success.returnType == NULL) {
|
||||
return Error(Nothing, charptr, "Failed to allocate memory for type");
|
||||
}
|
||||
type.as.success.returnType->identifierType = retType.as.success.as.idName;
|
||||
*type.as.success.returnType = createIdentifiedSolsType(retType.as.success.as.idName).as.success;
|
||||
} else {
|
||||
return Error(Nothing, charptr, "Expecting return type or identifier of type after def argument list");
|
||||
}
|
||||
@@ -1805,6 +1805,24 @@ static inline ResultType(Nothing, charptr) parseStruct(SolsParser* parser) {
|
||||
return Success(Nothing, charptr, {});
|
||||
}
|
||||
|
||||
ResultType(Nothing, charptr) parseNew(SolsParser* parser) {
|
||||
ResultType(SolsNode, charptr) newNode = createSolsNode(SNT_NEW);
|
||||
if (newNode.error) {
|
||||
return Error(Nothing, charptr, newNode.as.error);
|
||||
}
|
||||
ResultType(SolsToken, Nothing) nameTok = parserConsume(parser);
|
||||
if (nameTok.error || !(nameTok.as.success.type == STT_IDENTIFIER || nameTok.as.success.type == STT_TYPE)) {
|
||||
return Error(Nothing, charptr, "Expecting identifier after 'new'");
|
||||
}
|
||||
if (nameTok.as.success.type == STT_IDENTIFIER) {
|
||||
newNode.as.success.as.type = createIdentifiedSolsType(nameTok.as.success.as.idName).as.success;
|
||||
} else if (nameTok.as.success.type == STT_TYPE) {
|
||||
newNode.as.success.as.type = nameTok.as.success.as.type;
|
||||
}
|
||||
addChildToSolsNode(parser->currentParent, newNode.as.success);
|
||||
return Success(Nothing, charptr, {});
|
||||
}
|
||||
|
||||
ResultType(Nothing, charptr) parse(SolsParser* parser) {
|
||||
parser->currentParent = &parser->output;
|
||||
for (;;) {
|
||||
@@ -1822,6 +1840,7 @@ ResultType(Nothing, charptr) parse(SolsParser* parser) {
|
||||
case STT_KW_LAMBDA: PARSER_HANDLE(Lambda);
|
||||
case STT_KW_RETURN: PARSER_HANDLE(Return);
|
||||
case STT_KW_STRUCT: PARSER_HANDLE(Struct);
|
||||
case STT_KW_NEW: PARSER_HANDLE(New);
|
||||
case STT_KW_USE: PARSER_HANDLE(Use);
|
||||
case STT_KW_DEF: PARSER_HANDLE(Def);
|
||||
case STT_OP_SET: PARSER_HANDLE(Set);
|
||||
|
||||
Reference in New Issue
Block a user