Cleanup binding-dom-codec generator 98/56998/2
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 13 May 2017 18:25:24 +0000 (20:25 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 15 May 2017 15:27:41 +0000 (15:27 +0000)
- use lambdas
- use fluent StringBuilder
- make methods static

This should improve codec generation slightly due to gains of
invoke_static vs. invoke_virtual and overall bytecode size diet.

Change-Id: Id8d3a442f63a452111907b7d683d2167dd489ca7
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/gen/impl/AbstractStreamWriterGenerator.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/gen/impl/DataNodeContainerSerializerSource.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/gen/impl/DataObjectSerializerSource.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/gen/spi/AbstractSource.java

index 8d459ceb3c80fedc3f2c6bbb22c22449fb88a767..ab58d74f24b9a779a6718fcf3aac5a300ee978d5 100644 (file)
@@ -22,7 +22,6 @@ import javassist.CtMethod;
 import javassist.Modifier;
 import javassist.NotFoundException;
 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
-import org.opendaylight.mdsal.binding.generator.util.ClassCustomizer;
 import org.opendaylight.mdsal.binding.generator.util.JavassistUtils;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.util.Types;
@@ -197,32 +196,24 @@ abstract class AbstractStreamWriterGenerator extends AbstractGenerator implement
          * care of this before calling instantiatePrototype(), as that will call our customizer with the lock held,
          * hence any code generation will end up being blocked on the javassist lock.
          */
-        final String body = ClassLoaderUtils.withClassLoader(type.getClassLoader(), new Supplier<String>() {
-                @Override
-                public String get() {
-                    return source.getSerializerBody().toString();
-                }
-            }
-        );
+        final String body = ClassLoaderUtils.withClassLoader(type.getClassLoader(),
+            (Supplier<String>) () -> source.getSerializerBody().toString());
 
         try {
-            product = javassist.instantiatePrototype(DataObjectSerializerPrototype.class.getName(), serializerName, new ClassCustomizer() {
-                @Override
-                public void customizeClass(final CtClass cls) throws CannotCompileException, NotFoundException {
-                    // Generate any static fields
-                    for (final StaticConstantDefinition def : source.getStaticConstants()) {
-                        final CtField field = new CtField(javassist.asCtClass(def.getType()), def.getName(), cls);
-                        field.setModifiers(Modifier.PRIVATE + Modifier.STATIC);
-                        cls.addField(field);
-                    }
-
-                    // Replace serialize() -- may reference static fields
-                    final CtMethod serializeTo = cls.getDeclaredMethod(SERIALIZE_METHOD_NAME, serializeArguments);
-                    serializeTo.setBody(body);
-
-                    // The prototype is not visible, so we need to take care of that
-                    cls.setModifiers(Modifier.setPublic(cls.getModifiers()));
+            product = javassist.instantiatePrototype(DataObjectSerializerPrototype.class.getName(), serializerName, cls -> {
+                // Generate any static fields
+                for (final StaticConstantDefinition def : source.getStaticConstants()) {
+                    final CtField field = new CtField(javassist.asCtClass(def.getType()), def.getName(), cls);
+                    field.setModifiers(Modifier.PRIVATE + Modifier.STATIC);
+                    cls.addField(field);
                 }
+
+                // Replace serialize() -- may reference static fields
+                final CtMethod serializeTo = cls.getDeclaredMethod(SERIALIZE_METHOD_NAME, serializeArguments);
+                serializeTo.setBody(body);
+
+                // The prototype is not visible, so we need to take care of that
+                cls.setModifiers(Modifier.setPublic(cls.getModifiers()));
             });
         } catch (final NotFoundException e) {
             LOG.error("Failed to instatiate serializer {}", source, e);
index 52ba9c9bbfef3d9798b5d2052096d2c98510ff30..bd688c631e870b6a0fc04139aded31919bb9f2a9 100644 (file)
@@ -136,11 +136,11 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
                         LOG.warn("Node {} will be ignored. AnyXml is not yet supported from binding aware code." +
                                 "Binding Independent code can be used to serialize anyXml nodes.", schemaChild.getPath());
                         continue;
-                    } else {
-                        throw new IllegalStateException(
-                                String.format("Unable to find type for child node %s. Expected child nodes: %s",
-                                        schemaChild.getPath(), getterToType));
                     }
+
+                    throw new IllegalStateException(
+                        String.format("Unable to find type for child node %s. Expected child nodes: %s",
+                            schemaChild.getPath(), getterToType));
                 }
                 emitChild(b, getter, childType, schemaChild);
             }
@@ -186,7 +186,7 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
         }
     }
 
