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);