public override object VisitCompilationUnit(CompilationUnit compilationUnit, object data) { base.VisitCompilationUnit(compilationUnit, data); if (!string.IsNullOrEmpty(NamespacePrefixToAdd)) { for (int i = 0; i < compilationUnit.Children.Count; i++) { NamespaceDeclaration ns = compilationUnit.Children[i] as NamespaceDeclaration; if (ns != null) { ns.Name = NamespacePrefixToAdd + "." + ns.Name; } if (compilationUnit.Children[i] is TypeDeclaration || compilationUnit.Children[i] is DelegateDeclaration) { ns = new NamespaceDeclaration(NamespacePrefixToAdd); ns.AddChild(compilationUnit.Children[i]); compilationUnit.Children[i] = ns; } } } ToCSharpConvertVisitor v = new ToCSharpConvertVisitor(); compilationUnit.AcceptVisitor(v, data); if (projectContent != null && projectContent.DefaultImports != null) { int index = 0; foreach (string u in projectContent.DefaultImports.Usings) { compilationUnit.Children.Insert(index++, new UsingDeclaration(u)); } } return null; }
public void Setup() { mocks = new MockRepository(); typeResolver = mocks.DynamicMock<ITypeResolver>(); visitor = new TypeInspectionVisitor(typeResolver); type = new TypeDeclaration(Modifiers.Public, new List<AttributeSection>()) {Name = "SomeType"}; @namespace = new NamespaceDeclaration("SomeNamespace"); @namespace.AddChild(type); type.Parent = @namespace; }
private void CreateTypeDeclarations(string jarFile) { LoadClasses(Path.GetFullPath(jarFile)); foreach (string package in classes.Keys) { if (!IsIncluded(package)) continue; Console.WriteLine(package); IDictionary types = new Hashtable(); IList packageClasses = (IList) classes[package]; foreach (ClassFile cf in packageClasses) { if (cf.IsPublic) { TypeDeclaration type = GetTypeDeclaration(cf); types.Add(type.Name, type); } } foreach (TypeDeclaration type in types.Values) { if (type.Name.IndexOf("$") == -1) { NamespaceDeclaration nameSpace = new NamespaceDeclaration(package); type.Parent = nameSpace; nameSpace.AddChild(type); CompilationUnit cu = new CompilationUnit(); cu.Children.Add(nameSpace); compilationUnits.Add(cu); } else { string parentName = type.Name.Substring(0, type.Name.IndexOf("$")); TypeDeclaration parent = (TypeDeclaration) types[GetTypeName(parentName)]; if (parent != null) { type.Name = GetTypeName(type.Name); parent.AddChild(type); } } } } }
// 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; }