@@ -50,53 +50,64 @@ private void SetupTypeMaps(IEnumerable<System.Type> types,
5050
5151 public bool FindTypeMap ( Declaration decl , Type type , out TypeMap typeMap )
5252 {
53+ if ( type != null && typeMaps . ContainsKey ( type ) )
54+ {
55+ typeMap = typeMaps [ type ] ;
56+ return typeMap . IsEnabled ;
57+ }
58+
5359 // We try to find type maps from the most qualified to less qualified
5460 // types. Example: '::std::vector', 'std::vector' and 'vector'
5561
5662 var typePrinter = new CppTypePrinter { PrintLogicalNames = true } ;
5763
58- if ( FindTypeMap ( decl . Visit ( typePrinter ) , out typeMap ) )
59- {
60- typeMap . Type = type ;
64+ if ( FindTypeMap ( decl , type , out typeMap , typePrinter ) )
6165 return true ;
62- }
6366
6467 typePrinter . PrintScopeKind = TypePrintScopeKind . Qualified ;
65- if ( FindTypeMap ( decl . Visit ( typePrinter ) , out typeMap ) )
66- {
67- typeMap . Type = type ;
68+ if ( FindTypeMap ( decl , type , out typeMap , typePrinter ) )
6869 return true ;
69- }
7070
7171 typePrinter . ResolveTypedefs = true ;
72- if ( FindTypeMap ( decl . Visit ( typePrinter ) , out typeMap ) )
73- {
74- typeMap . Type = type ;
72+ if ( FindTypeMap ( decl , type , out typeMap , typePrinter ) )
7573 return true ;
76- }
7774 typePrinter . ResolveTypedefs = false ;
7875
7976 typePrinter . PrintScopeKind = TypePrintScopeKind . Local ;
80- if ( FindTypeMap ( decl . Visit ( typePrinter ) , out typeMap ) )
81- {
82- typeMap . Type = type ;
77+ if ( FindTypeMap ( decl , type , out typeMap , typePrinter ) )
8378 return true ;
84- }
8579
8680 var specialization = decl as ClassTemplateSpecialization ;
8781 if ( specialization != null &&
88- FindTypeMap ( specialization . TemplatedDecl . Visit ( typePrinter ) , out typeMap ) )
89- {
90- typeMap . Type = type ;
82+ FindTypeMap ( specialization . TemplatedDecl , type , out typeMap , typePrinter ) )
9183 return true ;
92- }
9384
9485 var typedef = decl as TypedefDecl ;
9586 return typedef != null && FindTypeMap ( typedef . Type , out typeMap ) ;
9687 }
9788
89+ private bool FindTypeMap ( Declaration decl , Type type , out TypeMap typeMap , CppTypePrinter typePrinter )
90+ {
91+ if ( FindTypeMap ( decl . Visit ( typePrinter ) , out typeMap ) )
92+ {
93+ if ( type != null && typeMap . Type == null )
94+ {
95+ typeMap . Type = type ;
96+ typeMaps [ type ] = typeMap ;
97+ }
98+ return true ;
99+ }
100+ return false ;
101+ }
102+
98103 public bool FindTypeMap ( Type type , out TypeMap typeMap )
99104 {
105+ if ( typeMaps . ContainsKey ( type ) )
106+ {
107+ typeMap = typeMaps [ type ] ;
108+ return typeMap . IsEnabled ;
109+ }
110+
100111 var typePrinter = new CppTypePrinter
101112 {
102113 PrintTypeQualifiers = false ,
@@ -119,13 +130,15 @@ public bool FindTypeMap(Type type, out TypeMap typeMap)
119130 if ( FindTypeMap ( type . Visit ( typePrinter ) , out typeMap ) )
120131 {
121132 typeMap . Type = type ;
133+ typeMaps [ type ] = typeMap ;
122134 return true ;
123135 }
124136
125137 typePrinter . PrintScopeKind = TypePrintScopeKind . Qualified ;
126138 if ( FindTypeMap ( type . Visit ( typePrinter ) , out typeMap ) )
127139 {
128140 typeMap . Type = type ;
141+ typeMaps [ type ] = typeMap ;
129142 return true ;
130143 }
131144
@@ -157,5 +170,7 @@ private bool FindTypeMap(string name, out TypeMap typeMap)
157170 {
158171 return TypeMaps . TryGetValue ( name , out typeMap ) && typeMap . IsEnabled ;
159172 }
173+
174+ private Dictionary < Type , TypeMap > typeMaps = new Dictionary < Type , TypeMap > ( ) ;
160175 }
161176}
0 commit comments