Пример #1
0
        ///-------------------------------------------------------------------------------------------------------------
        /// <summary>
        ///
        /// </summary>
        ///-------------------------------------------------------------------------------------------------------------
        void IVsCodeBehindCodeGenerator.Generate()
        {
            DocData           ddDesigner     = null;
            DocDataTextWriter designerWriter = null;

            try
            {
                if (_itemCode != null && _codeDomProvider != null)
                {
                    // Generate the code
                    StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture);
                    _codeDomProvider.GenerateCodeFromCompileUnit(_ccu, stringWriter, _codeGeneratorOptions);
                    string generatedCode = stringWriter.ToString();

                    // Create designer file if requested
                    if (_itemDesigner == null && _create)
                    {
                        _itemDesigner = GetDesignerItem(_itemCode, true);
                    }

                    // See if generated code changed
                    string designerContents = _itemDesigner.GetDocumentText();
                    if (!BufferEquals(designerContents, generatedCode))                      // Would be nice to just compare lengths but the buffer gets formatted after insertion
                    {
                        ddDesigner = new LockedDocData(_serviceProvider, _itemDesigner.FullPath());

                        // Try to check out designer file (this throws)
                        ddDesigner.CheckoutFile(_serviceProvider);

                        // Write out the new code
                        designerWriter = new DocDataTextWriter(ddDesigner);
                        designerWriter.Write(generatedCode);
                        designerWriter.Flush();
                        designerWriter.Close();
                    }
                }
            }
            finally
            {
                if (designerWriter != null)
                {
                    designerWriter.Dispose();
                }
                if (ddDesigner != null)
                {
                    ddDesigner.Dispose();
                }
            }
        }
Пример #2
0
        ///-------------------------------------------------------------------------------------------------------------
        /// <summary>
        ///	 Gets a VshierarchyItem for the designer file if possible.
        ///	 Will create new file if specified and not existing.
        /// </summary>
        ///-------------------------------------------------------------------------------------------------------------
        public /*protected, but public for FSharp.Project.dll*/ virtual VsHierarchyItem GetDesignerItem(VsHierarchyItem itemCode, bool create)
        {
            VsHierarchyItem itemDesigner = null;

            if (itemCode != null)
            {
                // Calculate codebehind and designer file paths
                string codeBehindFile = itemCode.FullPath();
                string designerFile   = null;
                if (_isPartialClassDisabled)
                {
                    designerFile = codeBehindFile;
                }
                else if (!string.IsNullOrEmpty(codeBehindFile))
                {
                    designerFile = codeBehindFile.Insert(codeBehindFile.LastIndexOf("."), ".designer");
                }

                // Try to locate existing designer file
                if (!string.IsNullOrEmpty(designerFile))
                {
                    itemDesigner = VsHierarchyItem.CreateFromMoniker(designerFile, _hierarchy);
                    if (itemDesigner != null)
                    {
                        return(itemDesigner);
                    }
                }

                // Create empty designer file if requested
                if (create && !string.IsNullOrEmpty(designerFile))
                {
                    ProjectItem projectItemCode = itemCode.ProjectItem();
                    if (projectItemCode != null)
                    {
                        ProjectItems projectItems = projectItemCode.Collection;
                        if (projectItems != null)
                        {
                            try
                            {
                                using (StreamWriter sw = File.CreateText(designerFile))
                                {
                                    sw.WriteLine(" ");
                                }

                                projectItems.AddFromFileCopy(designerFile);
                            }
                            catch
                            {
                            }

                            itemDesigner = VsHierarchyItem.CreateFromMoniker(designerFile, _hierarchy);
                            if (itemDesigner != null)
                            {
                                return(itemDesigner);
                            }
                        }
                    }
                }
            }

            return(itemDesigner);
        }