Generate @param for RPC invocation methods 78/89878/24
authorillia.ihushev <illia.ihushev@pantheon.tech>
Wed, 20 May 2020 11:47:31 +0000 (14:47 +0300)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 9 Oct 2020 13:49:53 +0000 (15:49 +0200)
Make codegen correctly format javadoc comments with @return, @param,
@throws. This is accomplished by splitting the member comment into
three distinct pieces in TypeMemberComment:
 - a common header: 'Invoke {@code rpc_name_here} RPC.'
 - a description-based block
 - a common footer, describing param/return/throws declarations

These are communicated from type generator and composed into javadoc
by the templating code.

JIRA: MDSAL-402
Change-Id: Ia6b7537cbeb28f9e7ff68479e887ab32e92a1c4b
Signed-off-by: illia.ihushev <illia.ihushev@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
24 files changed:
binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/model/api/TypeMember.java
binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/model/api/TypeMemberComment.java [new file with mode: 0644]
binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/model/api/type/builder/MethodSignatureBuilder.java
binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/model/api/type/builder/TypeMemberBuilder.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/CodegenTypeGenerator.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/RuntimeTypeGenerator.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/AbstractTypeMember.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/AbstractTypeMemberBuilder.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/GeneratedPropertyBuilderImpl.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/GeneratedPropertyImpl.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/MethodSignatureBuilderImpl.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/MethodSignatureImpl.java
binding/mdsal-binding-generator-util/src/test/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/AbstractTypeMemberTest.java
binding/mdsal-binding-generator-util/src/test/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/GeneratedPropertyBuilderImplTest.java
binding/mdsal-binding-generator-util/src/test/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/GeneratedPropertyImplTest.java
binding/mdsal-binding-generator-util/src/test/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/GeneratedPropertyTest.java
binding/mdsal-binding-generator-util/src/test/java/org/opendaylight/mdsal/binding/model/util/generated/type/builder/MethodSignatureImplTest.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderGeneratedProperty.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/EnumTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/InterfaceTemplate.xtend
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/Bug5151Test.java

index 353c66e7a38d719c496cac18bd76ed787e8cbb05..76b93a3ebc314362d7db0caf5260d18cf4ffa54a 100644 (file)
@@ -8,18 +8,18 @@
 package org.opendaylight.mdsal.binding.model.api;
 
 import java.util.List;
+import org.eclipse.jdt.annotation.Nullable;
 
 /**
  * Common interface for variables and methods in class.
  */
 public interface TypeMember {
-
     /**
      * Returns comment string associated with member.
      *
      * @return comment string associated with member.
      */
-    String getComment();
+    @Nullable TypeMemberComment getComment();
 
     /**
      * Returns List of annotation definitions associated with generated type.
@@ -69,5 +69,4 @@ public interface TypeMember {
      * @return the Type that declares member.
      */
     Type getDefiningType();
-
 }
diff --git a/binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/model/api/TypeMemberComment.java b/binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/model/api/TypeMemberComment.java
new file mode 100644 (file)
index 0000000..f386ce9
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.model.api;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import java.util.Objects;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.concepts.Immutable;
+
+/**
+ * Structured comment of a particular class member. This is aimed towards unifying the layout of a particular type.
+ */
+@Beta
+public final class TypeMemberComment implements Immutable {
+    private final String contractDescription;
+    private final String referenceDescription;
+    private final String typeSignature;
+
+    public TypeMemberComment(final String contractDescription, final String referenceDescription,
+            final String typeSignature) {
+        this.contractDescription = contractDescription;
+        this.referenceDescription = referenceDescription;
+        this.typeSignature = typeSignature;
+    }
+
+    /**
+     * Return the member contract description. This string, if present will represent the equivalent of the words you
+     * are just reading. This forms what is usually:
+     * <ul>
+     *   <li>hand-written with careful explanation</li>
+     *   <li>describing the general contract outline, what the member does/holds/etc. For methods this might be pre-
+     *       and post-conditions.</li>
+     * </ul>
+     *
+     * @return The equivalent of the above blurb.
+     */
+    public @Nullable String contractDescription() {
+        return contractDescription;
+    }
+
+    /**
+     * Return the member reference description. This description is passed unmodified, pre-formatted in a single block.
+     * It is expected to look something like the following paragraph:
+     *
+     * <p>
+     * <pre>
+     *   <code>
+     *     A 32-bit bit unsigned word. Individual bits are expected to be interpreted as follows:
+     *
+     *       31
+     *     +----+ ...
+     *   </code>
+     * </pre>
+     *
+     * @return The equivalent of the above pre-formmated paragraph.
+     */
+    public @Nullable String referenceDescription() {
+        return referenceDescription;
+    }
+
+    /**
+     * Return the type signature of this type member. This is only applicable for methods, use of anywhere else is
+     * expected to either be ignored, or processed as is. As a matter of example, this method has a signature starting
+     * right after this period<b>.</b>
+     *
+     * @return Return the signature description, just like these words right here
+     */
+    public @Nullable String typeSignature() {
+        return typeSignature;
+    }
+
+    public static @NonNull TypeMemberComment contractOf(final String contractDescription) {
+        return new TypeMemberComment(requireNonNull(contractDescription), null, null);
+    }
+
+    public static @NonNull TypeMemberComment referenceOf(final String referenceDescription) {
+        return new TypeMemberComment(null, requireNonNull(referenceDescription), null);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(contractDescription, referenceDescription, typeSignature);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof TypeMemberComment)) {
+            return false;
+        }
+        final TypeMemberComment other = (TypeMemberComment) obj;
+        return Objects.equals(contractDescription, other.contractDescription)
+            && Objects.equals(referenceDescription, other.referenceDescription)
+            && Objects.equals(typeSignature, other.typeSignature);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this).omitNullValues()
+            .add("contract", contractDescription).add("reference", referenceDescription).add("type", typeSignature)
+            .toString();
+    }
+}
index 5e69bef48bdf826a36e376c90fef8f60da516465..ce02ba4c09d2b6e66bde8211aa88bbaff3b3cf27 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.annotations.Beta;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature.ValueMechanics;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 
 /**
  * Method Signature Builder serves solely for building Method Signature and
@@ -21,7 +22,7 @@ import org.opendaylight.mdsal.binding.model.api.Type;
  * addName due to enforce reason that MethodSignatureBuilder SHOULD be
  * instantiated only once with defined method name. <br>
  * The methods as {@link #addAnnotation(String, String)} and
- * {@link #setComment(String)} can be used as optional because not all methods
+ * {@link #setComment(TypeMemberComment)} can be used as optional because not all methods
  * MUST contain annotation or comment definitions.
  *
  * @see MethodSignature
index ddb84d6eca885f3580f5c5cc6f4a76bacfb1a883..2f0e204d0cc371b8c13d1b35e376cf7bee3568bd 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.model.api.type.builder;
 
 import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 
 public interface TypeMemberBuilder<T extends TypeMemberBuilder<T>> extends AnnotableTypeBuilder {
     /**
@@ -39,9 +40,9 @@ public interface TypeMemberBuilder<T extends TypeMemberBuilder<T>> extends Annot
      * Adds String definition of comment into Method Signature definition. The comment String MUST NOT contain any
      * comment specific chars (i.e. "/**" or "//") just plain String text description.
      *
-     * @param comment Comment String.
+     * @param comment Structured comment
      */
