Skip to content

Commit 8757a97

Browse files
authored
117 constant referencing enum (#120)
* Impl recursive referneced in static block * Impl inherited references from all enclosing scope * Use parsing context for constant value parsing * Impl ValueResolver for constant * Impl constant referencing enum * Fix Rust constant enum value
1 parent fc793ce commit 8757a97

40 files changed

Lines changed: 798 additions & 675 deletions

annotation/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>online.sharedtype</groupId>
66
<artifactId>sharedtype-parent</artifactId>
7-
<version>0.9.3-SNAPSHOT</version>
7+
<version>0.10.0-SNAPSHOT</version>
88
<relativePath>../pom.xml</relativePath>
99
</parent>
1010

annotation/src/main/java/online/sharedtype/SharedType.java

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -259,47 +259,23 @@
259259

260260
/**
261261
* Mark enum value. By default, enum value is the enum constant name. The enum value must be literals (e.g. 1, "a", true) in enum constant expressions.
262-
* <p>
263-
* When placed on:
264-
* <ul>
265-
* <li>Constructor parameter - the literal value served to this parameter from enum constant expressions will be used.</li>
266-
* <li>Field - the constructor parameter with the same name and type will be used as if constructor parameter is annotated.</li>
267-
* </ul>
268-
* <p>
269-
* Below are some valid examples:
270-
* </p>
262+
* <b>Note: When there are multiple enum constant constructor parameters, the value is resolved by field order.</b>
263+
* If the constructor parameter order is different from the field order, value will not be resolved correctly.
271264
* <pre>
265+
* Example:
272266
* {@code
273267
* enum Enum {
274268
* A(1), B(2);
275269
*
276270
* @SharedType.EnumValue
277271
* private final int value;
278-
*
279-
* Enum(int value) {
280-
* this.value = value;
281-
* }
282-
* }
283-
* }
284-
* </pre>
285-
* is equivalent to:
286-
* <pre>
287-
* {@code
288-
* enum Enum {
289-
* A(1), B(2);
290-
*
291-
* private final int value;
292-
*
293-
* Enum(@SharedType.EnumValue int value) {
294-
* this.value = value;
295-
* }
296272
* }
297273
* }
298274
* </pre>
299275
* <br>
300276
* Additional annotation types can be configured via global properties.
301277
*/
302-
@Target({ElementType.FIELD, ElementType.PARAMETER})
278+
@Target({ElementType.FIELD})
303279
@Retention(RetentionPolicy.CLASS)
304280
@interface EnumValue {
305281
}

client-test/typescript/tests/runtime.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import {
66
REFERENCED_LOCAL_VALUE_IN_STATIC_BLOCK, SELF_REFERENCED_LOCAL_VALUE_IN_STATIC_BLOCK, REFERENCED_IMPORTED_VALUE_IN_STATIC_BLOCK,
77
REFERENCED_NESTED_VALUE_IN_STATIC_BLOCK, REFERENCED_STATIC_IMPORTED_VALUE_IN_STATIC_BLOCK,
88
REFERENCED_PACKAGE_PRIVATE_VALUE_IN_STATIC_BLOCK, REFERENCED_SUPER_VALUE_IN_STATIC_BLOCK, SELECTED_SUPER_VALUE_IN_STATIC_BLOCK,
9+
REFERENCED_STATIC_VALUE_IN_STATIC_BLOCK, INNER_REFERENCED_SUPER_VALUE_IN_STATIC,
10+
REFERENCED_ENUM_VALUE, REFERENCED_ENUM_VALUE_IN_STATIC_BLOCK,
911
} from '../src/index.java17';
1012

1113
test('Constant values', () => {
@@ -32,4 +34,8 @@ test('Constant values', () => {
3234
expect(REFERENCED_PACKAGE_PRIVATE_VALUE_IN_STATIC_BLOCK).toBe(123);
3335
expect(REFERENCED_SUPER_VALUE_IN_STATIC_BLOCK).toBe(345);
3436
expect(SELECTED_SUPER_VALUE_IN_STATIC_BLOCK).toBe(345);
37+
expect(REFERENCED_STATIC_VALUE_IN_STATIC_BLOCK).toBe(787);
38+
expect(INNER_REFERENCED_SUPER_VALUE_IN_STATIC).toBe(345);
39+
expect(REFERENCED_ENUM_VALUE).toBe("MilkyWay");
40+
expect(REFERENCED_ENUM_VALUE_IN_STATIC_BLOCK).toBe("MilkyWay");
3541
});

internal/src/main/java/online/sharedtype/processor/domain/ConcreteTypeInfo.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public final class ConcreteTypeInfo implements TypeInfo, MappableType {
3636
@Builder.Default
3737
private final List<TypeInfo> typeArgs = Collections.emptyList();
3838

39-
@Getter
40-
private final Kind kind;
39+
@Getter @Builder.Default
40+
private final Kind kind = Kind.OTHER;
4141

4242
/**
4343
* If this type is defined in global config as base Map type

internal/src/main/java/online/sharedtype/processor/domain/ConstantField.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.EqualsAndHashCode;
44
import lombok.RequiredArgsConstructor;
5+
import lombok.Setter;
56

67
/**
78
* Represents a constant literal.

internal/src/main/java/online/sharedtype/processor/domain/Constants.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,23 +71,23 @@ public final class Constants {
7171
PREDEFINED_OBJECT_TYPES.put("java.math.BigInteger", BIG_INTEGER_TYPE_INFO);
7272
}
7373

74-
public static final Set<TypeInfo> STRING_AND_NUMBER_TYPES = new HashSet<>(14);
74+
public static final Set<TypeInfo> LITERAL_TYPES = new HashSet<>(14);
7575
static {
76-
STRING_AND_NUMBER_TYPES.add(STRING_TYPE_INFO);
77-
STRING_AND_NUMBER_TYPES.add(BYTE_TYPE_INFO);
78-
STRING_AND_NUMBER_TYPES.add(SHORT_TYPE_INFO);
79-
STRING_AND_NUMBER_TYPES.add(INT_TYPE_INFO);
80-
STRING_AND_NUMBER_TYPES.add(LONG_TYPE_INFO);
81-
STRING_AND_NUMBER_TYPES.add(FLOAT_TYPE_INFO);
82-
STRING_AND_NUMBER_TYPES.add(DOUBLE_TYPE_INFO);
83-
STRING_AND_NUMBER_TYPES.add(CHAR_TYPE_INFO);
84-
STRING_AND_NUMBER_TYPES.add(BOXED_BYTE_TYPE_INFO);
85-
STRING_AND_NUMBER_TYPES.add(BOXED_SHORT_TYPE_INFO);
86-
STRING_AND_NUMBER_TYPES.add(BOXED_INT_TYPE_INFO);
87-
STRING_AND_NUMBER_TYPES.add(BOXED_LONG_TYPE_INFO);
88-
STRING_AND_NUMBER_TYPES.add(BOXED_FLOAT_TYPE_INFO);
89-
STRING_AND_NUMBER_TYPES.add(BOXED_DOUBLE_TYPE_INFO);
90-
STRING_AND_NUMBER_TYPES.add(BOXED_CHAR_TYPE_INFO);
76+
LITERAL_TYPES.add(STRING_TYPE_INFO);
77+
LITERAL_TYPES.add(BYTE_TYPE_INFO);
78+
LITERAL_TYPES.add(SHORT_TYPE_INFO);
79+
LITERAL_TYPES.add(INT_TYPE_INFO);
80+
LITERAL_TYPES.add(LONG_TYPE_INFO);
81+
LITERAL_TYPES.add(FLOAT_TYPE_INFO);
82+
LITERAL_TYPES.add(DOUBLE_TYPE_INFO);
83+
LITERAL_TYPES.add(CHAR_TYPE_INFO);
84+
LITERAL_TYPES.add(BOXED_BYTE_TYPE_INFO);
85+
LITERAL_TYPES.add(BOXED_SHORT_TYPE_INFO);
86+
LITERAL_TYPES.add(BOXED_INT_TYPE_INFO);
87+
LITERAL_TYPES.add(BOXED_LONG_TYPE_INFO);
88+
LITERAL_TYPES.add(BOXED_FLOAT_TYPE_INFO);
89+
LITERAL_TYPES.add(BOXED_DOUBLE_TYPE_INFO);
90+
LITERAL_TYPES.add(BOXED_CHAR_TYPE_INFO);
9191
}
9292

9393
private Constants() {

it/java17/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>online.sharedtype</groupId>
66
<artifactId>sharedtype-it-parent</artifactId>
7-
<version>0.9.3-SNAPSHOT</version>
7+
<version>0.10.0-SNAPSHOT</version>
88
<relativePath>../pom.xml</relativePath>
99
</parent>
1010

it/java17/src/test/java/online/sharedtype/it/ConstantsIntegrationTest.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ void parseMyConstants() {
1212
ConstantNamespaceDef constantsDef = (ConstantNamespaceDef) deserializeTypeDef("$online.sharedtype.it.java8.MyConstants.ser");
1313
assertThat(constantsDef.simpleName()).isEqualTo("MyConstants");
1414
var components = constantsDef.components();
15-
assertThat(components).hasSize(21);
15+
assertThat(components).hasSize(24);
1616
assertThat(components).satisfiesExactly(
1717
component -> {
1818
assertThat(component.name()).isEqualTo("FLOAT_VALUE");
@@ -58,6 +58,10 @@ void parseMyConstants() {
5858
assertThat(component.name()).isEqualTo("SELECTED_SUPER_VALUE");
5959
assertThat(component.value()).isEqualTo(345L);
6060
},
61+
component -> {
62+
assertThat(component.name()).isEqualTo("REFERENCED_ENUM_VALUE");
63+
assertThat(component.value()).isEqualTo("MilkyWay");
64+
},
6165
component -> {
6266
assertThat(component.name()).isEqualTo("REFERENCED_VALUE_IN_STATIC_BLOCK");
6367
assertThat(component.value()).isEqualTo(112L);
@@ -97,6 +101,27 @@ void parseMyConstants() {
97101
component -> {
98102
assertThat(component.name()).isEqualTo("SELECTED_SUPER_VALUE_IN_STATIC_BLOCK");
99103
assertThat(component.value()).isEqualTo(345L);
104+
},
105+
component -> {
106+
assertThat(component.name()).isEqualTo("REFERENCED_STATIC_VALUE_IN_STATIC_BLOCK");
107+
assertThat(component.value()).isEqualTo(787L);
108+
},
109+
component -> {
110+
assertThat(component.name()).isEqualTo("REFERENCED_ENUM_VALUE_IN_STATIC_BLOCK");
111+
assertThat(component.value()).isEqualTo("MilkyWay");
112+
}
113+
);
114+
}
115+
116+
@Test
117+
void parseMyConstantsInner() {
118+
ConstantNamespaceDef constantsDef = (ConstantNamespaceDef) deserializeTypeDef("$online.sharedtype.it.java8.MyConstants.InnerConstantClass.ser");
119+
assertThat(constantsDef.simpleName()).isEqualTo("InnerConstantClass");
120+
var components = constantsDef.components();
121+
assertThat(components).satisfiesExactly(
122+
component -> {
123+
assertThat(component.name()).isEqualTo("INNER_REFERENCED_SUPER_VALUE_IN_STATIC");
124+
assertThat(component.value()).isEqualTo(345L);
100125
}
101126
);
102127
}

it/java17/src/test/java/online/sharedtype/it/EnumIntegrationTest.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void parseEnumSize() {
2828
assertThat(enumSize.qualifiedName()).isEqualTo("online.sharedtype.it.java8.EnumSize");
2929
assertThat(enumSize.components()).hasSize(3).allMatch(constant -> {
3030
ConcreteTypeInfo typeInfo = (ConcreteTypeInfo)constant.type();
31-
return typeInfo.qualifiedName().equals("int");
31+
return typeInfo.qualifiedName().equals("java.lang.Integer");
3232
});
3333

3434
EnumValueInfo constant1 = enumSize.components().get(0);
@@ -40,4 +40,23 @@ void parseEnumSize() {
4040
EnumValueInfo constant3 = enumSize.components().get(2);
4141
assertThat(constant3.value()).isEqualTo(3);
4242
}
43+
44+
@Test
45+
void enumGalaxy() {
46+
EnumDef enumGalaxy = (EnumDef) deserializeTypeDef("online.sharedtype.it.java8.EnumGalaxy.ser");
47+
assertThat(enumGalaxy.simpleName()).isEqualTo("EnumGalaxy");
48+
assertThat(enumGalaxy.qualifiedName()).isEqualTo("online.sharedtype.it.java8.EnumGalaxy");
49+
assertThat(enumGalaxy.components()).hasSize(3).allMatch(constant -> {
50+
ConcreteTypeInfo typeInfo = (ConcreteTypeInfo)constant.type();
51+
return typeInfo.qualifiedName().equals("java.lang.String");
52+
});
53+
EnumValueInfo constant1 = enumGalaxy.components().get(0);
54+
assertThat(constant1.value()).isEqualTo("MilkyWay");
55+
56+
EnumValueInfo constant2 = enumGalaxy.components().get(1);
57+
assertThat(constant2.value()).isEqualTo("Andromeda");
58+
59+
EnumValueInfo constant3 = enumGalaxy.components().get(2);
60+
assertThat(constant3.value()).isEqualTo("Triangulum");
61+
}
4362
}

it/java17/src/test/java/online/sharedtype/it/TypeDefIntegrationTest.java

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -73,45 +73,6 @@ void dependencyClassC() {
7373
assertThat(classC.simpleName()).isEqualTo("DependencyClassC");
7474
}
7575

76-
@Test
77-
void enumGalaxy() {
78-
EnumDef enumGalaxy = (EnumDef) deserializeTypeDef("online.sharedtype.it.java8.EnumGalaxy.ser");
79-
assertThat(enumGalaxy.simpleName()).isEqualTo("EnumGalaxy");
80-
assertThat(enumGalaxy.qualifiedName()).isEqualTo("online.sharedtype.it.java8.EnumGalaxy");
81-
assertThat(enumGalaxy.components()).hasSize(3).allMatch(constant -> {
82-
ConcreteTypeInfo typeInfo = (ConcreteTypeInfo)constant.type();
83-
return typeInfo.qualifiedName().equals("java.lang.String");
84-
});
85-
EnumValueInfo constant1 = enumGalaxy.components().get(0);
86-
assertThat(constant1.value()).isEqualTo("MilkyWay");
87-
88-
EnumValueInfo constant2 = enumGalaxy.components().get(1);
89-
assertThat(constant2.value()).isEqualTo("Andromeda");
90-
91-
EnumValueInfo constant3 = enumGalaxy.components().get(2);
92-
assertThat(constant3.value()).isEqualTo("Triangulum");
93-
}
94-
95-
@Test
96-
void enumSize() {
97-
EnumDef enumSize = (EnumDef) deserializeTypeDef("online.sharedtype.it.java8.EnumSize.ser");
98-
assertThat(enumSize.simpleName()).isEqualTo("EnumSize");
99-
assertThat(enumSize.qualifiedName()).isEqualTo("online.sharedtype.it.java8.EnumSize");
100-
assertThat(enumSize.components()).hasSize(3).allMatch(constant -> {
101-
ConcreteTypeInfo typeInfo = (ConcreteTypeInfo)constant.type();
102-
return typeInfo.qualifiedName().equals("int");
103-
});
104-
105-
EnumValueInfo constant1 = enumSize.components().get(0);
106-
assertThat(constant1.value()).isEqualTo(1);
107-
108-
EnumValueInfo constant2 = enumSize.components().get(1);
109-
assertThat(constant2.value()).isEqualTo(2);
110-
111-
EnumValueInfo constant3 = enumSize.components().get(2);
112-
assertThat(constant3.value()).isEqualTo(3);
113-
}
114-
11576
@Test
11677
void recursiveClass() {
11778
ClassDef recursiveClass = (ClassDef) deserializeTypeDef("online.sharedtype.it.java8.RecursiveClass.ser");

0 commit comments

Comments
 (0)