refactor(ast): LiteralNode ve IdentifierNode toJson spagetti → JsonObject

Elle yönetilen ostringstream + virgül/kapanış manipülasyonu kaldırıldı;
VariableDeclNode ile aynı JsonObject builder pattern'ına geçildi.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
saqut 2026-06-19 23:03:41 +03:00
parent 636bfcc6d5
commit 77bcd1c9d6
2 changed files with 17 additions and 28 deletions

View File

@ -1,6 +1,5 @@
#include "parser/nodes/identifier.hpp"
#include <iostream>
#include <sstream>
#include "parser/ast_json.hpp"
IdentifierNode::IdentifierNode() { kind = ASTKind::Identifier; }
@ -11,14 +10,10 @@ void IdentifierNode::log(int indent) {
}
std::string IdentifierNode::toJson(int depth) {
std::string in = jsonIndent(depth);
std::string name = parserToken.token ? parserToken.token->token : "?";
std::ostringstream ss;
ss << "{\n"
<< in << " \"kind\": \"Identifier\",\n"
<< in << " \"name\": \"" << jsonEscape(name) << "\",\n"
<< in << " \"resolvedType\": " << resolvedTypeJson() << ",\n"
<< in << " \"location\": " << loc.toJson() << "\n"
<< in << "}";
return ss.str();
JsonObject obj(depth);
obj.add("kind", "Identifier");
obj.add("name", parserToken.token ? parserToken.token->token : "?");
obj.addRaw("resolvedType", resolvedTypeJson());
obj.addRaw("location", loc.toJson());
return obj.str();
}

View File

@ -1,6 +1,5 @@
#include "parser/nodes/literal.hpp"
#include <iostream>
#include <sstream>
#include "parser/ast_json.hpp"
LiteralNode::LiteralNode() { kind = ASTKind::Literal; }
@ -18,22 +17,17 @@ void LiteralNode::log(int indent) {
}
std::string LiteralNode::toJson(int depth) {
std::string in = jsonIndent(depth);
std::string val = hasDirectValue ? std::to_string(directIntValue)
: (parserToken.token ? parserToken.token->token : "?");
std::ostringstream ss;
ss << "{\n"
<< in << " \"kind\": \"Literal\",\n"
<< in << " \"literalType\": \"" << literalTypeToString(literalType) << "\",\n"
<< in << " \"value\": \"" << jsonEscape(val) << "\"";
if (literalType == LiteralType::INTEGER && literalBase != 10) {
ss << ",\n" << in << " \"base\": " << literalBase;
}
if (literalType == LiteralType::FLOAT) {
ss << ",\n" << in << " \"isFloat\": true";
}
ss << ",\n" << in << " \"resolvedType\": " << resolvedTypeJson();
ss << ",\n" << in << " \"location\": " << loc.toJson() << "\n"
<< in << "}";
return ss.str();
JsonObject obj(depth);
obj.add("kind", "Literal");
obj.add("literalType", literalTypeToString(literalType));
obj.add("value", val);
if (literalType == LiteralType::INTEGER && literalBase != 10)
obj.add("base", literalBase);
if (literalType == LiteralType::FLOAT)
obj.add("isFloat", true);
obj.addRaw("resolvedType", resolvedTypeJson());
obj.addRaw("location", loc.toJson());
return obj.str();
}