diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs index e670e56cdf..e092972d0d 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs @@ -112,7 +112,21 @@ namespace ICSharpCode.FormDesigner protected override void OnEndLoad(bool successful, ICollection errors) { this.loading = false; - base.OnEndLoad(successful, errors); + //when control's Dispose() has a exception and on loading also raised exception + //then this is only place where this error can be logged, because after errors is + //catched internally in .net + try { + base.OnEndLoad(successful, errors); + } catch(ExceptionCollection e) { + LoggingService.Error("DesignerLoader.OnEndLoad error" + e.Message); + foreach(Exception ine in e.Exceptions) { + LoggingService.Error("DesignerLoader.OnEndLoad error" + ine.Message); + } + throw; + } catch(Exception e) { + LoggingService.Error("DesignerLoader.OnEndLoad error" + e.Message); + throw; + } } string lastTextContent; @@ -192,7 +206,7 @@ namespace ICSharpCode.FormDesigner TypeDeclaration td = o as TypeDeclaration; if (td != null && td.Name == formDecl.Name) { foreach (INode node in td.Children) - formDecl.AddChild(node); + formDecl.AddChild(node); formDecl.BaseTypes.AddRange(td.BaseTypes); } if (o is NamespaceDeclaration) { diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs index 9e9fc5c640..4dab6277fb 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs @@ -13,6 +13,8 @@ using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.NRefactory.Parser; +using ICSharpCode.FormDesigner.Services; +using System.ComponentModel.Design; namespace ICSharpCode.FormDesigner { @@ -30,7 +32,7 @@ namespace ICSharpCode.FormDesigner } return null; } - + public static bool BaseClassIsFormOrControl(IClass c) { // Simple test for fully qualified name @@ -44,21 +46,26 @@ namespace ICSharpCode.FormDesigner return true; } } + + IClass form = ProjectContentRegistry.WinForms.GetClass("System.Windows.Forms.Form"); + IClass userControl = ProjectContentRegistry.WinForms.GetClass("System.Windows.Forms.UserControl"); + if (form != null && c.IsTypeInInheritanceTree(form)) + return true; + if (userControl != null && c.IsTypeInInheritanceTree(userControl)) + return true; return false; } - + public static bool IsDesignable(ParseInformation info) { if (info != null) { ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; foreach (IClass c in cu.Classes) { - if (BaseClassIsFormOrControl(c)) { - IMethod method = GetInitializeComponents(c); - if (method == null) { - return false; - } - return true; + IMethod method = GetInitializeComponents(c); + if (method == null) { + return false; } + return BaseClassIsFormOrControl(c); } } return false; @@ -79,6 +86,7 @@ namespace ICSharpCode.FormDesigner case ".cs": case ".vb": ParseInformation info = ParserService.ParseFile(fileName, textAreaControlProvider.TextEditorControl.Document.TextContent, false, true); + if (IsDesignable(info)) return true; break; diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs index 220469fe4f..97aaa7b50f 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs @@ -62,7 +62,7 @@ namespace ICSharpCode.FormDesigner IDesignerGenerator generator; DesignerResourceService designerResourceService; FormDesignerUndoEngine undoEngine; - + public override Control Control { get { return p; @@ -131,6 +131,7 @@ namespace ICSharpCode.FormDesigner serviceContainer.AddService(typeof(IHelpService), new HelpService()); serviceContainer.AddService(typeof(System.Drawing.Design.IPropertyValueUIService), new PropertyValueUIService()); + designerResourceService = new DesignerResourceService(viewContent.FileName, this.resources); serviceContainer.AddService(typeof(System.ComponentModel.Design.IResourceService), designerResourceService); AmbientProperties ambientProperties = new AmbientProperties(); @@ -142,7 +143,7 @@ namespace ICSharpCode.FormDesigner serviceContainer.AddService(typeof(MemberRelationshipService), new DefaultMemberRelationshipService()); designSurface = new DesignSurface(serviceContainer); - + serviceContainer.AddService(typeof(System.ComponentModel.Design.IMenuCommandService), new ICSharpCode.FormDesigner.Services.MenuCommandService(p, designSurface, serviceContainer)); ICSharpCode.FormDesigner.Services.EventBindingService eventBindingService = new ICSharpCode.FormDesigner.Services.EventBindingService(designSurface); serviceContainer.AddService(typeof(System.ComponentModel.Design.IEventBindingService), eventBindingService); @@ -220,6 +221,19 @@ namespace ICSharpCode.FormDesigner errorText.Text = e.Message; else errorText.Text = e.ToString(); + //output loaderrors too + if(!designSurface.IsLoaded) { + errorText.Text += "\r\nDesignSurface not loaded :"; + if(designSurface.LoadErrors != null) { + foreach(Exception le in designSurface.LoadErrors) { + errorText.Text += "\r\n"; + errorText.Text += le.ToString(); + errorText.Text += "\r\n"; + errorText.Text += le.StackTrace; + } + } + } + errorText.Dock = DockStyle.Fill; p.Controls.Add(errorText); Control title = new Label(); @@ -494,7 +508,7 @@ namespace ICSharpCode.FormDesigner if (e.ChangedItem.GridItemType == GridItemType.Property) { if (e.ChangedItem.PropertyDescriptor.Name == "Language") { if (!e.OldValue.Equals(e.ChangedItem.Value)) { - LoggingService.Debug("Reloading designer due to language change."); + LoggingService.Debug("Reloading designer due to language change."); propertyContainer.Clear(); if (!failedDesignerInitialize) { MergeFormChanges(); diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/CustomComponentsSideTab.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/CustomComponentsSideTab.cs index 6716001e1a..25aeb339af 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/CustomComponentsSideTab.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/CustomComponentsSideTab.cs @@ -10,6 +10,7 @@ using System.IO; using System.Windows.Forms; using System.Reflection; using System.Collections; +using System.Collections.Generic; using System.Drawing; using System.Drawing.Design; using System.ComponentModel; @@ -33,7 +34,9 @@ namespace ICSharpCode.FormDesigner.Gui { ArrayList projectAssemblies = new ArrayList(); ArrayList referencedAssemblies = new ArrayList(); - + Dictionary loadedFiles = new Dictionary(); + List loadedProjects = new List(); + static bool loadReferencedAssemblies = true; ///Load an assembly's controls @@ -45,14 +48,14 @@ namespace ICSharpCode.FormDesigner.Gui } public static bool LoadReferencedAssemblies { - get { - return loadReferencedAssemblies; + get { + return loadReferencedAssemblies; } - set { - loadReferencedAssemblies = value; + set { + loadReferencedAssemblies = value; } } - + string loadingPath = String.Empty; byte[] GetBytes(string fileName) @@ -73,69 +76,54 @@ namespace ICSharpCode.FormDesigner.Gui if (idx >= 0) { file = file.Substring(0, idx); } - try { - if (File.Exists(loadingPath + file + ".exe")) { - LoggingService.Debug("Form Designer: MyResolve: Load bytes from exe"); - return Assembly.Load(GetBytes(loadingPath + file + ".exe")); - } - if (File.Exists(loadingPath + file + ".dll")) { - LoggingService.Debug("Form Designer: MyResolve: Load bytes from dll"); - return Assembly.Load(GetBytes(loadingPath + file + ".dll")); - } - LoggingService.Info("Form Designer: MyResolve: did not find " + args.Name); - } catch (Exception ex) { - LoggingService.Warn("Form Designer: MyResolve: Can't load assembly", ex); + //search in other assemblies, this also help to avoid doubling of loaded assms + if (ProjectService.OpenSolution != null) { + foreach (IProject project in ProjectService.OpenSolution.Projects) { + if (project.AssemblyName == file) + return LoadAssemblyFile(project.OutputAssemblyFullPath, true); + } } + + //skip already loaded + Assembly lastAssembly = null; + foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { + //LoggingService.Info("Assembly..." + asm.FullName); + if (asm.FullName == args.Name) { + lastAssembly = asm; + } + } + if (lastAssembly != null) { + LoggingService.Info("ICSharpAssemblyResolver found..." + args.Name); + return lastAssembly; + } + return null; } -// public void ReloadProjectAssemblies(object sender, EventArgs e) -// { -// ScanProjectAssemblies(); -// AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); -// try { -// Items.Clear(); -// AddDefaultItem(); -// foreach (string assemblyName in projectAssemblies) { -// if ((assemblyName.EndsWith("exe") || assemblyName.EndsWith("dll")) && File.Exists(assemblyName)) { -// loadingPath = Path.GetDirectoryName(assemblyName) + Path.DirectorySeparatorChar; -// try { -// if (loadReferencedAssemblies == true) { -// Assembly asm = Assembly.Load(Path.GetFileNameWithoutExtension(assemblyName)); -// BuildToolboxFromAssembly(asm); -// } -// } catch (Exception ex) { -// Console.WriteLine("Error loading Assembly " + assemblyName + " : " + ex.ToString()); -// } -// } -// } -// foreach (Assembly refAsm in referencedAssemblies) { -// try { -// BuildToolboxFromAssembly(refAsm); -// } catch (Exception ex) { -// Console.WriteLine("Error loading referenced Assembly " + refAsm + " : " + ex.ToString()); -// } -// } -// } catch (Exception ex) { -// Console.WriteLine("GOT EXCEPTION : " + ex.ToString()); -// } finally { -// AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(MyResolveEventHandler); -// } -// -// foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) { -// FormDesignerDisplayBindingBase formDesigner = content.WorkbenchWindow.ActiveViewContent as FormDesignerDisplayBindingBase; -// if (formDesigner != null) { -// formDesigner.Control.Invoke(new ThreadStart(formDesigner.ReloadAndSelect), null); -// } -// } -// } - Assembly LoadAssemblyFile(string assemblyName, bool nonLocking) { assemblyName = assemblyName.ToLower(); + //skip already loaded over MyResolveEventHandler + if(loadedFiles.ContainsKey(assemblyName)) + return loadedFiles[assemblyName]; if ((assemblyName.EndsWith("exe") || assemblyName.EndsWith("dll")) && File.Exists(assemblyName)) { - Assembly asm = nonLocking ? Assembly.Load(GetBytes(assemblyName)) : Assembly.LoadFrom(assemblyName); //Assembly.LoadFrom(assemblyName); + string fileAsmName = AssemblyName.GetAssemblyName(assemblyName).ToString(); + Assembly asm; + + //skip already loaded + Assembly lastAssembly = null; + foreach (Assembly asmLoaded in AppDomain.CurrentDomain.GetAssemblies()) { + if (asmLoaded.FullName == fileAsmName) { + lastAssembly = asmLoaded; + } + } + if (lastAssembly != null) { + asm = lastAssembly; + } else { + asm = nonLocking ? Assembly.Load(GetBytes(assemblyName)) : Assembly.LoadFrom(assemblyName); //Assembly.LoadFrom(assemblyName); + } if (asm != null) { + loadedFiles[assemblyName] = asm; BuildToolboxFromAssembly(asm); } return asm; @@ -143,37 +131,41 @@ namespace ICSharpCode.FormDesigner.Gui return null; } + void LoadProject(IProject project) + { + string assemblyName = project.OutputAssemblyFullPath; + if(loadedProjects.Contains(assemblyName)) + return; + loadedProjects.Add(assemblyName); + + foreach (ProjectItem projectItem in project.Items) { + ProjectReferenceProjectItem projectReferenceProjectItem = projectItem as ProjectReferenceProjectItem; + if(projectReferenceProjectItem != null) + LoadProject(projectReferenceProjectItem.ReferencedProject); + } + + loadingPath = Path.GetDirectoryName(assemblyName) + Path.DirectorySeparatorChar; + LoadAssemblyFile(assemblyName, true); + } + void ScanProjectAssemblies() { projectAssemblies.Clear(); referencedAssemblies.Clear(); - + + loadedFiles.Clear(); + loadedProjects.Clear(); + AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); try { - + // custom user controls don't need custom images loadImages = false; ITypeResolutionService typeResolutionService = ToolboxProvider.TypeResolutionService; if (ProjectService.OpenSolution != null) { foreach (IProject project in ProjectService.OpenSolution.Projects) { - string assemblyName = project.OutputAssemblyFullPath; - projectAssemblies.Add(assemblyName); - loadingPath = Path.GetDirectoryName(assemblyName) + Path.DirectorySeparatorChar; - - LoadAssemblyFile(assemblyName, true); - if (loadReferencedAssemblies == true) { -// TODO: project system... -// foreach (ProjectReference reference in projectEntry.Project.ProjectReferences) { -// if (reference.ReferenceType != ReferenceType.Gac && reference.ReferenceType != ReferenceType.Project) { -// assemblyName = reference.GetReferencedFileName(projectEntry.Project); -// loadingPath = Path.GetDirectoryName(assemblyName) + Path.DirectorySeparatorChar; -// Assembly asm = LoadAssemblyFile(assemblyName, true); -// if (asm != null) { -// referencedAssemblies.Add(asm); -// } -// } -// } - } + LoadProject(project); + projectAssemblies.Add(project.OutputAssemblyFullPath); } } } catch (Exception e) { diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabDesigner.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabDesigner.cs index 6f7831a604..642df17c31 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabDesigner.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabDesigner.cs @@ -10,7 +10,7 @@ * * Project : FormDesigner Loading Library Control. * - * Source code altering : A1 + * Source code altering : A1 * * Description : Creation of the SideTabDesigner which load controls from an assembly * Use for FromDesigner. @@ -126,69 +126,69 @@ namespace ICSharpCode.FormDesigner.Gui string[] imgNames = assembly.GetManifestResourceNames(); foreach (string im in imgNames) { - try { - Stream stream = assembly.GetManifestResourceStream(im); - if (stream != null) { - Bitmap b = new Bitmap(Image.FromStream(stream)); - b.MakeTransparent(); - images[im] = il.Images.Count; - il.Images.Add(b); - stream.Close(); + if (!im.EndsWith(".resources")) //load resources only to avoid exception on debugging + { + try { + Stream stream = assembly.GetManifestResourceStream(im); + if (stream != null) { + Bitmap b = new Bitmap(Image.FromStream(stream, true, false)); + b.MakeTransparent(); + images[im] = il.Images.Count; + il.Images.Add(b); + stream.Close(); + } + } catch (Exception e) { + LoggingService.Warn("Form Designer: GetToolboxItemsFromAssembly", e); } - } catch (Exception e) { - LoggingService.Warn("Form Designer: GetToolboxItemsFromAssembly", e); } } - Module[] ms = assembly.GetModules(false); - foreach (Module m in ms) { - - Type[] ts = m.GetTypes(); - foreach (Type t in ts) { - if (t.IsPublic && !t.IsAbstract) { - if (t.IsDefined(typeof(ToolboxItemFilterAttribute), true) || t.IsDefined(typeof(ToolboxItemAttribute), true) || t.IsDefined(typeof(DesignTimeVisibleAttribute), true) || typeof(System.ComponentModel.IComponent).IsAssignableFrom(t)) { - - object[] filterAttrs = t.GetCustomAttributes(typeof(DesignTimeVisibleAttribute), true); - foreach (DesignTimeVisibleAttribute visibleAttr in filterAttrs) { - if (!visibleAttr.Visible) { - goto skip; - } + Type[] ts = assembly.GetExportedTypes(); + foreach (Type t in ts) { + if (t.IsPublic && !t.IsAbstract) { + if (t.IsDefined(typeof(ToolboxItemFilterAttribute), true) || t.IsDefined(typeof(ToolboxItemAttribute), true) || t.IsDefined(typeof(DesignTimeVisibleAttribute), true) || typeof(System.ComponentModel.IComponent).IsAssignableFrom(t)) { + + object[] filterAttrs = t.GetCustomAttributes(typeof(DesignTimeVisibleAttribute), true); + foreach (DesignTimeVisibleAttribute visibleAttr in filterAttrs) { + if (!visibleAttr.Visible) { + goto skip; } - string imageName = String.Concat(t.FullName, ".bmp"); - if (images[imageName] == null) { - object[] attributes = t.GetCustomAttributes(false); - if (t.IsDefined(typeof(ToolboxBitmapAttribute), false)) { - foreach (object attr in attributes) { - if (attr is ToolboxBitmapAttribute) { - ToolboxBitmapAttribute toolboxBitmapAttribute = (ToolboxBitmapAttribute)attr; - Bitmap b = new Bitmap(toolboxBitmapAttribute.GetImage(t)); - b.MakeTransparent(); - il.Images.Add(b); - images[imageName] =b; - break; - } + } + string imageName = String.Concat(t.FullName, ".bmp"); + if (images[imageName] == null) { + object[] attributes = t.GetCustomAttributes(false); + if (t.IsDefined(typeof(ToolboxBitmapAttribute), false)) { + foreach (object attr in attributes) { + if (attr is ToolboxBitmapAttribute) { + ToolboxBitmapAttribute toolboxBitmapAttribute = (ToolboxBitmapAttribute)attr; + Bitmap b = new Bitmap(toolboxBitmapAttribute.GetImage(t)); + b.MakeTransparent(); + il.Images.Add(b); + images[imageName] =b; + break; } } } - - ToolboxItem item = new ToolboxItem(t); - - if (images[imageName] != null) { - try { + } + + ToolboxItem item = new ToolboxItem(t); + + if (images[imageName] != null) { + try { + if(images[imageName] is Bitmap) item.Bitmap = (Bitmap)images[imageName]; - } catch (Exception ex) { - MessageService.ShowError(ex, "Exception converting bitmap : " + images[imageName] + " : "); - } + } catch (Exception ex) { + MessageService.ShowError(ex, "Exception converting bitmap : " + images[imageName] + " : "); } - toolBoxItems.Add(item); - - skip:; } + toolBoxItems.Add(item); + + skip:; } } } return toolBoxItems; } - + void SelectedTabItemChanged(object sender, EventArgs e) { AxSideTabItem item = (sender as AxSideTab).ChoosedItem; diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs index bad96546b3..66e8297aee 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs @@ -28,7 +28,7 @@ namespace ICSharpCode.FormDesigner.Services IDesignerHost host; string FileName = String.Empty; - + #region ResourceStorage public class ResourceStorage { @@ -129,7 +129,7 @@ namespace ICSharpCode.FormDesigner.Services Resx = 0, Resources = 1 }; - + // In ResourceMemoryStreams are stored: // Key: "true" file names from the project // Value: ResourceStorage, where the resources are stored @@ -157,13 +157,13 @@ namespace ICSharpCode.FormDesigner.Services host = value; } } - + public DesignerResourceService(string fileName, Dictionary resources) { this.FileName = fileName; this.resources = resources; } - + IProject _project; IProject GetProject() @@ -192,7 +192,7 @@ namespace ICSharpCode.FormDesigner.Services return null; } } - + public System.Resources.IResourceReader GetResourceReader(System.Globalization.CultureInfo info) { try { diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeDiscoveryService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeDiscoveryService.cs index ce205bc3b4..ad3ad22f72 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeDiscoveryService.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeDiscoveryService.cs @@ -37,35 +37,31 @@ namespace ICSharpCode.FormDesigner.Services if (baseType != null) { LoggingService.Debug("TypeDiscoveryService.GetTypes baseType=" + baseType.FullName); LoggingService.Debug("TypeDiscoveryService.GetTypes excludeGlobalTypes=" + excludeGlobalTypes.ToString()); + //seek in all assemblies + //allow to work designers like columns editor in datagridview + foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { + AddDerivedTypes(baseType, asm, types); + } - // TODO - Look in more than just System.Windows.Forms. + // TODO - Don't look in all assemblies. // Should use the current project and its referenced assemblies // as well as System.Windows.Forms. - types.AddRange(GetDerivedTypesFromWindowsForms(baseType)); } return types; } /// - /// Gets the derived types from the System.Windows.Forms assembly. + /// Gets the types derived from baseType from the assembly and adds them to the list. /// - IList GetDerivedTypesFromWindowsForms(Type baseType) + void AddDerivedTypes(Type baseType, Assembly assembly, IList list) { - List types = new List(); - - Assembly asm = typeof(System.Windows.Forms.Control).Assembly; - - foreach (Module m in asm.GetModules()) { - foreach (Type t in m.GetTypes()) { - if (t.IsSubclassOf(baseType)) { - LoggingService.Debug("TypeDiscoveryService. Adding type=" + t.FullName); - types.Add(t); - } + foreach (Type t in assembly.GetExportedTypes()) { + if (t.IsSubclassOf(baseType)) { + LoggingService.Debug("TypeDiscoveryService. Adding type=" + t.FullName); + list.Add(t); } } - - return types; } } } diff --git a/src/Libraries/ICSharpCode.TextEditor/ICSharpCode.TextEditor.sln b/src/Libraries/ICSharpCode.TextEditor/ICSharpCode.TextEditor.sln index f8121a44ad..9294e8023a 100644 --- a/src/Libraries/ICSharpCode.TextEditor/ICSharpCode.TextEditor.sln +++ b/src/Libraries/ICSharpCode.TextEditor/ICSharpCode.TextEditor.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor.Test", "Test\ICSharpCode.TextEditor.Test.csproj", "{6259D767-BA7C-484D-9472-68F350A20086}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor.Tests", "Test\ICSharpCode.TextEditor.Tests.csproj", "{6259D767-BA7C-484D-9472-68F350A20086}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}" EndProject diff --git a/src/Libraries/ICSharpCode.TextEditor/Test/DocumentTests.cs b/src/Libraries/ICSharpCode.TextEditor/Test/DocumentTests.cs index cd79185b2d..f0656467ea 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Test/DocumentTests.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Test/DocumentTests.cs @@ -9,7 +9,7 @@ using System; using NUnit.Framework; using ICSharpCode.TextEditor.Document; -namespace ICSharpCode.TextEditor.Test.Tests +namespace ICSharpCode.TextEditor.Tests { [TestFixture] public class DocumentAggregatorTests diff --git a/src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Test.csproj b/src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Tests.csproj similarity index 94% rename from src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Test.csproj rename to src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Tests.csproj index d94b308b7d..2f3a5aaa6e 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Test.csproj +++ b/src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Tests.csproj @@ -5,8 +5,8 @@ 8.0.41115 2.0 {6259D767-BA7C-484D-9472-68F350A20086} - ICSharpCode.TextEditor.Test - ICSharpCode.TextEditor.Test + ICSharpCode.TextEditor.Tests + ICSharpCode.TextEditor.Tests Library 4 False diff --git a/src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Test.csproj.user b/src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Tests.csproj.user similarity index 100% rename from src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Test.csproj.user rename to src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Tests.csproj.user diff --git a/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs index 5d872e5f90..768bd7dc2f 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.NRefactory.Parser List variables = new List(); TypeDeclaration currentTypeDeclaration = null; - + // dummy collection used to swallow statements CodeStatementCollection NullStmtCollection = new CodeStatementCollection(); @@ -93,7 +93,7 @@ namespace ICSharpCode.NRefactory.Parser } return type; } - + void AddStmt(CodeStatement stmt) { if (codeStack.Count == 0) @@ -103,7 +103,7 @@ namespace ICSharpCode.NRefactory.Parser stmtCollection.Add(stmt); } } - + void AddStmt(CodeExpression expr) { if (codeStack.Count == 0) @@ -113,12 +113,12 @@ namespace ICSharpCode.NRefactory.Parser stmtCollection.Add(expr); } } - + // FIXME: map all modifiers correctly MemberAttributes ConvMemberAttributes(Modifier modifier) { MemberAttributes attr = (MemberAttributes)0; - + if ((modifier & Modifier.Abstract) != 0) attr |= MemberAttributes.Abstract; if ((modifier & Modifier.Const) != 0) @@ -147,7 +147,7 @@ namespace ICSharpCode.NRefactory.Parser return attr; } - + #region ICSharpCode.SharpRefactory.Parser.IASTVisitor interface implementation public override object Visit(CompilationUnit compilationUnit, object data) { @@ -266,9 +266,9 @@ namespace ICSharpCode.NRefactory.Parser memberMethod.Attributes = ConvMemberAttributes(methodDeclaration.Modifier); codeStack.Push(memberMethod.Statements); - + typeDeclarations.Peek().Members.Add(memberMethod); - + // Add Method Parameters foreach (ParameterDeclarationExpression parameter in methodDeclaration.Parameters) { @@ -277,21 +277,21 @@ namespace ICSharpCode.NRefactory.Parser variables.Clear(); methodDeclaration.Body.AcceptChildren(this, data); - + codeStack.Pop(); - + return null; } public override object Visit(ConstructorDeclaration constructorDeclaration, object data) { CodeMemberMethod memberMethod = new CodeConstructor(); - + codeStack.Push(memberMethod.Statements); typeDeclarations.Peek().Members.Add(memberMethod); constructorDeclaration.Body.AcceptChildren(this, data); codeStack.Pop(); - + return null; } @@ -335,7 +335,7 @@ namespace ICSharpCode.NRefactory.Parser public override object Visit(LocalVariableDeclaration localVariableDeclaration, object data) { CodeVariableDeclarationStatement declStmt = null; - + for (int i = 0; i < localVariableDeclaration.Variables.Count; ++i) { CodeTypeReference type = new CodeTypeReference(Convert(localVariableDeclaration.GetTypeForVariable(i))); VariableDeclaration var = (VariableDeclaration)localVariableDeclaration.Variables[i]; @@ -350,16 +350,16 @@ namespace ICSharpCode.NRefactory.Parser variables.Add(declStmt); AddStmt(declStmt); } - + return declStmt; } public override object Visit(EmptyStatement emptyStatement, object data) { CodeSnippetStatement emptyStmt = new CodeSnippetStatement(); - + AddStmt(emptyStmt); - + return emptyStmt; } @@ -370,18 +370,18 @@ namespace ICSharpCode.NRefactory.Parser returnStmt = new CodeMethodReturnStatement(); else returnStmt = new CodeMethodReturnStatement((CodeExpression)returnStatement.Expression.AcceptVisitor(this,data)); - + AddStmt(returnStmt); - + return returnStmt; } public override object Visit(IfElseStatement ifElseStatement, object data) { CodeConditionStatement ifStmt = new CodeConditionStatement(); - + ifStmt.Condition = (CodeExpression)ifElseStatement.Condition.AcceptVisitor(this, data); - + codeStack.Push(ifStmt.TrueStatements); foreach (Statement stmt in ifElseStatement.TrueStatement) { if (stmt is BlockStatement) { @@ -391,7 +391,7 @@ namespace ICSharpCode.NRefactory.Parser } } codeStack.Pop(); - + codeStack.Push(ifStmt.FalseStatements); foreach (Statement stmt in ifElseStatement.FalseStatement) { if (stmt is BlockStatement) { @@ -401,9 +401,9 @@ namespace ICSharpCode.NRefactory.Parser } } codeStack.Pop(); - + AddStmt(ifStmt); - + return ifStmt; } @@ -415,7 +415,7 @@ namespace ICSharpCode.NRefactory.Parser if (forStatement.Initializers.Count > 1) { throw new NotSupportedException("CodeDom does not support Multiple For-Loop Initializer Statements"); } - + foreach (object o in forStatement.Initializers) { if (o is Expression) { forLoop.InitStatement = new CodeExpressionStatement((CodeExpression)((Expression)o).AcceptVisitor(this,data)); @@ -433,43 +433,43 @@ namespace ICSharpCode.NRefactory.Parser } else { forLoop.TestExpression = (CodeExpression)forStatement.Condition.AcceptVisitor(this, data); } - + codeStack.Push(forLoop.Statements); forStatement.EmbeddedStatement.AcceptVisitor(this, data); codeStack.Pop(); - + if (forStatement.Iterator.Count > 0) { if (forStatement.Initializers.Count > 1) { throw new NotSupportedException("CodeDom does not support Multiple For-Loop Iterator Statements"); } - + foreach (Statement stmt in forStatement.Iterator) { forLoop.IncrementStatement = (CodeStatement)stmt.AcceptVisitor(this, data); } } - + AddStmt(forLoop); - + return forLoop; } public override object Visit(LabelStatement labelStatement, object data) { System.CodeDom.CodeLabeledStatement labelStmt = new CodeLabeledStatement(labelStatement.Label,(CodeStatement)labelStatement.AcceptVisitor(this, data)); - + // Add Statement to Current Statement Collection AddStmt(labelStmt); - + return labelStmt; } public override object Visit(GotoStatement gotoStatement, object data) { System.CodeDom.CodeGotoStatement gotoStmt = new CodeGotoStatement(gotoStatement.Label); - + // Add Statement to Current Statement Collection AddStmt(gotoStmt); - + return gotoStmt; } @@ -482,44 +482,44 @@ namespace ICSharpCode.NRefactory.Parser { // add a try-catch-finally CodeTryCatchFinallyStatement tryStmt = new CodeTryCatchFinallyStatement(); - + codeStack.Push(tryStmt.TryStatements); tryCatchStatement.StatementBlock.AcceptChildren(this, data); codeStack.Pop(); - + if (!tryCatchStatement.FinallyBlock.IsNull) { codeStack.Push(tryStmt.FinallyStatements); tryCatchStatement.FinallyBlock.AcceptChildren(this,data); codeStack.Pop(); } - + foreach (CatchClause clause in tryCatchStatement.CatchClauses) { CodeCatchClause catchClause = new CodeCatchClause(clause.VariableName); catchClause.CatchExceptionType = new CodeTypeReference(clause.TypeReference.Type); tryStmt.CatchClauses.Add(catchClause); - + codeStack.Push(catchClause.Statements); clause.StatementBlock.AcceptChildren(this, data); codeStack.Pop(); } - + // Add Statement to Current Statement Collection AddStmt(tryStmt); - + return tryStmt; } public override object Visit(ThrowStatement throwStatement, object data) { CodeThrowExceptionStatement throwStmt = new CodeThrowExceptionStatement((CodeExpression)throwStatement.Expression.AcceptVisitor(this, data)); - + // Add Statement to Current Statement Collection AddStmt(throwStmt); - + return throwStmt; } @@ -657,7 +657,7 @@ namespace ICSharpCode.NRefactory.Parser public override object Visit(UnaryOperatorExpression unaryOperatorExpression, object data) { CodeExpression var; - + switch (unaryOperatorExpression.Op) { case UnaryOperatorType.Minus: if (unaryOperatorExpression.Expression is PrimitiveExpression) { @@ -685,43 +685,43 @@ namespace ICSharpCode.NRefactory.Parser (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data)); case UnaryOperatorType.Plus: return unaryOperatorExpression.Expression.AcceptVisitor(this, data); - + case UnaryOperatorType.PostIncrement: // emulate i++, with i = i + 1 var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data); - + return new CodeAssignStatement(var, new CodeBinaryOperatorExpression(var, CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))); - + case UnaryOperatorType.PostDecrement: // emulate i--, with i = i - 1 var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data); - + return new CodeAssignStatement(var, new CodeBinaryOperatorExpression(var, CodeBinaryOperatorType.Subtract, new CodePrimitiveExpression(1))); - + case UnaryOperatorType.Decrement: // emulate --i, with i = i - 1 var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data); - + return new CodeAssignStatement(var, new CodeBinaryOperatorExpression(var, CodeBinaryOperatorType.Subtract, new CodePrimitiveExpression(1))); - + case UnaryOperatorType.Increment: // emulate ++i, with i = i + 1 var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data); - + return new CodeAssignStatement(var, new CodeBinaryOperatorExpression(var, CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))); - + } return null; } @@ -839,19 +839,13 @@ namespace ICSharpCode.NRefactory.Parser bool IsFieldReferenceExpression(FieldReferenceExpression fieldReferenceExpression) { - if (fieldReferenceExpression.TargetObject is ThisReferenceExpression) { - foreach (object o in this.currentTypeDeclaration.Children) { - if (o is FieldDeclaration) { - FieldDeclaration fd = (FieldDeclaration)o; - foreach (VariableDeclaration field in fd.Fields) { - if (fieldReferenceExpression.FieldName == field.Name) { - return true; - } - } - } - } + if (fieldReferenceExpression.TargetObject is ThisReferenceExpression + || fieldReferenceExpression.TargetObject is BaseReferenceExpression) + { + //field detection for fields\props inherited from base classes + return IsField(fieldReferenceExpression.FieldName); } - return false; //Char.IsLower(fieldReferenceExpression.FieldName[0]); + return false; } public override object Visit(FieldReferenceExpression fieldReferenceExpression, object data) @@ -917,11 +911,16 @@ namespace ICSharpCode.NRefactory.Parser } } } + //field detection for fields\props inherited from base classes + if (currentTypeDeclaration.BaseTypes.Count > 0) { + return IsField(currentTypeDeclaration.BaseTypes[0].ToString(), identifier); + } return false; } CodeTypeReferenceExpression ConvertToTypeReference(FieldReferenceExpression fieldReferenceExpression) { + FieldReferenceExpression primaryReferenceExpression = fieldReferenceExpression; StringBuilder type = new StringBuilder(""); while (fieldReferenceExpression.TargetObject is FieldReferenceExpression) { @@ -971,17 +970,48 @@ namespace ICSharpCode.NRefactory.Parser return list; } - Type GetType(string typeName) + //copy from TypeResolutionService.cs because from this point impossible to access TypeResolutionService + //TODO create universal way for getting types + public Type GetType(string name) { - foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) - { - Type type = asm.GetType(typeName); - if (type != null) - { - return type; + bool throwOnError = false; + bool ignoreCase = false; + if (name == null || name.Length == 0) { + return null; + } + Assembly lastAssembly = null; + foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { + Type t = asm.GetType(name, throwOnError); + if (t != null) { + lastAssembly = asm; } } - return Type.GetType(typeName); + if (lastAssembly != null) { + return lastAssembly.GetType(name, throwOnError, ignoreCase); + } + + Type type = Type.GetType(name, throwOnError, ignoreCase); + + // type lookup for typename, assembly, xyz style lookups + if (type == null) { + int idx = name.IndexOf(","); + if (idx > 0) { + string[] splitName = name.Split(','); + string typeName = splitName[0]; + string assemblyName = splitName[1].Substring(1); + Assembly assembly = null; + try { + assembly = Assembly.Load(assemblyName); + } catch (Exception) {} + if (assembly != null) { + type = assembly.GetType(typeName, throwOnError, ignoreCase); + } else { + type = Type.GetType(typeName, throwOnError, ignoreCase); + } + } + } + + return type; } } } diff --git a/src/SharpDevelop.Tests.sln b/src/SharpDevelop.Tests.sln index 7411e7d59e..ec5356b6bc 100644 --- a/src/SharpDevelop.Tests.sln +++ b/src/SharpDevelop.Tests.sln @@ -38,7 +38,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAntAddIn", "AddIns\Misc\NA EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks.Tests", "Libraries\ICSharpCode.Build.Tasks\Test\ICSharpCode.Build.Tasks.Tests.csproj", "{B7C2A664-B454-4920-AC6E-318F5274B2EF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor.Test", "Libraries\ICSharpCode.TextEditor\Test\ICSharpCode.TextEditor.Test.csproj", "{6259D767-BA7C-484D-9472-68F350A20086}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor.Tests", "Libraries\ICSharpCode.TextEditor\Test\ICSharpCode.TextEditor.Tests.csproj", "{6259D767-BA7C-484D-9472-68F350A20086}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}" EndProject