Rework Java import tracking
[mdsal.git] / binding / mdsal-binding-generator-api / src / main / java / org / opendaylight / mdsal / binding / model / api / JavaTypeName.java
index 3ba1aaa5e23d19dcbd7141d058a8e6b1b371e3f7..7893682303fe17a6ee41ee6237f511135bc68d53 100644 (file)
@@ -11,6 +11,9 @@ import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -57,11 +60,26 @@ public abstract class JavaTypeName implements Identifier, Immutable {
                     + simpleName);
         }
 
+        @Override
+        public String localName() {
+            return simpleName();
+        }
+
+        @Override
+        public List<String> localNameComponents() {
+            return ImmutableList.of(simpleName());
+        }
+
         @Override
         public JavaTypeName createSibling(final String simpleName) {
             return new Primitive(simpleName);
         }
 
+        @Override
+        public JavaTypeName topLevelClass() {
+            return this;
+        }
+
         @Override
         public String toString() {
             return simpleName();
@@ -125,6 +143,23 @@ public abstract class JavaTypeName implements Identifier, Immutable {
             return Optional.empty();
         }
 
+        @Override
+        public String localName() {
+            return simpleName();
+        }
+
+        @Override
+        public List<String> localNameComponents() {
+            final List<String> ret = new ArrayList<>();
+            ret.add(simpleName());
+            return ret;
+        }
+
+        @Override
+        public JavaTypeName topLevelClass() {
+            return this;
+        }
+
         @Override
         StringBuilder appendClass(final StringBuilder sb) {
             return sb.append(packageName).append('.').append(simpleName());
@@ -165,6 +200,23 @@ public abstract class JavaTypeName implements Identifier, Immutable {
         public boolean canCreateEnclosed(final String simpleName) {
             return super.canCreateEnclosed(simpleName) && immediatelyEnclosingClass.canCreateEnclosed(simpleName);
         }
+
+        @Override
+        public String localName() {
+            return immediatelyEnclosingClass.localName() + "." + simpleName();
+        }
+
+        @Override
+        public List<String> localNameComponents() {
+            final List<String> ret = immediatelyEnclosingClass.localNameComponents();
+            ret.add(simpleName());
+            return ret;
+        }
+
+        @Override
+        public JavaTypeName topLevelClass() {
+            return immediatelyEnclosingClass.topLevelClass();
+        }
     }
 
     private static final long serialVersionUID = 1L;
@@ -256,12 +308,34 @@ public abstract class JavaTypeName implements Identifier, Immutable {
     public abstract String packageName();
 
     /**
-     * Return the enclosing class TypeName, if present.
+     * Return the enclosing class JavaTypeName, if present.
      *
-     * @return Enclosing class TypeName.
+     * @return Enclosing class JavaTypeName.
      */
     public abstract Optional<JavaTypeName> immediatelyEnclosingClass();
 
+    /**
+     * Return the top-level class JavaTypeName which is containing this type, or self if this type is a top-level
+     * one.
+     *
+     * @return Top-level JavaTypeName
+     */
+    public abstract JavaTypeName topLevelClass();
+
+    /**
+     * Return the package-local name by which this type can be referenced by classes living in the same package.
+     *
+     * @return Local name.
+     */
+    public abstract String localName();
+
+    /**
+     * Return broken-down package-local name components.
+     *
+     * @return List of package-local components.
+     */
+    public abstract List<String> localNameComponents();
+
     @Override
     public final int hashCode() {
         return Objects.hash(simpleName, packageName(), immediatelyEnclosingClass());