From f2ecb18965c9b23f2ad87975dd459b972881b60a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 4 May 2006 18:00:32 +0000 Subject: [PATCH] Fixed BOO-713: Explode operator must be used for DataGridView.Columns.AddRange. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1386 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Designer/BooDesignerGenerator.cs | 72 +++++++++++++++++++ .../Project/Src/Designer/BooDesignerLoader.cs | 6 +- .../AbstractDesignerGenerator.cs | 6 ++ 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs index 80a6609f70..126b1f1bac 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs @@ -7,6 +7,7 @@ using System; using System.ComponentModel; +using System.Collections.Generic; using System.Text; using System.Reflection; using System.CodeDom; @@ -30,6 +31,77 @@ namespace Grunwald.BooBinding.Designer return new Boo.Lang.CodeDom.BooCodeProvider(); } + protected override void FixGeneratedCode(IClass formClass, CodeMemberMethod code) + { + base.FixGeneratedCode(formClass, code); + Dictionary variables = new Dictionary(); + foreach (IField f in formClass.DefaultReturnType.GetFields()) { + variables[f.Name] = f.ReturnType; + } + variables[""] = formClass.DefaultReturnType; + foreach (CodeStatement statement in code.Statements) { + CodeExpressionStatement ces = statement as CodeExpressionStatement; + if (ces != null) { + CodeMethodInvokeExpression cmie = ces.Expression as CodeMethodInvokeExpression; + if (cmie != null && cmie.Parameters.Count == 1) { + CodeArrayCreateExpression cace = cmie.Parameters[0] as CodeArrayCreateExpression; + if (cace != null) { + IReturnType rt = ResolveType(cmie.Method.TargetObject, variables); + if (rt != null) { + foreach (IMethod m in rt.GetMethods()) { + if (m.Name == cmie.Method.MethodName + && m.Parameters.Count == 1 + && m.Parameters[0].IsParams + && m.Parameters[0].ReturnType.ArrayDimensions == 1 + && m.Parameters[0].ReturnType.ArrayElementType.FullyQualifiedName == cace.CreateType.BaseType) + { + cace.UserData["Explode"] = true; + } + } + } + } + } + } + CodeVariableDeclarationStatement cvds = statement as CodeVariableDeclarationStatement; + if (cvds != null) { + variables[cvds.Name] = new SearchClassReturnType(formClass.ProjectContent, formClass, formClass.Region.BeginLine + 1, 0, cvds.Type.BaseType, cvds.Type.TypeArguments.Count); + } + } + } + + IReturnType ResolveType(CodeExpression expr, Dictionary variables) + { + IReturnType rt; + if (expr is CodeThisReferenceExpression) { + return variables[""]; + } else if (expr is CodeVariableReferenceExpression) { + string name = (expr as CodeVariableReferenceExpression).VariableName; + if (variables.TryGetValue(name, out rt)) + return rt; + } else if (expr is CodeFieldReferenceExpression) { + string name = (expr as CodeFieldReferenceExpression).FieldName; + rt = ResolveType((expr as CodeFieldReferenceExpression).TargetObject, variables); + if (rt != null) { + foreach (IField f in rt.GetFields()) { + if (f.Name == name) { + return f.ReturnType; + } + } + } + } else if (expr is CodePropertyReferenceExpression) { + string name = (expr as CodePropertyReferenceExpression).PropertyName; + rt = ResolveType((expr as CodePropertyReferenceExpression).TargetObject, variables); + if (rt != null) { + foreach (IProperty p in rt.GetProperties()) { + if (p.Name == name) { + return p.ReturnType; + } + } + } + } + return null; + } + protected override string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body, string indentation) { if (string.IsNullOrEmpty(body)) body = "pass"; diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs index 9e1bc951f6..ea0427a36a 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs @@ -198,7 +198,11 @@ namespace Grunwald.BooBinding.Designer protected override void Write(CodeCompileUnit unit) { LoggingService.Info("BooDesignerLoader.Write called"); - generator.MergeFormChanges(unit); + try { + generator.MergeFormChanges(unit); + } catch (Exception ex) { + MessageService.ShowError(ex); + } } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs index d601be63e4..11d2816bd5 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs @@ -130,6 +130,10 @@ namespace ICSharpCode.FormsDesigner protected abstract DomRegion GetReplaceRegion(ICSharpCode.TextEditor.Document.IDocument document, IMethod method); + protected virtual void FixGeneratedCode(IClass formClass, CodeMemberMethod code) + { + } + public void MergeFormChanges(CodeCompileUnit unit) { Reparse(); @@ -163,6 +167,8 @@ namespace ICSharpCode.FormsDesigner Reparse(); } + FixGeneratedCode(this.formClass, initializeComponent); + // generate file and get initialize components string StringWriter writer = new StringWriter(); CodeDOMGenerator domGenerator = new CodeDOMGenerator(this.CodeDomProvider, tabs + '\t');