diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj index e6fefd355a..60c5659f48 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj @@ -66,6 +66,7 @@ + diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs index 3721675e25..5ca9372617 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using CSharpBinding.Parser; using ICSharpCode.NRefactory.Completion; +using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp.Completion; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop; @@ -45,41 +46,43 @@ namespace CSharpBinding.Completion return false; } ICompilation compilation = SD.ParserService.GetCompilationForFile(editor.FileName); - var pc = compilation.MainAssembly.UnresolvedAssembly as IProjectContent; - if (pc == null) + var projectContent = compilation.MainAssembly.UnresolvedAssembly as IProjectContent; + if (projectContent == null) return false; - var context = parseInfo.ParsedFile.GetTypeResolveContext(compilation, editor.Caret.Location); - CSharpCompletionEngine cc = new CSharpCompletionEngine( + var completionContextProvider = new DefaultCompletionContextProvider(editor.Document, parseInfo.ParsedFile); + var typeResolveContext = parseInfo.ParsedFile.GetTypeResolveContext(compilation, editor.Caret.Location); + var completionFactory = new CSharpCompletionDataFactory(typeResolveContext); + CSharpCompletionEngine cce = new CSharpCompletionEngine( editor.Document, - new DefaultCompletionContextProvider(editor.Document, parseInfo.ParsedFile), - new CSharpCompletionDataFactory(context), - pc, - context + completionContextProvider, + completionFactory, + projectContent, + typeResolveContext ); - //cc.FormattingPolicy = ? - cc.EolMarker = DocumentUtilitites.GetLineTerminator(editor.Document, editor.Caret.Line); - //cc.IndentString = ? + cce.FormattingPolicy = FormattingOptionsFactory.CreateSharpDevelop(); + cce.EolMarker = DocumentUtilitites.GetLineTerminator(editor.Document, editor.Caret.Line); + cce.IndentString = editor.Options.IndentationString; int startPos, triggerWordLength; IEnumerable completionData; if (ctrlSpace) { - if (!cc.TryGetCompletionWord(editor.Caret.Offset, out startPos, out triggerWordLength)) { + if (!cce.TryGetCompletionWord(editor.Caret.Offset, out startPos, out triggerWordLength)) { startPos = editor.Caret.Offset; triggerWordLength = 0; } - completionData = cc.GetCompletionData(startPos, true); + completionData = cce.GetCompletionData(startPos, true); } else { startPos = editor.Caret.Offset; if (char.IsLetterOrDigit (completionChar) || completionChar == '_') { if (startPos > 1 && char.IsLetterOrDigit (editor.Document.GetCharAt (startPos - 2))) return false; - completionData = cc.GetCompletionData(startPos, false); + completionData = cce.GetCompletionData(startPos, false); startPos--; triggerWordLength = 1; } else { - completionData = cc.GetCompletionData(startPos, false); + completionData = cce.GetCompletionData(startPos, false); triggerWordLength = 0; } } @@ -90,10 +93,27 @@ namespace CSharpBinding.Completion list.SortItems(); list.PreselectionLength = editor.Caret.Offset - startPos; list.PostselectionLength = Math.Max(0, startPos + triggerWordLength - editor.Caret.Offset); - list.SuggestedItem = list.Items.FirstOrDefault(i => i.Text == cc.DefaultCompletionString); + list.SuggestedItem = list.Items.FirstOrDefault(i => i.Text == cce.DefaultCompletionString); editor.ShowCompletionWindow(list); return true; } + + if (!ctrlSpace) { + // Method Insight + var pce = new CSharpParameterCompletionEngine( + editor.Document, + completionContextProvider, + completionFactory, + projectContent, + typeResolveContext + ); + var provider = pce.GetParameterDataProvider(editor.Caret.Offset, completionChar) as CSharpParameterDataProvider; + if (provider != null && provider.items.Count > 0) { + var insightWindow = editor.ShowInsightWindow(provider.items); + insightWindow.StartOffset = provider.StartOffset; + return true; + } + } return false; } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs index f629dd67ad..48d4e76cf2 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using System.Linq; using ICSharpCode.NRefactory.Completion; +using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp.Completion; using ICSharpCode.NRefactory.CSharp.TypeSystem; using ICSharpCode.NRefactory.TypeSystem; @@ -11,7 +13,7 @@ using ICSharpCode.SharpDevelop; namespace CSharpBinding.Completion { - class CSharpCompletionDataFactory : ICompletionDataFactory + class CSharpCompletionDataFactory : ICompletionDataFactory, IParameterCompletionDataFactory { readonly CSharpTypeResolveContext contextAtCaret; @@ -91,7 +93,7 @@ namespace CSharpBinding.Completion public ICompletionData CreateEventCreationCompletionData(string varName, IType delegateType, IEvent evt, string parameterDefinition, IUnresolvedMember currentMember, IUnresolvedTypeDefinition currentType) { - throw new NotImplementedException(); + return new CompletionData("TODO: event creation"); } public ICompletionData CreateNewOverrideCompletionData(int declarationBegin, IUnresolvedTypeDefinition type, IMember m) @@ -101,7 +103,7 @@ namespace CSharpBinding.Completion public ICompletionData CreateNewPartialCompletionData(int declarationBegin, IUnresolvedTypeDefinition type, IUnresolvedMember m) { - throw new NotImplementedException(); + return new CompletionData("TODO: partial completion"); } public IEnumerable CreateCodeTemplateCompletionData() @@ -113,5 +115,34 @@ namespace CSharpBinding.Completion { yield break; } + + #region IParameterCompletionDataFactory implementation + IParameterDataProvider IParameterCompletionDataFactory.CreateConstructorProvider(int startOffset, IType type) + { + IAmbience ambience = AmbienceService.GetCurrentAmbience(); + return new CSharpParameterDataProvider(startOffset, type.GetConstructors().Select(m => new CSharpInsightItem(m, ambience))); + } + + IParameterDataProvider IParameterCompletionDataFactory.CreateMethodDataProvider(int startOffset, IEnumerable methods) + { + IAmbience ambience = AmbienceService.GetCurrentAmbience(); + return new CSharpParameterDataProvider(startOffset, methods.Select(m => new CSharpInsightItem(m, ambience))); + } + + IParameterDataProvider IParameterCompletionDataFactory.CreateDelegateDataProvider(int startOffset, IType type) + { + return new CSharpParameterDataProvider(startOffset, Enumerable.Empty()); + } + + IParameterDataProvider IParameterCompletionDataFactory.CreateIndexerParameterDataProvider(int startOffset, IType type, AstNode resolvedNode) + { + throw new NotImplementedException(); + } + + IParameterDataProvider IParameterCompletionDataFactory.CreateTypeParameterDataProvider(int startOffset, IEnumerable types) + { + throw new NotImplementedException(); + } + #endregion } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs new file mode 100644 index 0000000000..57126a05f7 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs @@ -0,0 +1,86 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.Linq; +using ICSharpCode.NRefactory.Completion; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Editor.CodeCompletion; + +namespace CSharpBinding.Completion +{ + sealed class CSharpInsightItem : IInsightItem + { + public readonly IParameterizedMember Method; + readonly IAmbience ambience; + + public CSharpInsightItem(IParameterizedMember method, IAmbience ambience) + { + this.Method = method; + this.ambience = ambience; + } + + string header; + + public object Header { + get { + if (header == null) { + ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; + header = ambience.ConvertEntity(Method); + } + return header; + } + } + + public object Content { + get { return null; } + } + } + + sealed class CSharpParameterDataProvider : IParameterDataProvider + { + readonly int startOffset; + internal readonly IReadOnlyList items; + + public CSharpParameterDataProvider(int startOffset, IEnumerable items) + { + this.startOffset = startOffset; + this.items = items.ToList(); + } + + int IParameterDataProvider.Count { + get { return items.Count; } + } + + public int StartOffset { + get { return startOffset; } + } + + string IParameterDataProvider.GetHeading(int overload, string[] parameterDescription, int currentParameter) + { + throw new NotImplementedException(); + } + + string IParameterDataProvider.GetDescription(int overload, int currentParameter) + { + throw new NotImplementedException(); + } + + string IParameterDataProvider.GetParameterDescription(int overload, int paramIndex) + { + throw new NotImplementedException(); + } + + int IParameterDataProvider.GetParameterCount(int overload) + { + throw new NotImplementedException(); + } + + bool IParameterDataProvider.AllowParameterList(int overload) + { + throw new NotImplementedException(); + } + } +}