|
6 | 6 | #include <utility> |
7 | 7 |
|
8 | 8 | Field::Field(std::string name, std::shared_ptr<Type> type) |
9 | | - : TypeAndName(std::move(name), type) {} |
| 9 | + : TypeAndName(std::move(name), std::move(type)) {} |
| 10 | + |
| 11 | +std::string Field::generateSetter(int fieldIndex) { |
| 12 | + std::string setter = handleReservedWords(getName(), "_="); |
| 13 | + std::string parameterType = type->str(); |
| 14 | + std::string value = "value"; |
| 15 | + if (isInstanceOf<ArrayType>(type.get()) || |
| 16 | + isInstanceOf<Struct>(type.get())) { |
| 17 | + parameterType = "native.Ptr[" + parameterType + "]"; |
| 18 | + value = "!" + value; |
| 19 | + } |
| 20 | + std::stringstream s; |
| 21 | + s << " def " << setter << "(value: " + parameterType + "): Unit = !p._" |
| 22 | + << std::to_string(fieldIndex + 1) << " = " << value; |
| 23 | + return s.str(); |
| 24 | +} |
| 25 | + |
| 26 | +std::string Field::generateGetter(int fieldIndex) { |
| 27 | + std::string getter = handleReservedWords(getName()); |
| 28 | + std::string returnType = type->str(); |
| 29 | + std::string methodBody; |
| 30 | + if (isInstanceOf<ArrayType>(type.get()) || |
| 31 | + isInstanceOf<Struct>(type.get())) { |
| 32 | + returnType = "native.Ptr[" + returnType + "]"; |
| 33 | + methodBody = "p._" + std::to_string(fieldIndex + 1); |
| 34 | + } else { |
| 35 | + methodBody = "!p._" + std::to_string(fieldIndex + 1); |
| 36 | + } |
| 37 | + std::stringstream s; |
| 38 | + s << " def " << getter << ": " << returnType << " = " << methodBody; |
| 39 | + return s.str(); |
| 40 | +} |
10 | 41 |
|
11 | 42 | StructOrUnion::StructOrUnion(std::string name, std::vector<Field *> fields) |
12 | 43 | : name(std::move(name)), fields(std::move(fields)) {} |
@@ -47,14 +78,8 @@ std::string Struct::generateHelperClass() const { |
47 | 78 | int fieldIndex = 0; |
48 | 79 | for (const auto &field : fields) { |
49 | 80 | if (!field->getName().empty()) { |
50 | | - std::string getter = handleReservedWords(field->getName()); |
51 | | - std::string setter = handleReservedWords(field->getName(), "_="); |
52 | | - std::shared_ptr<Type> ftype = field->getType(); |
53 | | - s << " def " << getter << ": " << ftype->str() << " = !p._" |
54 | | - << std::to_string(fieldIndex + 1) << "\n" |
55 | | - << " def " << setter |
56 | | - << "(value: " + ftype->str() + "):Unit = !p._" |
57 | | - << std::to_string(fieldIndex + 1) << " = value\n"; |
| 81 | + s << field->generateGetter(fieldIndex) << "\n"; |
| 82 | + s << field->generateSetter(fieldIndex) << "\n"; |
58 | 83 | } |
59 | 84 | fieldIndex++; |
60 | 85 | } |
|
0 commit comments