Skip to content

Commit eb95eaa

Browse files
committed
Port to KTextTemplate
1 parent 92aef3c commit eb95eaa

11 files changed

+350
-333
lines changed

CMakeLists.txt

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ cmake_minimum_required(VERSION 3.10)
22
project(fcitx5-wayland-binding-generator)
33

44
find_package(Qt6 REQUIRED COMPONENTS Core Xml)
5+
find_package(KF6TextTemplate REQUIRED)
56

6-
set(CMAKE_CXX_STANDARD_REQUIRED 20)
7+
set(CMAKE_CXX_STANDARD 20)
8+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
9+
set(CMAKE_CXX_EXTENSIONS OFF)
710

811
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
912
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
1013
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
1114

1215
add_subdirectory(src)
16+
add_subdirectory(templates)

src/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
add_executable(fcitx5-wayland-binding-generator main.cpp protocol.cpp parser.cpp)
2-
target_link_libraries(fcitx5-wayland-binding-generator Qt6::Core Qt6::Xml)
2+
target_link_libraries(fcitx5-wayland-binding-generator Qt6::Core Qt6::Xml KF6::TextTemplate templateResources)
3+

src/main.cpp

+11-5
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
*/
77

88
#include <cstdlib>
9-
#include "protocol.h"
109
#include <QCommandLineOption>
1110
#include <QCommandLineParser>
1211
#include <QCoreApplication>
12+
#include <QLatin1String>
1313
#include <QLoggingCategory>
1414
#include <QtLogging>
15-
#include <QLatin1String>
15+
#include <ktexttemplate/metatype.h>
16+
#include <qcontainerfwd.h>
17+
#include "protocol.h"
1618

1719
Q_LOGGING_CATEGORY(generator, "generator");
1820

@@ -38,7 +40,8 @@ int main(int argc, char *argv[]) {
3840
parser.addOption(
3941
QCommandLineOption("directory", "Output directory.", "directory", "."));
4042
parser.addHelpOption();
41-
parser.addPositionalArgument("files", "Input files.", "[files...]");
43+
parser.addPositionalArgument("files", "Input files.",
44+
"[deps_protocol_file] main_protocol_file");
4245
parser.process(app);
4346

4447
EmitOptions options;
@@ -52,9 +55,12 @@ int main(int argc, char *argv[]) {
5255

5356
const auto filenames = parser.positionalArguments();
5457

58+
KTextTemplate::registerMetaType<Message>();
59+
KTextTemplate::registerMetaType<Message *>();
60+
KTextTemplate::registerMetaType<Argument>();
61+
5562
Protocol protocol(filenames);
56-
protocol.emitHeader(options);
57-
protocol.emitSource(options);
63+
protocol.generate(options);
5864

5965
return 0;
6066
}

src/parser.cpp

+17-26
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ Q_DECLARE_LOGGING_CATEGORY(generator);
3535

3636
#define XML_BUFFER_SIZE 4096
3737

38-
ParseContext::ParseContext(Protocol *protocol, const QString &filename)
39-
: protocol_(protocol) {
38+
ParseContext::ParseContext(Protocol *protocol, const QString &filename,
39+
bool main)
40+
: protocol_(protocol), main_(main) {
4041

4142
if (filename.isEmpty()) {
4243

@@ -124,7 +125,7 @@ void ParseContext::startElement(QStringView element_name,
124125
qCCritical(generator) << "no interface version given";
125126
}
126127

127-
protocol_->interfaces_.emplace_back(loc_, name, version);
128+
protocol_->interfaces_.emplace_back(loc_, name, version, main_);
128129
interface_ = &protocol_->interfaces_.back();
129130
} else if (element_name == "request" || element_name == "event") {
130131
if (name.empty()) {
@@ -137,11 +138,11 @@ void ParseContext::startElement(QStringView element_name,
137138
} else {
138139
messageList = &interface_->eventsList_;
139140
}
140-
messageList->emplace_back(loc_, name);
141+
messageList->emplace_back(name);
141142
message_ = &messageList->back();
142143

143144
if (type == "destructor") {
144-
message_->destructor_ = 1;
145+
message_->destructor_ = true;
145146
}
146147

147148
if (!since.isEmpty()) {
@@ -235,25 +236,6 @@ void ParseContext::startElement(QStringView element_name,
235236
entry = &enumeration_->entryList_.back();
236237

237238
entry->summary_ = summary.toString();
238-
} else if (element_name == "description") {
239-
if (summary.isEmpty()) {
240-
qCCritical(generator) << "description without summary";
241-
}
242-
243-
std::unique_ptr<Description> description =
244-
std::make_unique<Description>();
245-
description_ = description.get();
246-
description->summary = summary.toString();
247-
248-
if (message_) {
249-
message_->description_ = std::move(description);
250-
} else if (enumeration_) {
251-
enumeration_->description_ = std::move(description);
252-
} else if (interface_) {
253-
interface_->description_ = std::move(description);
254-
} else {
255-
protocol_->description_ = std::move(description);
256-
}
257239
}
258240
}
259241

@@ -293,8 +275,17 @@ void ParseContext::endElement(QStringView name) {
293275
if (name == "copyright") {
294276
protocol_->copyright_ = characterData_;
295277
} else if (name == "description") {
296-
description_->text = characterData_;
297-
description_ = nullptr;
278+
Description description;
279+
description.text = characterData_;
280+
if (message_) {
281+
message_->description_ = std::move(description);
282+
} else if (enumeration_) {
283+
enumeration_->description_ = std::move(description);
284+
} else if (interface_) {
285+
interface_->description_ = std::move(description);
286+
} else {
287+
protocol_->description_ = std::move(description);
288+
}
298289
} else if (name == "request" || name == "event") {
299290
message_ = nullptr;
300291
} else if (name == "enum") {

src/parser.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct Interface;
2121
struct Description;
2222

2323
struct ParseContext {
24-
ParseContext(Protocol *protocol, const QString &filename);
24+
ParseContext(Protocol *protocol, const QString &filename, bool main);
2525

2626
~ParseContext();
2727

@@ -41,14 +41,14 @@ struct ParseContext {
4141
return loc_;
4242
}
4343

44+
bool main_;
4445
QXmlStreamReader reader_;
4546
QFile input_;
4647
Location loc_;
4748
Protocol *protocol_ = nullptr;
4849
Interface *interface_ = nullptr;
4950
Message *message_ = nullptr;
5051
Enumeration *enumeration_ = nullptr;
51-
Description *description_ = nullptr;
5252
QString characterData_;
5353
};
5454

0 commit comments

Comments
 (0)