Skip to content

Commit 728c49b

Browse files
committed
Add types to enumerators
1 parent 3a95e9c commit 728c49b

File tree

5 files changed

+55
-25
lines changed

5 files changed

+55
-25
lines changed

ir/Enum.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "Enum.h"
22
#include <sstream>
3-
#include <cassert>
43

54
Enumerator::Enumerator(std::string name, uint64_t value)
65
: name(std::move(name)), value(value) {}
@@ -22,18 +21,40 @@ bool Enum::isAnonymous() const {
2221

2322
TypeDef Enum::generateTypeDef() const {
2423
assert (!isAnonymous());
25-
return TypeDef("enum_" + name, type);
24+
return TypeDef(getTypeName(), type);
2625
}
2726

2827
llvm::raw_ostream &operator<<(llvm::raw_ostream &s, const Enum &e) {
2928
for (auto enumerator : e.enumerators) {
3029
std::string enumeratorName;
3130
if (!e.name.empty()) {
32-
enumeratorName = "enum_" + e.name + "_" + enumerator.getName();
31+
enumeratorName = e.getTypeName() + "_" + enumerator.getName();
3332
} else {
3433
enumeratorName = "enum_" + enumerator.getName();
3534
}
36-
s << " final val " << enumeratorName << " = " << std::to_string(enumerator.getValue()) << "\n";
35+
s << " final val " << enumeratorName;
36+
std::string type;
37+
if (e.isAnonymous()) {
38+
type = e.type;
39+
} else {
40+
type = e.getTypeName();
41+
}
42+
s << ": " << type
43+
<< " = " << std::to_string(enumerator.getValue());
44+
45+
if (e.type == "native.CUnsignedInt") {
46+
s << ".toUInt" << "\n";
47+
} else if (e.type == "native.CUnsignedLong") {
48+
s << "L.toULong" << "\n";
49+
} else {
50+
llvm::errs() << "Enum type is unsupported: " << e.type << "\n";
51+
llvm::errs().flush();
52+
}
3753
}
3854
return s;
3955
}
56+
57+
std::string Enum::getTypeName() const {
58+
assert(!isAnonymous());
59+
return "enum_" + name;
60+
}

ir/Enum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class Enum {
2929

3030
TypeDef generateTypeDef() const;
3131

32+
std::string getTypeName() const;
33+
3234
friend llvm::raw_ostream &operator<<(llvm::raw_ostream &s, const Enum &e);
3335

3436
private:

tests/samples/Enum.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,9 @@ enum days {
1010

1111
enum bigValues {
1212
A = 10000000000, // does not fit into int
13-
B // 10000000001
13+
B = 1
14+
};
15+
16+
enum { // anonymous enum
17+
C, D
1418
};

tests/samples/Enum.scala

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ object Enum {
1212
import Enum._
1313

1414
object EnumEnums {
15-
final val enum_days_MONDAY = 0
16-
final val enum_days_TUESDAY = 200
17-
final val enum_days_WEDNESDAY = 201
18-
final val enum_days_THURSDAY = 4
19-
final val enum_days_FRIDAY = 5
20-
final val enum_days_SATURDAY = 3
21-
final val enum_days_SUNDAY = 4
15+
final val enum_days_MONDAY: enum_days = 0.toUInt
16+
final val enum_days_TUESDAY: enum_days = 200.toUInt
17+
final val enum_days_WEDNESDAY: enum_days = 201.toUInt
18+
final val enum_days_THURSDAY: enum_days = 4.toUInt
19+
final val enum_days_FRIDAY: enum_days = 5.toUInt
20+
final val enum_days_SATURDAY: enum_days = 3.toUInt
21+
final val enum_days_SUNDAY: enum_days = 4.toUInt
2222

23-
final val enum_bigValues_A = 10000000000
24-
final val enum_bigValues_B = 10000000001
23+
final val enum_bigValues_A: enum_bigValues = 10000000000L.toULong
24+
final val enum_bigValues_B: enum_bigValues = 1L.toULong
25+
26+
final val enum_C: native.CUnsignedInt = 0.toUInt
27+
final val enum_D: native.CUnsignedInt = 1.toUInt
2528
}

tests/samples/Typedef.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ object Typedef {
99
type int2int = native.CFunctionPtr1[native.CInt, native.CInt]
1010
type day2string = native.CFunctionPtr1[enum_days, native.CString]
1111
type toggle = native.CFunctionPtr1[toggle_e, Unit]
12-
type enum_days = native.CInt
13-
type enum_toggle_e = native.CInt
12+
type enum_days = native.CUnsignedInt
13+
type enum_toggle_e = native.CUnsignedInt
1414
}
1515

1616
import Typedef._
1717

1818
object TypedefEnums {
19-
final val enum_days_MONDAY = 0
20-
final val enum_days_TUESDAY = 1
21-
final val enum_days_WEDNESDAY = 2
22-
final val enum_days_THURSDAY = 3
23-
final val enum_days_FRIDAY = 4
24-
final val enum_days_SATURDAY = 5
25-
final val enum_days_SUNDAY = 6
19+
final val enum_days_MONDAY: enum_days = 0.toUInt
20+
final val enum_days_TUESDAY: enum_days = 1.toUInt
21+
final val enum_days_WEDNESDAY: enum_days = 2.toUInt
22+
final val enum_days_THURSDAY: enum_days = 3.toUInt
23+
final val enum_days_FRIDAY: enum_days = 4.toUInt
24+
final val enum_days_SATURDAY: enum_days = 5.toUInt
25+
final val enum_days_SUNDAY: enum_days = 6.toUInt
2626

27-
final val enum_toggle_e_OFF = 0
28-
final val enum_toggle_e_ON = 1
27+
final val enum_toggle_e_OFF: enum_toggle_e = 0.toUInt
28+
final val enum_toggle_e_ON: enum_toggle_e = 1.toUInt
2929
}

0 commit comments

Comments
 (0)