Add hook for interning raw argument 84/58184/3
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 31 May 2017 16:42:25 +0000 (18:42 +0200)
committerRobert Varga <nite@hq.sk>
Sun, 4 Jun 2017 15:37:25 +0000 (15:37 +0000)
Type statement typically has a low cardinality of arguments, hence
we can reuse the same object for things like 'type uint32'.

Change-Id: I34c11e1d1f18f8ecaf260d55eb20ffd09d8ae4b0
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 00c0868216727e5333f9af896a7a26ddff7068d6)

yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeUtils.java

index 9eeeefc80ce45a21415b886fd7d8c9c144e67922..4ee6c84c1ea124cd2ad6485ee0ea9c68c22f4f48 100644 (file)
@@ -179,4 +179,14 @@ public interface StatementSupport<A, D extends DeclaredStatement<A>, E extends E
      */
     @Nullable
     StatementSupport<?, ?, ?> getSupportSpecificForArgument(String argument);
-}
\ No newline at end of file
+
+    /**
+     * Given a raw string representation of an argument, try to use a shared representation
+     *
+     * @param rawArgument Argument string
+     * @return A potentially-shard instance
+     */
+    default String internArgument(final String rawArgument) {
+        return rawArgument;
+    }
+}
index d31c7bd50397e0637697dba067ef9aa656f9deb9..fae13e73e8189945ec5f9672cbeef44494a5c182 100644 (file)
@@ -61,7 +61,7 @@ public class RootStatementContext<A, D extends DeclaredStatement<A>, E extends E
         final StatementSourceReference ref, final String rawArgument) {
         super(def, ref, rawArgument);
         this.sourceContext = Preconditions.checkNotNull(sourceContext);
-        this.argument = def.parseArgumentValue(this, rawArgument);
+        this.argument = def.parseArgumentValue(this, rawStatementArgument());
     }
 
     RootStatementContext(final SourceSpecificContext sourceContext, final StatementDefinitionContext<A, D, E> def,
index 31c9333e560442318779726453759f9ad02906ca..5711829dd67d20fbf5eab37eb8049f05c285b535 100644 (file)
@@ -95,7 +95,7 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
             final String rawArgument) {
         this.definition = Preconditions.checkNotNull(def);
         this.statementDeclSource = Preconditions.checkNotNull(ref);
-        this.rawArgument = rawArgument;
+        this.rawArgument = def.internArgument(rawArgument);
     }
 
     StatementContextBase(final StatementContextBase<A, D, E> original) {
index 2db65cf6cb336fd6d415d372ef90d7c5d2d5677f..bbd883938ed2ea4e177cff754872ad9f40184f0c 100644 (file)
@@ -122,4 +122,8 @@ public class StatementDefinitionContext<A, D extends DeclaredStatement<A>, E ext
     public boolean hasArgumentSpecificSubDefinitions() {
         return support.hasArgumentSpecificSupports();
     }
+
+    String internArgument(final String rawArgument) {
+        return support.internArgument(rawArgument);
+    }
 }
index 2c0634c7060539e4f18b7f878416b6eee7a42c15..fabe7692b14cafa2544650014c73e5dffad2c3bc 100644 (file)
@@ -74,7 +74,7 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
             final StatementSourceReference ref, final String rawArgument) {
         super(def, ref, rawArgument);
         this.parent = Preconditions.checkNotNull(parent, "Parent must not be null");
-        this.argument = def.parseArgumentValue(this, rawArgument);
+        this.argument = def.parseArgumentValue(this, rawStatementArgument());
     }
 
     @SuppressWarnings("unchecked")
@@ -254,7 +254,7 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
         if (argument instanceof String) {
             // FIXME: This may yield illegal argument exceptions
             final StatementContextBase<?, ?, ?> originalCtx = getOriginalCtx();
-            final QName qname = (originalCtx != null) ? Utils.qNameFromArgument(originalCtx, (String) argument) : Utils
+            final QName qname = originalCtx != null ? Utils.qNameFromArgument(originalCtx, (String) argument) : Utils
                     .qNameFromArgument(this, (String) argument);
             return parentPath.createChild(qname);
         }
