From 9dcb8e9989add3be27fa52d5cbeb70ab4a341631 Mon Sep 17 00:00:00 2001 From: Philip Helger Date: Mon, 23 Apr 2018 14:42:52 +0200 Subject: [PATCH] Added getInner as requested by #60 --- .../com/helger/jcodemodel/AbstractJClass.java | 24 ++++++++++++++++ .../jcodemodel/AbstractJClassContainer.java | 28 +++++++++---------- .../helger/jcodemodel/InnerClassFuncTest.java | 4 +++ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/helger/jcodemodel/AbstractJClass.java b/src/main/java/com/helger/jcodemodel/AbstractJClass.java index 377aa3c6..8965b9ec 100644 --- a/src/main/java/com/helger/jcodemodel/AbstractJClass.java +++ b/src/main/java/com/helger/jcodemodel/AbstractJClass.java @@ -42,6 +42,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -425,6 +426,29 @@ public final JTypeWildcard wildcard (@Nonnull final EWildcardBoundMode eMode) protected abstract AbstractJClass substituteParams (@Nonnull JTypeVar [] aVariables, @Nonnull List aBindings); + /** + * Check if this class is a class container and if so try to find the inner + * class with the provided name. + * + * @param sName + * The name to check. May be null. + * @return The inner class with the provided name. + * @since 3.0.3 + */ + @Nullable + public AbstractJClassContainer getInnerClass (@Nullable final String sName) + { + if (sName != null && this instanceof AbstractJClassContainer ) + { + @SuppressWarnings ("rawtypes") + final Collection > aInnerClasses = ((AbstractJClassContainer) this).classes (); + for (final AbstractJClassContainer aInnerClass : aInnerClasses) + if (aInnerClass.name ().equals (sName)) + return aInnerClass; + } + return null; + } + /** * @return name.class */ diff --git a/src/main/java/com/helger/jcodemodel/AbstractJClassContainer.java b/src/main/java/com/helger/jcodemodel/AbstractJClassContainer.java index ad1f2ac7..36f35209 100644 --- a/src/main/java/com/helger/jcodemodel/AbstractJClassContainer.java +++ b/src/main/java/com/helger/jcodemodel/AbstractJClassContainer.java @@ -82,8 +82,6 @@ public abstract class AbstractJClassContainer m_aClasses; @@ -178,7 +176,8 @@ public String fullName () } /** - * @return true if this is an anonymous class. + * @return true if this is an anonymous class. Note: this applies + * only to classes. */ public final boolean isAnonymous () { @@ -213,14 +212,6 @@ public final JPackage getPackage () return parentContainer ().getPackage (); } - @Nonnull - private Map _getClasses () - { - if (m_aClasses == null) - m_aClasses = new TreeMap <> (); - return m_aClasses; - } - @Nonnull protected abstract CLASSTYPE createInnerClass (final int nMods, @Nonnull final EClassType eClassType, @@ -237,12 +228,19 @@ public final CLASSTYPE _class (final int nMods, else sRealName = sName; - final CLASSTYPE aExistingClass = _getClasses ().get (sRealName); - if (aExistingClass != null) - throw new JClassAlreadyExistsException (aExistingClass); + // Existing class? + if (m_aClasses != null) + { + final CLASSTYPE aExistingClass = m_aClasses.get (sRealName); + if (aExistingClass != null) + throw new JClassAlreadyExistsException (aExistingClass); + } + else + m_aClasses = new TreeMap <> (); + // Create and add inner class final CLASSTYPE c = createInnerClass (nMods, eClassType, sName); - _getClasses ().put (sRealName, c); + m_aClasses.put (sRealName, c); return c; } diff --git a/src/test/java/com/helger/jcodemodel/InnerClassFuncTest.java b/src/test/java/com/helger/jcodemodel/InnerClassFuncTest.java index 00c78bde..c1850e18 100644 --- a/src/test/java/com/helger/jcodemodel/InnerClassFuncTest.java +++ b/src/test/java/com/helger/jcodemodel/InnerClassFuncTest.java @@ -41,6 +41,8 @@ package com.helger.jcodemodel; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import org.junit.Test; @@ -57,6 +59,8 @@ public void innerClassesAreImported () throws Exception final JDefinedClass daInnerInner = daInner1._class ("InnerInner"); final JDefinedClass daInner2 = aClass._class ("DaTestClassInner"); final JDefinedClass daInner2Inner = daInner2._class ("Inner2"); + assertSame (daInner2Inner, daInner2.getInnerClass ("Inner2")); + assertNull (daInner2.getInnerClass ("Inner3")); assertEquals ("Inner", daInner1.name ()); assertEquals ("org.test.DaTestClass.Inner", daInner1.fullName ());