@@ -46,7 +46,7 @@ public override bool VisitClassDecl(Class @class)
4646 {
4747 var @base = @class . Bases [ i ] ;
4848 var baseClass = @base . Class ;
49- if ( baseClass == null || baseClass . IsInterface ) continue ;
49+ if ( baseClass == null || baseClass . IsInterface || ! baseClass . IsGenerated ) continue ;
5050
5151 var @interface = GetInterface ( baseClass ) ;
5252 @class . Bases [ i ] = new BaseClassSpecifier ( @base ) { Type = new TagType ( @interface ) } ;
@@ -70,14 +70,35 @@ private Class GetInterface(Class @base)
7070
7171 private Class GetNewInterface ( string name , Class @base )
7272 {
73- var @interface = new Class
74- {
75- Name = name ,
76- Namespace = @base . Namespace ,
77- Access = @base . Access ,
78- Type = ClassType . Interface ,
79- OriginalClass = @base
80- } ;
73+ var specialization = @base as ClassTemplateSpecialization ;
74+ Class @interface ;
75+ if ( specialization == null )
76+ {
77+ @interface = new Class ( ) ;
78+ }
79+ else
80+ {
81+ Class template = specialization . TemplatedDecl . TemplatedClass ;
82+ Class templatedInterface ;
83+ if ( templatedInterfaces . ContainsKey ( template ) )
84+ templatedInterface = templatedInterfaces [ template ] ;
85+ else
86+ templatedInterfaces [ template ] = templatedInterface = GetInterface ( template ) ;
87+ var specializedInterface = new ClassTemplateSpecialization ( ) ;
88+ specializedInterface . Arguments . AddRange ( specialization . Arguments ) ;
89+ specializedInterface . TemplatedDecl = new ClassTemplate { TemplatedDecl = templatedInterface } ;
90+ @interface = specializedInterface ;
91+ }
92+ @interface . Name = name ;
93+ @interface . Namespace = @base . Namespace ;
94+ @interface . Access = @base . Access ;
95+ @interface . Type = ClassType . Interface ;
96+ @interface . OriginalClass = @base ;
97+ if ( @base . IsTemplate )
98+ {
99+ @interface . IsDependent = true ;
100+ @interface . TemplateParameters . AddRange ( @base . TemplateParameters ) ;
101+ }
81102
82103 @interface . Bases . AddRange (
83104 from b in @base . Bases
@@ -136,7 +157,8 @@ where property.IsDeclared
136157
137158 @base . Bases . Add ( new BaseClassSpecifier { Type = new TagType ( @interface ) } ) ;
138159
139- interfaces . Add ( @base , @interface ) ;
160+ if ( specialization == null )
161+ interfaces . Add ( @base , @interface ) ;
140162 return @interface ;
141163 }
142164
@@ -204,5 +226,7 @@ private static void ImplementInterfaceProperties(Class @class, Class @interface)
204226 foreach ( var @base in @interface . Bases )
205227 ImplementInterfaceProperties ( @class , @base . Class ) ;
206228 }
229+
230+ private readonly Dictionary < Class , Class > templatedInterfaces = new Dictionary < Class , Class > ( ) ;
207231 }
208232}
0 commit comments