@@ -50,27 +50,65 @@ public class CppDtoGenerator implements CodeGenerator
5050
5151 private final Ir ir ;
5252 private final OutputManager outputManager ;
53+ private final boolean shouldSupportTypesPackageNames ;
54+ private final Map <String , String > namespaceByType = new HashMap <>();
5355
5456 /**
5557 * Create a new C++ DTO {@link CodeGenerator}.
5658 *
57- * @param ir for the messages and types.
58- * @param outputManager for generating the DTOs to.
59+ * @param ir for the messages and types.
60+ * @param shouldSupportTypesPackageNames generator support for types in their own package.
61+ * @param outputManager for generating the DTOs to.
5962 */
60- public CppDtoGenerator (final Ir ir , final OutputManager outputManager )
63+ public CppDtoGenerator (
64+ final Ir ir ,
65+ final boolean shouldSupportTypesPackageNames ,
66+ final OutputManager outputManager )
6167 {
6268 Verify .notNull (ir , "ir" );
6369 Verify .notNull (outputManager , "outputManager" );
6470
6571 this .ir = ir ;
72+ this .shouldSupportTypesPackageNames = shouldSupportTypesPackageNames ;
6673 this .outputManager = outputManager ;
6774 }
6875
76+ private String [] fetchTypesPackageName (final Token token , final Ir ir )
77+ {
78+ if (!shouldSupportTypesPackageNames )
79+ {
80+ return ir .namespaces ();
81+ }
82+
83+ if (token .packageName () != null )
84+ {
85+ return Ir .getNamespaces (token .packageName ());
86+ }
87+
88+ return ir .namespaces ();
89+ }
90+
6991 /**
7092 * {@inheritDoc}
7193 */
7294 public void generate () throws IOException
7395 {
96+ namespaceByType .clear ();
97+
98+ if (shouldSupportTypesPackageNames )
99+ {
100+ for (final List <Token > tokens : ir .types ())
101+ {
102+ final Token token = tokens .get (0 );
103+ final String packageName = token .packageName ();
104+
105+ if (packageName != null )
106+ {
107+ namespaceByType .put (token .applicableTypeName (), packageName );
108+ }
109+ }
110+ }
111+
74112 generateDtosForTypes ();
75113
76114 for (final List <Token > tokens : ir .messages ())
@@ -116,13 +154,14 @@ public void generate() throws IOException
116154 final Set <String > referencedTypes = generateTypesToIncludes (beginTypeTokensInSchema );
117155 referencedTypes .add (codecClassName );
118156
157+ final String [] namespaces = fetchTypesPackageName (msgToken , ir );
119158 out .append (generateDtoFileHeader (
120- ir . namespaces () ,
159+ namespaces ,
121160 className ,
122161 referencedTypes ));
123162 out .append (generateDocumentation (BASE_INDENT , msgToken ));
124163 classBuilder .appendTo (out );
125- out .append (CppUtil .closingBraces (ir . namespaces () .length ));
164+ out .append (CppUtil .closingBraces (namespaces .length ));
126165 out .append ("#endif\n " );
127166 }
128167 }
@@ -1732,7 +1771,8 @@ private void generateDtosForTypes() throws IOException
17321771
17331772 private void generateComposite (final List <Token > tokens ) throws IOException
17341773 {
1735- final String name = tokens .get (0 ).applicableTypeName ();
1774+ final Token token = tokens .get (0 );
1775+ final String name = token .applicableTypeName ();
17361776 final String className = formatDtoClassName (name );
17371777 final String codecClassName = formatClassName (name );
17381778
@@ -1741,8 +1781,9 @@ private void generateComposite(final List<Token> tokens) throws IOException
17411781 final List <Token > compositeTokens = tokens .subList (1 , tokens .size () - 1 );
17421782 final Set <String > referencedTypes = generateTypesToIncludes (compositeTokens );
17431783 referencedTypes .add (codecClassName );
1744- out .append (generateDtoFileHeader (ir .namespaces (), className , referencedTypes ));
1745- out .append (generateDocumentation (BASE_INDENT , tokens .get (0 )));
1784+ final String [] namespaces = fetchTypesPackageName (token , ir );
1785+ out .append (generateDtoFileHeader (namespaces , className , referencedTypes ));
1786+ out .append (generateDocumentation (BASE_INDENT , token ));
17461787
17471788 final ClassBuilder classBuilder = new ClassBuilder (className , BASE_INDENT );
17481789
@@ -1754,14 +1795,15 @@ private void generateComposite(final List<Token> tokens) throws IOException
17541795 codecClassName + "::sbeSchemaVersion()" , BASE_INDENT + INDENT );
17551796
17561797 classBuilder .appendTo (out );
1757- out .append (CppUtil .closingBraces (ir . namespaces () .length ));
1798+ out .append (CppUtil .closingBraces (namespaces .length ));
17581799 out .append ("#endif\n " );
17591800 }
17601801 }
17611802
17621803 private void generateChoiceSet (final List <Token > tokens ) throws IOException
17631804 {
1764- final String name = tokens .get (0 ).applicableTypeName ();
1805+ final Token token = tokens .get (0 );
1806+ final String name = token .applicableTypeName ();
17651807 final String className = formatDtoClassName (name );
17661808 final String codecClassName = formatClassName (name );
17671809
@@ -1770,7 +1812,8 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
17701812 final List <Token > setTokens = tokens .subList (1 , tokens .size () - 1 );
17711813 final Set <String > referencedTypes = generateTypesToIncludes (setTokens );
17721814 referencedTypes .add (codecClassName );
1773- out .append (generateDtoFileHeader (ir .namespaces (), className , referencedTypes ));
1815+ final String [] namespaces = fetchTypesPackageName (token , ir );
1816+ out .append (generateDtoFileHeader (namespaces , className , referencedTypes ));
17741817 out .append (generateDocumentation (BASE_INDENT , tokens .get (0 )));
17751818
17761819 final ClassBuilder classBuilder = new ClassBuilder (className , BASE_INDENT );
@@ -1780,7 +1823,7 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
17801823 generateChoiceSetEncodeWith (classBuilder , className , codecClassName , setTokens , BASE_INDENT + INDENT );
17811824
17821825 classBuilder .appendTo (out );
1783- out .append (CppUtil .closingBraces (ir . namespaces () .length ));
1826+ out .append (CppUtil .closingBraces (namespaces .length ));
17841827 out .append ("#endif\n " );
17851828 }
17861829 }
@@ -1965,7 +2008,7 @@ private static CharSequence typeWithFieldOptionality(
19652008 }
19662009 }
19672010
1968- private static CharSequence generateDtoFileHeader (
2011+ private CharSequence generateDtoFileHeader (
19692012 final CharSequence [] namespaces ,
19702013 final String className ,
19712014 final Collection <String > typesToInclude )
@@ -2010,6 +2053,32 @@ private static CharSequence generateDtoFileHeader(
20102053 sb .append (String .join (" {\n namespace " , namespaces ));
20112054 sb .append (" {\n \n " );
20122055
2056+ if (shouldSupportTypesPackageNames && typesToInclude != null && !typesToInclude .isEmpty ())
2057+ {
2058+ final Set <String > namespacesToUse = namespaceByType
2059+ .entrySet ()
2060+ .stream ()
2061+ .filter (e -> typesToInclude .contains (e .getKey ()))
2062+ .map (Map .Entry ::getValue )
2063+ .collect (Collectors .toSet ());
2064+
2065+ // remove the current namespace
2066+ namespacesToUse .remove (String .join ("." , namespaces ));
2067+
2068+ for (final String namespace : namespacesToUse )
2069+ {
2070+ sb
2071+ .append ("using namespace " )
2072+ .append (namespace .replaceAll ("\\ ." , "::" ))
2073+ .append (";\n " );
2074+ }
2075+
2076+ if (!namespacesToUse .isEmpty ())
2077+ {
2078+ sb .append ("\n " );
2079+ }
2080+ }
2081+
20132082 return sb ;
20142083 }
20152084
0 commit comments