Object field assignment

This commit is contained in:
2026-01-28 14:56:36 +11:00
parent d12036fe70
commit 4b86fee7b5
2 changed files with 49 additions and 52 deletions

View File

@@ -274,6 +274,7 @@ namespace Solstice {
for (size_t i = 0; i < children.size(); i++) { for (size_t i = 0; i < children.size(); i++) {
SolNode& child = children[i]; SolNode& child = children[i];
if (child.nodeType == SolNodeType::In) { if (child.nodeType == SolNodeType::In) {
if (nodeType == SolNodeType::Set && i == 0) continue;
if (variables.find(child.outputId) == variables.end()) { if (variables.find(child.outputId) == variables.end()) {
Error::syntaxError(child.outputId + " could not be found", child.line, child.lineContent); Error::syntaxError(child.outputId + " could not be found", child.line, child.lineContent);
} }
@@ -304,45 +305,6 @@ namespace Solstice {
} }
} }
/*
// Process object member access
for (size_t i = 0; i < children.size(); i++) {
SolNode& child = children[i];
if (child.nodeType == SolNodeType::In) {
if (variables.find(outputId) == variables.end()) {
Error::syntaxError(child.outputId + " could not be found", child.line, child.lineContent);
break;
}
std::string type = variables[outputId];
if (type.substr(0, 7) != "object(") {
Error::typingError(child.outputId + " is not an object", child.line, child.lineContent);
break;
}
std::regex pattern("([a-zA-Z0-9_:<>*&]+)\\s+\\b" + child.children[0].outputId + "\\b");
std::smatch match;
if (std::regex_search(type, match, pattern)) {
if (i + 1 < children.size() && children[i + 1].nodeType == SolNodeType::Set) {
// handle stuff in the equals
} else {
SolGroundCodeBlock codeBlock;
GroundInstruction gi = groundCreateInstruction(GETFIELD);
groundAddReferenceToInstruction(&gi, groundCreateReference(VALREF, copyString(outputId)));
groundAddReferenceToInstruction(&gi, groundCreateReference(DIRREF, copyString(children[0].outputId)));
outputId = "obj_access_" + std::to_string(tmpIdIterator++);
variables[outputId] = match[1];
groundAddReferenceToInstruction(&gi, groundCreateReference(DIRREF, copyString(outputId)));
codeBlock.code.push_back(gi);
code.push_back(codeBlock);
}
} else {
Error::typingError("Couldn't find field " + child.children[0].outputId + " in " + outputId, child.line, child.lineContent);
break;
}
}
}
*/
// Process other stuff // Process other stuff
if (nodeType != SolNodeType::If && nodeType != SolNodeType::While && nodeType != SolNodeType::Struct) for (auto& child : children) { if (nodeType != SolNodeType::If && nodeType != SolNodeType::While && nodeType != SolNodeType::Struct) for (auto& child : children) {
auto childCode = child.generateCode(); auto childCode = child.generateCode();
@@ -780,6 +742,35 @@ namespace Solstice {
break; break;
} }
case SolNodeType::Set: { case SolNodeType::Set: {
if (children[0].nodeType == SolNodeType::In) {
if (variables.find(children[0].outputId) == variables.end()) {
Error::syntaxError(children[0].outputId + " could not be found", children[0].line, children[0].lineContent);
}
std::string type = variables[children[0].outputId];
if (type.substr(0, 7) != "object(") {
Error::typingError(children[0].outputId + " is not an object", children[0].line, children[0].lineContent);
}
std::regex pattern("([a-zA-Z0-9_:<>*&]+)\\s+\\b" + children[0].children[0].outputId + "\\b");
std::smatch match;
if (!std::regex_search(type, match, pattern)) {
Error::typingError("Couldn't find field " + children[0].children[0].outputId + " in " + children[0].outputId, children[0].line, children[0].lineContent);
}
std::string fieldType = match[1];
if (fieldType != checkNodeReturnType(children[1])) {
Error::typingError("Cannot assign type " + checkNodeReturnType(children[1]) + " to field of type " + fieldType, children[0].line, children[0].lineContent);
}
exists(children[1]);
SolGroundCodeBlock codeBlock;
GroundInstruction setInstruction = groundCreateInstruction(SETFIELD);
groundAddReferenceToInstruction(&setInstruction, groundCreateReference(DIRREF, copyString(children[0].outputId)));
groundAddReferenceToInstruction(&setInstruction, groundCreateReference(DIRREF, copyString(children[0].children[0].outputId)));
groundAddReferenceToInstruction(&setInstruction, groundCreateReference(VALREF, copyString(children[1].outputId)));
codeBlock.code.push_back(setInstruction);
if (isTemp(children[1].outputId)) codeBlock.toBeDropped.push_back(children[1].outputId);
code.push_back(codeBlock);
} else {
if (variables.find(children[0].outputId) != variables.end()) { if (variables.find(children[0].outputId) != variables.end()) {
if (variables[children[0].outputId] != checkNodeReturnType(children[1])) { if (variables[children[0].outputId] != checkNodeReturnType(children[1])) {
Error::typingError("Cannot change type of this variable", children[0].line, children[0].lineContent); Error::typingError("Cannot change type of this variable", children[0].line, children[0].lineContent);
@@ -795,6 +786,7 @@ namespace Solstice {
code.push_back(codeBlock); code.push_back(codeBlock);
// Make sure we know what the variable type is // Make sure we know what the variable type is
variables[children[0].outputId] = checkNodeReturnType(children[1]); variables[children[0].outputId] = checkNodeReturnType(children[1]);
}
break; break;
} }
case SolNodeType::FunctionCall: { case SolNodeType::FunctionCall: {

View File

@@ -9,3 +9,8 @@ puts dingus
puts e.x puts e.x
println(e.y) println(e.y)
e.x = 7
e.y = "heheheha"
puts e.x
println(e.y)