private List <INode> GetMatchingClassesAndEnums(ReferenceType referenceType) { var names = referenceType.Identifiers.Select(x => x.Text).ToList(); var ancestors = referenceType.AllAncestorOfType <AbstractTopLevelNode>(); foreach (var ancestor in ancestors) { var nodes = new List <AbstractTopLevelNode> { ancestor }; for (int i = 0; i < referenceType.Identifiers.Count(); i++) { if (i < referenceType.Identifiers.Count() - 1) { nodes = nodes .SelectMany(GetDeclarations) .OfType <ModuleDeclaration>() .Where(x => x.Name == referenceType.Identifiers.AtIndex(i).Text) .Cast <AbstractTopLevelNode>() .ToList(); } else { var declarations = nodes.SelectMany(GetDeclarations).ToList(); var matchingClasses = declarations.OfType <ClassDeclaration>().Where(x => x.Name == names[i]).DistinctBy(x => x.Name).ToList(); var matchingEnums = declarations.OfType <EnumDeclaration>().Where(y => y.Name == names[i]).ToList(); if (matchingClasses.Count + matchingEnums.Count > 0) { return(matchingClasses.Concat <INode>(matchingEnums).ToList()); } } } } return(new List <INode>()); }