index 1525a5d119802d4587cad12cae9a7f8b4b5feea2..992404533e13a5baa4d4ae50b72a86556f09c539 100644 (file)
@@ -252,6 +252,12 @@ public class TypeStatementImpl extends AbstractDeclaredStatement<String>
         public StatementSupport<?, ?, ?> getSupportSpecificForArgument(final String argument) {
             return ARGUMENT_SPECIFIC_SUPPORTS.get(argument);
         }
+
+        @Override
+        public String internArgument(final String rawArgument) {
+            final String found = TypeUtils.findBuiltinString(rawArgument);
+            return found != null ? found : rawArgument;
+        }
     }
 
     @Nonnull
index 21acf3f249d5c7c85e0740179cce83fe79440b9d..e6e67ea0bb9195aee0c9fc4714fd4cc58750aa36 100644 (file)
@@ -11,6 +11,8 @@ import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import java.math.BigDecimal;
@@ -20,6 +22,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.YangVersion;
@@ -66,9 +69,33 @@ public final class TypeUtils {
     public static final String UINT64 = "uint64";
     public static final String UNION = "union";
 
-    private static final Set<String> BUILT_IN_TYPES =
-            ImmutableSet.of(BINARY, BITS, BOOLEAN, DECIMAL64, EMPTY, ENUMERATION, IDENTITY_REF, INSTANCE_IDENTIFIER,
-                    INT8, INT16, INT32, INT64, LEAF_REF, STRING, UINT8, UINT16, UINT32, UINT64, UNION);
+    private static final Map<String, String> BUILT_IN_TYPES;
+
+    static {
+        final Builder<String, String> b = ImmutableMap.builder();
+
+        b.put(BINARY, BINARY);
+        b.put(BITS, BITS);
+        b.put(BOOLEAN, BOOLEAN);
+        b.put(DECIMAL64, DECIMAL64);
+        b.put(EMPTY, EMPTY);
+        b.put(ENUMERATION, ENUMERATION);
+        b.put(IDENTITY_REF,IDENTITY_REF);
+        b.put(INSTANCE_IDENTIFIER, INSTANCE_IDENTIFIER);
+        b.put(INT8, INT8);
+        b.put(INT16, INT16);
+        b.put(INT32, INT32);
+        b.put(INT64, INT64);
+        b.put(LEAF_REF, LEAF_REF);
+        b.put(STRING, STRING);
+        b.put(UINT8, UINT8);
+        b.put(UINT16, UINT16);
+        b.put(UINT32, UINT32);
+        b.put(UINT64, UINT64);
+        b.put(UNION, UNION);
+
+        BUILT_IN_TYPES = b.build();
+    }
 
     private static final Set<String> TYPE_BODY_STMTS = ImmutableSet.of(
         DECIMAL64, ENUMERATION, LEAF_REF, IDENTITY_REF, BITS, UNION);
@@ -210,7 +237,7 @@ public final class TypeUtils {
     }
 
     public static boolean isYangBuiltInTypeString(final String typeName) {
-        return BUILT_IN_TYPES.contains(typeName);
+        return BUILT_IN_TYPES.containsKey(typeName);
     }
 
 
@@ -277,6 +304,10 @@ public final class TypeUtils {
                 && isAnyDefaultValueMarkedWithIfFeature(typeStmt, defaultValues);
     }
 
+    static String findBuiltinString(final String rawArgument) {
+        return BUILT_IN_TYPES.get(rawArgument);
+    }
+
     private static boolean isRelevantForIfFeatureCheck(final TypeEffectiveStatement<?> typeStmt) {
         final TypeDefinition<?> typeDefinition = typeStmt.getTypeDefinition();
         return typeDefinition instanceof EnumTypeDefinition || typeDefinition instanceof BitsTypeDefinition