Skip to content

added support for InterfaceRecordPropertiesAnnotationIntrospector #30

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,13 +1,29 @@
package com.infobip.typescript;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.infobip.typescript.record.property.discovery.InterfaceRecordPropertyDiscoveryModule;
import cz.habarta.typescript.generator.Input;
import cz.habarta.typescript.generator.TypeScriptGenerator;
import cz.habarta.typescript.generator.parser.Jackson2Parser;

public class OrderedTypescriptGenerator {
final TypeScriptGenerator generator;

public OrderedTypescriptGenerator(TypeScriptGenerator generator) {
this.generator = generator;
var typeScriptGeneratorObjectMapper = getObjectMapper(generator);
typeScriptGeneratorObjectMapper.registerModule(new InterfaceRecordPropertyDiscoveryModule());
}

private ObjectMapper getObjectMapper(TypeScriptGenerator generator) {
var modelParser = (Jackson2Parser) generator.getModelParser();
try {
var field = Jackson2Parser.class.getDeclaredField("objectMapper");
field.setAccessible(true);
return (ObjectMapper) field.get(modelParser);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public String generateTypeScript(Input input) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import cz.habarta.typescript.generator.emitter.EmitterExtension;
import cz.habarta.typescript.generator.emitter.TsModel;
import cz.habarta.typescript.generator.parser.Model;
import cz.habarta.typescript.generator.util.Utils;

import java.io.*;
import java.lang.annotation.Annotation;
Expand All @@ -37,8 +36,6 @@ protected TypeScriptFileGenerator(Path basePath) {
}

public void generate() {
var objectMapper = Utils.getObjectMapper();
objectMapper.findAndRegisterModules();
List<EmitterExtension> extensions = createExtensions();
Settings settings = createSettings(extensions);
OrderedTypescriptGenerator generator = createGenerator(settings);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.infobip.typescript.record.property.discovery;

import com.fasterxml.jackson.databind.PropertyName;
import com.fasterxml.jackson.databind.introspect.*;

import java.util.stream.Stream;

public class InterfaceRecordPropertiesAnnotationIntrospector extends NopAnnotationIntrospector {

@Override
public PropertyName findNameForSerialization(Annotated a) {
if(!(a instanceof AnnotatedMember annotatedMember)) {
return super.findNameForSerialization(a);
}

Class<?> declaringClass = annotatedMember.getDeclaringClass();

if(!declaringClass.isInterface()) {
return super.findNameForSerialization(a);
}

if(!declaringClass.isSealed()) {
return super.findNameForSerialization(a);
}

var hasRecordGetter = Stream.of(declaringClass.getPermittedSubclasses())
.filter(Class::isRecord)
.flatMap(subclass -> Stream.of(subclass.getRecordComponents()))
.anyMatch(component -> component.getName().equals(a.getName()));

if(!hasRecordGetter) {
return super.findNameForSerialization(a);
}

return new PropertyName(a.getName());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.infobip.typescript.record.property.discovery;

import com.fasterxml.jackson.databind.module.SimpleModule;

public class InterfaceRecordPropertyDiscoveryModule extends SimpleModule {

@Override
public void setupModule(SetupContext context) {
super.setupModule(context);
context.insertAnnotationIntrospector(new InterfaceRecordPropertiesAnnotationIntrospector());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.infobip.typescript.record.property.discovery;

import com.infobip.typescript.TestBase;
import com.infobip.typescript.type.JsonTypeExtension;
import cz.habarta.typescript.generator.Input;
import org.junit.jupiter.api.Test;

import java.util.Collections;
import java.util.stream.Stream;

import static org.assertj.core.api.BDDAssertions.then;

class InterfaceRecordPropertyDiscoveryTest extends TestBase {

InterfaceRecordPropertyDiscoveryTest() {
super(new JsonTypeExtension(Stream::empty),
Collections.emptyList());
}

@Test
void shouldAddReadonlyTypeField() {

// when
String actual = whenGenerate(Input.from(HierarchyRoot.class,
FirstLeaf.class));

// then
then(actual).isEqualTo(
"""

export interface HierarchyRoot {
value: string;
}

export class FirstLeaf implements HierarchyRoot {
value: string;
}
""");
}

sealed interface HierarchyRoot permits FirstLeaf {
// @JsonGetter
String value();
}

record FirstLeaf(String value) implements HierarchyRoot {
}
}
Loading