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); }
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); } }