Search in sources :

Example 21 with ClassRef

use of io.sundr.model.ClassRef in project sundrio by sundrio.

the class Generify method findTypeArguments.

private static Set<TypeRef> findTypeArguments(Set<ClassRef> interfaces) {
    if (interfaces.size() < 2) {
        return Collections.<TypeRef>emptySet();
    }
    // 1st pass find all generics
    Set<TypeRef> allGenerics = new LinkedHashSet<TypeRef>();
    for (ClassRef clazz : interfaces) {
        allGenerics.addAll(clazz.getArguments());
    }
    // 2nd pass collect common generics
    Set<TypeRef> common = new LinkedHashSet<TypeRef>(allGenerics);
    for (ClassRef clazz : interfaces) {
        Set<TypeRef> ownGenerics = new LinkedHashSet<TypeRef>();
        ownGenerics.addAll(clazz.getArguments());
        common.remove(clazz);
        common.retainAll(ownGenerics);
    }
    Set<TypeRef> result = new LinkedHashSet<TypeRef>();
    for (TypeRef type : common) {
        Boolean isGeneric = type.getAttributes().containsKey(IS_GENERIC) ? (Boolean) type.getAttributes().get(IS_GENERIC) : false;
        if (!isGeneric) {
            result.add(type);
        }
    }
    return result;
}
Also used : LinkedHashSet(java.util.LinkedHashSet) ClassRef(io.sundr.model.ClassRef) TypeRef(io.sundr.model.TypeRef)

Example 22 with ClassRef

use of io.sundr.model.ClassRef in project sundrio by sundrio.

the class ClazzAs method staticAdapterBody.

private static String staticAdapterBody(TypeDef pojo, TypeDef pojoBuilder, TypeDef source, boolean returnBuilder) {
    StringBuilder sb = new StringBuilder();
    sb.append("return new ").append(pojoBuilder.getName()).append("()");
    for (Method m : source.getMethods()) {
        String trimmedName = Strings.deCapitalizeFirst(m.getName().replaceAll("^get", "").replaceAll("^is", ""));
        if (m.getReturnType() instanceof ClassRef) {
            ClassRef ref = (ClassRef) m.getReturnType();
            Boolean hasSuperClass = pojo.getProperties().stream().filter(p -> p.getTypeRef() instanceof ClassRef && p.getName().equals(Getter.propertyNameSafe(m))).map(p -> GetDefinition.of((ClassRef) p.getTypeRef())).flatMap(c -> c.getExtendsList().stream()).count() > 0;
            if (GetDefinition.of(ref).isAnnotation()) {
                TypeDef generatedType = Types.allProperties(pojo).stream().filter(p -> p.getName().equals(m.getName())).map(p -> p.getTypeRef()).filter(r -> r instanceof ClassRef).map(r -> (ClassRef) r).map(c -> GetDefinition.of(c)).findFirst().orElse(null);
                if (generatedType != null) {
                    Method ctor = BuilderUtils.findBuildableConstructor(generatedType);
                    if (m.getReturnType().getDimensions() > 0) {
                        sb.append(".addAllTo").append(Strings.capitalizeFirst(trimmedName)).append("(").append("Arrays.asList(").append("instance.").append(m.getName()).append("())").append(".stream().map(i ->").append("new ").append(generatedType.getName()).append("(").append(ctor.getArguments().stream().map(p -> Getter.find(GetDefinition.of((ClassRef) m.getReturnType()), p, true)).map(g -> g.getName()).map(s -> "i." + s + "()").collect(Collectors.joining(", "))).append(")").append(")").append(".collect(Collectors.toList()))");
                    } else {
                        sb.append(".with").append(Strings.capitalizeFirst(trimmedName)).append("(").append("new ").append(generatedType.getName()).append("(").append(ctor.getArguments().stream().map(p -> Getter.find(GetDefinition.of((ClassRef) m.getReturnType()), p, true)).map(g -> g.getName()).map(s -> "instance." + m.getName() + "()." + s + "()").collect(Collectors.joining(", "))).append(")").append(")");
                    }
                    continue;
                }
            }
        }
        String withMethod = "with" + (Strings.capitalizeFirst(trimmedName));
        if (Types.hasProperty(pojo, trimmedName)) {
            sb.append(".").append(withMethod).append("(").append("instance.").append(m.getName()).append("())");
        }
    }
    if (returnBuilder) {
        sb.append(".build();");
    } else {
        sb.append(";");
    }
    return sb.toString();
}
Also used : FunctionFactory(io.sundr.FunctionFactory) StringStatement(io.sundr.model.StringStatement) Modifier(javax.lang.model.element.Modifier) Buildable(io.sundr.builder.annotations.Buildable) TypeParamRef(io.sundr.model.TypeParamRef) GetDefinition(io.sundr.model.functions.GetDefinition) TypeDefBuilder(io.sundr.model.TypeDefBuilder) Function(java.util.function.Function) Supplier(java.util.function.Supplier) BuilderUtils(io.sundr.builder.internal.utils.BuilderUtils) ArrayList(java.util.ArrayList) ClassRef(io.sundr.model.ClassRef) Getter(io.sundr.model.utils.Getter) InitEnricher(io.sundr.builder.internal.visitors.InitEnricher) Map(java.util.Map) RichTypeDef(io.sundr.model.RichTypeDef) Types(io.sundr.model.utils.Types) Constants(io.sundr.builder.Constants) AptContext(io.sundr.adapter.apt.AptContext) Strings(io.sundr.utils.Strings) TypedVisitor(io.sundr.builder.TypedVisitor) BuilderContext(io.sundr.builder.internal.BuilderContext) SundrException(io.sundr.SundrException) Set(java.util.Set) Method(io.sundr.model.Method) TypeRef(io.sundr.model.TypeRef) Types.isAbstract(io.sundr.model.utils.Types.isAbstract) Setter(io.sundr.model.utils.Setter) AnnotationRef(io.sundr.model.AnnotationRef) Collectors(java.util.stream.Collectors) Property(io.sundr.model.Property) List(java.util.List) ClassRefBuilder(io.sundr.model.ClassRefBuilder) MethodBuilder(io.sundr.model.MethodBuilder) TypeArguments(io.sundr.model.utils.TypeArguments) Statement(io.sundr.model.Statement) TypeDef(io.sundr.model.TypeDef) Optional(java.util.Optional) PropertyBuilder(io.sundr.model.PropertyBuilder) BuilderContextManager(io.sundr.builder.internal.BuilderContextManager) TypeParamDef(io.sundr.model.TypeParamDef) ClassRef(io.sundr.model.ClassRef) RichTypeDef(io.sundr.model.RichTypeDef) TypeDef(io.sundr.model.TypeDef) Method(io.sundr.model.Method)

