151 {
152 ManagedTypeSymbol* translatedBaseType=argument.symbolManager->ReplaceGenericArguments(baseType, replacement.Wrap());
153 if(!baseTypes.Contains(translatedBaseType))
154 {
155 baseTypes.Add(translatedBaseType);
156 }
157 }
158 }
159 else
160 {
161 ManagedSymbolDeclaration* symbol=dynamic_cast
162 FOREACH(ManagedTypeSymbol*, baseType, symbol->baseTypes.Wrap())
163 {
164 if(!baseTypes.Contains(baseType))
165 {
166 baseTypes.Add(baseType);
167 }
168 }
169 }
170 for(vint i=oldCount;i
172 CollectBaseTypes(baseTypes[i], baseTypes, argument);
173 }
174 }
175
176 void EnsureTypeVisibility(ManagedLanguageElement* languageElement, ManagedTypeSymbol* type, ManagedSymbolItem* scopeItem, const MAP& argument)
177 {
179 !scopeItem
180 || scopeItem->GetSymbolType()==ManagedSymbolItem::Class
181 || scopeItem->GetSymbolType()==ManagedSymbolItem::Structure
182 || scopeItem->GetSymbolType()==ManagedSymbolItem::Interface,
183 L"EnsureTypeVisibility(ManagedLanguageElement*, ManagedTypeSymbol*, ManagedSymbolItem*, const MAP&)#scopeItem内容非法。"
184 );
185
186 List
187 {
188 ManagedSymbolDeclaration* currentDeclaration=dynamic_cast
189 while(currentDeclaration)
190 {
191 thisTypes.Add(argument.symbolManager->GetThisType(currentDeclaration));
192 currentDeclaration=dynamic_cast
193 }
194 }
195 FOREACH(ManagedTypeSymbol*, thisType, thisTypes.Wrap())
196 {
197 CollectBaseTypes(thisType, baseTypes, argument);
198 }
199 EnsureTypeVisibility(languageElement, type, argument, thisTypes, baseTypes);
200 }
主要方法就是,判断A
1:A
2:A
至于为什么这里不需要判断B
然后判断A
一直这么递归下去,就把整个类型都检查完了。