static void GenerateSteticCodeStructure(DotNetProject project, Stetic.ProjectItemInfo item, Stetic.Component component, Stetic.ComponentNameEventArgs args, bool saveToFile, bool overwrite) { // Generate a class which contains fields for all bound widgets of the component string name = item != null ? item.Name : component.Name; string fileName = GetBuildCodeFileName(project, name); if (fileName == null) { return; } string ns = ""; int i = name.LastIndexOf('.'); if (i != -1) { ns = name.Substring(0, i); name = name.Substring(i + 1); } if (saveToFile && !overwrite && File.Exists(fileName)) { return; } if (item != null) { component = item.Component; } CodeCompileUnit cu = new CodeCompileUnit(); if (project.UsePartialTypes) { CodeNamespace cns = new CodeNamespace(ns); cu.Namespaces.Add(cns); CodeTypeDeclaration type = new CodeTypeDeclaration(name); type.IsPartial = true; type.Attributes = MemberAttributes.Public; type.TypeAttributes = System.Reflection.TypeAttributes.Public; cns.Types.Add(type); foreach (Stetic.ObjectBindInfo binfo in component.GetObjectBindInfo()) { // When a component is being renamed, we have to generate the // corresponding field using the old name, since it will be renamed // later using refactory string nname = args != null && args.NewName == binfo.Name ? args.OldName : binfo.Name; type.Members.Add( new CodeMemberField( binfo.TypeName, nname ) ); } } else { if (!saveToFile) { return; } CodeNamespace cns = new CodeNamespace(); cns.Comments.Add(new CodeCommentStatement("Generated code for component " + component.Name)); cu.Namespaces.Add(cns); } CodeDomProvider provider = project.LanguageBinding.GetCodeDomProvider(); if (provider == null) { throw new UserException("Code generation not supported for language: " + project.LanguageName); } TextWriter fileStream; if (saveToFile) { fileStream = new StreamWriter(fileName); } else { fileStream = new StringWriter(); } try { provider.GenerateCodeFromCompileUnit(cu, fileStream, new CodeGeneratorOptions()); } finally { fileStream.Close(); } if (ProjectDomService.HasDom(project)) { // Only update the parser database if the project is actually loaded in the IDE. if (saveToFile) { ProjectDomService.Parse(project, fileName, ""); FileService.NotifyFileChanged(fileName); } else { ProjectDomService.Parse(project, fileName, ((StringWriter)fileStream).ToString()); } } }