-    T setComment(String comment);
+    T setComment(TypeMemberComment comment);
 
     /**
      * Sets the flag final for method signature. If this is set the method will be prohibited from overriding. This
index 1c8b7da09978832f6b1cac988ab631defb76b93a..afed7fe272826f746896653b310dbeb2dfd7aec4 100644 (file)
@@ -245,6 +245,8 @@ abstract class AbstractTypeGenerator {
 
     abstract void addComment(TypeMemberBuilder<?> genType, DocumentedNode node);
 
+    abstract void addRpcMethodComment(TypeMemberBuilder<?> genType, RpcDefinition node);
+
     private ModuleContext moduleToGenTypes(final Module module) {
         final ModuleContext context = new ModuleContext(module);
         genCtx.put(module.getQNameModule(), context);
@@ -559,7 +561,7 @@ abstract class AbstractTypeGenerator {
 
                 // Do not refer to annotation class, as it may not be available at runtime
                 method.addAnnotation(CHECK_RETURN_VALUE_ANNOTATION);
-                addComment(method, rpc);
+                addRpcMethodComment(method, rpc);
                 method.addParameter(
                     createRpcContainer(context, rpcName, rpc, verifyNotNull(rpc.getInput()), RPC_INPUT), "input");
                 method.setReturnType(listenableFutureTypeFor(
index 23650335833db262931a61f63d09d17a93199bb0..3d40e877d968cee6d2ab259d972846c0794d3749 100644 (file)
@@ -7,16 +7,14 @@
  */
 package org.opendaylight.mdsal.binding.generator.impl;
 
