BUG-6965: introduce BuiltinDeclaredStatements 17/47217/4
authorRobert Varga <rovarga@cisco.com>
Thu, 20 Oct 2016 16:31:11 +0000 (18:31 +0200)
committerRobert Varga <nite@hq.sk>
Fri, 21 Oct 2016 09:54:52 +0000 (09:54 +0000)
This patch adds squashing of YANG builtin types into
singletons when such types are not otherwise modified.

Change-Id: I3a146b4c7d6d01daf4892b2d41f813fc9bfcc393
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BuiltinTypeStatement.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeStatementImpl.java

diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BuiltinTypeStatement.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BuiltinTypeStatement.java
new file mode 100644 (file)
index 0000000..dcfcf3b
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2016 Pantheon Technologies 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.yangtools.yang.parser.stmt.rfc6020;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+import java.util.Collection;
+import java.util.Map;
+import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
+import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
+
+final class BuiltinTypeStatement implements TypeStatement {
+    private static final Map<String, BuiltinTypeStatement> BUILTINS;
+    static {
+        final Builder<String, BuiltinTypeStatement> builder = ImmutableMap.builder();
+        putBuiltin(builder, TypeUtils.BINARY);
+        putBuiltin(builder, TypeUtils.BOOLEAN);
+        putBuiltin(builder, TypeUtils.EMPTY);
+        putBuiltin(builder, TypeUtils.INSTANCE_IDENTIFIER);
+        putBuiltin(builder, TypeUtils.INT8);
+        putBuiltin(builder, TypeUtils.INT16);
+        putBuiltin(builder, TypeUtils.INT32);
+        putBuiltin(builder, TypeUtils.INT64);
+        putBuiltin(builder, TypeUtils.STRING);
+        putBuiltin(builder, TypeUtils.UINT8);
+        putBuiltin(builder, TypeUtils.UINT16);
+        putBuiltin(builder, TypeUtils.UINT32);
+        putBuiltin(builder, TypeUtils.UINT64);
+        BUILTINS = builder.build();
+    }
+
+    private static void putBuiltin(final Builder<String, BuiltinTypeStatement> builder, final String argument) {
+        builder.put(argument, new BuiltinTypeStatement(argument));
+    }
+
+    private final String argument;
+
+    private BuiltinTypeStatement(final String argument) {
+        this.argument = Preconditions.checkNotNull(argument);
+    }
+
+    static TypeStatement maybeReplace(final TypeStatementImpl orig) {
+        if (orig.declaredSubstatements().isEmpty() && orig.getStatementSource() == StatementSource.DECLARATION &&
+                orig.statementDefinition() == Rfc6020Mapping.TYPE) {
+            final BuiltinTypeStatement builtin = BUILTINS.get(orig.argument());
+            if (builtin != null) {
+                return builtin;
+            }
+        }
+
+        return orig;
+    }
+
+    @Override
+    public String argument() {
+        return argument;
+    }
+
+    @Override
+    public String rawArgument() {
+        return argument;
+    }
+
+    @Override
+    public Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
+        return ImmutableList.of();
+    }
+
+    @Override
+    public StatementDefinition statementDefinition() {
+        return Rfc6020Mapping.TYPE;
+    }
+
+    @Override
+    public String getName() {
+        return argument;
+    }
+
+    @Override
+    public StatementSource getStatementSource() {
+        return StatementSource.DECLARATION;
+    }
+}
index 758f6c1343f2bbe0b6779fdc38ee36b13477c99d..4083f1fd69e41a24e84808b6710424e1abd5d8d7 100644 (file)
@@ -93,9 +93,8 @@ public class TypeStatementImpl extends AbstractDeclaredStatement<String>
         }
 
         @Override
-        public TypeStatement createDeclared(
-                final StmtContext<String, TypeStatement, ?> ctx) {
-            return new TypeStatementImpl(ctx);
+        public TypeStatement createDeclared(final StmtContext<String, TypeStatement, ?> ctx) {
+            return BuiltinTypeStatement.maybeReplace(new TypeStatementImpl(ctx));
         }
 
         @Override