Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
        /// <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)));
        }
Beispiel #3
0
        /// <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);
        }