-    private StringBuilder tryToUseCacheElse(final String getterName, final CharSequence statement) {
+    private static StringBuilder tryToUseCacheElse(final String getterName, final CharSequence statement) {
         final StringBuilder b = new StringBuilder();
 
         b.append("if ( ");
@@ -194,7 +194,7 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
         b.append(invoke(SERIALIZER, "serialize", getterName)).append("== null");
         b.append(") {");
         b.append(statement);
-        b.append("}");
+        b.append('}');
         return b;
     }
 
index d4bde7834c967356c997befa8ecc0c620a461bef..2a495ec5106bc97afe8b2b65fb579a9cfd40f834 100644 (file)
@@ -58,75 +58,76 @@ abstract class DataObjectSerializerSource extends AbstractSource {
      */
     protected abstract CharSequence getSerializerBody();
 
-    protected final CharSequence leafNode(final String localName, final CharSequence value) {
+    protected static final CharSequence leafNode(final String localName, final CharSequence value) {
         return invoke(STREAM, "leafNode", escape(localName), value);
     }
 
-    protected final CharSequence startLeafSet(final String localName,final CharSequence expected) {
-        return invoke(STREAM, "startLeafSet", escape(localName),expected);
+    protected static final CharSequence startLeafSet(final String localName,final CharSequence expected) {
+        return invoke(STREAM, "startLeafSet", escape(localName), expected);
     }
 
-    protected final CharSequence startOrderedLeafSet(final String localName, final CharSequence expected) {
-        return invoke(STREAM, "startOrderedLeafSet", escape(localName),expected);
+    protected static final CharSequence startOrderedLeafSet(final String localName, final CharSequence expected) {
+        return invoke(STREAM, "startOrderedLeafSet", escape(localName), expected);
     }
 
-    protected final CharSequence leafSetEntryNode(final CharSequence value) {
+    protected static final CharSequence leafSetEntryNode(final CharSequence value) {
         return invoke(STREAM, "leafSetEntryNode", value);
     }
 
-    protected final CharSequence startContainerNode(final CharSequence type, final CharSequence expected) {
-        return invoke(STREAM, "startContainerNode", (type),expected);
+    protected static final CharSequence startContainerNode(final CharSequence type, final CharSequence expected) {
+        return invoke(STREAM, "startContainerNode", type, expected);
     }
 
-    protected final CharSequence escape(final String localName) {
+    protected static final CharSequence escape(final String localName) {
         return '"' + localName + '"';
     }
 
-    protected final CharSequence startUnkeyedList(final CharSequence type, final CharSequence expected) {
-        return invoke(STREAM, "startUnkeyedList", (type),expected);
+    protected static final CharSequence startUnkeyedList(final CharSequence type, final CharSequence expected) {
+        return invoke(STREAM, "startUnkeyedList", type, expected);
     }
 
-    protected final CharSequence startUnkeyedListItem(final CharSequence expected) {
-        return invoke(STREAM, "startUnkeyedListItem",expected);
+    protected static final CharSequence startUnkeyedListItem(final CharSequence expected) {
+        return invoke(STREAM, "startUnkeyedListItem", expected);
     }
 
-    protected final CharSequence startMapNode(final CharSequence type,final CharSequence expected) {
-        return invoke(STREAM, "startMapNode", (type),expected);
+    protected static final CharSequence startMapNode(final CharSequence type,final CharSequence expected) {
+        return invoke(STREAM, "startMapNode", type, expected);
     }
 
-    protected final CharSequence startOrderedMapNode(final CharSequence type,final CharSequence expected) {
-        return invoke(STREAM, "startOrderedMapNode", (type),expected);
+    protected static final CharSequence startOrderedMapNode(final CharSequence type,final CharSequence expected) {
+        return invoke(STREAM, "startOrderedMapNode", type, expected);
     }
 
-    protected final CharSequence startMapEntryNode(final CharSequence key, final CharSequence expected) {
-        return invoke(STREAM,"startMapEntryNode",key,expected);
+    protected static final CharSequence startMapEntryNode(final CharSequence key, final CharSequence expected) {
+        return invoke(STREAM, "startMapEntryNode", key, expected);
     }
 
-    protected final CharSequence startAugmentationNode(final CharSequence key) {
-        return invoke(STREAM,"startAugmentationNode",key);
+    protected static final CharSequence startAugmentationNode(final CharSequence key) {
+        return invoke(STREAM, "startAugmentationNode", key);
     }
 
-    protected final CharSequence startChoiceNode(final CharSequence localName,final CharSequence expected) {
-        return invoke(STREAM, "startChoiceNode", (localName),expected);
+    protected static final CharSequence startChoiceNode(final CharSequence localName,final CharSequence expected) {
+        return invoke(STREAM, "startChoiceNode", localName, expected);
     }
 
-    protected final CharSequence startCaseNode(final CharSequence localName,final CharSequence expected) {
-        return invoke(STREAM, "startCase", (localName),expected);
+    protected static final CharSequence startCaseNode(final CharSequence localName,final CharSequence expected) {
+        return invoke(STREAM, "startCase", localName, expected);
     }
 
-    protected final CharSequence anyxmlNode(final String name, final String value) throws IllegalArgumentException {
-        return invoke(STREAM, "anyxmlNode", escape(name),name);
+    protected static final CharSequence anyxmlNode(final String name, final String value)
+            throws IllegalArgumentException {
+        return invoke(STREAM, "anyxmlNode", escape(name), name);
     }
 
-    protected final CharSequence endNode() {
+    protected static final CharSequence endNode() {
         return invoke(STREAM, "endNode");
     }
 
-    protected final CharSequence forEach(final String iterable,final Type valueType,final CharSequence body) {
+    protected static final CharSequence forEach(final String iterable,final Type valueType,final CharSequence body) {
         return forEach(iterable, ITERATOR, valueType.getFullyQualifiedName(), CURRENT, body);
     }
 
-    protected final CharSequence classReference(final Type type) {
+    protected static final CharSequence classReference(final Type type) {
         return type.getFullyQualifiedName() + ".class";
     }
 
index 131997e990652000c7f4302ab7a9c3132e70e1a0..e11f8c06b897565f6c6ddf6990c7808bdd9abee7 100644 (file)
@@ -9,14 +9,12 @@ package org.opendaylight.yangtools.binding.data.codec.gen.spi;
 
 import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
-
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.model.api.Type;
 
 public abstract class AbstractSource {
-
     private final Set<StaticConstantDefinition> staticConstants = new HashSet<>();
 
     public final <T> void staticConstant(final String name, final Class<T> type, final T value) {
@@ -27,72 +25,68 @@ public abstract class AbstractSource {
         return Collections.unmodifiableSet(staticConstants);
     }
 
-    protected final CharSequence invoke(final CharSequence object, final String methodName, final Object... args) {
-        StringBuilder builder = new StringBuilder();
+    private static StringBuilder commonInvoke(final CharSequence object, final String methodName) {
+        final StringBuilder sb = new StringBuilder();
         if (object != null) {
-            builder.append(object);
-            builder.append('.');
+            sb.append(object);
+            sb.append('.');
         }
-        builder.append(methodName);
-        builder.append('(');
+        return sb.append(methodName).append('(');
+    }
 
-        UnmodifiableIterator<Object> iterator = Iterators.forArray(args);
+    protected static final CharSequence invoke(final CharSequence object, final String methodName, final Object arg) {
+        return commonInvoke(object, methodName).append(arg).append(')');
+    }
+
+    protected static final CharSequence invoke(final CharSequence object, final String methodName, final Object... args) {
+        final StringBuilder sb = commonInvoke(object, methodName);
+
+        final UnmodifiableIterator<Object> iterator = Iterators.forArray(args);
         while (iterator.hasNext()) {
-            builder.append(iterator.next());
+            sb.append(iterator.next());
             if (iterator.hasNext()) {
-                builder.append(',');
+                sb.append(',');
             }
         }
-        builder.append(')');
-        return builder;
+        return sb.append(')');
     }
 
-    protected final CharSequence assign(final String var, final CharSequence value) {
+    protected static final CharSequence assign(final String var, final CharSequence value) {
         return assign((String) null, var, value);
     }
 
-    protected final CharSequence assign(final String type, final String var, final CharSequence value) {
-        StringBuilder builder = new StringBuilder();
-        if(type != null) {
-            builder.append(type);
-            builder.append(' ');
+    protected static final CharSequence assign(final String type, final String var, final CharSequence value) {
+        final StringBuilder sb = new StringBuilder();
+        if (type != null) {
+            sb.append(type);
+            sb.append(' ');
         }
-        builder.append(var);
-        builder.append(" = ");
-        builder.append(value);
-        return builder;
+        return sb.append(var).append(" = ").append(value);
     }
 
-    protected final CharSequence assign(final Type type, final String var, final CharSequence value) {
+    protected static final CharSequence assign(final Type type, final String var, final CharSequence value) {
         return assign(type.getFullyQualifiedName(), var, value);
     }
 
-    protected final CharSequence cast(final Type type, final CharSequence value) {
+    protected static final CharSequence cast(final Type type, final CharSequence value) {
         return cast(type.getFullyQualifiedName(), value);
     }
 
-    protected final CharSequence forEach(final String iterable,final String iteratorName, final String valueType,final String valueName, final CharSequence body) {
-        StringBuilder b = new StringBuilder();
-        b.append(statement(assign(java.util.Iterator.class.getName(), iteratorName,invoke(iterable, "iterator"))));
-        b.append("while (").append(invoke(iteratorName, "hasNext")).append(") {\n");
-        b.append(statement(assign(valueType, valueName,cast(valueType, invoke(iteratorName, "next")))));
-        b.append(body);
-        b.append("\n}\n");
-        return b;
+    protected static final CharSequence forEach(final String iterable, final String iteratorName,
+            final String valueType, final String valueName, final CharSequence body) {
+        final StringBuilder sb = new StringBuilder();
+        sb.append(statement(assign(java.util.Iterator.class.getName(), iteratorName, invoke(iterable, "iterator"))));
+        sb.append("while (").append(invoke(iteratorName, "hasNext")).append(") {\n");
+        sb.append(statement(assign(valueType, valueName,cast(valueType, invoke(iteratorName, "next")))));
+        sb.append(body);
+        return sb.append("\n}\n");
     }
 
-    protected final CharSequence statement(final CharSequence statement) {
-        return new StringBuilder().append(statement).append(";\n");
+    protected static final CharSequence statement(final CharSequence statement) {
+        return new StringBuilder(statement).append(";\n");
     }
 
-    protected final CharSequence cast(final String type, final CharSequence value) {
-        StringBuilder builder = new StringBuilder();
-        builder.append("((");
-        builder.append(type);
-        builder.append(") ");
-        builder.append(value);
-        builder.append(')');
-        return builder;
+    protected static final CharSequence cast(final String type, final CharSequence value) {
+        return "((" + type + ") " + value + ')';
     }
-
 }