Example 23 with ClassRef

use of io.sundr.model.ClassRef in project sundrio by sundrio.

the class TypeToTypeRef method apply.

@Override
public TypeRef apply(Type type) {
    if (type instanceof VoidType) {
        return new VoidRef();
    } else if (type instanceof WildcardType) {
        return new WildcardRef();
    } else if (type instanceof ReferenceType) {
        ReferenceType referenceType = (ReferenceType) type;
        int dimensions = referenceType.getArrayCount();
        TypeRef typeRef = apply(referenceType.getType());
        if (dimensions == 0) {
            return typeRef;
        } else if (typeRef instanceof ClassRef) {
            return new ClassRefBuilder((ClassRef) typeRef).withDimensions(dimensions).build();
        } else if (typeRef instanceof PrimitiveRef) {
            return new PrimitiveRefBuilder((PrimitiveRef) typeRef).withDimensions(dimensions).build();
        } else if (typeRef instanceof TypeParamRef) {
            return new TypeParamRefBuilder((TypeParamRef) typeRef).withDimensions(dimensions).build();
        }
    } else if (type instanceof PrimitiveType) {
        PrimitiveType primitiveType = (PrimitiveType) type;
        return new PrimitiveRefBuilder().withName(primitiveType.getType().name()).build();
    } else if (type instanceof ClassOrInterfaceType) {
        return classOrInterfaceToTypeRef.apply((ClassOrInterfaceType) type);
    }
    throw new IllegalArgumentException("Can't handle type:[" + type + "].");
}
Also used : VoidType(com.github.javaparser.ast.type.VoidType) PrimitiveRefBuilder(io.sundr.model.PrimitiveRefBuilder) ClassRef(io.sundr.model.ClassRef) TypeRef(io.sundr.model.TypeRef) VoidRef(io.sundr.model.VoidRef) ClassRefBuilder(io.sundr.model.ClassRefBuilder) WildcardRef(io.sundr.model.WildcardRef) PrimitiveRef(io.sundr.model.PrimitiveRef) ClassOrInterfaceType(com.github.javaparser.ast.type.ClassOrInterfaceType) TypeParamRefBuilder(io.sundr.model.TypeParamRefBuilder) ReferenceType(com.github.javaparser.ast.type.ReferenceType) TypeParamRef(io.sundr.model.TypeParamRef) WildcardType(com.github.javaparser.ast.type.WildcardType) PrimitiveType(com.github.javaparser.ast.type.PrimitiveType)

