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; @@ -21,6 +21,7 @@ using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.TextEditor.Document;
using ReflectionLayer = ICSharpCode.SharpDevelop.Dom.ReflectionLayer;
namespace ICSharpCode.FormsDesigner
{
@ -397,6 +398,32 @@ namespace ICSharpCode.FormsDesigner @@ -397,6 +398,32 @@ namespace ICSharpCode.FormsDesigner
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)
{
return c.Region.EndLine;

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

@ -13,6 +13,8 @@ using System.Text; @@ -13,6 +13,8 @@ using System.Text;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.PrettyPrinter;
namespace ICSharpCode.FormsDesigner
{
@ -68,35 +70,14 @@ namespace ICSharpCode.FormsDesigner @@ -68,35 +70,14 @@ namespace ICSharpCode.FormsDesigner
return r.BeginLine + 2;
}
protected static string GenerateParams(EventDescriptor edesc, bool paramNames)
protected string GenerateParams(EventDescriptor edesc, bool paramNames)
{
System.Type type = edesc.EventType;
MethodInfo mInfo = type.GetMethod("Invoke");
string param = "";
IAmbience csa = null;
try {
csa = (IAmbience)AddInTree.BuildItem("/SharpDevelop/Workbench/Ambiences/C#", null);
} catch (TreePathNotFoundException) {
LoggingService.Warn("C# ambience not found");
CSharpOutputVisitor v = new CSharpOutputVisitor();
MethodDeclaration md = ConvertDescriptorToNRefactory(edesc, "name");
if (md != null) {
v.AppendCommaSeparatedList(md.Parameters);
}
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;
return v.Text;
}
}
}

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

@ -12,6 +12,8 @@ using System.Text; @@ -12,6 +12,8 @@ using System.Text;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.PrettyPrinter;
namespace ICSharpCode.FormsDesigner
{
@ -45,34 +47,14 @@ namespace ICSharpCode.FormsDesigner @@ -45,34 +47,14 @@ namespace ICSharpCode.FormsDesigner
return b.ToString();
}
protected static string GenerateParams(EventDescriptor edesc)
protected string GenerateParams(EventDescriptor edesc)
{
System.Type type = edesc.EventType;
MethodInfo mInfo = type.GetMethod("Invoke");
string param = "";
IAmbience csa = null;
try {
csa = (IAmbience)AddInTree.BuildItem("/SharpDevelop/Workbench/Ambiences/VBNet", null);
} catch (TreePathNotFoundException) {
LoggingService.Warn("VB ambience not found");
VBNetOutputVisitor v = new VBNetOutputVisitor();
MethodDeclaration md = ConvertDescriptorToNRefactory(edesc, "name");
if (md != null) {
v.AppendCommaSeparatedList(md.Parameters);
}
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;
return v.Text;
}
}
}

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

@ -2472,11 +2472,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -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) {
for (int i = 0; i < list.Count; ++i) {
nodeTracker.TrackedVisit(((INode)list[i]), null);
int i = 0;
foreach (T node in list) {
nodeTracker.TrackedVisit(node, null);
if (i + 1 < list.Count) {
PrintFormattedComma();
}
@ -2484,6 +2485,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -2484,6 +2485,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
outputFormatter.NewLine();
outputFormatter.Indent();
}
i++;
}
}
}

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

@ -2646,11 +2646,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -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) {
for (int i = 0; i < list.Count; ++i) {
nodeTracker.TrackedVisit(((INode)list[i]), null);
int i = 0;
foreach (T node in list) {
nodeTracker.TrackedVisit(node, null);
if (i + 1 < list.Count) {
outputFormatter.PrintToken(Tokens.Comma);
outputFormatter.Space();
@ -2660,6 +2661,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -2660,6 +2661,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
outputFormatter.PrintText("\t");
}
}
i++;
}
}
}

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

@ -10,7 +10,7 @@ using System.Reflection; @@ -10,7 +10,7 @@ using System.Reflection;
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
internal class ReflectionParameter : DefaultParameter
public class ReflectionParameter : DefaultParameter
{
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; @@ -10,7 +10,7 @@ using System.Collections.Generic;
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
internal static class ReflectionReturnType
public static class ReflectionReturnType
{
public static bool IsDefaultType(Type type)
{

Loading…
Cancel
Save