/// <inheritdoc /> public override IEnumerable <TypeMethodInfo> FindMethods(string searchedName) { var methods = new List <TypeMethodInfo>(); //firstly we test current nodes (because of implicit ctors,..) IEnumerable <ElementPosition> nextElements; if (_currentElements == null) { //searched name will be tested when filling matching info nextElements = ElementPosition.ExtendElements(_assembly.RootElements, null); } else { fillWithMatchingInfo(searchedName, _currentElements, methods); //searched name will be tested when filling matching info nextElements = ElementPosition.ExtendElements(_currentElements, null); } fillWithMatchingInfo(searchedName, nextElements, methods); var path = PathInfo.Append(_currentPath, searchedName); //resolve generic specializations foreach (var method in methods) { var resolvedMethod = method; if (_currentPath != null && _currentPath.HasGenericArguments) { resolvedMethod = method.MakeGenericMethod(path); } yield return(resolvedMethod); } }
/// <inheritdoc /> public override SearchIterator ExtendName(string suffix) { if (suffix == "") { return(this); } IEnumerable <ElementPosition> extendedPositions; if (_currentElements == null) { //position has not been currently set - use root elements //Root element iteration IS PERFORMANCE KILLER - IS IT POSSIBLE TO WORKAROUND VISUAL STUDIO THREADING MODEL? extendedPositions = ElementPosition.ExtendElements(_assembly.RootElements, suffix); } else { //we already have initial position extendedPositions = ElementPosition.ExtendElements(_currentElements, suffix); } if (!extendedPositions.Any()) { return(null); } return(new CodeElementIterator(extendedPositions, _assembly, PathInfo.Append(_currentPath, suffix))); }
/// <summary> /// Search first <see cref="CodeElement"/> with given path. /// </summary> /// <param name="path">Search path</param> /// <returns>First <see cref="CodeElement"/> found with sufficient path</returns> internal IEnumerable <CodeElement> Search(string path) { var pathSignature = PathInfo.GetSignature(path); var pathParts = pathSignature.Split(Naming.PathDelimiter); var pathLength = pathParts.Length; if (pathLength == 0) { //the path is empty return(null); } var result = new List <CodeElement>(); //traverse elements IEnumerable <ElementPosition> currentElements = null; for (var i = 0; i < pathLength; ++i) { var isLastPart = i + 1 == pathLength; var currentPart = pathParts[i]; var genericIndex = currentPart.IndexOf('<'); if (genericIndex > 0) { currentPart = currentPart.Substring(0, genericIndex); } //extend next element if (currentElements == null) { currentElements = ElementPosition.ExtendElements(_searchedAssembly.RootElements, currentPart); } else { currentElements = ElementPosition.ExtendElements(currentElements, currentPart); } if (!currentElements.Any()) { //there are no available elements break; } } foreach (var element in currentElements) { if (element.IsEnd) { result.Add(element.Element); } } return(result); }