diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs
index a636617a76..9808062ce8 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs
@@ -78,7 +78,7 @@ namespace ICSharpCode.Core
}
string GetModifier(IDecoration decoration)
- {
+ {
string ret = "";
if (IncludeHTMLMarkup) {
@@ -122,7 +122,7 @@ namespace ICSharpCode.Core
case ClassType.Struct:
case ClassType.Enum:
break;
-
+
default:
builder.Append("sealed ");
break;
@@ -169,7 +169,7 @@ namespace ICSharpCode.Core
builder.Append("");
}
- if (UseFullyQualifiedMemberNames) {
+ if (UseFullyQualifiedMemberNames) {
builder.Append(c.FullyQualifiedName);
} else {
builder.Append(c.Name);
@@ -178,6 +178,14 @@ namespace ICSharpCode.Core
if (IncludeHTMLMarkup) {
builder.Append("");
}
+ 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) {
builder.Append(" (");
@@ -213,7 +221,7 @@ namespace ICSharpCode.Core
builder.Append("\n{");
}
- return builder.ToString();
+ return builder.ToString();
}
public override string ConvertEnd(IClass c)
@@ -268,7 +276,7 @@ namespace ICSharpCode.Core
if (IncludeBodies) builder.Append(";");
- return builder.ToString();
+ return builder.ToString();
}
public override string Convert(IProperty property)
@@ -303,7 +311,7 @@ namespace ICSharpCode.Core
if (property.Parameters.Count > 0) {
builder.Append("(");
if (IncludeHTMLMarkup) builder.Append("
");
-
+
for (int i = 0; i < property.Parameters.Count; ++i) {
if (IncludeHTMLMarkup) builder.Append(" ");
builder.Append(Convert(property.Parameters[i]));
@@ -502,7 +510,7 @@ namespace ICSharpCode.Core
bool linkSet = false;
if (UseLinkArrayList) {
-// TODO: #Assembly dependance:
+// TODO: #Assembly dependance:
// SharpAssemblyReturnType ret = returnType as SharpAssemblyReturnType;
// if (ret != null) {
// if (ret.UnderlyingClass != null) {
@@ -548,7 +556,7 @@ namespace ICSharpCode.Core
if (IncludeHTMLMarkup) {
builder.Append("");
}
-
+
if (param.IsRef) {
builder.Append("ref ");
} else if (param.IsOut) {
diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
index ad1430ad05..01516908e1 100644
--- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
+++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
@@ -639,6 +639,8 @@
+
+
diff --git a/src/Main/Base/Project/Src/Dom/IClass.cs b/src/Main/Base/Project/Src/Dom/IClass.cs
index 853a5d9869..9713fb56f2 100644
--- a/src/Main/Base/Project/Src/Dom/IClass.cs
+++ b/src/Main/Base/Project/Src/Dom/IClass.cs
@@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop.Dom
ClassType ClassType {
get;
- }
+ }
///
/// The project content in which this class is defined.
@@ -73,6 +73,10 @@ namespace ICSharpCode.SharpDevelop.Dom
List Events {
get;
}
+
+ List TypeParameters {
+ get;
+ }
IEnumerable ClassInheritanceTree {
get;
diff --git a/src/Main/Base/Project/Src/Dom/ITypeParameter.cs b/src/Main/Base/Project/Src/Dom/ITypeParameter.cs
new file mode 100644
index 0000000000..0ad38d04ec
--- /dev/null
+++ b/src/Main/Base/Project/Src/Dom/ITypeParameter.cs
@@ -0,0 +1,22 @@
+//
+//
+//
+//
+//
+//
+
+using System;
+using System.Reflection;
+using System.Collections.Generic;
+
+namespace ICSharpCode.SharpDevelop.Dom
+{
+ ///
+ /// Type parameter of a generic class/method.
+ ///
+ public interface ITypeParameter
+ {
+ string Name { get; }
+ // TODO: Constraint
+ }
+}
diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
index 43f869e15a..fc32865d92 100644
--- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
+++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
@@ -31,6 +31,7 @@ namespace ICSharpCode.SharpDevelop.Dom
List methods = null;
List events = null;
List indexer = null;
+ List typeParameters = null;
public DefaultClass(ICompilationUnit compilationUnit, string fullyQualifiedName) : base(null)
{
@@ -142,6 +143,15 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
+ public virtual List TypeParameters {
+ get {
+ if (typeParameters == null) {
+ typeParameters = new List();
+ }
+ return typeParameters;
+ }
+ }
+
public virtual int CompareTo(IClass value)
{
int cmp;
@@ -191,7 +201,7 @@ namespace ICSharpCode.SharpDevelop.Dom
return DiffUtility.Compare(Events, value.Events);
}
- int IComparable.CompareTo(object o)
+ int IComparable.CompareTo(object o)
{
return CompareTo((IClass)o);
}
@@ -328,7 +338,7 @@ namespace ICSharpCode.SharpDevelop.Dom
bool isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(this);
foreach (IClass c in InnerClasses) {
if (((c.ClassType == ClassType.Class) || (c.ClassType == ClassType.Struct)) &&
- c.IsAccessible(callingClass, isClassInInheritanceTree)) {
+ c.IsAccessible(callingClass, isClassInInheritanceTree)) {
types.Add(c);
}
}
diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs
new file mode 100644
index 0000000000..136542f190
--- /dev/null
+++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs
@@ -0,0 +1,37 @@
+//
+//
+//
+//
+//
+//
+
+using System;
+using System.Reflection;
+using System.Collections.Generic;
+
+namespace ICSharpCode.SharpDevelop.Dom
+{
+ ///
+ /// Type parameter of a generic class/method.
+ ///
+ 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;
+ }
+ }
+}
diff --git a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
index 19589684cf..2dbd986e2c 100644
--- a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
+++ b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
@@ -19,10 +19,10 @@ namespace ICSharpCode.SharpDevelop.Dom
Type type;
BindingFlags flags = BindingFlags.Instance |
- BindingFlags.Static |
- BindingFlags.NonPublic |
- BindingFlags.DeclaredOnly |
- BindingFlags.Public;
+ BindingFlags.Static |
+ BindingFlags.NonPublic |
+ BindingFlags.DeclaredOnly |
+ BindingFlags.Public;
public override List InnerClasses {
get {
@@ -137,7 +137,12 @@ namespace ICSharpCode.SharpDevelop.Dom
public ReflectionClass(ICompilationUnit compilationUnit, Type type, IClass declaringType) : base(compilationUnit, declaringType)
{
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
if (IsDelegate(type)) {
@@ -154,6 +159,11 @@ namespace ICSharpCode.SharpDevelop.Dom
} else {
this.ClassType = ClassType.Class;
}
+ if (type.IsGenericTypeDefinition) {
+ foreach (Type g in type.GetGenericArguments()) {
+ this.TypeParameters.Add(new DefaultTypeParameter(g));
+ }
+ }
ModifierEnum modifiers = ModifierEnum.None;
@@ -192,7 +202,7 @@ namespace ICSharpCode.SharpDevelop.Dom
foreach (Type iface in type.GetInterfaces()) {
BaseTypes.Add(iface.FullName);
}
-
+
}
}
}
diff --git a/src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs b/src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
index 38883ea92e..9a0c6db44d 100644
--- a/src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
+++ b/src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
@@ -95,9 +95,6 @@ namespace ICSharpCode.SharpDevelop.Gui
public STAThreadCaller()
{
performCallDelegate = new PerformCallDelegate(DoPerformCall);
- #if DEBUG
- callerStack = Environment.StackTrace;
- #endif
}
public object Call(object target, string methodName, params object[] arguments)
@@ -110,6 +107,10 @@ namespace ICSharpCode.SharpDevelop.Gui
this.methodName = methodName;
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!
return DoPerformCall();
}
diff --git a/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs b/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs
index 96ec3608a4..5a196abcc6 100644
--- a/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs
+++ b/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs
@@ -48,6 +48,14 @@ namespace ICSharpCode.Core
} else {
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) {
builder.Append('(');
diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs
index 929bad8407..2411c77dd3 100644
--- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs
+++ b/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
this.c = c;
imageIndex = ClassBrowserIconService.GetIcon(c);
- text = c.Name;
- completionString = c.Name;
+ ambience.ConversionFlags = ConversionFlags.None;
+ text = ambience.Convert(c);
+ completionString = text;
ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedNames | ConversionFlags.ShowReturnType | ConversionFlags.ShowModifiers;
// Console.WriteLine("Convert : " + c);
description = ambience.Convert(c);