gboersma / uml-java-doclet

Doclet to generate UML diagrams for Javadoc using PlantUML.
74 stars 29 forks source link

syntax error with generics #3

Closed immetoo2 closed 4 years ago

immetoo2 commented 7 years ago

When using some generics I get following error when viewing the generated javadoc TestGenerics.MyModelBuilder page; ... (skipping 12 lines) ...class "<b><size:14>TestGenerics.AbstractBuilder<P, MyModel, MyModelBuilder></b>\n<size:10>info.leadinglight.umljavadoclet" as info.leadinglight.umljavadoclet.TestGenerics.AbstractBuilderObjectTestGenerics.MyModelTestGenerics.MyModelBuilder<P>{}hide info.leadinglight.umljavadoclet.TestGenerics.AbstractBuilderObjectTestGenerics.MyModelTestGenerics.MyModelBuilder<P> fieldsSyntax Error?

Created a test model; `package info.leadinglight.umljavadoclet;

import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Consumer;

public class TestGenerics {

Map<String,MyModel> result = new HashMap<>();

public static void main(String[] argu[]) {
    new TestGenerics().createValue("1").setValue("1VAL").build().createValue("2").setValue("2VAL").build().extendValue("1").setValue("1WAL-Override").build();
}

public MyModelBuilder<TestGenerics> createValue(String key) {
    return new MyModelBuilder<>(this, new MyModel(), (p,v) -> p.result.put(v.key, v)).setKey(key);
}

public MyModelBuilder<TestGenerics> extendValue(String key) {
    return new MyModelBuilder<>(this, result.get(key), (p,v) -> {});
}

public class MyModel {
    String key;
    String value;
}

public interface Builder<T> {
    T build();
}

/**
 * Abstract object builder with parent builder.
 *
 * @param <P> The parent builder.
 * @param <T> The object to build.
 * @param <B> The current builder.
 */
abstract public class AbstractBuilder<P, T, B> implements Builder<P> {
    private final P parent;
    private final T value;
    private final BiConsumer<P, T> parentBuilder;

    public AbstractBuilder(P parent, T value, BiConsumer<P, T> parentBuilder) {
        this.parent = parent;
        this.value = value;
        this.parentBuilder = parentBuilder;
    }

    @Override
    public final P build() {
        parentBuilder.accept(parent, value);
        return parent;
    }

    protected final B make(Consumer<T> mixer) {
        mixer.accept(value);
        return (B) this;
    }
}

public class MyModelBuilder<P> extends AbstractBuilder<P,MyModel,MyModelBuilder<P>> {
    public MyModelBuilder(P parent, MyModel value, BiConsumer<P, MyModel> parentBuilder) {
        super(parent, value, parentBuilder);
    }

    protected MyModelBuilder<P> setKey(String key) {
        return make(v -> v.key=key);
    }

    public MyModelBuilder<P> setValue(String value) {
        return make(v -> v.value=value);
    }
}

} ` When put in src./test/java/..... and run javadoc:test-javadoc to have test case.

gboersma commented 4 years ago

The syntax error is caused by the superclass having generic parameters that are themselves generic parameters.

gboersma commented 4 years ago

Fixed the syntax error by stripping out <> in the names of the superclass parameters. This will now successfully generate the diagram for the class. However, generics within generics are not really represented well across all diagrams- will open an enhancement for that one.