blob: dddfe61659588f72fd96b3ab7fd980d739d79845 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
#pragma once
#include "CodegenConfig.hpp"
#include "CodegenMacros.hpp"
#include "CodegenOutput.inl"
#include <Macros.hpp>
#include <ScopeGuard.hpp>
#include <cstdio>
#include <cstdlib>
#include <filesystem>
namespace Utils {
bool WriteOutputFile(const CodegenOutput& output, const char* path) {
auto outputFile = Utils::OpenCstdioFile(path, Utils::WriteTruncate);
if (!outputFile) {
printf("[ERROR] unable to open output file %s\n", path);
return false;
}
DEFER { fclose(outputFile); };
DEBUG_PRINTF("Writing output %s\n", path);
output.Write(outputFile);
return true;
}
std::string MakeFullName(std::string_view name, DeclNamespace* ns = nullptr) {
size_t length = 0;
std::vector<std::string_view> components;
if (!name.empty()) {
components.push_back(name);
length += name.length();
}
DeclNamespace* currentNamespace = ns;
while (currentNamespace) {
components.push_back(currentNamespace->name);
length += currentNamespace->name.size() + /*::*/ 2;
currentNamespace = currentNamespace->container;
}
std::string fullname;
fullname.reserve(length);
for (auto it = components.rbegin(); it != components.rend(); ++it) {
fullname += *it;
fullname += "::";
}
// Get rid of the last "::"
fullname.pop_back();
fullname.pop_back();
return fullname;
}
void ProduceGeneratedHeader(const char* headerFilename, CodegenOutput& header, const char* sourceFilename, CodegenOutput& source) {
CodegenOutputThing headerOut;
headerOut.text += &R"""(
// This file is generated. Any changes will be overidden when building.
#pragma once
#include <MetadataBase.hpp>
#include <cstddef>
#include <cstdint>
)"""[1];
CodegenOutputThing sourceOut;
APPEND_LIT_LN(sourceOut.text, "// This file is generated. Any changes will be overidden when building.");
APPEND_FMT_LN(sourceOut.text, "#include \"%s\"", headerFilename);
sourceOut.text += &R"""(
#include <frozen/string.h>
#include <frozen/unordered_map.h>
using namespace std::literals;
)"""[1];
header.AddOutputThing(std::move(headerOut));
source.AddOutputThing(std::move(sourceOut));
}
} // namespace Utils
|