public static string GenerateText(TypeDeclaration type, OrderedPartCollection<AbstractDynamicCompilationExtension> extensions) { var unit = new CompilationUnit(); var namespaces = new HashSet<string> { typeof (SystemTime).Namespace, typeof (AbstractViewGenerator).Namespace, typeof (Enumerable).Namespace, typeof (IEnumerable<>).Namespace, typeof (IEnumerable).Namespace, typeof (int).Namespace, typeof (LinqOnDynamic).Namespace, typeof(Field).Namespace, }; foreach (var extension in extensions) { foreach (var ns in extension.Value.GetNamespacesToImport()) { namespaces.Add(ns); } } foreach (var ns in namespaces) { unit.AddChild(new Using(ns)); } unit.AddChild(type); var output = new CSharpOutputVisitor(); unit.AcceptVisitor(output, null); return output.Text; }
public static string GenerateText(TypeDeclaration type) { var unit = new CompilationUnit(); unit.AddChild(new Using(typeof (AbstractViewGenerator).Namespace)); unit.AddChild(new Using(typeof (Enumerable).Namespace)); unit.AddChild(new Using(typeof (int).Namespace)); unit.AddChild(new Using(typeof (LinqOnDynamic).Namespace)); unit.AddChild(type); var output = new CSharpOutputVisitor(); unit.AcceptVisitor(output, null); return output.Text; }
private string LinqQueryToImplicitClass() { var parser = ParserFactory.CreateParser(SupportedLanguage.CSharp, new StringReader(source)); var block = parser.ParseBlock(); var visitor = new TransformVisitor(); block.AcceptVisitor(visitor, null); VariableDeclaration variable = GetVariableDeclaration(block); Name = variable.Name; var type = new TypeDeclaration(Modifiers.Public, new List<AttributeSection>()) { BaseTypes = { new TypeReference("AbstractViewGenerator") }, Name = Name, Type = ClassType.Class }; var ctor = new ConstructorDeclaration(Name, Modifiers.Public, new List<ParameterDeclarationExpression>(), null); type.Children.Add(ctor); ctor.Body = new BlockStatement(); ctor.Body.AddChild(new ExpressionStatement( new AssignmentExpression( new MemberReferenceExpression(new ThisReferenceExpression(), "ViewText"), AssignmentOperatorType.Assign, new PrimitiveExpression(source, source)))); ctor.Body.AddChild(new ExpressionStatement( new AssignmentExpression( new MemberReferenceExpression(new ThisReferenceExpression(), "ViewDefinition"), AssignmentOperatorType.Assign, new LambdaExpression { Parameters = { new ParameterDeclarationExpression(new TypeReference("System.Collections.Generic.IEnumerable<"+rootQueryType+">"), rootQueryName) }, ExpressionBody = variable.Initializer }))); var unit = new CompilationUnit(); unit.AddChild(new Using(typeof(AbstractViewGenerator).Namespace)); unit.AddChild(new Using(typeof(System.Linq.Enumerable).Namespace)); unit.AddChild(type); var output = new CSharpOutputVisitor(); unit.AcceptVisitor(output, null); return output.Text; }
public void ComplexExample() { string code = @"class A { Button closeButton; void M() { System.Windows.Forms.Panel panel1; closeButton = new System.Windows.Forms.Button(); panel1 = new System.Windows.Forms.Panel(); panel1.SuspendLayout(); panel1.Controls.Add(this.closeButton); closeButton.BackColor = System.Drawing.Color.FromArgb(); panel1.BackColor = System.Drawing.SystemColors.Info; } }"; TypeDeclaration decl = Ast.ParseUtilCSharp.ParseGlobal<TypeDeclaration>(code); CompilationUnit cu = new CompilationUnit(); cu.AddChild(decl); CodeNamespace ns = (CodeNamespace)cu.AcceptVisitor(new CodeDomVisitor(), null); Assert.AreEqual("A", ns.Types[0].Name); Assert.AreEqual("closeButton", ns.Types[0].Members[0].Name); Assert.AreEqual("M", ns.Types[0].Members[1].Name); CodeMemberMethod m = (CodeMemberMethod)ns.Types[0].Members[1]; CodeVariableDeclarationStatement s0 = (CodeVariableDeclarationStatement)m.Statements[0]; Assert.AreEqual("panel1", s0.Name); Assert.AreEqual("System.Windows.Forms.Panel", s0.Type.BaseType); CodeAssignStatement cas = (CodeAssignStatement)m.Statements[1]; Assert.AreEqual("closeButton", ((CodeFieldReferenceExpression)cas.Left).FieldName); cas = (CodeAssignStatement)m.Statements[2]; Assert.AreEqual("panel1", ((CodeVariableReferenceExpression)cas.Left).VariableName); CodeExpressionStatement ces = (CodeExpressionStatement)m.Statements[3]; CodeMethodInvokeExpression mie = (CodeMethodInvokeExpression)ces.Expression; Assert.AreEqual("SuspendLayout", mie.Method.MethodName); Assert.AreEqual("panel1", ((CodeVariableReferenceExpression)mie.Method.TargetObject).VariableName); ces = (CodeExpressionStatement)m.Statements[4]; mie = (CodeMethodInvokeExpression)ces.Expression; Assert.AreEqual("Add", mie.Method.MethodName); CodePropertyReferenceExpression pre = (CodePropertyReferenceExpression)mie.Method.TargetObject; Assert.AreEqual("Controls", pre.PropertyName); Assert.AreEqual("panel1", ((CodeVariableReferenceExpression)pre.TargetObject).VariableName); cas = (CodeAssignStatement)m.Statements[5]; pre = (CodePropertyReferenceExpression)cas.Left; Assert.AreEqual("BackColor", pre.PropertyName); Assert.AreEqual("closeButton", ((CodeFieldReferenceExpression)pre.TargetObject).FieldName); mie = (CodeMethodInvokeExpression)cas.Right; Assert.AreEqual("FromArgb", mie.Method.MethodName); Assert.IsTrue(mie.Method.TargetObject is CodeTypeReferenceExpression); Assert.AreEqual("System.Drawing.Color", (mie.Method.TargetObject as CodeTypeReferenceExpression).Type.BaseType); cas = (CodeAssignStatement)m.Statements[6]; pre = (CodePropertyReferenceExpression)cas.Left; Assert.AreEqual("BackColor", pre.PropertyName); Assert.AreEqual("panel1", ((CodeVariableReferenceExpression)pre.TargetObject).VariableName); pre = (CodePropertyReferenceExpression)cas.Right; Assert.AreEqual("Info", pre.PropertyName); Assert.IsTrue(pre.TargetObject is CodeTypeReferenceExpression); Assert.AreEqual("System.Drawing.SystemColors", (pre.TargetObject as CodeTypeReferenceExpression).Type.BaseType); }
// 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() { LoggingService.Debug("NRefactoryDesignerLoader.Parse()"); lastTextContent = this.Generator.ViewContent.DesignerCodeFileContent; ParseInformation parseInfo = ParserService.GetParseInformation(this.Generator.ViewContent.DesignerCodeFile.FileName); IClass formClass; bool isFirstClassInFile; IList<IClass> parts = FindFormClassParts(parseInfo, out formClass, out isFirstClassInFile); const string missingReferenceMessage = "Your project is missing a reference to '${Name}' - please add it using 'Project > Add Reference'."; if (formClass.ProjectContent.GetClass("System.Drawing.Point", 0) == null) { throw new FormsDesignerLoadException(StringParser.Parse(missingReferenceMessage, new StringTagPair("Name", "System.Drawing"))); } if (formClass.ProjectContent.GetClass("System.Windows.Forms.Form", 0) == null) { throw new FormsDesignerLoadException(StringParser.Parse(missingReferenceMessage, new StringTagPair("Name" , "System.Windows.Forms"))); } List<KeyValuePair<string, CompilationUnit>> compilationUnits = new List<KeyValuePair<string, CompilationUnit>>(); bool foundInitMethod = false; foreach (IClass part in parts) { string fileName = part.CompilationUnit.FileName; if (fileName == null) continue; bool found = false; foreach (KeyValuePair<string, CompilationUnit> entry in compilationUnits) { if (FileUtility.IsEqualFileName(fileName, entry.Key)) { found = true; break; } } if (found) continue; ITextBuffer fileContent; if (FileUtility.IsEqualFileName(fileName, this.Generator.ViewContent.PrimaryFileName)) { fileContent = this.Generator.ViewContent.PrimaryFileContent; } else if (FileUtility.IsEqualFileName(fileName, this.Generator.ViewContent.DesignerCodeFile.FileName)) { fileContent = new StringTextBuffer(this.Generator.ViewContent.DesignerCodeFileContent); } else { fileContent = ParserService.GetParseableFileContent(fileName); } ICSharpCode.NRefactory.IParser p = ICSharpCode.NRefactory.ParserFactory.CreateParser(language, fileContent.CreateReader()); p.Parse(); if (p.Errors.Count > 0) { throw new FormsDesignerLoadException("Syntax errors in " + fileName + ":\r\n" + p.Errors.ErrorOutput); } // Try to fix the type names to fully qualified ones FixTypeNames(p.CompilationUnit, part.CompilationUnit, ref foundInitMethod); compilationUnits.Add(new KeyValuePair<string, CompilationUnit>(fileName, p.CompilationUnit)); } if (!foundInitMethod) throw new FormsDesignerLoadException("The InitializeComponent method was not found. Designer cannot be loaded."); CompilationUnit combinedCu = new CompilationUnit(); NamespaceDeclaration nsDecl = new NamespaceDeclaration(formClass.Namespace); combinedCu.AddChild(nsDecl); TypeDeclaration formDecl = new TypeDeclaration(Modifiers.Public, null); nsDecl.AddChild(formDecl); formDecl.Name = formClass.Name; foreach (KeyValuePair<string, CompilationUnit> entry in compilationUnits) { foreach (object o in entry.Value.Children) { TypeDeclaration td = o as TypeDeclaration; if (td != null && td.Name == formDecl.Name) { foreach (INode node in td.Children) formDecl.AddChild(node); formDecl.BaseTypes.AddRange(td.BaseTypes); } if (o is NamespaceDeclaration) { foreach (object o2 in ((NamespaceDeclaration)o).Children) { td = o2 as TypeDeclaration; if (td != null && td.Name == formDecl.Name) { foreach (INode node in td.Children) formDecl.AddChild(node); formDecl.BaseTypes.AddRange(td.BaseTypes); } } } } } CodeDomVisitor visitor = new CodeDomVisitor(); visitor.EnvironmentInformationProvider = new ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryInformationProvider(formClass.ProjectContent); visitor.VisitCompilationUnit(combinedCu, null); // output generated CodeDOM to the console : #if DEBUG if ((Control.ModifierKeys & Keys.Control) == Keys.Control) { CodeDomVerboseOutputGenerator outputGenerator = new CodeDomVerboseOutputGenerator(); outputGenerator.GenerateCodeFromMember(visitor.codeCompileUnit.Namespaces[0].Types[0], Console.Out, null); this.CodeDomProvider.GenerateCodeFromCompileUnit(visitor.codeCompileUnit, 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 visitor.codeCompileUnit; }