added some development tools
[windows-sources.git] / developer / VSSDK / Samples / Single_File_Generator / C# / BaseCodeGeneratorWithSite.cs
bloba6618323f0f2eff15c1a02bdbb087e5f1f83f398
1 /***************************************************************************
3 Copyright (c) Microsoft Corporation. All rights reserved.
4 This code is licensed under the Visual Studio SDK license terms.
5 THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
6 ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
7 IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
8 PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
10 ***************************************************************************/
12 using System;
13 using System.CodeDom.Compiler;
14 using System.Diagnostics;
15 using System.Runtime.InteropServices;
16 using EnvDTE;
17 using EnvDTE80;
18 using VSLangProj;
19 using VSOLE = Microsoft.VisualStudio.OLE.Interop;
20 using Microsoft.VisualStudio;
21 using Microsoft.VisualStudio.Shell;
22 using Microsoft.VisualStudio.Shell.Interop;
23 using Microsoft.VisualStudio.Designer.Interfaces;
25 namespace Microsoft.Samples.VisualStudio.GeneratorSample
27 /// <summary>
28 /// Base code generator with site implementation
29 /// </summary>
30 public abstract class BaseCodeGeneratorWithSite : BaseCodeGenerator, VSOLE.IObjectWithSite
32 private object site = null;
33 private CodeDomProvider codeDomProvider = null;
34 private ServiceProvider serviceProvider = null;
36 #region IObjectWithSite Members
38 /// <summary>
39 /// GetSite method of IOleObjectWithSite
40 /// </summary>
41 /// <param name="riid">interface to get</param>
42 /// <param name="ppvSite">IntPtr in which to stuff return value</param>
43 void VSOLE.IObjectWithSite.GetSite(ref Guid riid, out IntPtr ppvSite)
45 if (site == null)
47 throw new COMException("object is not sited", VSConstants.E_FAIL);
50 IntPtr pUnknownPointer = Marshal.GetIUnknownForObject(site);
51 IntPtr intPointer = IntPtr.Zero;
52 Marshal.QueryInterface(pUnknownPointer, ref riid, out intPointer);
54 if (intPointer == IntPtr.Zero)
56 throw new COMException("site does not support requested interface", VSConstants.E_NOINTERFACE);
59 ppvSite = intPointer;
62 /// <summary>
63 /// SetSite method of IOleObjectWithSite
64 /// </summary>
65 /// <param name="pUnkSite">site for this object to use</param>
66 void VSOLE.IObjectWithSite.SetSite(object pUnkSite)
68 site = pUnkSite;
69 codeDomProvider = null;
70 serviceProvider = null;
73 #endregion
75 /// <summary>
76 /// Demand-creates a ServiceProvider
77 /// </summary>
78 private ServiceProvider SiteServiceProvider
80 get
82 if (serviceProvider == null)
84 serviceProvider = new ServiceProvider(site as VSOLE.IServiceProvider);
85 Debug.Assert(serviceProvider != null, "Unable to get ServiceProvider from site object.");
87 return serviceProvider;
91 /// <summary>
92 /// Method to get a service by its GUID
93 /// </summary>
94 /// <param name="serviceGuid">GUID of service to retrieve</param>
95 /// <returns>An object that implements the requested service</returns>
96 protected object GetService(Guid serviceGuid)
98 return SiteServiceProvider.GetService(serviceGuid);
101 /// <summary>
102 /// Method to get a service by its Type
103 /// </summary>
104 /// <param name="serviceType">Type of service to retrieve</param>
105 /// <returns>An object that implements the requested service</returns>
106 protected object GetService(Type serviceType)
108 return SiteServiceProvider.GetService(serviceType);
111 /// <summary>
112 /// Returns a CodeDomProvider object for the language of the project containing
113 /// the project item the generator was called on
114 /// </summary>
115 /// <returns>A CodeDomProvider object</returns>
116 protected virtual CodeDomProvider GetCodeProvider()
118 if (codeDomProvider == null)
120 //Query for IVSMDCodeDomProvider/SVSMDCodeDomProvider for this project type
121 IVSMDCodeDomProvider provider = GetService(typeof(SVSMDCodeDomProvider)) as IVSMDCodeDomProvider;
122 if (provider != null)
124 codeDomProvider = provider.CodeDomProvider as CodeDomProvider;
126 else
128 //In the case where no language specific CodeDom is available, fall back to C#
129 codeDomProvider = CodeDomProvider.CreateProvider("C#");
132 return codeDomProvider;
135 /// <summary>
136 /// Gets the default extension of the output file from the CodeDomProvider
137 /// </summary>
138 /// <returns></returns>
139 protected override string GetDefaultExtension()
141 CodeDomProvider codeDom = GetCodeProvider();
142 Debug.Assert(codeDom != null, "CodeDomProvider is NULL.");
143 string extension = codeDom.FileExtension;
144 if (extension != null && extension.Length > 0)
146 extension = "." + extension.TrimStart(".".ToCharArray());
148 return extension;
151 /// <summary>
152 /// Returns the EnvDTE.ProjectItem object that corresponds to the project item the code
153 /// generator was called on
154 /// </summary>
155 /// <returns>The EnvDTE.ProjectItem of the project item the code generator was called on</returns>
156 protected ProjectItem GetProjectItem()
158 object p = GetService(typeof(ProjectItem));
159 Debug.Assert(p != null, "Unable to get Project Item.");
160 return (ProjectItem)p;
163 /// <summary>
164 /// Returns the EnvDTE.Project object of the project containing the project item the code
165 /// generator was called on
166 /// </summary>
167 /// <returns>
168 /// The EnvDTE.Project object of the project containing the project item the code generator was called on
169 /// </returns>
170 protected Project GetProject()
172 return GetProjectItem().ContainingProject;
175 /// <summary>
176 /// Returns the VSLangProj.VSProjectItem object that corresponds to the project item the code
177 /// generator was called on
178 /// </summary>
179 /// <returns>The VSLangProj.VSProjectItem of the project item the code generator was called on</returns>
180 protected VSProjectItem GetVSProjectItem()
182 return (VSProjectItem)GetProjectItem().Object;
185 /// <summary>
186 /// Returns the VSLangProj.VSProject object of the project containing the project item the code
187 /// generator was called on
188 /// </summary>
189 /// <returns>
190 /// The VSLangProj.VSProject object of the project containing the project item
191 /// the code generator was called on
192 /// </returns>
193 protected VSProject GetVSProject()
195 return (VSProject)GetProject().Object;