bol->baseTypes.Wrap()) 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(thisType->GetSymbol()); 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 171 { 172 CollectBaseTypes(baseTypes[i], baseTypes, argument); 173 } 174 } 175 176 void EnsureTypeVisibility(ManagedLanguageElement* languageElement, ManagedTypeSymbol* type, ManagedSymbolItem* scopeItem, const MAP& argument) 177 { 178 CHECK_ERROR( 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 thisTypes, baseTypes; 187 { 188 ManagedSymbolDeclaration* currentDeclaration=dynamic_cast(scopeItem); 189 while(currentDeclaration) 190 { 191 thisTypes.Add(argument.symbolManager->GetThisType(currentDeclaration)); 192 currentDeclaration=dynamic_cast(currentDeclaration->GetParentItem()); 193 } 194 } 195 FOREACH(ManagedTypeSymbol*, thisType, thisTypes.Wrap()) 196 { 197 CollectBaseTypes(thisType, baseTypes, argument); 198 } 199 EnsureTypeVisibility(languageElement, type, argument, thisTypes, baseTypes); 200 } 主要方法就是,判断A.S.T是否可见有下面两个判断: 1:A.S是否可见 2:A.S扩展后的类型是B,判断B.T是否可见。 至于为什么这里不需要判断B是否可见,是因为在using S=xxx这条声明的语义分析里面已经查过了,如果不可见就会有错误信息产生。因此这里可以当B是可见的,减少多余的错误信息。
然后判断A.S是否可见比较简单,主要就是判断A.S和string是否可见。
一直这么递归下去,就把整个类型都检查完了。
|