Browse Source

Fix CSharpCompletionDataFactory.CreateTypeCompletionData() for generic types.

pull/48/head
Daniel Grunwald 12 years ago
parent
commit
64eaa25f5e
  1. 1
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
  2. 3
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs
  3. 46
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs
  4. 8
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpMethodInsight.cs
  5. 20
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs
  6. 19
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/EntityCompletionData.cs
  7. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/ImportCompletionData.cs
  8. 6
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/OverrideCompletionData.cs
  9. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/OverrideEqualsGetHashCodeCompletionData.cs
  10. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/OverrideToStringCompletionData.cs
  11. 27
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/TypeCompletionData.cs
  12. 11
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/Images/CompletionImage.cs
  13. 14
      src/Main/Base/Project/Src/Services/ClassBrowserIcons/ClassBrowserIconService.cs

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

@ -77,6 +77,7 @@ @@ -77,6 +77,7 @@
<Compile Include="Src\Completion\OverrideEqualsGetHashCodeCompletionData.cs" />
<Compile Include="Src\Completion\OverrideToStringCompletionData.cs" />
<Compile Include="Src\Completion\SegmentTrackingOutputFormatter.cs" />
<Compile Include="Src\Completion\TypeCompletionData.cs" />
<Compile Include="Src\FormattingStrategy\CSharpFormatter.cs" />
<Compile Include="Src\FormsDesigner\CSharpDesignerGenerator.cs" />
<Compile Include="Src\FormsDesigner\CSharpDesignerLoader.cs" />

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

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.Completion;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Completion;
@ -39,7 +40,7 @@ namespace CSharpBinding.Completion @@ -39,7 +40,7 @@ namespace CSharpBinding.Completion
if (completionContext == null)
return false;
var completionFactory = new CSharpCompletionDataFactory(this, editor, completionContext.TypeResolveContextAtCaret);
var completionFactory = new CSharpCompletionDataFactory(completionContext, new CSharpResolver(completionContext.TypeResolveContextAtCaret));
CSharpCompletionEngine cce = new CSharpCompletionEngine(
editor.Document,
completionContext.CompletionContextProvider,

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

@ -6,6 +6,8 @@ using System.Collections.Generic; @@ -6,6 +6,8 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using ICSharpCode.NRefactory.CSharp.Refactoring;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.Completion;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Completion;
@ -18,18 +20,17 @@ namespace CSharpBinding.Completion @@ -18,18 +20,17 @@ namespace CSharpBinding.Completion
{
sealed class CSharpCompletionDataFactory : ICompletionDataFactory, IParameterCompletionDataFactory
{
readonly CSharpCompletionBinding binding;
readonly ITextEditor editor;
readonly CSharpTypeResolveContext contextAtCaret;
readonly CSharpCompletionContext completionContext;
readonly CSharpResolver contextAtCaret;
readonly TypeSystemAstBuilder builder;
public CSharpCompletionDataFactory(CSharpCompletionBinding binding, ITextEditor editor, CSharpTypeResolveContext contextAtCaret)
public CSharpCompletionDataFactory(CSharpCompletionContext completionContext, CSharpResolver contextAtCaret)
{
Debug.Assert(binding != null);
Debug.Assert(editor != null);
Debug.Assert(completionContext != null);
Debug.Assert(contextAtCaret != null);
this.binding = binding;
this.editor = editor;
this.completionContext = completionContext;
this.contextAtCaret = contextAtCaret;
this.builder = new TypeSystemAstBuilder(contextAtCaret);
}
#region ICompletionDataFactory implementation
@ -48,16 +49,31 @@ namespace CSharpBinding.Completion @@ -48,16 +49,31 @@ namespace CSharpBinding.Completion
ICompletionData ICompletionDataFactory.CreateTypeCompletionData(IType type, bool showFullName, bool isInAttributeContext)
{
var typeDef = type.GetDefinition();
if (typeDef != null)
return new EntityCompletionData(typeDef);
var data = new TypeCompletionData(type);
if (showFullName) {
string text = builder.ConvertType(type).ToString();
data.CompletionText = text;
data.DisplayText = text;
}
if (isInAttributeContext) {
data.CompletionText = StripAttributeSuffix(data.CompletionText);
data.DisplayText = StripAttributeSuffix(data.DisplayText);
}
return data;
}
static string StripAttributeSuffix(string text)
{
if (text.Length > "Attribute".Length && text.EndsWith("Attribute", StringComparison.Ordinal))
return text.Substring(0, text.Length - "Attribute".Length);
else
return new CompletionData(type.Name);
return text;
}
ICompletionData ICompletionDataFactory.CreateMemberCompletionData(IType type, IEntity member)
{
return new CompletionData(type.Name + "." + member.Name);
string typeName = builder.ConvertType(type).ToString();
return new CompletionData(typeName + "." + member.Name);
}
ICompletionData ICompletionDataFactory.CreateLiteralCompletionData(string title, string description, string insertText)
@ -116,7 +132,7 @@ namespace CSharpBinding.Completion @@ -116,7 +132,7 @@ namespace CSharpBinding.Completion
IEnumerable<ICompletionData> ICompletionDataFactory.CreatePreProcessorDefinesCompletionData()
{
yield break;
return completionContext.ParseInformation.SyntaxTree.ConditionalSymbols.Select(def => new CompletionData(def));
}
ICompletionData ICompletionDataFactory.CreateImportCompletionData(IType type, bool useFullName)
@ -132,7 +148,7 @@ namespace CSharpBinding.Completion @@ -132,7 +148,7 @@ namespace CSharpBinding.Completion
#region IParameterCompletionDataFactory implementation
IParameterDataProvider CreateMethodDataProvider(int startOffset, IEnumerable<IParameterizedMember> methods)
{
return new CSharpMethodInsight(binding, editor, startOffset, from m in methods where m != null select new CSharpInsightItem(m));
return new CSharpMethodInsight(completionContext.Editor, startOffset, from m in methods where m != null select new CSharpInsightItem(m));
}
IParameterDataProvider IParameterCompletionDataFactory.CreateConstructorProvider(int startOffset, IType type)

8
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpMethodInsight.cs

@ -6,6 +6,7 @@ using System.Collections.Generic; @@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.Completion;
using ICSharpCode.NRefactory.CSharp.Completion;
using ICSharpCode.SharpDevelop;
@ -18,17 +19,14 @@ namespace CSharpBinding.Completion @@ -18,17 +19,14 @@ namespace CSharpBinding.Completion
{
readonly int startOffset;
internal readonly IReadOnlyList<CSharpInsightItem> items;
readonly CSharpCompletionBinding binding;
readonly ITextEditor editor;
IInsightWindow window;
CSharpInsightItem initiallySelectedItem;
public CSharpMethodInsight(CSharpCompletionBinding binding, ITextEditor editor, int startOffset, IEnumerable<CSharpInsightItem> items)
public CSharpMethodInsight(ITextEditor editor, int startOffset, IEnumerable<CSharpInsightItem> items)
{
Debug.Assert(binding != null);
Debug.Assert(editor != null);
Debug.Assert(items != null);
this.binding = binding;
this.editor = editor;
this.startOffset = startOffset;
this.items = items.ToList();
@ -52,7 +50,7 @@ namespace CSharpBinding.Completion @@ -52,7 +50,7 @@ namespace CSharpBinding.Completion
window.Close();
return;
}
var completionFactory = new CSharpCompletionDataFactory(binding, editor, completionContext.TypeResolveContextAtCaret);
var completionFactory = new CSharpCompletionDataFactory(completionContext, new CSharpResolver(completionContext.TypeResolveContextAtCaret));
var pce = new CSharpParameterCompletionEngine(
editor.Document,
completionContext.CompletionContextProvider,

20
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs

@ -12,7 +12,7 @@ namespace CSharpBinding.Completion @@ -12,7 +12,7 @@ namespace CSharpBinding.Completion
{
class CompletionData : ICompletionData, ICompletionItem, IFancyCompletionItem
{
public CompletionData(string text = "")
public CompletionData(string text = "")
{
this.DisplayText = text;
this.CompletionText = text;
@ -29,6 +29,23 @@ namespace CSharpBinding.Completion @@ -29,6 +29,23 @@ namespace CSharpBinding.Completion
set { displayFlags = value; }
}
// List<ICompletionData> overloads;
//
// public virtual void AddOverload(ICompletionData data)
// {
// if (overloads == null)
// overloads = new List<ICompletionData>();
// overloads.Add(data);
// }
//
// public virtual bool HasOverloads {
// get { return overloads != null && overloads.Count > 0; }
// }
//
// public virtual IEnumerable<ICompletionData> OverloadedData {
// get { return overloads ?? EmptyList<ICompletionData>.Instance; }
// }
public virtual bool HasOverloads { get { return false; } }
public virtual IEnumerable<ICompletionData> OverloadedData {
@ -37,7 +54,6 @@ namespace CSharpBinding.Completion @@ -37,7 +54,6 @@ namespace CSharpBinding.Completion
public virtual void AddOverload(ICompletionData data)
{
//throw new InvalidOperationException();
}
string ICompletionItem.Text {

19
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/EntityCompletionData.cs

@ -17,28 +17,11 @@ namespace CSharpBinding.Completion @@ -17,28 +17,11 @@ namespace CSharpBinding.Completion
get { return entity; }
}
public EntityCompletionData(IEntity entity)
public EntityCompletionData(IEntity entity) : base(entity.Name)
{
this.entity = entity;
this.CompletionText = entity.Name;
this.DisplayText = entity.Name;
this.Description = entity.Documentation;
this.Image = ClassBrowserIconService.GetIcon(entity);
}
List<ICompletionData> overloads = new List<ICompletionData>();
public override void AddOverload(ICompletionData data)
{
overloads.Add(data);
}
public override bool HasOverloads {
get { return overloads.Count > 0; }
}
public override IEnumerable<ICompletionData> OverloadedData {
get { return overloads; }
}
}
}

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/ImportCompletionData.cs

@ -24,12 +24,12 @@ namespace CSharpBinding.Completion @@ -24,12 +24,12 @@ namespace CSharpBinding.Completion
string insertUsing;
string insertionText;
public ImportCompletionData(ITypeDefinition typeDef, CSharpTypeResolveContext contextAtCaret, bool useFullName)
public ImportCompletionData(ITypeDefinition typeDef, CSharpResolver contextAtCaret, bool useFullName)
: base(typeDef)
{
this.Description = "using " + typeDef.Namespace + ";";
if (useFullName) {
var astBuilder = new TypeSystemAstBuilder(new CSharpResolver(contextAtCaret));
var astBuilder = new TypeSystemAstBuilder(contextAtCaret);
insertionText = astBuilder.ConvertType(typeDef).ToString();
} else {
insertionText = typeDef.Name;

6
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/OverrideCompletionData.cs

@ -25,9 +25,9 @@ namespace CSharpBinding.Completion @@ -25,9 +25,9 @@ namespace CSharpBinding.Completion
class OverrideCompletionData : EntityCompletionData
{
protected readonly int declarationBegin;
protected readonly CSharpTypeResolveContext contextAtCaret;
protected readonly CSharpResolver contextAtCaret;
public OverrideCompletionData(int declarationBegin, IMember m, CSharpTypeResolveContext contextAtCaret)
public OverrideCompletionData(int declarationBegin, IMember m, CSharpResolver contextAtCaret)
: base(m)
{
this.declarationBegin = declarationBegin;
@ -44,7 +44,7 @@ namespace CSharpBinding.Completion @@ -44,7 +44,7 @@ namespace CSharpBinding.Completion
return;
}
TypeSystemAstBuilder b = new TypeSystemAstBuilder(new CSharpResolver(contextAtCaret));
TypeSystemAstBuilder b = new TypeSystemAstBuilder(contextAtCaret);
b.ShowTypeParameterConstraints = false;
b.GenerateBody = true;

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/OverrideEqualsGetHashCodeCompletionData.cs

@ -30,7 +30,7 @@ namespace CSharpBinding.Completion @@ -30,7 +30,7 @@ namespace CSharpBinding.Completion
/// </summary>
class OverrideEqualsGetHashCodeCompletionData : OverrideCompletionData
{
public OverrideEqualsGetHashCodeCompletionData(int declarationBegin, IMember m, CSharpTypeResolveContext contextAtCaret)
public OverrideEqualsGetHashCodeCompletionData(int declarationBegin, IMember m, CSharpResolver contextAtCaret)
: base(declarationBegin, m, contextAtCaret)
{
}
@ -42,7 +42,7 @@ namespace CSharpBinding.Completion @@ -42,7 +42,7 @@ namespace CSharpBinding.Completion
return;
}
TypeSystemAstBuilder b = new TypeSystemAstBuilder(new CSharpResolver(contextAtCaret));
TypeSystemAstBuilder b = new TypeSystemAstBuilder(contextAtCaret);
b.ShowTypeParameterConstraints = false;
b.GenerateBody = true;

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/OverrideToStringCompletionData.cs

@ -26,7 +26,7 @@ namespace CSharpBinding.Completion @@ -26,7 +26,7 @@ namespace CSharpBinding.Completion
/// </summary>
class OverrideToStringCompletionData : OverrideCompletionData
{
public OverrideToStringCompletionData(int declarationBegin, IMember m, CSharpTypeResolveContext contextAtCaret)
public OverrideToStringCompletionData(int declarationBegin, IMember m, CSharpResolver contextAtCaret)
: base(declarationBegin, m, contextAtCaret)
{
}
@ -38,7 +38,7 @@ namespace CSharpBinding.Completion @@ -38,7 +38,7 @@ namespace CSharpBinding.Completion
return;
}
TypeSystemAstBuilder b = new TypeSystemAstBuilder(new CSharpResolver(contextAtCaret));
TypeSystemAstBuilder b = new TypeSystemAstBuilder(contextAtCaret);
b.ShowTypeParameterConstraints = false;
b.GenerateBody = true;

27
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/TypeCompletionData.cs

@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
// 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 ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop;
namespace CSharpBinding.Completion
{
class TypeCompletionData : CompletionData
{
readonly IType type;
public IType Type {
get { return type; }
}
public TypeCompletionData(IType type) : base(type.Name)
{
this.type = type;
ITypeDefinition typeDef = type.GetDefinition();
if (typeDef != null)
this.Description = typeDef.Documentation;
this.Image = ClassBrowserIconService.GetIcon(type);
}
}
}

11
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/Images/CompletionImage.cs

@ -2,11 +2,13 @@ @@ -2,11 +2,13 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
namespace ICSharpCode.AvalonEdit.CodeCompletion
{
@ -135,6 +137,10 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion @@ -135,6 +137,10 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
return field.IsReadOnly ? imageFieldReadOnly : imageField;
case SymbolKind.Method:
IMethod method = (IMethod)entity;
if (method.IsExtensionMethod)
return imageExtensionMethod;
if (method.IsStatic && method.Attributes.Any(a => a.AttributeType.Name == "DllImportAttribute"))
return imagePInvokeMethod;
return method.IsOverridable ? imageVirtualMethod : imageMethod;
case SymbolKind.Property:
return imageProperty;
@ -174,6 +180,11 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion @@ -174,6 +180,11 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
return field.IsReadOnly ? imageFieldReadOnly : imageField;
case SymbolKind.Method:
IUnresolvedMethod method = (IUnresolvedMethod)entity;
// We cannot reliably detect extension methods in the unresolved type system (e.g. in VB we need to resolve an attribute),
// but at least we can do it for C#:
var defMethod = method as DefaultUnresolvedMethod;
if (defMethod != null && defMethod.IsExtensionMethod)
return imageExtensionMethod;
return method.IsOverridable ? imageVirtualMethod : imageMethod;
case SymbolKind.Property:
return imageProperty;

14
src/Main/Base/Project/Src/Services/ClassBrowserIcons/ClassBrowserIconService.cs

@ -66,6 +66,20 @@ namespace ICSharpCode.SharpDevelop @@ -66,6 +66,20 @@ namespace ICSharpCode.SharpDevelop
{
return GetIcon((IEntity)v);
}
public static IImage GetIcon(IType t)
{
ITypeDefinition def = t.GetDefinition();
if (def != null)
return GetIcon(def);
else
return null;
}
public static IImage GetIcon(ITypeDefinition t)
{
return GetIImage(CompletionImage.GetImage(t));
}
#endregion
public static IImage Namespace { get { return GetIImage(CompletionImage.NamespaceImage); } }

Loading…
Cancel
Save