bool ResolveModuleMember(Boo.Lang.List targetList, string name, EntityType flags) { bool found = false; foreach (TypeMember member in _module.Members) { if (name != member.Name) continue; IEntity entity = _typeSystemServices.GetMemberEntity(member); if (NameResolutionService.IsFlagSet(flags, entity.EntityType)) { targetList.Add(entity); found = true; } } return found; }
void ResolveBaseTypes(Boo.Lang.List visited, TypeDefinition node) { // If type is generic, enter a special namespace to allow // correct resolution of generic parameters IType type = (IType)TypeSystemServices.GetEntity(node); if (type.GenericInfo != null) { EnterNamespace(new GenericParametersNamespaceExtender( type, NameResolutionService.CurrentNamespace)); } visited.Add(node); Boo.Lang.List visitedNonInterfaces = null; Boo.Lang.List visitedInterfaces = null; if (node is InterfaceDefinition) { visitedInterfaces = visited; // interfaces won't have noninterface base types so visitedNonInterfaces not necessary here } else { visitedNonInterfaces = visited; visitedInterfaces = new Boo.Lang.List(); } int removed = 0; int index = 0; foreach (SimpleTypeReference baseType in node.BaseTypes.ToArray()) { NameResolutionService.ResolveSimpleTypeReference(baseType); AbstractInternalType internalType = baseType.Entity as AbstractInternalType; if (null != internalType) { if (internalType is InternalInterface) { if (visitedInterfaces.Contains(internalType.TypeDefinition)) { Error(CompilerErrorFactory.InheritanceCycle(baseType, internalType.FullName)); node.BaseTypes.RemoveAt(index - removed); ++removed; } else { ResolveBaseTypes(visitedInterfaces, internalType.TypeDefinition); } } else { if (visitedNonInterfaces.Contains(internalType.TypeDefinition)) { Error(CompilerErrorFactory.InheritanceCycle(baseType, internalType.FullName)); node.BaseTypes.RemoveAt(index - removed); ++removed; } else { ResolveBaseTypes(visitedNonInterfaces, internalType.TypeDefinition); } } } ++index; } // Leave special namespace if we entered it before if (type.GenericInfo != null) { LeaveNamespace(); } }