Example 24 with ClassRef

use of io.sundr.model.ClassRef in project sundrio by sundrio.

the class SimpleClassTest method testBuilder.

@Test
public void testBuilder() {
    TypeDef builder = ClazzAs.BUILDER.apply(simpleClassDef);
    System.out.println(builder);
    assertEquals(Kind.CLASS, builder.getKind());
    assertEquals("SimpleClassBuilder", builder.getName());
    assertEquals(1, builder.getExtendsList().size());
    ClassRef superClass = builder.getImplementsList().iterator().next();
    assertEquals("VisitableBuilder", superClass.getName());
    assertEquals(2, superClass.getArguments().size());
    Iterator<TypeRef> argIterator = superClass.getArguments().iterator();
    TypeRef ref = argIterator.next();
    assertEquals("testpackage.SimpleClass", ref.toString());
    assertEquals("testpackage.SimpleClass", ref.render());
    ref = argIterator.next();
    assertEquals("testpackage.SimpleClassBuilder", ref.toString());
    assertEquals("testpackage.SimpleClassBuilder", ref.render());
}
Also used : TypeDef(io.sundr.model.TypeDef) RichTypeDef(io.sundr.model.RichTypeDef) ClassRef(io.sundr.model.ClassRef) TypeRef(io.sundr.model.TypeRef) Test(org.junit.Test)

Example 25 with ClassRef

use of io.sundr.model.ClassRef in project sundrio by sundrio.

the class SimpleClassTest method testFluent.

@Test
public void testFluent() {
    TypeDef fluent = ClazzAs.FLUENT_INTERFACE.apply(simpleClassDef);
    System.out.println(fluent);
    assertEquals(Kind.INTERFACE, fluent.getKind());
    assertEquals("SimpleClassFluent", fluent.getName());
    assertEquals(1, fluent.getExtendsList().size());
    ClassRef superClass = fluent.getExtendsList().iterator().next();
    assertEquals("Fluent", superClass.getName());
    assertEquals(1, superClass.getArguments().size());
    assertEquals("A", superClass.getArguments().iterator().next().toString());
}
Also used : TypeDef(io.sundr.model.TypeDef) RichTypeDef(io.sundr.model.RichTypeDef) ClassRef(io.sundr.model.ClassRef) Test(org.junit.Test)

Aggregations

ClassRef (io.sundr.model.ClassRef)68 TypeDef (io.sundr.model.TypeDef)41 TypeRef (io.sundr.model.TypeRef)35 RichTypeDef (io.sundr.model.RichTypeDef)22 ClassRefBuilder (io.sundr.model.ClassRefBuilder)21 ArrayList (java.util.ArrayList)21 Property (io.sundr.model.Property)19 Method (io.sundr.model.Method)18 TypeDefBuilder (io.sundr.model.TypeDefBuilder)18 Test (org.junit.Test)17 List (java.util.List)12 AnnotationRef (io.sundr.model.AnnotationRef)11 MethodBuilder (io.sundr.model.MethodBuilder)11 Collectors (java.util.stream.Collectors)11 TypedVisitor (io.sundr.builder.TypedVisitor)10 TypeParamDef (io.sundr.model.TypeParamDef)10 LinkedHashSet (java.util.LinkedHashSet)10 PropertyBuilder (io.sundr.model.PropertyBuilder)9 Map (java.util.Map)9 AttributeKey (io.sundr.model.AttributeKey)8