-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCppDataClassGenerator.kt
More file actions
70 lines (65 loc) · 3.01 KB
/
CppDataClassGenerator.kt
File metadata and controls
70 lines (65 loc) · 3.01 KB
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
package generators.cpp
import ce.domain.usecase.add.AddRegionDefaultsUseCase
import generators.obj.TransformBlockUseCase
import generators.obj.abstractSyntaxTree.DataClass
import generators.obj.abstractSyntaxTree.DataField
import generators.obj.abstractSyntaxTree.addCommentLine
import generators.obj.abstractSyntaxTree.addDatatype
import generators.obj.abstractSyntaxTree.addKeyword
import generators.obj.abstractSyntaxTree.addOutBlock
import generators.obj.abstractSyntaxTree.addSub
import generators.obj.abstractSyntaxTree.addVarName
import generators.obj.abstractSyntaxTree.findOrCreateSub
import generators.obj.abstractSyntaxTree.findOrNull
import generators.obj.abstractSyntaxTree.getParentPath
import generators.obj.syntaxParseTree.CommentsBlock
import generators.obj.syntaxParseTree.FieldNode
import generators.obj.syntaxParseTree.FileData
import generators.obj.syntaxParseTree.ImportsBlock
import generators.obj.syntaxParseTree.NamespaceBlock
import generators.obj.syntaxParseTree.RegionImpl
class CppDataClassGenerator(
private val addBlockDefaultsUseCase: AddRegionDefaultsUseCase,
private val prepareRightValueUseCase: PrepareRightValueUseCase,
private val dataTypeToString: GetTypeNameUseCase,
) : TransformBlockUseCase<DataClass> {
override fun invoke(blockFiles: List<FileData>, desc: DataClass) {
val header = blockFiles.find { it is CppHeaderFile }
?: throw java.lang.IllegalStateException("Can't find Header file for C++")
header.findOrCreateSub(ImportsBlock::class.java)
val imports = header.findOrCreateSub(ImportsBlock::class.java)
val namespace = header.addSub(NamespaceBlock(desc.getParentPath()))
namespace.addSub(RegionImpl(desc.name)).apply {
addBlockDefaultsUseCase(desc, this)
if (findOrNull(CommentsBlock::class.java) == null) {
// add default comments block
addSub(CommentsBlock()).apply {
addCommentLine("Data class ${desc.name}")
}
}
addOutBlock("struct ${desc.name}") {
desc.subs.forEach { leaf ->
if (leaf is DataField) {
addSub(FieldNode().apply {
addDatatype(
dataTypeToString.typeTo(
importsBlock = imports,
type = leaf.getType()
)
)
addVarName(leaf.name)
if (leaf.getValue().isDefined()) {
addKeyword("=")
val rValue = prepareRightValueUseCase.toRightValue(
dataField = leaf,
importsBlock = imports
)
addSub(rValue)
}
})
}
}
}
}
}
}