From 5b89814e74c341cd4346ef336feeacf3f4c36942 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 14 Jun 2013 16:47:13 +0200 Subject: [PATCH] Implement C# forms designer loader. --- .../CSharpBinding/Project/CSharpBinding.addin | 8 + .../Project/CSharpBinding.csproj | 14 + .../Project/Src/ExtensionMethods.cs | 21 ++ .../Src/FormsDesigner/CSharpDesignerLoader.cs | 139 +++++++ .../CSharpDesignerLoaderProvider.cs | 47 +++ .../CSharpFormsDesignerLoaderContext.cs | 47 +++ .../ICSharpDesignerLoaderContext.cs | 21 ++ .../FormsDesigner}/SecondaryDisplayBinding.cs | 77 ++-- .../Gui/WixDialogDesignerLoaderProvider.cs | 3 +- .../FormsDesigner/Project/FormsDesigner.addin | 7 - .../Project/FormsDesigner.csproj | 2 +- .../AbstractCodeDomDesignerLoader.cs | 19 - .../CodeDOMVerboseOutputGenerator.cs | 356 ++++++++++++++++++ .../DesignerLoader/DesignerLoaderProvider.cs | 20 +- .../Project/Src/DesignerViewContent.cs | 6 +- .../ICSharpCode.ReportDesigner.addin | 2 +- .../Project/Services/TypeResolutionService.cs | 6 - .../OutputVisitor/CodeDomConvertVisitor.cs | 2 +- .../TypeSystem/TypeSystemExtensions.cs | 2 + .../Project/Designer/TypeResolutionService.cs | 3 - 20 files changed, 688 insertions(+), 114 deletions(-) create mode 100644 src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpDesignerLoader.cs create mode 100644 src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpDesignerLoaderProvider.cs create mode 100644 src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpFormsDesignerLoaderContext.cs create mode 100644 src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/ICSharpDesignerLoaderContext.cs rename src/AddIns/{DisplayBindings/FormsDesigner/Project/Src => BackendBindings/CSharpBinding/Project/Src/FormsDesigner}/SecondaryDisplayBinding.cs (53%) create mode 100644 src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/CodeDOMVerboseOutputGenerator.cs diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin index 47ffeea755..68efb1bf1f 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin @@ -8,6 +8,7 @@ + @@ -321,4 +322,11 @@ + + + + diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj index 7d56122673..413773e546 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj @@ -54,6 +54,7 @@ + @@ -77,6 +78,11 @@ + + + + + @@ -197,6 +203,11 @@ ICSharpCode.SharpDevelop.Widgets False + + {9E951B9F-6AC2-4537-9D0B-0AE7C026D5A1} + FormsDesigner + False + @@ -206,5 +217,8 @@ + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/ExtensionMethods.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/ExtensionMethods.cs index 03a478223e..c43732370f 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/ExtensionMethods.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/ExtensionMethods.cs @@ -3,6 +3,9 @@ using System; using System.Threading.Tasks; +using ICSharpCode.Core; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; using CSharpBinding.Parser; using CSharpBinding.Refactoring; using ICSharpCode.NRefactory.CSharp; @@ -51,5 +54,23 @@ namespace CSharpBinding return new CSharpAstResolver(compilation, new SyntaxTree(), new CSharpUnresolvedFile { FileName = ec.FileName }); }); } + + /// + /// Retrieves the declaration for the specified entity. + /// Returns null if the entity is not defined in C# source code. + /// + public static EntityDeclaration GetDeclaration(this IEntity entity, out CSharpFullParseInformation parseInfo) + { + if (entity == null || string.IsNullOrEmpty(entity.Region.FileName)) { + parseInfo = null; + return null; + } + parseInfo = SD.ParserService.Parse(FileName.Create(entity.Region.FileName), + parentProject: entity.ParentAssembly.GetProject()) + as CSharpFullParseInformation; + if (parseInfo == null) + return null; + return parseInfo.SyntaxTree.GetNodeAt(entity.Region.Begin); + } } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpDesignerLoader.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpDesignerLoader.cs new file mode 100644 index 0000000000..5f660efec4 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpDesignerLoader.cs @@ -0,0 +1,139 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.Diagnostics; +using System.Linq; +using System.Windows.Forms; +using ICSharpCode.Core; +using ICSharpCode.FormsDesigner; +using ICSharpCode.NRefactory.CSharp; +using ICSharpCode.NRefactory.CSharp.Resolver; +using ICSharpCode.NRefactory.Editor; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; +using Microsoft.CSharp; +using CSharpBinding.Parser; + +namespace CSharpBinding.FormsDesigner +{ + public class CSharpDesignerLoader : AbstractCodeDomDesignerLoader + { + readonly CodeDomProvider codeDomProvider = new CSharpCodeProvider(); + readonly ICSharpDesignerLoaderContext context; + + public CSharpDesignerLoader(ICSharpDesignerLoaderContext context) + { + this.context = context; + } + + protected override void Write(CodeCompileUnit unit) + { + throw new NotImplementedException(); + } + + protected override CodeDomProvider CodeDomProvider { + get { + return codeDomProvider; + } + } + + ITextSourceVersion lastTextContentVersion; + + protected override bool IsReloadNeeded() + { + return base.IsReloadNeeded() || context.DesignerCodeFileDocument.Version.Equals(lastTextContentVersion); + } + + IUnresolvedTypeDefinition primaryPart; + + // Steps to load the designer: + // - Parse main file + // - Find other files containing parts of the form + // - Parse all files and look for fields (for controls) and InitializeComponents method + // - Create CodeDom objects for fields and InitializeComponents statements + // - If debug build and Ctrl pressed, output CodeDom to console + // - Return CodeDom objects to the .NET designer + protected override CodeCompileUnit Parse() + { + SD.Log.Debug("CSharpDesignerLoader.Parse()"); + + lastTextContentVersion = context.DesignerCodeFileDocument.Version; + var primaryParseInfo = context.GetPrimaryFileParseInformation(); + var compilation = context.GetCompilation(); + + // Find designer class + ITypeDefinition designerClass = null; + IMethod initializeComponents = null; + foreach (var utd in primaryParseInfo.UnresolvedFile.TopLevelTypeDefinitions) { + var td = utd.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly)).GetDefinition(); + if (td != null && FormsDesignerSecondaryDisplayBinding.IsDesignable(td)) { + primaryPart = utd; + designerClass = td; + initializeComponents = FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(td); + break; + } + } + + if (initializeComponents == null) { + throw new FormsDesignerLoadException("The InitializeComponent method was not found. Designer cannot be loaded."); + } + Debug.Assert(primaryPart != null); + Debug.Assert(designerClass != null); + + bool isFirstClassInFile = primaryParseInfo.UnresolvedFile.TopLevelTypeDefinitions[0] == primaryPart; + + // TODO: translate + const string missingReferenceMessage = "Your project is missing a reference to '${Name}' - please add it using 'Project > Add Reference'."; + if (compilation.FindType(typeof(System.Drawing.Point)).Kind == TypeKind.Unknown) { + throw new FormsDesignerLoadException(StringParser.Parse(missingReferenceMessage, new StringTagPair("Name", "System.Drawing"))); + } + if (compilation.FindType(typeof(System.Windows.Forms.Form)).Kind == TypeKind.Unknown) { + throw new FormsDesignerLoadException(StringParser.Parse(missingReferenceMessage, new StringTagPair("Name" , "System.Windows.Forms"))); + } + + CodeDomConvertVisitor cv = new CodeDomConvertVisitor(); + cv.UseFullyQualifiedTypeNames = true; + + CSharpFullParseInformation designerParseInfo; + MethodDeclaration initializeComponentsDeclaration = initializeComponents.GetDeclaration(out designerParseInfo) as MethodDeclaration; + if (initializeComponentsDeclaration == null) + throw new FormsDesignerLoadException("Could not find source code for InitializeComponents"); + var resolver = designerParseInfo.GetResolver(compilation); + var codeMethod = (CodeMemberMethod) cv.Convert(initializeComponentsDeclaration, resolver); + var codeClass = new CodeTypeDeclaration(designerClass.Name); + codeClass.Attributes = MemberAttributes.Public; + codeClass.BaseTypes.AddRange(designerClass.DirectBaseTypes.Select(cv.Convert).ToArray()); + codeClass.Members.Add(codeMethod); + + foreach (var field in designerClass.Fields) { + var codeField = new CodeMemberField(cv.Convert(field.Type), field.Name); + codeClass.Members.Add(codeField); + } + var codeNamespace = new CodeNamespace(designerClass.Namespace); + codeNamespace.Types.Add(codeClass); + var codeUnit = new CodeCompileUnit(); + codeUnit.Namespaces.Add(codeNamespace); + + // output generated CodeDOM to the console : + #if DEBUG + if ((Control.ModifierKeys & Keys.Control) == Keys.Control) { + CodeDomVerboseOutputGenerator outputGenerator = new CodeDomVerboseOutputGenerator(); + outputGenerator.GenerateCodeFromMember(codeMethod, Console.Out, null); + this.CodeDomProvider.GenerateCodeFromCompileUnit(codeUnit, Console.Out, null); + } + #endif + + LoggingService.Debug("NRefactoryDesignerLoader.Parse() finished"); + + if (!isFirstClassInFile) { + MessageService.ShowWarning("The form must be the first class in the file in order for form resources be compiled correctly.\n" + + "Please move other classes below the form class definition or move them to other files."); + } + + return codeUnit; + } + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpDesignerLoaderProvider.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpDesignerLoaderProvider.cs new file mode 100644 index 0000000000..f270565d44 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpDesignerLoaderProvider.cs @@ -0,0 +1,47 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.ComponentModel.Design.Serialization; +using System.Linq; +using ICSharpCode.FormsDesigner; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Workbench; +using CSharpBinding.Parser; + +namespace CSharpBinding.FormsDesigner +{ + public class CSharpDesignerLoaderProvider : IDesignerLoaderProvider + { + public DesignerLoader CreateLoader(FormsDesignerViewContent viewContent) + { + return new CSharpDesignerLoader(new CSharpFormsDesignerLoaderContext(viewContent)); + } + + public IReadOnlyList GetSourceFiles(FormsDesignerViewContent viewContent, out OpenedFile designerCodeFile) + { + // get new initialize components + var parsedFile = SD.ParserService.ParseFile(viewContent.PrimaryFileName, viewContent.PrimaryFileContent); + var compilation = SD.ParserService.GetCompilationForFile(viewContent.PrimaryFileName); + foreach (var utd in parsedFile.TopLevelTypeDefinitions) { + var td = utd.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly)).GetDefinition(); + if (FormsDesignerSecondaryDisplayBinding.IsDesignable(td)) { + var initializeComponents = FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(td); + if (initializeComponents != null) { + string designerFileName = initializeComponents.Region.FileName; + if (designerFileName != null) { + designerCodeFile = SD.FileService.GetOrCreateOpenedFile(designerFileName); + return td.Parts + .Select(p => SD.FileService.GetOrCreateOpenedFile(p.UnresolvedFile.FileName)) + .Distinct().ToList(); + } + } + } + } + + throw new FormsDesignerLoadException("Could not find InitializeComponent method in any part of the open class."); + } + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpFormsDesignerLoaderContext.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpFormsDesignerLoaderContext.cs new file mode 100644 index 0000000000..f09f4c56c9 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/CSharpFormsDesignerLoaderContext.cs @@ -0,0 +1,47 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.FormsDesigner; +using ICSharpCode.NRefactory.Editor; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; +using CSharpBinding.Parser; + +namespace CSharpBinding.FormsDesigner +{ + class CSharpFormsDesignerLoaderContext : ICSharpDesignerLoaderContext + { + readonly FormsDesignerViewContent viewContent; + + public CSharpFormsDesignerLoaderContext(FormsDesignerViewContent viewContent) + { + this.viewContent = viewContent; + } + + public IDocument PrimaryFileDocument { + get { + return viewContent.PrimaryFileDocument; + } + } + + public IDocument DesignerCodeFileDocument { + get { + return viewContent.DesignerCodeFileDocument; + } + } + + public CSharpFullParseInformation GetPrimaryFileParseInformation() + { + return SD.ParserService.Parse(viewContent.PrimaryFileName, viewContent.PrimaryFileDocument) + as CSharpFullParseInformation; + } + + public ICompilation GetCompilation() + { + return SD.ParserService.GetCompilationForFile(viewContent.PrimaryFileName); + } + } +} + + diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/ICSharpDesignerLoaderContext.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/ICSharpDesignerLoaderContext.cs new file mode 100644 index 0000000000..e92fd99d44 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/ICSharpDesignerLoaderContext.cs @@ -0,0 +1,21 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.NRefactory.Editor; +using ICSharpCode.NRefactory.TypeSystem; +using CSharpBinding.Parser; + +namespace CSharpBinding.FormsDesigner +{ + /// + /// Description of ICSharpDesignerLoaderContext. + /// + public interface ICSharpDesignerLoaderContext + { + //IDocument PrimaryFileDocument { get; } + IDocument DesignerCodeFileDocument { get; } + CSharpFullParseInformation GetPrimaryFileParseInformation(); + ICompilation GetCompilation(); + } +} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/SecondaryDisplayBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/SecondaryDisplayBinding.cs similarity index 53% rename from src/AddIns/DisplayBindings/FormsDesigner/Project/Src/SecondaryDisplayBinding.cs rename to src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/SecondaryDisplayBinding.cs index 9503dac922..423cd1fdee 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/SecondaryDisplayBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormsDesigner/SecondaryDisplayBinding.cs @@ -2,19 +2,15 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using System.IO; using System.Linq; using ICSharpCode.Core; -using ICSharpCode.NRefactory; +using ICSharpCode.FormsDesigner; using ICSharpCode.NRefactory.TypeSystem; -using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; -using ICSharpCode.SharpDevelop.Gui; -using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Workbench; -namespace ICSharpCode.FormsDesigner +namespace CSharpBinding.FormsDesigner { public class FormsDesignerSecondaryDisplayBinding : ISecondaryDisplayBinding { @@ -59,17 +55,19 @@ namespace ICSharpCode.FormsDesigner return false; } + public static bool IsDesignable(ITypeDefinition td) + { + return GetInitializeComponents(td) != null && BaseClassIsFormOrControl(td); + } + public static bool IsDesignable(IUnresolvedFile parsedFile, ICompilation compilation) { if (parsedFile == null) return false; foreach (var utd in parsedFile.TopLevelTypeDefinitions) { var td = utd.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly)).GetDefinition(); - if (td != null) { - IMethod method = GetInitializeComponents(td); - if (method != null) { - return BaseClassIsFormOrControl(td); - } + if (IsDesignable(td)) { + return true; } } return false; @@ -77,58 +75,27 @@ namespace ICSharpCode.FormsDesigner public bool CanAttachTo(IViewContent viewContent) { - if (viewContent is ITextEditorProvider) { - FileName fileName = viewContent.PrimaryFileName; - if (fileName == null) - return false; - - ITextEditor textEditor = viewContent.GetService(); - string fileExtension = Path.GetExtension(fileName).ToLowerInvariant(); - - switch (fileExtension) { - case ".cs": -// case ".vb": - var parsedFile = SD.ParserService.ParseFile(fileName, textEditor.Document); - var compilation = SD.ParserService.GetCompilationForFile(fileName); - if (IsDesignable(parsedFile, compilation)) - return true; - break; - } - } - return false; + ITextEditor textEditor = viewContent.GetService(); + if (textEditor == null) + return false; + FileName fileName = viewContent.PrimaryFileName; + if (fileName == null) + return false; + + var parsedFile = SD.ParserService.ParseFile(fileName, textEditor.Document); + var compilation = SD.ParserService.GetCompilationForFile(fileName); + return IsDesignable(parsedFile, compilation); } public IViewContent[] CreateSecondaryViewContent(IViewContent viewContent) { - return new IViewContent[0]; - /* if (viewContent.SecondaryViewContents.Any(c => c is FormsDesignerViewContent)) { return new IViewContent[0]; } - string fileExtension = String.Empty; - string fileName = viewContent.PrimaryFileName; - - fileExtension = Path.GetExtension(fileName).ToLowerInvariant(); - - IDesignerLoaderProvider loader; - IDesignerGenerator generator; - - switch (fileExtension) { - case ".cs": -// loader = new NRefactoryDesignerLoaderProvider(SupportedLanguage.CSharp); -// generator = new CSharpDesignerGenerator(); - throw new NotImplementedException(); - break; - case ".vb": - //loader = new NRefactoryDesignerLoaderProvider(SupportedLanguage.VBNet); - //generator = new VBNetDesignerGenerator(); - throw new NotImplementedException(); - break; - default: - throw new ApplicationException("Cannot create content for " + fileExtension); - } - return new IViewContent[] { new FormsDesignerViewContent(viewContent, loader, generator) }; */ + return new IViewContent[] { + new FormsDesignerViewContent(viewContent, new CSharpDesignerLoaderProvider()) + }; } } } diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixDialogDesignerLoaderProvider.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixDialogDesignerLoaderProvider.cs index f47a85a2ae..bf65f22795 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixDialogDesignerLoaderProvider.cs +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixDialogDesignerLoaderProvider.cs @@ -17,8 +17,9 @@ namespace ICSharpCode.WixBinding return new WixDialogDesignerLoader((IWixDialogDesigner)viewContent); } - public IReadOnlyList GetSourceFiles(FormsDesignerViewContent viewContent) + public IReadOnlyList GetSourceFiles(FormsDesignerViewContent viewContent, out OpenedFile designerCodeFile) { + designerCodeFile = viewContent.PrimaryFile; return new[] { viewContent.PrimaryFile }; } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.addin b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.addin index 06608bef24..f8cc5ba5a5 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.addin +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.addin @@ -13,13 +13,6 @@ - - - - + @@ -96,7 +97,6 @@ LocalizationModelOptionsPanel.xaml Code - diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/AbstractCodeDomDesignerLoader.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/AbstractCodeDomDesignerLoader.cs index cd8d657318..1968aef182 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/AbstractCodeDomDesignerLoader.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/AbstractCodeDomDesignerLoader.cs @@ -14,7 +14,6 @@ using ICSharpCode.FormsDesigner.Services; namespace ICSharpCode.FormsDesigner { - /* /// /// An abstract base class for CodeDOM designer loaders. /// @@ -23,7 +22,6 @@ namespace ICSharpCode.FormsDesigner bool loading; IDesignerLoaderHost designerLoaderHost = null; ITypeResolutionService typeResolutionService = null; - readonly IDesignerGenerator generator; public override bool Loading { get { return base.Loading || loading; } @@ -37,22 +35,6 @@ namespace ICSharpCode.FormsDesigner get { return this.designerLoaderHost; } } - protected override CodeDomProvider CodeDomProvider { - get { return this.generator.CodeDomProvider; } - } - - protected IDesignerGenerator Generator { - get { return this.generator; } - } - - protected AbstractCodeDomDesignerLoader(IDesignerGenerator generator) - { - if (generator == null) { - throw new ArgumentNullException("generator", "Generator cannot be null"); - } - this.generator = generator; - } - public override void Dispose() { try { @@ -173,5 +155,4 @@ namespace ICSharpCode.FormsDesigner MessageService.ShowError(sb.ToString()); } } - */ } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/CodeDOMVerboseOutputGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/CodeDOMVerboseOutputGenerator.cs new file mode 100644 index 0000000000..c93baffc12 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/CodeDOMVerboseOutputGenerator.cs @@ -0,0 +1,356 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.IO; +using System.Security.Permissions; + +namespace ICSharpCode.FormsDesigner +{ + [PermissionSet(SecurityAction.InheritanceDemand, Name = "FullTrust")] + [PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")] + public class CodeDomVerboseOutputGenerator : System.CodeDom.Compiler.CodeGenerator + { + #region System.CodeDom.Compiler.CodeGenerator abstract class implementation + protected override string NullToken { + get { + return "[NULL]"; + } + } + + protected override void OutputType(CodeTypeReference typeRef) + { + Output.Write("[CodeTypeReference: {0}", typeRef.BaseType); + if (typeRef.ArrayRank > 0) { + Output.Write(" Rank:" + typeRef.ArrayRank); + } + Output.Write("]"); + } + + protected override void GenerateArrayCreateExpression(CodeArrayCreateExpression e) + { + Output.Write("[CodeArrayCreateExpression: {0}]", e.ToString()); + } + + protected override void GenerateBaseReferenceExpression(CodeBaseReferenceExpression e) + { + Output.Write("[CodeBaseReferenceExpression: {0}]", e.ToString()); + } + + protected override void GenerateCastExpression(CodeCastExpression e) + { + Output.Write("[CodeCastExpression: {0}]", e.ToString()); + } + + protected override void GenerateDelegateCreateExpression(CodeDelegateCreateExpression e) + { + Output.Write("[CodeDelegateCreateExpression: {0}]", e.ToString()); + } + + protected override void GenerateFieldReferenceExpression(CodeFieldReferenceExpression e) + { + Output.Write("[CodeFieldReferenceExpression: Name={0}, Target=", e.FieldName); + this.GenerateExpression(e.TargetObject); + Output.Write("]"); + } + + protected override void GenerateMethodReferenceExpression(CodeMethodReferenceExpression e) + { + Output.Write("[CodeMethodReferenceExpression: Name={0}, Target=", e.MethodName); + this.GenerateExpression(e.TargetObject); + Output.Write("]"); + } + + protected override void GenerateEventReferenceExpression(CodeEventReferenceExpression e) + { + Output.Write("[CodeEventReferenceExpression: Name={0}, Target=", e.EventName); + this.GenerateExpression(e.TargetObject); + Output.Write("]"); + } + + protected override void GenerateArgumentReferenceExpression(CodeArgumentReferenceExpression e) + { + Output.Write("[CodeArgumentReferenceExpression: {0}]", e.ToString()); + } + + protected override void GenerateVariableReferenceExpression(CodeVariableReferenceExpression e) + { + Output.Write("[CodeVariableReferenceExpression: Name={0}]", e.VariableName); + } + + protected override void GenerateIndexerExpression(CodeIndexerExpression e) + { + Output.Write("[CodeIndexerExpression: {0}]", e.ToString()); + } + + protected override void GenerateArrayIndexerExpression(CodeArrayIndexerExpression e) + { + Output.Write("[CodeArrayIndexerExpression: {0}]", e.ToString()); + } + + protected override void GenerateSnippetExpression(CodeSnippetExpression e) + { + Output.Write("[CodeSnippetExpression: {0}]", e.ToString()); + } + + protected override void GenerateMethodInvokeExpression(CodeMethodInvokeExpression e) + { + Output.Write("[CodeMethodInvokeExpression: Method="); + GenerateMethodReferenceExpression(e.Method); + Output.Write(", Parameters="); + bool first = true; + foreach (CodeExpression expr in e.Parameters) { + if (first) first = false; else Output.Write(", "); + this.GenerateExpression(expr); + } + Output.Write("]"); + } + + protected override void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e) + { + Output.Write("[CodeDelegateInvokeExpression: {0}]", e.ToString()); + } + + protected override void GenerateObjectCreateExpression(CodeObjectCreateExpression e) + { + Output.Write("[CodeObjectCreateExpression: Type={0}, Parameters=", e.CreateType.BaseType); + bool first = true; + foreach (CodeExpression expr in e.Parameters) { + if (first) first = false; else Output.Write(", "); + this.GenerateExpression(expr); + } + Output.Write("]"); + } + + protected override void GeneratePropertyReferenceExpression(CodePropertyReferenceExpression e) + { + Output.Write("[CodePropertyReferenceExpression: Name={0}, Target=", e.PropertyName); + this.GenerateExpression(e.TargetObject); + Output.Write("]"); + } + + protected override void GeneratePropertySetValueReferenceExpression(CodePropertySetValueReferenceExpression e) + { + Output.Write("[CodePropertySetValueReferenceExpression: {0}]", e.ToString()); + } + + protected override void GenerateThisReferenceExpression(CodeThisReferenceExpression e) + { + Output.Write("[CodeThisReferenceExpression]"); + } + + protected override void GenerateExpressionStatement(CodeExpressionStatement e) + { + Output.Write("[CodeExpressionStatement:"); + base.GenerateExpression(e.Expression); + Output.WriteLine("]"); + } + + protected override void GenerateIterationStatement(CodeIterationStatement e) + { + Output.WriteLine("[CodeIterationStatement: {0}]", e.ToString()); + } + + protected override void GenerateThrowExceptionStatement(CodeThrowExceptionStatement e) + { + Output.WriteLine("[CodeThrowExceptionStatement: {0}]", e.ToString()); + } + + protected override void GenerateComment(CodeComment e) + { + Output.WriteLine("[CodeComment: {0}]", e.ToString()); + } + + protected override void GenerateMethodReturnStatement(CodeMethodReturnStatement e) + { + Output.WriteLine("[CodeMethodReturnStatement: {0}]", e.ToString()); + } + + protected override void GenerateConditionStatement(CodeConditionStatement e) + { + Output.WriteLine("[GenerateConditionStatement: {0}]", e.ToString()); + } + + protected override void GenerateTryCatchFinallyStatement(CodeTryCatchFinallyStatement e) + { + Output.WriteLine("[CodeTryCatchFinallyStatement: {0}]", e.ToString()); + } + + protected override void GenerateAssignStatement(CodeAssignStatement e) + { + Output.Write("[CodeAssignStatement: Left="); + base.GenerateExpression(e.Left); + Output.Write(", Right="); + base.GenerateExpression(e.Right); + Output.WriteLine("]"); + } + + protected override void GenerateAttachEventStatement(CodeAttachEventStatement e) + { + Output.WriteLine("[CodeAttachEventStatement: {0}]", e.ToString()); + } + + protected override void GenerateRemoveEventStatement(CodeRemoveEventStatement e) + { + Output.WriteLine("[CodeRemoveEventStatement: {0}]", e.ToString()); + } + + protected override void GenerateGotoStatement(CodeGotoStatement e) + { + Output.WriteLine("[CodeGotoStatement: {0}]", e.ToString()); + } + + protected override void GenerateLabeledStatement(CodeLabeledStatement e) + { + Output.WriteLine("[CodeLabeledStatement: {0}]", e.ToString()); + } + + protected override void GenerateVariableDeclarationStatement(CodeVariableDeclarationStatement e) + { + Output.WriteLine("[CodeVariableDeclarationStatement: {0}]", e.ToString()); + } + + protected override void GenerateLinePragmaStart(CodeLinePragma e) + { + Output.WriteLine("[CodeLinePragma: {0}]", e.ToString()); + } + + protected override void GenerateLinePragmaEnd(CodeLinePragma e) + { + Output.WriteLine("[CodeLinePragma: {0}]", e.ToString()); + } + + protected override void GenerateEvent(CodeMemberEvent e, CodeTypeDeclaration c) + { + Output.WriteLine("[CodeMemberEvent: {0}]", e.ToString()); + } + + protected override void GenerateField(CodeMemberField e) + { + Output.Write("[CodeMemberField: Name={0}, Type=", e.Name); + Output.Write(e.Type.BaseType); + Output.WriteLine("]"); + } + + protected override void GenerateSnippetMember(CodeSnippetTypeMember e) + { + Output.WriteLine("[CodeSnippetTypeMember: {0}]", e.ToString()); + } + + protected override void GenerateEntryPointMethod(CodeEntryPointMethod e, CodeTypeDeclaration c) + { + Output.WriteLine("[CodeEntryPointMethod: {0}]", e.ToString()); + } + + public void PublicGenerateCodeFromStatement(CodeStatement e, TextWriter w, CodeGeneratorOptions o) + { + ((ICodeGenerator)this).GenerateCodeFromStatement(e, w, o); + } + + protected override void GenerateMethod(CodeMemberMethod e, CodeTypeDeclaration c) + { + Output.WriteLine("[CodeMemberMethod: Name={0}, Parameterns={1}]", e.Name, e.Parameters.Count); + ++Indent; + GenerateStatements(e.Statements); + --Indent; + } + + protected override void GenerateProperty(CodeMemberProperty e, CodeTypeDeclaration c) + { + Output.WriteLine("[CodeMemberProperty : {0}]", e.ToString()); + } + + protected override void GenerateConstructor(CodeConstructor e, CodeTypeDeclaration c) + { + Output.WriteLine("[CodeConstructor : {0}]", e.ToString()); + ++Indent; + GenerateStatements(e.Statements); + --Indent; + } + + protected override void GenerateTypeConstructor(CodeTypeConstructor e) + { + Output.WriteLine("[CodeTypeConstructor : {0}]", e.ToString()); + } + + protected override void GenerateTypeStart(CodeTypeDeclaration e) + { + Output.WriteLine("[CodeTypeDeclaration : {0}]", e.ToString()); + } + + protected override void GenerateTypeEnd(CodeTypeDeclaration e) + { + Output.WriteLine("[CodeTypeDeclaration: {0}]", e.ToString()); + } + + protected override void GenerateNamespaceStart(CodeNamespace e) + { + Output.WriteLine("[CodeNamespaceStart: {0}]", e.ToString()); + } + + protected override void GenerateNamespaceEnd(CodeNamespace e) + { + Output.WriteLine("[CodeNamespaceEnd: {0}]", e.ToString()); + } + + protected override void GenerateNamespaceImport(CodeNamespaceImport e) + { + Output.WriteLine("[CodeNamespaceImport: {0}]", e.ToString()); + } + + protected override void GenerateAttributeDeclarationsStart(CodeAttributeDeclarationCollection attributes) + { + Output.WriteLine("[CodeAttributeDeclarationCollection: {0}]", attributes.ToString()); + } + + protected override void GenerateAttributeDeclarationsEnd(CodeAttributeDeclarationCollection attributes) + { + Output.WriteLine("[CodeAttributeDeclarationCollection: {0}]", attributes.ToString()); + } + + protected override void GeneratePrimitiveExpression(CodePrimitiveExpression e) + { + if (e.Value == null) { + Output.WriteLine("[CodePrimitiveExpression: null]"); + } else { + Output.Write("[CodePrimitiveExpression: "); + base.GeneratePrimitiveExpression(e); + Output.WriteLine(" (" + e.Value.GetType().Name + ")]"); + } + } + + protected override bool Supports(GeneratorSupport support) + { + return true; + } + + protected override bool IsValidIdentifier(string value) + { + return true; + } + + protected override string CreateEscapedIdentifier(string value) + { + return value; + } + + protected override string CreateValidIdentifier(string value) + { + return value; + } + + protected override string GetTypeOutput(CodeTypeReference value) + { + return value.ToString(); + } + + protected override string QuoteSnippetString(string value) + { + return "\"" + value + "\""; + } + + #endregion + } +} diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/DesignerLoaderProvider.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/DesignerLoaderProvider.cs index 153c8dcf2a..2b6b30ae83 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/DesignerLoaderProvider.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/DesignerLoaderProvider.cs @@ -15,23 +15,9 @@ namespace ICSharpCode.FormsDesigner /// /// Gets the source files involved when designing. - /// The first file in the resulting list is the main code file. /// - IReadOnlyList GetSourceFiles(FormsDesignerViewContent viewContent); + /// + /// The file that contains the InitializeComponents() implementation + IReadOnlyList GetSourceFiles(FormsDesignerViewContent viewContent, out OpenedFile designerCodeFile); } - /* - public class NRefactoryDesignerLoaderProvider : IDesignerLoaderProvider - { - readonly SupportedLanguage language; - - public NRefactoryDesignerLoaderProvider(SupportedLanguage language) - { - this.language = language; - } - - public DesignerLoader CreateLoader(IDesignerGenerator generator) - { - return new NRefactoryDesignerLoader(language, generator); - } - }*/ } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs index 4b3959fbf4..6e0959b695 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs @@ -189,9 +189,9 @@ namespace ICSharpCode.FormsDesigner this.sourceCodeStorage.LoadFile(file, stream); LoggingService.Debug("Forms designer: Determining designer source files for " + file.FileName); - IReadOnlyList sourceFiles = loaderProvider.GetSourceFiles(this); - OpenedFile newDesignerCodeFile = sourceFiles.FirstOrDefault(); - if (newDesignerCodeFile == null) { + OpenedFile newDesignerCodeFile; + IReadOnlyList sourceFiles = loaderProvider.GetSourceFiles(this, out newDesignerCodeFile); + if (sourceFiles == null || newDesignerCodeFile == null) { throw new FormsDesignerLoadException("The designer source files could not be determined."); } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/ICSharpCode.ReportDesigner.addin b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/ICSharpCode.ReportDesigner.addin index 9c0ed41d86..60b527d591 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/ICSharpCode.ReportDesigner.addin +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/ICSharpCode.ReportDesigner.addin @@ -211,6 +211,6 @@ - + diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/Services/TypeResolutionService.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/Services/TypeResolutionService.cs index b2b5a898bb..6fe7cec9ec 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/Services/TypeResolutionService.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/Services/TypeResolutionService.cs @@ -4,15 +4,9 @@ using System; using System.Collections.Generic; using System.ComponentModel.Design; -using System.Diagnostics; -using System.IO; using System.Reflection; using ICSharpCode.Core; -using ICSharpCode.SharpDevelop; -using ICSharpCode.SharpDevelop.Dom; -using ICSharpCode.SharpDevelop.Project; -using Microsoft.Win32; namespace ICSharpCode.Reports.Addin { diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs index c4b72e8967..096a2679b7 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs @@ -144,7 +144,7 @@ namespace ICSharpCode.NRefactory.CSharp return result.ToArray(); } - CodeTypeReference Convert(IType type) + public CodeTypeReference Convert(IType type) { if (type.Kind == TypeKind.Array) { ArrayType a = (ArrayType)type; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/TypeSystemExtensions.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/TypeSystemExtensions.cs index 12efe662ba..2c615bf028 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/TypeSystemExtensions.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/TypeSystemExtensions.cs @@ -656,6 +656,7 @@ namespace ICSharpCode.NRefactory.TypeSystem yield return attr; } } + yield break; } IMember member = entity as IMember; if (member != null) { @@ -671,6 +672,7 @@ namespace ICSharpCode.NRefactory.TypeSystem yield return attr; } } while (member.IsOverride && (member = InheritanceHelper.GetBaseMember(member)) != null); + yield break; } throw new NotSupportedException("Unknown entity type"); } diff --git a/src/Main/Base/Project/Designer/TypeResolutionService.cs b/src/Main/Base/Project/Designer/TypeResolutionService.cs index 72c07477fb..dbc74d6a32 100644 --- a/src/Main/Base/Project/Designer/TypeResolutionService.cs +++ b/src/Main/Base/Project/Designer/TypeResolutionService.cs @@ -3,17 +3,14 @@ using System; using System.Collections.Generic; -using System.ComponentModel.Design; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; -using System.Windows.Documents; using ICSharpCode.Core; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Gui; -using ICSharpCode.SharpDevelop.Gui.XmlForms; using ICSharpCode.SharpDevelop.Project; using Microsoft.Win32;