@@ -73,73 +73,84 @@ public string GetCode(MetadataTypes metadata)
7373 string lastNS = null ;
7474
7575 var existingOps = new HashSet < string > ( ) ;
76- sb . AppendLine ( "#region Operations" ) ;
77- sb . AppendLine ( ) ;
78- foreach ( var operation in metadata . Operations
79- . OrderBy ( x => x . Request . Namespace )
80- . ThenBy ( x => x . Request . Name ) )
76+
77+ var requestTypes = metadata . Operations . Select ( x => x . Request ) . ToHashSet ( ) ;
78+ var requestTypesMap = metadata . Operations . ToSafeDictionary ( x => x . Request ) ;
79+ var responseTypes = metadata . Operations
80+ . Where ( x => x . Response != null )
81+ . Select ( x => x . Response ) . ToHashSet ( ) ;
82+ var types = metadata . Types . ToHashSet ( ) ;
83+
84+ var allTypes = new List < MetadataType > ( ) ;
85+ allTypes . AddRange ( requestTypes ) ;
86+ allTypes . AddRange ( responseTypes ) ;
87+ allTypes . AddRange ( types ) ;
88+ var orderedTypes = allTypes
89+ . OrderBy ( x => x . Namespace )
90+ . ThenBy ( x => x . Name ) ;
91+
92+ foreach ( var type in orderedTypes )
8193 {
82- var request = operation . Request ;
83- var response = operation . Response ;
84- if ( ! existingOps . Contains ( request . GetFullName ( ) ) )
94+ var fullTypeName = type . GetFullName ( ) ;
95+ if ( requestTypes . Contains ( type ) )
8596 {
86- lastNS = AppendType ( ref sb , request , lastNS ,
87- new CreateTypeOptions
97+ if ( ! existingOps . Contains ( fullTypeName ) )
98+ {
99+ MetadataType response = null ;
100+ MetadataOperationType operation ;
101+ if ( requestTypesMap . TryGetValue ( type , out operation ) )
88102 {
89- ImplementsFn = ( ) =>
103+ response = operation . Response ;
104+ }
105+
106+ lastNS = AppendType ( ref sb , type , lastNS ,
107+ new CreateTypeOptions
90108 {
91- if ( ! Config . AddReturnMarker
92- && ! request . ReturnVoidMarker
93- && request . ReturnMarkerTypeName == null )
94- return null ;
95-
96- if ( request . ReturnVoidMarker )
97- return "IReturnVoid" ;
98- if ( request . ReturnMarkerTypeName != null )
99- return Type ( "IReturn`1" , new [ ] { Type ( request . ReturnMarkerTypeName ) } ) ;
100- return response != null
101- ? Type ( "IReturn`1" , new [ ] { Type ( response . Name , response . GenericArgs ) } )
102- : null ;
103- } ,
104- IsRequest = true ,
105- } ) ;
106-
107- existingOps . Add ( request . GetFullName ( ) ) ;
109+ ImplementsFn = ( ) =>
110+ {
111+ if ( ! Config . AddReturnMarker
112+ && ! type . ReturnVoidMarker
113+ && type . ReturnMarkerTypeName == null )
114+ return null ;
115+
116+ if ( type . ReturnVoidMarker )
117+ return "IReturnVoid" ;
118+ if ( type . ReturnMarkerTypeName != null )
119+ return Type ( "IReturn`1" , new [ ] { Type ( type . ReturnMarkerTypeName ) } ) ;
120+ return response != null
121+ ? Type ( "IReturn`1" , new [ ] { Type ( type . Name , type . GenericArgs ) } )
122+ : null ;
123+ } ,
124+ IsRequest = true ,
125+ } ) ;
126+
127+ existingOps . Add ( fullTypeName ) ;
128+ }
108129 }
109- if ( response != null && ! existingOps . Contains ( response . GetFullName ( ) )
110- && ! Config . IgnoreTypesInNamespaces . Contains ( response . Namespace ) )
130+ else if ( responseTypes . Contains ( type ) )
111131 {
112- lastNS = AppendType ( ref sb , response , lastNS ,
113- new CreateTypeOptions
114- {
115- IsResponse = true ,
116- } ) ;
132+ if ( ! existingOps . Contains ( fullTypeName )
133+ && ! Config . IgnoreTypesInNamespaces . Contains ( type . Namespace ) )
134+ {
135+ lastNS = AppendType ( ref sb , type , lastNS ,
136+ new CreateTypeOptions
137+ {
138+ IsResponse = true ,
139+ } ) ;
117140
118- existingOps . Add ( response . GetFullName ( ) ) ;
141+ existingOps . Add ( fullTypeName ) ;
142+ }
143+ }
144+ else if ( types . Contains ( type ) && ! existingOps . Contains ( fullTypeName ) )
145+ {
146+ lastNS = AppendType ( ref sb , type , lastNS ,
147+ new CreateTypeOptions { IsType = true } ) ;
119148 }
120149 }
121- if ( lastNS != null )
122- sb . AppendLine ( "}" ) ;
123- sb . AppendLine ( ) ;
124- sb . AppendLine ( "#endregion" ) ;
125-
126- sb . AppendLine ( ) ;
127- sb . AppendLine ( ) ;
128150
129- lastNS = null ;
130- sb . AppendLine ( "#region Types" ) ;
131- sb . AppendLine ( ) ;
132- foreach ( var type in metadata . Types
133- . OrderBy ( x => x . Namespace )
134- . ThenBy ( x => x . Name ) )
135- {
136- lastNS = AppendType ( ref sb , type , lastNS ,
137- new CreateTypeOptions { IsType = true } ) ;
138- }
139151 if ( lastNS != null )
140152 sb . AppendLine ( "}" ) ;
141153 sb . AppendLine ( ) ;
142- sb . AppendLine ( "#endregion" ) ;
143154
144155 return sb . ToString ( ) ;
145156 }
0 commit comments