Skip to content

Commit 3f0b75a

Browse files
committed
Use enumValueTypeAlias for constant type annotation for rust
1 parent 0630a95 commit 3f0b75a

25 files changed

Lines changed: 121 additions & 51 deletions

internal/src/main/java/online/sharedtype/processor/domain/def/ConcreteTypeDef.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public abstract class ConcreteTypeDef implements TypeDef {
2929

3030
/**
3131
* Register a counterpart typeInfo.
32+
* <b>Note:</b> This method should not be called from outside, please use {@link ConcreteTypeInfo#shallowResolved()}
3233
*/
3334
public abstract void linkTypeInfo(ConcreteTypeInfo typeInfo);
3435
}

internal/src/main/java/online/sharedtype/processor/domain/def/EnumDef.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ public TypeInfo getComponentValueType() {
5454
}
5555
return enumValueInfos.get(0).value().getValueType();
5656
}
57+
/** @return true if component value has a different type other than this enumType, i.e. when enumValue is defined */
58+
public boolean hasComponentValueType() {
59+
return !getComponentValueType().equals(typeInfo);
60+
}
61+
public String valueTypeAlias() {
62+
return String.format("%sValue", simpleName);
63+
}
5764

5865
@Override
5966
public Set<ConcreteTypeInfo> typeInfoSet() {

internal/src/main/java/online/sharedtype/processor/domain/value/EnumConstantValue.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
@EqualsAndHashCode(callSuper = true)
1010
public final class EnumConstantValue extends LiteralValue {
1111
private static final long serialVersionUID = -6711930218877737970L;
12+
private final ConcreteTypeInfo enumType;
1213
private final String enumConstantName;
13-
EnumConstantValue(String enumConstantName, ConcreteTypeInfo valueType, Object value) {
14+
EnumConstantValue(ConcreteTypeInfo enumType, String enumConstantName, ConcreteTypeInfo valueType, Object value) {
1415
super(valueType, value);
16+
this.enumType = enumType;
1517
this.enumConstantName = enumConstantName;
1618
}
1719

internal/src/main/java/online/sharedtype/processor/domain/value/ValueHolder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import online.sharedtype.processor.domain.Constants;
44
import online.sharedtype.processor.domain.type.ConcreteTypeInfo;
5-
import online.sharedtype.processor.domain.type.TypeInfo;
65

76
import java.io.Serializable;
87

@@ -27,15 +26,15 @@ static ValueHolder of(ConcreteTypeInfo valueType, Object value) {
2726
}
2827
}
2928

30-
static EnumConstantValue ofEnum(String enumConstantName, ConcreteTypeInfo valueType, Object value) {
29+
static EnumConstantValue ofEnum(ConcreteTypeInfo enumType, String enumConstantName, ConcreteTypeInfo valueType, Object value) {
3130
ConcreteTypeInfo actualValueType = valueType;
3231
Object actualValue = value;
3332
while (actualValue instanceof ValueHolder) {
3433
ValueHolder valueHolder = (ValueHolder) actualValue;
3534
actualValueType = valueHolder.getValueType();
3635
actualValue = valueHolder.getValue();
3736
}
38-
return new EnumConstantValue(enumConstantName, actualValueType, actualValue);
37+
return new EnumConstantValue(enumType, enumConstantName, actualValueType, actualValue);
3938
}
4039

4140
LiteralValue NULL = new LiteralValue(Constants.NULL_TYPE_INFO,null);

processor/src/main/java/online/sharedtype/processor/parser/ClassTypeDefParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public List<TypeDef> parse(TypeElement typeElement) {
7676
classDef.directSupertypes().addAll(parseSupertypes(typeElement));
7777

7878
TypeInfo typeInfo = typeInfoParser.parse(typeElement.asType(), typeElement);
79-
classDef.linkTypeInfo((ConcreteTypeInfo) typeInfo);
79+
((ConcreteTypeInfo) typeInfo).markShallowResolved(classDef);
8080
return Collections.singletonList(classDef);
8181
}
8282

processor/src/main/java/online/sharedtype/processor/parser/EnumTypeDefParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public List<TypeDef> parse(TypeElement typeElement) {
6262
.build();
6363
enumDef.components().addAll(parseEnumConstants(typeElement, enumConstantElems));
6464
TypeInfo typeInfo = typeInfoParser.parse(typeElement.asType(), typeElement);
65-
enumDef.linkTypeInfo((ConcreteTypeInfo) typeInfo);
65+
((ConcreteTypeInfo) typeInfo).markShallowResolved(enumDef);
6666
return Collections.singletonList(enumDef);
6767
}
6868

processor/src/main/java/online/sharedtype/processor/parser/value/EnumValueParser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ public ValueHolder resolve(Element enumConstantElement, TypeElement enumTypeElem
3333
VariableElement enumConstant = (VariableElement) enumConstantElement;
3434
String enumConstantName = enumConstant.getSimpleName().toString();
3535
EnumCtorIndex ctorArgIdx = resolveCtorIndex(enumTypeElement);
36+
ConcreteTypeInfo enumTypeInfo = (ConcreteTypeInfo) typeInfoParser.parse(enumTypeElement.asType(), enumTypeElement);
3637
if (ctorArgIdx == EnumCtorIndex.NONE) {
37-
ConcreteTypeInfo typeInfo = (ConcreteTypeInfo) typeInfoParser.parse(enumTypeElement.asType(), enumTypeElement);
38-
return ValueHolder.ofEnum(enumConstantName, typeInfo, enumConstantName);
38+
return ValueHolder.ofEnum(enumTypeInfo, enumConstantName, enumTypeInfo, enumConstantName);
3939
}
4040

4141
Tree tree = ctx.getTrees().getTree(enumConstant);
@@ -58,7 +58,7 @@ public ValueHolder resolve(Element enumConstantElement, TypeElement enumTypeElem
5858
return ValueHolder.NULL;
5959
}
6060
}
61-
return ValueHolder.ofEnum(enumConstantName, valueType, value);
61+
return ValueHolder.ofEnum(enumTypeInfo, enumConstantName, valueType, value);
6262
} else if (tree == null) {
6363
ctx.error(enumConstant, "Literal value cannot be parsed from enum constant: %s of enum %s, because source tree from the element is null." +
6464
" This could mean at the time of the annotation processing, the source tree was not available." +

processor/src/main/java/online/sharedtype/processor/writer/converter/ConstantConverter.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import online.sharedtype.processor.domain.component.ComponentInfo;
88
import online.sharedtype.processor.domain.component.ConstantField;
99
import online.sharedtype.processor.domain.def.ConstantNamespaceDef;
10+
import online.sharedtype.processor.domain.def.EnumDef;
1011
import online.sharedtype.processor.domain.def.TypeDef;
1112
import online.sharedtype.processor.domain.type.ConcreteTypeInfo;
1213
import online.sharedtype.processor.domain.value.EnumConstantValue;
@@ -22,7 +23,6 @@
2223
@RequiredArgsConstructor
2324
final class ConstantConverter implements TemplateDataConverter {
2425
private final Context ctx;
25-
@Nullable
2626
private final TypeExpressionConverter typeExpressionConverter;
2727
private final SharedType.TargetType targetType;
2828

@@ -46,11 +46,24 @@ public Tuple<Template, AbstractTypeExpr> convert(TypeDef typeDef) {
4646
private ConstantExpr toConstantExpr(ConstantField constantField, TypeDef contextTypeDef) {
4747
return new ConstantExpr(
4848
constantField,
49-
typeExpressionConverter == null ? null : typeExpressionConverter.toTypeExpr(constantField.value().getValueType(), contextTypeDef),
49+
toConstantTypeExpr(constantField, contextTypeDef),
5050
toConstantValue(constantField)
5151
);
5252
}
5353

54+
private String toConstantTypeExpr(ConstantField constantField, TypeDef contextTypeDef) {
55+
if (targetType == SharedType.TargetType.RUST && constantField.value() instanceof EnumConstantValue) {
56+
EnumConstantValue enumConstantValue = (EnumConstantValue) constantField.value();
57+
ConcreteTypeInfo enumTypeInfo = enumConstantValue.getEnumType();
58+
EnumDef enumTypeDef = (EnumDef) enumTypeInfo.typeDef();
59+
if (enumTypeDef.hasComponentValueType() && ctx.getProps().getRust().hasEnumValueTypeAlias()) {
60+
return enumTypeDef.valueTypeAlias();
61+
}
62+
}
63+
64+
return typeExpressionConverter.toTypeExpr(constantField.value().getValueType(), contextTypeDef);
65+
}
66+
5467
private String toConstantValue(ConstantField constantField) {
5568
if (targetType == SharedType.TargetType.RUST) {
5669
ConcreteTypeInfo type = constantField.value().getValueType();

processor/src/main/java/online/sharedtype/processor/writer/converter/RustEnumConverter.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import online.sharedtype.processor.domain.def.EnumDef;
99
import online.sharedtype.processor.domain.def.TypeDef;
1010
import online.sharedtype.processor.domain.type.ConcreteTypeInfo;
11-
import online.sharedtype.processor.domain.type.TypeInfo;
1211
import online.sharedtype.processor.domain.value.EnumConstantValue;
1312
import online.sharedtype.processor.support.utils.Tuple;
1413
import online.sharedtype.processor.writer.converter.type.TypeExpressionConverter;
@@ -40,19 +39,17 @@ public Tuple<Template, AbstractTypeExpr> convert(TypeDef typeDef) {
4039
rustMacroTraitsGenerator.generate(enumDef),
4140
hasValue,
4241
valueType,
43-
hasValue && ctx.getProps().getRust().hasEnumValueTypeAlias() ? String.format("%sValue", enumDef.simpleName()) : null
42+
hasValue && ctx.getProps().getRust().hasEnumValueTypeAlias() ? enumDef.valueTypeAlias() : null
4443
);
4544
return Tuple.of(Template.TEMPLATE_RUST_ENUM, value);
4645
}
4746

4847
@Nullable
4948
private String getValueTypeExpr(EnumDef enumDef) {
50-
TypeInfo componentValueType = enumDef.getComponentValueType();
51-
TypeInfo enumTypeInfo = enumDef.typeInfoSet().iterator().next();
52-
if (enumTypeInfo.equals(componentValueType)) {
53-
return null;
49+
if (enumDef.hasComponentValueType()) {
50+
return typeExpressionConverter.toTypeExpr(enumDef.getComponentValueType(), enumDef);
5451
}
55-
return typeExpressionConverter.toTypeExpr(componentValueType, enumDef);
52+
return null;
5653
}
5754

5855
private List<EnumerationExpr> extractEnumValues(List<EnumValueInfo> components) {

processor/src/main/java/online/sharedtype/processor/writer/converter/TemplateDataConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ static Set<TemplateDataConverter> typescript(Context ctx) {
2020
Set<TemplateDataConverter> converters = new HashSet<>(3);
2121
converters.add(new TypescriptInterfaceConverter(ctx, TypeExpressionConverter.typescript(ctx)));
2222
converters.add(new TypescriptEnumConverter(ctx));
23-
converters.add(new ConstantConverter(ctx, null, SharedType.TargetType.TYPESCRIPT));
23+
converters.add(new ConstantConverter(ctx, TypeExpressionConverter.nullOp(), SharedType.TargetType.TYPESCRIPT));
2424
return converters;
2525
}
2626

@@ -36,7 +36,7 @@ static Set<TemplateDataConverter> go(Context ctx) {
3636
static Set<TemplateDataConverter> rust(Context ctx) {
3737
RustMacroTraitsGenerator rustMacroTraitsGenerator = new RustMacroTraitsGeneratorImpl(ctx);
3838
TypeExpressionConverter rustTypeExpressionConverter = TypeExpressionConverter.rust(ctx);
39-
TypeExpressionConverter rustLiteralTypeExpressionConverter = TypeExpressionConverter.rustLiteral();
39+
TypeExpressionConverter rustLiteralTypeExpressionConverter = TypeExpressionConverter.rustLiteral(ctx);
4040
Set<TemplateDataConverter> converters = new HashSet<>(3);
4141
converters.add(new RustStructConverter(ctx, rustTypeExpressionConverter, rustMacroTraitsGenerator));
4242
converters.add(new RustEnumConverter(ctx, rustLiteralTypeExpressionConverter, rustMacroTraitsGenerator));

0 commit comments

Comments
 (0)