Exemplo n.º 1
0
        IInsightWindow ShowInsight(ITextEditor editor, IList <IInsightItem> insightItems, ICollection <ResolveResult> parameters, char charTyped)
        {
            int paramCount = parameters.Count;

            if (insightItems == null || insightItems.Count == 0)
            {
                return(null);
            }
            bool overloadIsSure;
            int  defaultIndex;

            if (insightItems.Count == 1)
            {
                overloadIsSure = true;
                defaultIndex   = 0;
            }
            else
            {
                var           methods       = insightItems.Select(item => GetMethodFromInsightItem(item)).ToList();
                IReturnType[] argumentTypes = new IReturnType[paramCount + 1];
                int           i             = 0;
                foreach (ResolveResult rr in parameters)
                {
                    if (rr != null)
                    {
                        argumentTypes[i] = rr.ResolvedType;
                    }
                    i++;
                }
                IMethodOrProperty result = OverloadResolution.FindOverload(methods.Where(m => m != null), argumentTypes, true, false, out overloadIsSure);
                defaultIndex = methods.IndexOf(result);
            }

            IInsightWindow insightWindow = editor.ShowInsightWindow(insightItems);

            if (insightWindow != null)
            {
                InitializeOpenedInsightWindow(editor, insightWindow);
                insightWindow.SelectedItem = insightItems[defaultIndex];
            }
            if (overloadIsSure)
            {
                IMethodOrProperty method = GetMethodFromInsightItem(insightItems[defaultIndex]);
                if (method != null && paramCount < method.Parameters.Count)
                {
                    IParameter param = method.Parameters[paramCount];
                    ProvideContextCompletion(editor, param.ReturnType, charTyped);
                }
            }
            return(insightWindow);
        }
Exemplo n.º 2
0
        public void SetupDataProvider(string fileName, TextArea textArea)
        {
            FActiveTextArea = textArea;
            FMethods.Clear();

            var document        = textArea.Document;
            var csDoc           = FEditor.TextDocument as CSDocument;
            var parseInfo       = csDoc.ParseInfo;
            var finder          = csDoc.ExpressionFinder;
            var compilationUnit = parseInfo.MostRecentCompilationUnit;
            var projectContent  = compilationUnit.ProjectContent;
            var language        = projectContent.Language;

            var expressionResult = finder.FindExpression(document.TextContent, FOffset);

            Debug.WriteLine(string.Format("Generating C# method insight data for expression: {0}", expressionResult));

            var resolver      = new NRefactoryResolver(language);
            var resolveResult = resolver.Resolve(expressionResult, parseInfo, csDoc.TextContent);

            if (resolveResult != null)
            {
                Debug.WriteLine(string.Format("Resolve result: {0}", resolveResult));

                var methodGroupResolveResult = resolveResult as MethodGroupResolveResult;
                if (methodGroupResolveResult == null)
                {
                    return;
                }

                bool classIsInInheritanceTree = false;
                var  callingClass             = methodGroupResolveResult.CallingClass;
                if (callingClass != null)
                {
                    classIsInInheritanceTree = callingClass.IsTypeInInheritanceTree(methodGroupResolveResult.ContainingType.GetUnderlyingClass());
                }

                foreach (var methodGroup in  methodGroupResolveResult.Methods)
                {
                    foreach (var method in methodGroup)
                    {
                        if (language.NameComparer.Equals(method.Name, methodGroupResolveResult.Name))
                        {
                            if (method.IsAccessible(methodGroupResolveResult.CallingClass, classIsInInheritanceTree))
                            {
                                FMethods.Add(method);
                            }
                        }
                    }
                }

                // Set default index dependant on parameters.
                var arguments = new List <IReturnType>();

                foreach (var commaOffset in FCommaOffsets)
                {
                    var argumentExpression = finder.FindExpression(document.TextContent, commaOffset);
                    var argResolveResult   = resolver.Resolve(argumentExpression, parseInfo, document.TextContent);
                    if (argResolveResult != null)
                    {
                        arguments.Add(argResolveResult.ResolvedType);
                        Debug.WriteLine(string.Format("Parameter: {0}", argResolveResult));
                    }
                }

                bool overloadIsSure;
                var  bestMatchingMethod = OverloadResolution.FindOverload(FMethods, arguments.ToArray(), true, false, out overloadIsSure);
                DefaultIndex = FMethods.IndexOf(bestMatchingMethod);
            }
        }