@@ -50,27 +50,65 @@ public class CppDtoGenerator implements CodeGenerator
50
50
51
51
private final Ir ir ;
52
52
private final OutputManager outputManager ;
53
+ private final boolean shouldSupportTypesPackageNames ;
54
+ private final Map <String , String > namespaceByType = new HashMap <>();
53
55
54
56
/**
55
57
* Create a new C++ DTO {@link CodeGenerator}.
56
58
*
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.
59
62
*/
60
- public CppDtoGenerator (final Ir ir , final OutputManager outputManager )
63
+ public CppDtoGenerator (
64
+ final Ir ir ,
65
+ final boolean shouldSupportTypesPackageNames ,
66
+ final OutputManager outputManager )
61
67
{
62
68
Verify .notNull (ir , "ir" );
63
69
Verify .notNull (outputManager , "outputManager" );
64
70
65
71
this .ir = ir ;
72
+ this .shouldSupportTypesPackageNames = shouldSupportTypesPackageNames ;
66
73
this .outputManager = outputManager ;
67
74
}
68
75
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
+
69
91
/**
70
92
* {@inheritDoc}
71
93
*/
72
94
public void generate () throws IOException
73
95
{
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
+
74
112
generateDtosForTypes ();
75
113
76
114
for (final List <Token > tokens : ir .messages ())
@@ -116,13 +154,14 @@ public void generate() throws IOException
116
154
final Set <String > referencedTypes = generateTypesToIncludes (beginTypeTokensInSchema );
117
155
referencedTypes .add (codecClassName );
118
156
157
+ final String [] namespaces = fetchTypesPackageName (msgToken , ir );
119
158
out .append (generateDtoFileHeader (
120
- ir . namespaces () ,
159
+ namespaces ,
121
160
className ,
122
161
referencedTypes ));
123
162
out .append (generateDocumentation (BASE_INDENT , msgToken ));
124
163
classBuilder .appendTo (out );
125
- out .append (CppUtil .closingBraces (ir . namespaces () .length ));
164
+ out .append (CppUtil .closingBraces (namespaces .length ));
126
165
out .append ("#endif\n " );
127
166
}
128
167
}
@@ -1732,7 +1771,8 @@ private void generateDtosForTypes() throws IOException
1732
1771
1733
1772
private void generateComposite (final List <Token > tokens ) throws IOException
1734
1773
{
1735
- final String name = tokens .get (0 ).applicableTypeName ();
1774
+ final Token token = tokens .get (0 );
1775
+ final String name = token .applicableTypeName ();
1736
1776
final String className = formatDtoClassName (name );
1737
1777
final String codecClassName = formatClassName (name );
1738
1778
@@ -1741,8 +1781,9 @@ private void generateComposite(final List<Token> tokens) throws IOException
1741
1781
final List <Token > compositeTokens = tokens .subList (1 , tokens .size () - 1 );
1742
1782
final Set <String > referencedTypes = generateTypesToIncludes (compositeTokens );
1743
1783
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 ));
1746
1787
1747
1788
final ClassBuilder classBuilder = new ClassBuilder (className , BASE_INDENT );
1748
1789
@@ -1754,14 +1795,15 @@ private void generateComposite(final List<Token> tokens) throws IOException
1754
1795
codecClassName + "::sbeSchemaVersion()" , BASE_INDENT + INDENT );
1755
1796
1756
1797
classBuilder .appendTo (out );
1757
- out .append (CppUtil .closingBraces (ir . namespaces () .length ));
1798
+ out .append (CppUtil .closingBraces (namespaces .length ));
1758
1799
out .append ("#endif\n " );
1759
1800
}
1760
1801
}
1761
1802
1762
1803
private void generateChoiceSet (final List <Token > tokens ) throws IOException
1763
1804
{
1764
- final String name = tokens .get (0 ).applicableTypeName ();
1805
+ final Token token = tokens .get (0 );
1806
+ final String name = token .applicableTypeName ();
1765
1807
final String className = formatDtoClassName (name );
1766
1808
final String codecClassName = formatClassName (name );
1767
1809
@@ -1770,7 +1812,8 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
1770
1812
final List <Token > setTokens = tokens .subList (1 , tokens .size () - 1 );
1771
1813
final Set <String > referencedTypes = generateTypesToIncludes (setTokens );
1772
1814
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 ));
1774
1817
out .append (generateDocumentation (BASE_INDENT , tokens .get (0 )));
1775
1818
1776
1819
final ClassBuilder classBuilder = new ClassBuilder (className , BASE_INDENT );
@@ -1780,7 +1823,7 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
1780
1823
generateChoiceSetEncodeWith (classBuilder , className , codecClassName , setTokens , BASE_INDENT + INDENT );
1781
1824
1782
1825
classBuilder .appendTo (out );
1783
- out .append (CppUtil .closingBraces (ir . namespaces () .length ));
1826
+ out .append (CppUtil .closingBraces (namespaces .length ));
1784
1827
out .append ("#endif\n " );
1785
1828
}
1786
1829
}
@@ -1965,7 +2008,7 @@ private static CharSequence typeWithFieldOptionality(
1965
2008
}
1966
2009
}
1967
2010
1968
- private static CharSequence generateDtoFileHeader (
2011
+ private CharSequence generateDtoFileHeader (
1969
2012
final CharSequence [] namespaces ,
1970
2013
final String className ,
1971
2014
final Collection <String > typesToInclude )
@@ -2010,6 +2053,32 @@ private static CharSequence generateDtoFileHeader(
2010
2053
sb .append (String .join (" {\n namespace " , namespaces ));
2011
2054
sb .append (" {\n \n " );
2012
2055
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
+
2013
2082
return sb ;
2014
2083
}
2015
2084
0 commit comments