Browse Source

Implement method insight.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
3c507ab423
  1. 1
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
  2. 52
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs
  3. 37
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs
  4. 86
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs

1
src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj

@ -66,6 +66,7 @@ @@ -66,6 +66,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\Completion\CSharpInsightItem.cs" />
<Compile Include="Src\Completion\OverrideCompletionData.cs" />
<Compile Include="Src\Completion\SegmentTrackingOutputFormatter.cs" />
<Compile Include="Src\Refactoring\InsertionPoint.cs" />

52
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs

@ -6,6 +6,7 @@ using System.Collections.Generic; @@ -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 @@ -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<ICompletionData> 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 @@ -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;
}
}

37
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs

@ -3,7 +3,9 @@ @@ -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; @@ -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 @@ -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 @@ -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<ICompletionData> CreateCodeTemplateCompletionData()
@ -113,5 +115,34 @@ namespace CSharpBinding.Completion @@ -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<IMethod> 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<CSharpInsightItem>());
}
IParameterDataProvider IParameterCompletionDataFactory.CreateIndexerParameterDataProvider(int startOffset, IType type, AstNode resolvedNode)
{
throw new NotImplementedException();
}
IParameterDataProvider IParameterCompletionDataFactory.CreateTypeParameterDataProvider(int startOffset, IEnumerable<IType> types)
{
throw new NotImplementedException();
}
#endregion
}
}

86
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs

@ -0,0 +1,86 @@ @@ -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<CSharpInsightItem> items;
public CSharpParameterDataProvider(int startOffset, IEnumerable<CSharpInsightItem> 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();
}
}
}
Loading…
Cancel
Save