1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
6
using System.Collections.Generic;
7
using System.Reflection;
10
using ICSharpCode.FormsDesigner;
11
using ICSharpCode.SharpDevelop.Dom;
12
using ICSharpCode.SharpDevelop.Editor;
14
namespace Grunwald.BooBinding.Designer
16
public class BooDesignerGenerator : AbstractDesignerGenerator
18
protected override string GenerateFieldDeclaration(CodeDOMGenerator domGenerator, CodeMemberField field)
20
// TODO: add support for modifiers
21
// (or implement code generation for fields in the Boo CodeDomProvider)
22
return "private " + field.Name + " as " + field.Type.BaseType;
25
protected override System.CodeDom.Compiler.CodeDomProvider CreateCodeProvider()
27
return new Boo.Lang.CodeDom.BooCodeProvider();
30
protected override void FixGeneratedCode(IClass formClass, CodeMemberMethod code)
32
base.FixGeneratedCode(formClass, code);
33
Dictionary<string, IReturnType> variables = new Dictionary<string, IReturnType>();
34
foreach (IField f in formClass.DefaultReturnType.GetFields()) {
35
variables[f.Name] = f.ReturnType;
37
variables[""] = formClass.DefaultReturnType;
38
foreach (CodeStatement statement in code.Statements) {
39
CodeExpressionStatement ces = statement as CodeExpressionStatement;
41
CodeMethodInvokeExpression cmie = ces.Expression as CodeMethodInvokeExpression;
42
if (cmie != null && cmie.Parameters.Count == 1) {
43
CodeArrayCreateExpression cace = cmie.Parameters[0] as CodeArrayCreateExpression;
45
IReturnType rt = ResolveType(cmie.Method.TargetObject, variables);
47
foreach (IMethod m in rt.GetMethods()) {
48
if (m.Name == cmie.Method.MethodName
49
&& m.Parameters.Count == 1
50
&& m.Parameters[0].IsParams
51
&& m.Parameters[0].ReturnType.IsArrayReturnType)
53
ArrayReturnType paramArt = m.Parameters[0].ReturnType.CastToArrayReturnType();
54
if (paramArt.ArrayDimensions == 1
55
&& paramArt.FullyQualifiedName == cace.CreateType.BaseType)
57
cace.UserData["Explode"] = true;
65
CodeVariableDeclarationStatement cvds = statement as CodeVariableDeclarationStatement;
67
variables[cvds.Name] = new SearchClassReturnType(formClass.ProjectContent, formClass, formClass.Region.BeginLine + 1, 0, cvds.Type.BaseType, cvds.Type.TypeArguments.Count);
72
IReturnType ResolveType(CodeExpression expr, Dictionary<string, IReturnType> variables)
75
if (expr is CodeThisReferenceExpression) {
77
} else if (expr is CodeVariableReferenceExpression) {
78
string name = (expr as CodeVariableReferenceExpression).VariableName;
79
if (variables.TryGetValue(name, out rt))
81
} else if (expr is CodeFieldReferenceExpression) {
82
string name = (expr as CodeFieldReferenceExpression).FieldName;
83
rt = ResolveType((expr as CodeFieldReferenceExpression).TargetObject, variables);
85
foreach (IField f in rt.GetFields()) {
91
} else if (expr is CodePropertyReferenceExpression) {
92
string name = (expr as CodePropertyReferenceExpression).PropertyName;
93
rt = ResolveType((expr as CodePropertyReferenceExpression).TargetObject, variables);
95
foreach (IProperty p in rt.GetProperties()) {
105
protected override string CreateEventHandler(Type eventType, string eventMethodName, string body, string indentation)
107
if (string.IsNullOrEmpty(body)) body = "pass";
108
string param = GenerateParams(eventType);
110
StringBuilder b = new StringBuilder();
111
b.AppendLine(indentation);
112
b.AppendLine(indentation + "private def " + eventMethodName + "(" + param + "):");
113
if (string.IsNullOrEmpty(body)) {
114
if (ICSharpCode.FormsDesigner.Gui.OptionPanels.GeneralOptionsPanel.InsertTodoComment) {
115
body = "// TODO: Implement " + eventMethodName;
118
b.AppendLine(indentation + "\t" + body);
122
protected override DomRegion GetReplaceRegion(IDocument document, IMethod method)
124
DomRegion r = method.BodyRegion;
125
return new DomRegion(r.BeginLine + 1, 1, r.EndLine + 1, 1);
128
protected override int GetEventHandlerInsertionLine(IClass c)
130
return c.Region.EndLine + 1;
133
protected static string GenerateParams(Type eventType)
135
MethodInfo mInfo = eventType.GetMethod("Invoke");
138
for (int i = 0; i < mInfo.GetParameters().Length; ++i) {
139
ParameterInfo pInfo = mInfo.GetParameters()[i];
144
string typeStr = pInfo.ParameterType.ToString();
145
typeStr = new BooAmbience().GetIntrinsicTypeName(typeStr);
147
if (i + 1 < mInfo.GetParameters().Length) {