'new' keyword

This commit is contained in:
2026-04-09 19:00:40 +10:00
parent 9b55b509f5
commit a2fc138ba1
5 changed files with 129 additions and 16 deletions

View File

@@ -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);