@@ -155,22 +155,41 @@ private static void TryMoveExternalSpecializations(Class template)
155
155
{
156
156
continue ;
157
157
}
158
- var modules = ( from arg in specialization . Arguments
159
- where arg . Type . Type != null
160
- && ASTUtils . IsTypeExternal (
161
- template . TranslationUnit . Module , arg . Type . Type )
162
- let module = arg . Type . Type . GetModule ( )
163
- where module != null
164
- select module ) . ToList ( ) . TopologicalSort ( m => m . Dependencies ) ;
165
- if ( modules . Count > 0 )
158
+ Module module = GetExternalModule ( specialization ) ;
159
+ if ( module != null )
166
160
{
167
- var module = modules . Last ( ) ;
168
161
module . ExternalClassTemplateSpecializations . Add ( specialization ) ;
169
162
template . Specializations . RemoveAt ( i ) ;
170
163
}
171
164
}
172
165
}
173
166
167
+ private static Module GetExternalModule ( ClassTemplateSpecialization specialization )
168
+ {
169
+ Module currentModule = specialization . TemplatedDecl . TemplatedClass . TranslationUnit . Module ;
170
+ List < Module > modules = new List < Module > ( ) ;
171
+ foreach ( TemplateArgument arg in specialization . Arguments . Where ( arg => arg . Type . Type != null ) )
172
+ {
173
+ if ( ASTUtils . IsTypeExternal ( currentModule , arg . Type . Type ) )
174
+ {
175
+ Module module = arg . Type . Type . GetModule ( ) ;
176
+ if ( module != null )
177
+ {
178
+ modules . Add ( module ) ;
179
+ }
180
+ }
181
+ if ( arg . Type . Type . TryGetDeclaration ( out ClassTemplateSpecialization nestedSpecialization ) )
182
+ {
183
+ Module module = GetExternalModule ( nestedSpecialization ) ;
184
+ if ( module != null )
185
+ {
186
+ modules . Add ( module ) ;
187
+ }
188
+ }
189
+ }
190
+ return modules . TopologicalSort ( m => m . Dependencies ) . LastOrDefault ( ) ;
191
+ }
192
+
174
193
private void CheckForInternalSpecialization ( Declaration container , AST . Type type )
175
194
{
176
195
ASTUtils . CheckTypeForSpecialization ( type , container ,
0 commit comments