Browse Source

Fixed SD2-1066: Invalid event handler generated for delegate's ref parameter

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2116 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
988ddfc1de
  1. 27
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs
  2. 35
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/CSharpDesignerGenerator.cs
  3. 34
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/VBNetDesignerGenerator.cs
  4. 8
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs
  5. 8
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs
  6. 2
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionParameter.cs
  7. 2
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionReturnType.cs

27
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs

@ -21,6 +21,7 @@ using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.TextEditor.Document; using ICSharpCode.TextEditor.Document;
using ReflectionLayer = ICSharpCode.SharpDevelop.Dom.ReflectionLayer;
namespace ICSharpCode.FormsDesigner namespace ICSharpCode.FormsDesigner
{ {
@ -397,6 +398,32 @@ namespace ICSharpCode.FormsDesigner
return true; return true;
} }
/// <summary>
/// Gets a method implementing the signature specified by the event descriptor
/// </summary>
protected IMethod ConvertDescriptorToDom(EventDescriptor edesc, string methodName)
{
MethodInfo mInfo = edesc.EventType.GetMethod("Invoke");
DefaultMethod m = new DefaultMethod(completeClass, methodName);
m.ReturnType = ReflectionLayer.ReflectionReturnType.Create(m, mInfo.ReturnType, false);
foreach (ParameterInfo pInfo in mInfo.GetParameters()) {
m.Parameters.Add(new ReflectionLayer.ReflectionParameter(pInfo, m));
}
return m;
}
/// <summary>
/// Gets a method implementing the signature specified by the event descriptor
/// </summary>
protected ICSharpCode.NRefactory.Ast.MethodDeclaration
ConvertDescriptorToNRefactory(EventDescriptor edesc, string methodName)
{
return ICSharpCode.SharpDevelop.Dom.Refactoring.CodeGenerator.ConvertMember(
ConvertDescriptorToDom(edesc, methodName),
new ClassFinder(c, c.BodyRegion.BeginLine + 1, 1)
) as ICSharpCode.NRefactory.Ast.MethodDeclaration;
}
protected virtual int GetEventHandlerInsertionLine(IClass c) protected virtual int GetEventHandlerInsertionLine(IClass c)
{ {
return c.Region.EndLine; return c.Region.EndLine;

35
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/CSharpDesignerGenerator.cs

@ -13,6 +13,8 @@ using System.Text;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.PrettyPrinter;
namespace ICSharpCode.FormsDesigner namespace ICSharpCode.FormsDesigner
{ {
@ -68,35 +70,14 @@ namespace ICSharpCode.FormsDesigner
return r.BeginLine + 2; return r.BeginLine + 2;
} }
protected static string GenerateParams(EventDescriptor edesc, bool paramNames) protected string GenerateParams(EventDescriptor edesc, bool paramNames)
{ {
System.Type type = edesc.EventType; CSharpOutputVisitor v = new CSharpOutputVisitor();
MethodInfo mInfo = type.GetMethod("Invoke"); MethodDeclaration md = ConvertDescriptorToNRefactory(edesc, "name");
string param = ""; if (md != null) {
IAmbience csa = null; v.AppendCommaSeparatedList(md.Parameters);
try {
csa = (IAmbience)AddInTree.BuildItem("/SharpDevelop/Workbench/Ambiences/C#", null);
} catch (TreePathNotFoundException) {
LoggingService.Warn("C# ambience not found");
} }
return v.Text;
for (int i = 0; i < mInfo.GetParameters().Length; ++i) {
ParameterInfo pInfo = mInfo.GetParameters()[i];
string typeStr = pInfo.ParameterType.ToString();
if (csa != null) {
typeStr = csa.GetIntrinsicTypeName(typeStr);
}
param += typeStr;
if (paramNames == true) {
param += " ";
param += pInfo.Name;
}
if (i + 1 < mInfo.GetParameters().Length) {
param += ", ";
}
}
return param;
} }
} }
} }

34
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/VBNetDesignerGenerator.cs

