Browse Source

Ctrl-Space completion now shows generic type parameters after class name.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@123 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 21 years ago
parent
commit
f49f5b9f04
  1. 24
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs
  2. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  3. 6
      src/Main/Base/Project/Src/Dom/IClass.cs
  4. 22
      src/Main/Base/Project/Src/Dom/ITypeParameter.cs
  5. 14
      src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
  6. 37
      src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs
  7. 22
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
  8. 7
      src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
  9. 8
      src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs
  10. 5
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs

24
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs

@ -78,7 +78,7 @@ namespace ICSharpCode.Core
} }
string GetModifier(IDecoration decoration) string GetModifier(IDecoration decoration)
{ {
string ret = ""; string ret = "";
if (IncludeHTMLMarkup) { if (IncludeHTMLMarkup) {
@ -122,7 +122,7 @@ namespace ICSharpCode.Core
case ClassType.Struct: case ClassType.Struct:
case ClassType.Enum: case ClassType.Enum:
break; break;
default: default:
builder.Append("sealed "); builder.Append("sealed ");
break; break;
@ -169,7 +169,7 @@ namespace ICSharpCode.Core
builder.Append("<b>"); builder.Append("<b>");
} }
if (UseFullyQualifiedMemberNames) { if (UseFullyQualifiedMemberNames) {
builder.Append(c.FullyQualifiedName); builder.Append(c.FullyQualifiedName);
} else { } else {
builder.Append(c.Name); builder.Append(c.Name);
@ -178,6 +178,14 @@ namespace ICSharpCode.Core
if (IncludeHTMLMarkup) { if (IncludeHTMLMarkup) {
builder.Append("</b>"); builder.Append("</b>");
} }
if (c.TypeParameters.Count > 0) {
builder.Append('<');
for (int i = 0; i < c.TypeParameters.Count; ++i) {
if (i > 0) builder.Append(", ");
builder.Append(c.TypeParameters[i].Name);
}
builder.Append('>');
}
if (c.ClassType == ClassType.Delegate) { if (c.ClassType == ClassType.Delegate) {
builder.Append(" ("); builder.Append(" (");
@ -213,7 +221,7 @@ namespace ICSharpCode.Core
builder.Append("\n{"); builder.Append("\n{");
} }
return builder.ToString(); return builder.ToString();
} }
public override string ConvertEnd(IClass c) public override string ConvertEnd(IClass c)
@ -268,7 +276,7 @@ namespace ICSharpCode.Core
if (IncludeBodies) builder.Append(";"); if (IncludeBodies) builder.Append(";");
return builder.ToString(); return builder.ToString();
} }
public override string Convert(IProperty property) public override string Convert(IProperty property)
@ -303,7 +311,7 @@ namespace ICSharpCode.Core
if (property.Parameters.Count > 0) { if (property.Parameters.Count > 0) {
builder.Append("("); builder.Append("(");
if (IncludeHTMLMarkup) builder.Append("<br>"); if (IncludeHTMLMarkup) builder.Append("<br>");
for (int i = 0; i < property.Parameters.Count; ++i) { for (int i = 0; i < property.Parameters.Count; ++i) {
if (IncludeHTMLMarkup) builder.Append("&nbsp;&nbsp;&nbsp;"); if (IncludeHTMLMarkup) builder.Append("&nbsp;&nbsp;&nbsp;");
builder.Append(Convert(property.Parameters[i])); builder.Append(Convert(property.Parameters[i]));
@ -502,7 +510,7 @@ namespace ICSharpCode.Core
bool linkSet = false; bool linkSet = false;
if (UseLinkArrayList) { if (UseLinkArrayList) {
// TODO: #Assembly dependance: // TODO: #Assembly dependance:
// SharpAssemblyReturnType ret = returnType as SharpAssemblyReturnType; // SharpAssemblyReturnType ret = returnType as SharpAssemblyReturnType;
// if (ret != null) { // if (ret != null) {
// if (ret.UnderlyingClass != null) { // if (ret.UnderlyingClass != null) {
@ -548,7 +556,7 @@ namespace ICSharpCode.Core
if (IncludeHTMLMarkup) { if (IncludeHTMLMarkup) {
builder.Append("<i>"); builder.Append("<i>");
} }
if (param.IsRef) { if (param.IsRef) {
builder.Append("ref "); builder.Append("ref ");
} else if (param.IsOut) { } else if (param.IsOut) {

2
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -639,6 +639,8 @@
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\Publish.cs" /> <Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\Publish.cs" />
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\DebugOptions.cs" /> <Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\DebugOptions.cs" />
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\BuildEvents.cs" /> <Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\BuildEvents.cs" />
<Compile Include="Src\Dom\ITypeParameter.cs" />
<Compile Include="Src\Dom\Implementations\DefaultTypeParameter.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj"> <ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj">

6
src/Main/Base/Project/Src/Dom/IClass.cs

@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop.Dom
ClassType ClassType { ClassType ClassType {
get; get;
} }
/// <summary> /// <summary>
/// The project content in which this class is defined. /// The project content in which this class is defined.
@ -73,6 +73,10 @@ namespace ICSharpCode.SharpDevelop.Dom
List<IEvent> Events { List<IEvent> Events {
get; get;
} }
List<ITypeParameter> TypeParameters {
get;
}
IEnumerable ClassInheritanceTree { IEnumerable ClassInheritanceTree {
get; get;

22
src/Main/Base/Project/Src/Dom/ITypeParameter.cs

@ -0,0 +1,22 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version value="$version"/>
// </file>
using System;
using System.Reflection;
using System.Collections.Generic;
namespace ICSharpCode.SharpDevelop.Dom
{
/// <summary>
/// Type parameter of a generic class/method.
/// </summary>
public interface ITypeParameter
{
string Name { get; }
// TODO: Constraint
}
}

14
src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs

@ -31,6 +31,7 @@ namespace ICSharpCode.SharpDevelop.Dom
List<IMethod> methods = null; List<IMethod> methods = null;
List<IEvent> events = null; List<IEvent> events = null;
List<IIndexer> indexer = null; List<IIndexer> indexer = null;
List<ITypeParameter> typeParameters = null;
public DefaultClass(ICompilationUnit compilationUnit, string fullyQualifiedName) : base(null) public DefaultClass(ICompilationUnit compilationUnit, string fullyQualifiedName) : base(null)
{ {
@ -142,6 +143,15 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
public virtual List<ITypeParameter> TypeParameters {
get {
if (typeParameters == null) {
typeParameters = new List<ITypeParameter>();
}
return typeParameters;
}
}
public virtual int CompareTo(IClass value) public virtual int CompareTo(IClass value)
{ {
int cmp; int cmp;
@ -191,7 +201,7 @@ namespace ICSharpCode.SharpDevelop.Dom
return DiffUtility.Compare(Events, value.Events); return DiffUtility.Compare(Events, value.Events);
} }
int IComparable.CompareTo(object o) int IComparable.CompareTo(object o)
{ {
return CompareTo((IClass)o); return CompareTo((IClass)o);
} }
@ -328,7 +338,7 @@ namespace ICSharpCode.SharpDevelop.Dom
bool isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(this); bool isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(this);
foreach (IClass c in InnerClasses) { foreach (IClass c in InnerClasses) {
if (((c.ClassType == ClassType.Class) || (c.ClassType == ClassType.Struct)) && if (((c.ClassType == ClassType.Class) || (c.ClassType == ClassType.Struct)) &&
c.IsAccessible(callingClass, isClassInInheritanceTree)) { c.IsAccessible(callingClass, isClassInInheritanceTree)) {
types.Add(c); types.Add(c);
} }
} }

37
src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs

@ -0,0 +1,37 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version value="$version"/>
// </file>
using System;
using System.Reflection;
using System.Collections.Generic;
namespace ICSharpCode.SharpDevelop.Dom
{
/// <summary>
/// Type parameter of a generic class/method.
/// </summary>
public class DefaultTypeParameter : ITypeParameter
{
string name;
public string Name {
get {
return name;
}
}
public DefaultTypeParameter(string name)
{
this.name = name;
}
public DefaultTypeParameter(Type type)
{
this.name = type.Name;
}
}
}

22
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs

@ -19,10 +19,10 @@ namespace ICSharpCode.SharpDevelop.Dom
Type type; Type type;
BindingFlags flags = BindingFlags.Instance | BindingFlags flags = BindingFlags.Instance |
BindingFlags.Static | BindingFlags.Static |
BindingFlags.NonPublic | BindingFlags.NonPublic |
BindingFlags.DeclaredOnly | BindingFlags.DeclaredOnly |
BindingFlags.Public; BindingFlags.Public;
public override List<IClass> InnerClasses { public override List<IClass> InnerClasses {
get { get {
@ -137,7 +137,12 @@ namespace ICSharpCode.SharpDevelop.Dom
public ReflectionClass(ICompilationUnit compilationUnit, Type type, IClass declaringType) : base(compilationUnit, declaringType) public ReflectionClass(ICompilationUnit compilationUnit, Type type, IClass declaringType) : base(compilationUnit, declaringType)
{ {
this.type = type; this.type = type;
FullyQualifiedName = type.FullName.Replace('+', '.'); string name = type.FullName.Replace('+', '.');
if (name.Length > 2 && name[name.Length - 2] == '`') {
FullyQualifiedName = name.Substring(0, name.Length - 2);
} else {
FullyQualifiedName = name;
}
// set classtype // set classtype
if (IsDelegate(type)) { if (IsDelegate(type)) {
@ -154,6 +159,11 @@ namespace ICSharpCode.SharpDevelop.Dom
} else { } else {
this.ClassType = ClassType.Class; this.ClassType = ClassType.Class;
} }
if (type.IsGenericTypeDefinition) {
foreach (Type g in type.GetGenericArguments()) {
this.TypeParameters.Add(new DefaultTypeParameter(g));
}
}
ModifierEnum modifiers = ModifierEnum.None; ModifierEnum modifiers = ModifierEnum.None;
@ -192,7 +202,7 @@ namespace ICSharpCode.SharpDevelop.Dom
foreach (Type iface in type.GetInterfaces()) { foreach (Type iface in type.GetInterfaces()) {
BaseTypes.Add(iface.FullName); BaseTypes.Add(iface.FullName);
} }
} }
} }
} }

7
src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs

@ -95,9 +95,6 @@ namespace ICSharpCode.SharpDevelop.Gui
public STAThreadCaller() public STAThreadCaller()
{ {
performCallDelegate = new PerformCallDelegate(DoPerformCall); performCallDelegate = new PerformCallDelegate(DoPerformCall);
#if DEBUG
callerStack = Environment.StackTrace;
#endif
} }
public object Call(object target, string methodName, params object[] arguments) public object Call(object target, string methodName, params object[] arguments)
@ -110,6 +107,10 @@ namespace ICSharpCode.SharpDevelop.Gui
this.methodName = methodName; this.methodName = methodName;
this.arguments = arguments; this.arguments = arguments;
#if DEBUG
callerStack = Environment.StackTrace;
#endif
// TODO: This doesn't look like it's thread-safe, we're calling the target directly! // TODO: This doesn't look like it's thread-safe, we're calling the target directly!
return DoPerformCall(); return DoPerformCall();
} }

8
src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs

@ -48,6 +48,14 @@ namespace ICSharpCode.Core
} else { } else {
builder.Append(c.Name); builder.Append(c.Name);
} }
if (c.TypeParameters.Count > 0) {
builder.Append('<');
for (int i = 0; i < c.TypeParameters.Count; ++i) {
if (i > 0) builder.Append(", ");
builder.Append(c.TypeParameters[i].Name);
}
builder.Append('>');
}
if (c.ClassType == ClassType.Delegate) { if (c.ClassType == ClassType.Delegate) {
builder.Append('('); builder.Append('(');

5
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs

@ -114,8 +114,9 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
// save class (for the delegate description shortcut // save class (for the delegate description shortcut
this.c = c; this.c = c;
imageIndex = ClassBrowserIconService.GetIcon(c); imageIndex = ClassBrowserIconService.GetIcon(c);
text = c.Name; ambience.ConversionFlags = ConversionFlags.None;
completionString = c.Name; text = ambience.Convert(c);
completionString = text;
ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedNames | ConversionFlags.ShowReturnType | ConversionFlags.ShowModifiers; ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedNames | ConversionFlags.ShowReturnType | ConversionFlags.ShowModifiers;
// Console.WriteLine("Convert : " + c); // Console.WriteLine("Convert : " + c);
description = ambience.Convert(c); description = ambience.Convert(c);

Loading…
Cancel
Save