-import static org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
@@ -26,6 +24,7 @@ import org.opendaylight.mdsal.binding.yang.types.CodegenTypeProvider;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 
 final class CodegenTypeGenerator extends AbstractTypeGenerator {
@@ -72,9 +71,16 @@ final class CodegenTypeGenerator extends AbstractTypeGenerator {
 
     @Override
     void addComment(final TypeMemberBuilder<?> genType, final DocumentedNode node) {
-        final Optional<String> optDesc = node.getDescription();
-        if (optDesc.isPresent()) {
-            genType.setComment(encodeAngleBrackets(optDesc.get()));
-        }
+        node.getDescription().map(TypeMemberComment::referenceOf).ifPresent(genType::setComment);
+    }
+
+    @Override
+    void addRpcMethodComment(final TypeMemberBuilder<?> genType, final RpcDefinition node) {
+        final String rpcName = node.getQName().getLocalName();
+        genType.setComment(new TypeMemberComment(
+            "Invoke {@code " + rpcName + "} RPC.",
+            node.getDescription().orElse(null),
+            "@param input of {@code " + rpcName + "}\n"
+                + "@return output of {@code " + rpcName + '}'));
     }
 }
index 07794f0341cc1de955f0dec7deb61bae4639c975..b49457ad5d242404cb9b48a05c2d32756ceed1c9 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.yangtools.yang.model.api.DocumentedNode;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 
 final class RuntimeTypeGenerator extends AbstractTypeGenerator {
@@ -102,4 +103,9 @@ final class RuntimeTypeGenerator extends AbstractTypeGenerator {
     void addComment(final TypeMemberBuilder<?> genType, final DocumentedNode node) {
         // No-op
     }
+
+    @Override
+    void addRpcMethodComment(final TypeMemberBuilder<?> genType, final RpcDefinition node) {
+        // No-op
+    }
 }
index ade89ea2272521b3ed9edc01df2b341a9755f4cf..b9c5aa1526c512643a365ef53c651d3bdbd683dd 100644 (file)
@@ -13,11 +13,12 @@ import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.api.TypeMember;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 
 abstract class AbstractTypeMember implements TypeMember {
 
     private final String name;
-    private final String comment;
+    private final TypeMemberComment comment;
     private final Type definingType;
     private final Type returnType;
     private final List<AnnotationType> annotations;
@@ -26,7 +27,7 @@ abstract class AbstractTypeMember implements TypeMember {
     private final AccessModifier accessModifier;
 
     protected AbstractTypeMember(final Type definingType, final String name,  final List<AnnotationType> annotations,
-            final String comment, final AccessModifier accessModifier, final Type returnType,
+            final TypeMemberComment comment, final AccessModifier accessModifier, final Type returnType,
             final boolean isFinal, final boolean isStatic) {
         this.definingType = definingType;
         this.name = name;
@@ -49,8 +50,8 @@ abstract class AbstractTypeMember implements TypeMember {
     }
 
     @Override
-    public String getComment() {
-        return this.comment;
+    public TypeMemberComment getComment() {
+        return comment;
     }
 
     @Override
@@ -80,11 +81,7 @@ abstract class AbstractTypeMember implements TypeMember {
 
     @Override
     public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = (prime * result) + Objects.hashCode(getName());
-        result = (prime * result) + Objects.hashCode(getReturnType());
-        return result;
+        return Objects.hash(getName(), getReturnType());
     }
 
     @Override
@@ -92,10 +89,7 @@ abstract class AbstractTypeMember implements TypeMember {
         if (this == obj) {
             return true;
         }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
+        if (obj == null || getClass() != obj.getClass()) {
             return false;
         }
         final AbstractTypeMember other = (AbstractTypeMember) obj;
@@ -104,24 +98,17 @@ abstract class AbstractTypeMember implements TypeMember {
 
     @Override
     public String toString() {
-        final StringBuilder builder = new StringBuilder();
-        builder.append("AbstractTypeMember [name=");
-        builder.append(getName());
-        builder.append(", comment=");
-        builder.append(getComment());
+        final StringBuilder builder = new StringBuilder()
+            .append("AbstractTypeMember [name=").append(getName())
+            .append(", comment=").append(getComment())
+            .append(", definingType=");
         if (getDefiningType() != null) {
-            builder.append(", definingType=");
-            builder.append(getDefiningType().getPackageName());
-            builder.append(".");
-            builder.append(getDefiningType().getName());
+            builder.append(getDefiningType().getPackageName()).append('.').append(getDefiningType().getName());
         } else {
-            builder.append(", definingType= null");
+            builder.append(" null");
         }
-        builder.append(", returnType=");
-        builder.append(getReturnType());
-        builder.append(", annotations=");
-        builder.append(getAnnotations());
-        builder.append("]");
-        return builder.toString();
+        return builder.append(", returnType=").append(getReturnType())
+            .append(", annotations=").append(getAnnotations())
+            .append(']').toString();
     }
 }
index 75a24ad47516a9311f9f040d7e93211a591232f8..da85b500c15538668b88ee805df67f46bf53e0df 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 import org.opendaylight.mdsal.binding.model.api.type.builder.AnnotationTypeBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.TypeMemberBuilder;
 import org.opendaylight.yangtools.util.LazyCollections;
@@ -26,7 +27,7 @@ abstract class AbstractTypeMemberBuilder<T extends TypeMemberBuilder<T>> impleme
     private final String name;
     private Type returnType;
     private List<AnnotationTypeBuilder> annotationBuilders = Collections.emptyList();
-    private String comment = "";
+    private TypeMemberComment comment;
     private boolean isFinal;
     private boolean isStatic;
     private AccessModifier accessModifier;
@@ -50,7 +51,7 @@ abstract class AbstractTypeMemberBuilder<T extends TypeMemberBuilder<T>> impleme
         return this.annotationBuilders;
     }
 
-    protected String getComment() {
+    protected TypeMemberComment getComment() {
         return this.comment;
     }
 
@@ -89,7 +90,7 @@ abstract class AbstractTypeMemberBuilder<T extends TypeMemberBuilder<T>> impleme
     }
 
     @Override
-    public T setComment(final String newComment) {
+    public T setComment(final TypeMemberComment newComment) {
         this.comment = newComment;
         return thisInstance();
     }
index 07e5492297d211a5ddf3448461a49444f1af6d93..ca406eaddee38aa209d8fc0d16e02029c89ebef6 100644 (file)
@@ -49,22 +49,14 @@ public final class GeneratedPropertyBuilderImpl extends AbstractTypeMemberBuilde
 
     @Override
     public String toString() {
-        final StringBuilder builder = new StringBuilder();
-        builder.append("GeneratedPropertyImpl [name=");
-        builder.append(getName());
-        builder.append(", annotations=");
-        builder.append(getAnnotationBuilders());
-        builder.append(", comment=");
-        builder.append(getComment());
-        builder.append(", returnType=");
-        builder.append(getReturnType());
-        builder.append(", isFinal=");
-        builder.append(isFinal());
-        builder.append(", isReadOnly=");
-        builder.append(this.readOnly);
-        builder.append(", modifier=");
-        builder.append(getAccessModifier());
-        builder.append("]");
-        return builder.toString();
+        return new StringBuilder()
+            .append("GeneratedPropertyImpl [name=").append(getName())
+            .append(", annotations=").append(getAnnotationBuilders())
+            .append(", comment=").append(getComment())
+            .append(", returnType=").append(getReturnType())
+            .append(", isFinal=").append(isFinal())
+            .append(", isReadOnly=").append(this.readOnly)
+            .append(", modifier=").append(getAccessModifier())
+            .append(']').toString();
     }
 }
\ No newline at end of file
index c83aefb7a6f5c9f2ef5871170fa3260b91ae68b2..166e89331227a5d1c52296fa3c1e3678426406e9 100644 (file)
@@ -12,14 +12,15 @@ import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 
 final class GeneratedPropertyImpl extends AbstractTypeMember implements GeneratedProperty {
     private final String value;
     private final boolean readOnly;
 
     GeneratedPropertyImpl(final Type definingType, final String name, final List<AnnotationType> annotations,
-            final String comment, final AccessModifier accessModifier, final Type returnType, final boolean isFinal,
-            final boolean isStatic, final boolean isReadOnly, final String value) {
+            final TypeMemberComment comment, final AccessModifier accessModifier, final Type returnType,
+            final boolean isFinal, final boolean isStatic, final boolean isReadOnly, final String value) {
         super(definingType, name, annotations, comment, accessModifier, returnType, isFinal, isStatic);
         this.value = value;
         this.readOnly = isReadOnly;
@@ -37,30 +38,20 @@ final class GeneratedPropertyImpl extends AbstractTypeMember implements Generate
 
     @Override
     public String toString() {
-        final StringBuilder builder = new StringBuilder();
-        builder.append("GeneratedPropertyImpl [name=");
-        builder.append(getName());
-        builder.append(", annotations=");
-        builder.append(getAnnotations());
-        builder.append(", comment=");
-        builder.append(getComment());
+        final StringBuilder builder = new StringBuilder()
+            .append("GeneratedPropertyImpl [name=").append(getName())
+            .append(", annotations=").append(getAnnotations())
+            .append(", comment=").append(getComment())
+            .append(", parent=");
         if (getDefiningType() != null) {
-            builder.append(", parent=");
-            builder.append(getDefiningType().getPackageName());
-            builder.append(".");
-            builder.append(getDefiningType().getName());
+            builder.append(getDefiningType().getPackageName()).append(".").append(getDefiningType().getName());
         } else {
-            builder.append(", parent=null");
+            builder.append("null");
         }
-        builder.append(", returnType=");
-        builder.append(getReturnType());
-        builder.append(", isFinal=");
-        builder.append(isFinal());
-        builder.append(", isReadOnly=");
-        builder.append(this.readOnly);
-        builder.append(", modifier=");
-        builder.append(getAccessModifier());
-        builder.append("]");
-        return builder.toString();
+        return builder.append(", returnType=").append(getReturnType())
+            .append(", isFinal=").append(isFinal())
+            .append(", isReadOnly=").append(readOnly)
+            .append(", modifier=").append(getAccessModifier())
+            .append(']').toString();
     }
 }
index fa60f84a922f9358562183acc41b1ba94334f277..7e1b9d16aeeaef1055ed3270faefb911070165ff 100644 (file)
@@ -21,7 +21,6 @@ import org.opendaylight.yangtools.util.LazyCollections;
 
 final class MethodSignatureBuilderImpl extends AbstractTypeMemberBuilder<MethodSignatureBuilder>
         implements MethodSignatureBuilder {
-
     private List<MethodSignature.Parameter> parameters = Collections.emptyList();
     private List<MethodSignature.Parameter> unmodifiableParams = Collections.emptyList();
     private ValueMechanics mechanics = ValueMechanics.NORMAL;
@@ -71,12 +70,7 @@ final class MethodSignatureBuilderImpl extends AbstractTypeMemberBuilder<MethodS
 
     @Override
     public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + Objects.hashCode(getName());
-        result = prime * result + Objects.hashCode(this.parameters);
-        result = prime * result + Objects.hashCode(getReturnType());
-        return result;
+        return Objects.hash(getName(), parameters, getReturnType());
     }
 
     @Override
index 4a0ac73a02493d9c4e14d18f6fc356ae6d4fac81..305c2eb2eb242dc5c9cb004e666f3a5fc2ef186c 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 
 class MethodSignatureImpl extends AbstractTypeMember implements MethodSignature {
     private final List<Parameter> params;
@@ -26,14 +27,14 @@ class MethodSignatureImpl extends AbstractTypeMember implements MethodSignature
 
     @VisibleForTesting
     MethodSignatureImpl(final Type definingType, final String name, final List<AnnotationType> annotations,
-        final String comment, final AccessModifier accessModifier, final Type returnType,
+        final TypeMemberComment comment, final AccessModifier accessModifier, final Type returnType,
         final List<Parameter> params, final boolean isFinal, final boolean isAbstract, final boolean isStatic) {
         this(definingType, name, annotations, comment, accessModifier, returnType, params, isFinal, isAbstract,
             isStatic, false, ValueMechanics.NORMAL);
     }
 
     MethodSignatureImpl(final Type definingType, final String name, final List<AnnotationType> annotations,
-            final String comment, final AccessModifier accessModifier, final Type returnType,
+            final TypeMemberComment comment, final AccessModifier accessModifier, final Type returnType,
             final List<Parameter> params, final boolean isFinal, final boolean isAbstract, final boolean isStatic,
             final boolean isDefault, final ValueMechanics mechanics) {
         super(definingType, name, annotations, comment, accessModifier, returnType, isFinal, isStatic);
@@ -89,9 +90,10 @@ class MethodSignatureImpl extends AbstractTypeMember implements MethodSignature
 
     @Override
     public String toString() {
-        final StringBuilder builder = new StringBuilder().append("MethodSignatureImpl [name=").append(getName())
-                .append(", comment=").append(getComment())
-                .append(", definingType=");
+        final StringBuilder builder = new StringBuilder()
+            .append("MethodSignatureImpl [name=").append(getName())
+            .append(", comment=").append(getComment())
+            .append(", definingType=");
 
         final Type defType = getDefiningType();
         if (defType != null) {
@@ -100,9 +102,10 @@ class MethodSignatureImpl extends AbstractTypeMember implements MethodSignature
             builder.append(" null");
         }
 
-        return builder.append(", returnType=").append(getReturnType())
-                .append(", params=").append(this.params)
-                .append(", annotations=").append(getAnnotations())
-                .append(']').toString();
+        return builder
+            .append(", returnType=").append(getReturnType())
+            .append(", params=").append(this.params)
+            .append(", annotations=").append(getAnnotations())
+            .append(']').toString();
     }
 }
index c334119c0c5c87ef7dc893fa0a7fcac1432c1c84..c512bb192fa7b93e891d2d539dda1cabc3361c6c 100644 (file)
@@ -15,6 +15,7 @@ import static org.junit.Assert.assertTrue;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 
 public class AbstractTypeMemberTest {
 
@@ -25,13 +26,13 @@ public class AbstractTypeMemberTest {
             JavaTypeName.create("org.opendaylight.yangtools.test", "TestType"));
         final CodegenGeneratedTypeBuilder typeBuilderImpl2 = new CodegenGeneratedTypeBuilder(
             JavaTypeName.create("org.opendaylight.yangtools.test", "TestType2"));
-        methodSignatureBuilderImpl.setComment("test comment");
+        methodSignatureBuilderImpl.setComment(TypeMemberComment.contractOf("test comment"));
         methodSignatureBuilderImpl.setFinal(true);
         methodSignatureBuilderImpl.setStatic(true);
 
         final MethodSignature genProperty = methodSignatureBuilderImpl.toInstance(typeBuilderImpl);
         final MethodSignature genProperty2 = methodSignatureBuilderImpl.toInstance(typeBuilderImpl2);
-        assertEquals("test comment", genProperty.getComment());
+        assertEquals(TypeMemberComment.contractOf("test comment"), genProperty.getComment());
         assertTrue(genProperty.isFinal());
         assertTrue(genProperty.isStatic());
         assertEquals(genProperty.hashCode(), genProperty2.hashCode());
@@ -39,6 +40,5 @@ public class AbstractTypeMemberTest {
         assertNotNull(genProperty.toString());
         assertTrue(genProperty.equals(genProperty2));
         assertFalse(genProperty.equals(null));
-
     }
 }
index 779725427e3d7f27be09005d7735bbb794eb8c3c..e60d763b5a7abb12b8a3798ec63d47f1eb1fded8 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.model.util.generated.type.builder;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
@@ -42,7 +43,7 @@ public class GeneratedPropertyBuilderImplTest {
         assertTrue(instance.isStatic());
         assertFalse(instance.isReadOnly());
         assertEquals("myValue", instance.getValue());
-        assertEquals(null, instance.getComment());
+        assertNull(instance.getComment());
         assertEquals(AccessModifier.PUBLIC, instance.getAccessModifier());
         assertEquals(Types.BOOLEAN, instance.getReturnType());
 
index 420ac7c8c33faab45fba05345941377ace709276..3e05d8e78811754ed6928fb58f3e1c5a1fd1f74f 100644 (file)
@@ -16,6 +16,7 @@ import org.junit.Test;
 import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 import org.opendaylight.mdsal.binding.model.util.Types;
 
 public class GeneratedPropertyImplTest {
@@ -26,7 +27,7 @@ public class GeneratedPropertyImplTest {
         generatedPropertyBuilderImpl.setValue("myValue");
         generatedPropertyBuilderImpl.setReadOnly(false);
         generatedPropertyBuilderImpl.setStatic(true);
-        generatedPropertyBuilderImpl.setComment("myComment");
+        generatedPropertyBuilderImpl.setComment(TypeMemberComment.contractOf("myComment"));
         generatedPropertyBuilderImpl.setFinal(true);
         generatedPropertyBuilderImpl.setAccessModifier(AccessModifier.PUBLIC);
         generatedPropertyBuilderImpl.setReturnType(Types.BOOLEAN);
@@ -40,13 +41,14 @@ public class GeneratedPropertyImplTest {
         assertTrue(instance.isStatic());
         assertFalse(instance.isReadOnly());
         assertEquals("myValue", instance.getValue());
-        assertEquals("myComment", instance.getComment());
+        assertEquals(TypeMemberComment.contractOf("myComment"), instance.getComment());
         assertEquals(AccessModifier.PUBLIC, instance.getAccessModifier());
         assertEquals(Types.BOOLEAN, instance.getReturnType());
 
-        assertEquals("GeneratedPropertyImpl [name=myPropertyName, annotations=[], comment=myComment, "
-                + "parent=my.package.myTypeName, returnType=Type (java.lang.Boolean), isFinal=true, isReadOnly=false, "
-                + "modifier=PUBLIC]", instance.toString());
+        assertEquals("GeneratedPropertyImpl [name=myPropertyName, annotations=[], "
+            + "comment=TypeMemberComment{contract=myComment}, "
+            + "parent=my.package.myTypeName, returnType=Type (java.lang.Boolean), isFinal=true, isReadOnly=false, "
+            + "modifier=PUBLIC]", instance.toString());
     }
 
     @Test
index 5e3ef4e37f58fb07549aab8ef57e91a82b3a9344..00e3dc7d504350dad9a0cdc788eb91aac748df22 100644 (file)
@@ -14,6 +14,7 @@ import static org.junit.Assert.assertTrue;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 
 public class GeneratedPropertyTest {
 
@@ -32,8 +33,9 @@ public class GeneratedPropertyTest {
 
     @Test
     public void testMethodsForGeneratedPropertyImpl() {
-        final GeneratedPropertyImpl propertyImpl = new GeneratedPropertyImpl(null, "Test", null, "test property",
-            AccessModifier.PRIVATE, null, true, true, true, "test value");
+        final GeneratedPropertyImpl propertyImpl = new GeneratedPropertyImpl(null, "Test", null,
+            TypeMemberComment.contractOf("test property"), AccessModifier.PRIVATE, null, true, true, true,
+            "test value");
 
         assertEquals("test value", propertyImpl.getValue());
         assertTrue(propertyImpl.isReadOnly());
index b480eb9c897b5318f6381e9fede0e4adab49170f..0558438538ba8d4a8d505027a9cb073274bcf8f6 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.model.util.generated.type.builder;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
@@ -19,6 +20,7 @@ import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature.Parameter;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 import org.opendaylight.mdsal.binding.model.util.Types;
 
 public class MethodSignatureImplTest {
@@ -35,7 +37,7 @@ public class MethodSignatureImplTest {
         Type type = Types.STRING;
         String name = "customMethod";
         List<AnnotationType> annotations = new ArrayList<>();
-        String comment = "This is just a comment";
+        TypeMemberComment comment = TypeMemberComment.contractOf("This is just a comment");
         AccessModifier accessModifier = AccessModifier.PUBLIC;
         Type returnType = Types.STRING;
         List<Parameter> params = new ArrayList<>();
@@ -71,7 +73,7 @@ public class MethodSignatureImplTest {
     @Test
     public void testHashCode() {
         assertEquals(hash1, hash1);
-        assertTrue(!(hash1 == hash4));
+        assertNotEquals(hash1, hash4);
     }
 
     @Test
index 5528a657337a5b27ab2adddef46354db31e22e83..e6a0a9be3010d5dae6eddd02e1ef865fa8ff59ab 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.mdsal.binding.java.api.generator
 
-import static org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets
+import static extension org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets
+import static extension org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.replaceAllIllegalChars
 
 import com.google.common.base.CharMatcher
 import com.google.common.base.Splitter
@@ -32,9 +33,9 @@ import org.opendaylight.mdsal.binding.model.api.MethodSignature
 import org.opendaylight.mdsal.binding.model.api.Restrictions
 import org.opendaylight.mdsal.binding.model.api.Type
 import org.opendaylight.mdsal.binding.model.api.TypeMember
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment
 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition.Single
 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition.Multiple
-import org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil
 import org.opendaylight.mdsal.binding.model.util.TypeConstants
 import org.opendaylight.mdsal.binding.model.util.Types
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping
@@ -102,7 +103,7 @@ abstract class BaseTemplate extends JavaFileTemplate {
         "_" + property.name
     }
 
-    final protected def propertyNameFromGetter(MethodSignature getter) {
+    final protected static def propertyNameFromGetter(MethodSignature getter) {
         var String prefix;
         if (getter.name.startsWith(BindingMapping.BOOLEAN_GETTER_PREFIX)) {
             prefix = BindingMapping.BOOLEAN_GETTER_PREFIX
@@ -193,13 +194,17 @@ abstract class BaseTemplate extends JavaFileTemplate {
      * @param comment string with the comment for whole JAVA class
      * @return string with comment in JAVA format
      */
-    def protected CharSequence asJavadoc(String comment) {
+    def final protected asJavadoc(TypeMemberComment comment) {
         if (comment === null) {
             return ''
         }
-        return '''
-            «wrapToDocumentation(formatToParagraph(comment.trim))»
-        '''
+        return wrapToDocumentation('''
+           «comment.contractDescription»
+
+           «comment.referenceDescription.formatReference»
+
+           «comment.typeSignature»
+        ''')
     }
 
     def static String wrapToDocumentation(String text) {
@@ -313,7 +318,7 @@ abstract class BaseTemplate extends JavaFileTemplate {
     def private static void appendYangSnippet(StringBuilder sb, ModuleEffectiveStatement module,
             DeclaredStatement<?> stmt) {
         for (String str : YANG_FORMATTER.toYangTextSnippet(module, stmt)) {
-            sb.append(BindingGeneratorUtil.replaceAllIllegalChars(encodeAngleBrackets(encodeJavadocSymbols(str))))
+            sb.append(str.encodeJavadocSymbols.encodeAngleBrackets.replaceAllIllegalChars)
         }
     }
 
@@ -338,24 +343,16 @@ abstract class BaseTemplate extends JavaFileTemplate {
         return sb.toString();
     }
 
-    def protected static String formatDataForJavaDoc(TypeMember type, String additionalComment) {
-        val StringBuilder typeDescriptionBuilder = new StringBuilder();
-        if (!type.comment.nullOrEmpty) {
-            typeDescriptionBuilder.append(formatToParagraph(type.comment))
-            typeDescriptionBuilder.append(NEW_LINE)
-            typeDescriptionBuilder.append(NEW_LINE)
-            typeDescriptionBuilder.append(NEW_LINE)
-        }
-        typeDescriptionBuilder.append(additionalComment)
-        var typeDescription = wrapToDocumentation(typeDescriptionBuilder.toString)
-        return '''
-            «typeDescription»
-        '''.toString
-    }
+    def static formatReference(String reference) '''
+        «IF reference !== null»
+            <pre>
+                <code>
+                    «reference.encodeAngleBrackets.formatToParagraph»
+                </code>
+            </pre>
 
-    def asCode(String text) {
-        return "<code>" + text + "</code>"
-    }
+        «ENDIF»
+    '''
 
     def asLink(String text) {
         val StringBuilder sb = new StringBuilder()
@@ -380,21 +377,15 @@ abstract class BaseTemplate extends JavaFileTemplate {
         return sb.toString
     }
 
-    protected static def formatToParagraph(String text) {
-        if(text === null || text.isEmpty)
-            return text
-
-        var formattedText = text
+    protected static def formatToParagraph(String inputText) {
         val StringBuilder sb = new StringBuilder();
         var StringBuilder lineBuilder = new StringBuilder();
         var boolean isFirstElementOnNewLineEmptyChar = false;
 
-        formattedText = encodeJavadocSymbols(formattedText)
-        formattedText = WS_MATCHER.replaceFrom(formattedText, SPACE)
+        var formattedText = WS_MATCHER.replaceFrom(inputText.encodeJavadocSymbols, SPACE)
         formattedText = SPACES_PATTERN.matcher(formattedText).replaceAll(" ")
 
-        val StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true);
-
+        val StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true)
         while (tokenizer.hasMoreTokens) {
             val nextElement = tokenizer.nextToken
 
@@ -413,7 +404,6 @@ abstract class BaseTemplate extends JavaFileTemplate {
                     isFirstElementOnNewLineEmptyChar = !isFirstElementOnNewLineEmptyChar;
                 }
             }
-
             if (isFirstElementOnNewLineEmptyChar) {
                 isFirstElementOnNewLineEmptyChar = !isFirstElementOnNewLineEmptyChar
             } else {
index d884dcf94486e2e7927e96a8ff9b0519c17fc607..3f7510ea2dd4d573e493386fc495066da8941d16 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature.ValueMechanics;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment;
 
 final class BuilderGeneratedProperty implements GeneratedProperty {
     private final MethodSignature getter;
@@ -62,7 +63,7 @@ final class BuilderGeneratedProperty implements GeneratedProperty {
     }
 
     @Override
-    public String getComment() {
+    public TypeMemberComment getComment() {
         throw uoe();
     }
 
index 3199d9122db03b8452823d35d21c4ce675c5eeb5..4ee8d603f97633278a209de2c745a4bae831b451 100644 (file)
@@ -148,7 +148,7 @@ class ClassTemplate extends BaseTemplate {
      * @return string with class source code in JAVA format
      */
     def protected generateBody(boolean isInnerClass) '''
-        «wrapToDocumentation(formatDataForJavaDoc(type))»
+        «type.formatDataForJavaDoc.wrapToDocumentation»
         «annotationDeclaration»
         «generateClassDeclaration(isInnerClass)» {
             «suidDeclaration»
index 51cfab310ea97b5ec0b728eebbe3b1c666ca79b3..ccc6b4390ebbbafe4f550aa2d23195a58ec28d38 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.java.api.generator
 
-import static org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets
+import static extension org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets
 import static org.opendaylight.mdsal.binding.model.util.Types.STRING;
 
 import com.google.common.collect.ImmutableMap
@@ -55,7 +55,9 @@ class EnumTemplate extends BaseTemplate {
     }
 
     def writeEnumItem(String name, String mappedName, int value, String description) '''
-        «asJavadoc(encodeAngleBrackets(description))»
+        «IF description !== null»
+            «description.trim.encodeAngleBrackets.encodeJavadocSymbols.wrapToDocumentation»
+        «ENDIF»
         «mappedName»(«value», "«name»")
     '''
 
@@ -65,7 +67,7 @@ class EnumTemplate extends BaseTemplate {
      * @return string with the enumeration body
      */
     override body() '''
-        «wrapToDocumentation(formatDataForJavaDoc(enums))»
+        «enums.formatDataForJavaDoc.wrapToDocumentation»
         public enum «enums.name» implements «org.opendaylight.yangtools.yang.binding.Enumeration.importedName» {
             «writeEnumeration(enums)»
 
index 7780cbd510f5a290d4dba1ef9863bd0061ba111e..ac67e9655575e70d676f5535b5d69da6026a0169 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.mdsal.binding.model.api.MethodSignature
 import org.opendaylight.mdsal.binding.model.api.Type
 import org.opendaylight.mdsal.binding.model.util.Types
 import org.opendaylight.mdsal.binding.model.util.TypeConstants
+import org.opendaylight.mdsal.binding.model.api.TypeMember
 
 /**
  * Template for generating JAVA interfaces.
@@ -79,7 +80,7 @@ class InterfaceTemplate extends BaseTemplate {
      * @return string with code for interface body in JAVA format
      */
     override body() '''
-        «wrapToDocumentation(formatDataForJavaDoc(type))»
+        «type.formatDataForJavaDoc.wrapToDocumentation»
         «type.annotations.generateAnnotations»
         public interface «type.name»
             «superInterfaces»
@@ -207,12 +208,25 @@ class InterfaceTemplate extends BaseTemplate {
         «method.returnType.importedName» «method.name»(«method.parameters.generateParameters»);
     '''
 
-    def private generateAccessorMethod(MethodSignature method) '''
-        «val ret = method.returnType»
-        «formatDataForJavaDoc(method, "@return " + asCode(ret.fullyQualifiedName) + " " + asCode(propertyNameFromGetter(method)) + ", or " + asCode("null") + " if not present")»
-        «method.annotations.generateAnnotations»
-        «nullableType(ret)» «method.name»();
-    '''
+    def private static accessorJavadoc(MethodSignature method, String orString) {
+        val reference = method.comment?.referenceDescription
+        val propReturn = method.propertyNameFromGetter + ", or " + orString + " if it is not present."
+
+        return wrapToDocumentation('''
+            Return «propReturn».
+
+            «reference.formatReference»
+            @return {@code «method.returnType.fullyQualifiedName»} «propReturn»
+        ''')
+    }
+
+    def private generateAccessorMethod(MethodSignature method) {
+        return '''
+            «accessorJavadoc(method, "{@code null}")»
+            «method.annotations.generateAnnotations»
+            «method.returnType.nullableType» «method.name»();
+        '''
+    }
 
     def private generateDefaultImplementedInterface() '''
         @«OVERRIDE.importedName»
@@ -305,7 +319,7 @@ class InterfaceTemplate extends BaseTemplate {
     def private generateNonnullMethod(MethodSignature method) '''
         «val ret = method.returnType»
         «val name = method.name»
-        «formatDataForJavaDoc(method, "@return " + asCode(ret.fullyQualifiedName) + " " + asCode(propertyNameFromGetter(method)) + ", or an empty list if it is not present")»
+        «accessorJavadoc(method, "an empty list")»
         «method.annotations.generateAnnotations»
         default «ret.importedNonNull» «name»() {
             return «CODEHELPERS.importedName».nonnull(«name.getGetterMethodForNonnull»());
index d1f62d3eda7b0f84a5d4d4c57c3755175728f794..750780a3f93bfe714973beb8e92f084e91a3abfb 100644 (file)
@@ -37,12 +37,12 @@ public class Bug5151Test extends BaseCompilationTest {
         final File fooContainerFile = generatedFiles.get("FooContainer.java");
         assertNotNull(fooContainerFile);
         FileSearchUtil.assertFileContains(fooContainerFile,
-            "@return <code>java.lang.String</code> <code>fooInContainer</code>, or <code>null</code> if not present");
+            "@return {@code java.lang.String} fooInContainer, or {@code null} if it is not present");
 
         final File fooDataFile = generatedFiles.get("FooData.java");
         assertNotNull(fooDataFile);
         FileSearchUtil.assertFileContains(fooDataFile,
-            "FooContainer</code> <code>fooContainer</code>, or <code>null</code> if not present");
+            "FooContainer} fooContainer, or {@code null} if it is not present");
 
         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
     }