@ -12,6 +12,8 @@ using System.Text;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.PrettyPrinter;
namespace ICSharpCode.FormsDesigner namespace ICSharpCode.FormsDesigner
{ {
@ -45,34 +47,14 @@ namespace ICSharpCode.FormsDesigner
return b.ToString(); return b.ToString();
} }
protected static string GenerateParams(EventDescriptor edesc) protected string GenerateParams(EventDescriptor edesc)
{ {
System.Type type = edesc.EventType; VBNetOutputVisitor v = new VBNetOutputVisitor();
MethodInfo mInfo = type.GetMethod("Invoke"); MethodDeclaration md = ConvertDescriptorToNRefactory(edesc, "name");
string param = ""; if (md != null) {
IAmbience csa = null; v.AppendCommaSeparatedList(md.Parameters);
try {
csa = (IAmbience)AddInTree.BuildItem("/SharpDevelop/Workbench/Ambiences/VBNet", null);
} catch (TreePathNotFoundException) {
LoggingService.Warn("VB ambience not found");
} }
return v.Text;
for (int i = 0; i < mInfo.GetParameters().Length; ++i) {
ParameterInfo pInfo = mInfo.GetParameters()[i];
param += pInfo.Name;
param += " As ";
string typeStr = pInfo.ParameterType.ToString();
if (csa != null) {
typeStr = csa.GetIntrinsicTypeName(typeStr);
}
param += typeStr;
if (i + 1 < mInfo.GetParameters().Length) {
param += ", ";
}
}
return param;
} }
} }
} }

8
src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs

@ -2472,11 +2472,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
} }
} }
void AppendCommaSeparatedList(IList list) public void AppendCommaSeparatedList<T>(ICollection<T> list) where T : class, INode
{ {
if (list != null) { if (list != null) {
for (int i = 0; i < list.Count; ++i) { int i = 0;
nodeTracker.TrackedVisit(((INode)list[i]), null); foreach (T node in list) {
nodeTracker.TrackedVisit(node, null);
if (i + 1 < list.Count) { if (i + 1 < list.Count) {
PrintFormattedComma(); PrintFormattedComma();
} }
@ -2484,6 +2485,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
outputFormatter.NewLine(); outputFormatter.NewLine();
outputFormatter.Indent(); outputFormatter.Indent();
} }
i++;
} }
} }
} }

8
src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs

@ -2646,11 +2646,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
} }
} }
void AppendCommaSeparatedList(IList list) public void AppendCommaSeparatedList<T>(ICollection<T> list) where T : class, INode
{ {
if (list != null) { if (list != null) {
for (int i = 0; i < list.Count; ++i) { int i = 0;
nodeTracker.TrackedVisit(((INode)list[i]), null); foreach (T node in list) {
nodeTracker.TrackedVisit(node, null);
if (i + 1 < list.Count) { if (i + 1 < list.Count) {
outputFormatter.PrintToken(Tokens.Comma); outputFormatter.PrintToken(Tokens.Comma);
outputFormatter.Space(); outputFormatter.Space();
@ -2660,6 +2661,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
outputFormatter.PrintText("\t"); outputFormatter.PrintText("\t");
} }
} }
i++;
} }
} }
} }

2
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionParameter.cs

@ -10,7 +10,7 @@ using System.Reflection;
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{ {
internal class ReflectionParameter : DefaultParameter public class ReflectionParameter : DefaultParameter
{ {
public ReflectionParameter(ParameterInfo parameterInfo, IMember member) : base(parameterInfo.Name) public ReflectionParameter(ParameterInfo parameterInfo, IMember member) : base(parameterInfo.Name)
{ {

2
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionReturnType.cs

@ -10,7 +10,7 @@ using System.Collections.Generic;
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{ {
internal static class ReflectionReturnType public static class ReflectionReturnType
{ {
public static bool IsDefaultType(Type type) public static bool IsDefaultType(Type type)
{ {

Loading…
Cancel
Save