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 ***************************************************************************/
13 using System
.CodeDom
.Compiler
;
14 using System
.Diagnostics
;
15 using System
.Runtime
.InteropServices
;
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
28 /// Base code generator with site implementation
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
39 /// GetSite method of IOleObjectWithSite
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
)
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
);
63 /// SetSite method of IOleObjectWithSite
65 /// <param name="pUnkSite">site for this object to use</param>
66 void VSOLE
.IObjectWithSite
.SetSite(object pUnkSite
)
69 codeDomProvider
= null;
70 serviceProvider
= null;
76 /// Demand-creates a ServiceProvider
78 private ServiceProvider SiteServiceProvider
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
;
92 /// Method to get a service by its GUID
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
);
102 /// Method to get a service by its Type
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
);
112 /// Returns a CodeDomProvider object for the language of the project containing
113 /// the project item the generator was called on
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
;
128 //In the case where no language specific CodeDom is available, fall back to C#
129 codeDomProvider
= CodeDomProvider
.CreateProvider("C#");
132 return codeDomProvider
;
136 /// Gets the default extension of the output file from the CodeDomProvider
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());
152 /// Returns the EnvDTE.ProjectItem object that corresponds to the project item the code
153 /// generator was called on
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
;
164 /// Returns the EnvDTE.Project object of the project containing the project item the code
165 /// generator was called on
168 /// The EnvDTE.Project object of the project containing the project item the code generator was called on
170 protected Project
GetProject()
172 return GetProjectItem().ContainingProject
;
176 /// Returns the VSLangProj.VSProjectItem object that corresponds to the project item the code
177 /// generator was called on
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
;
186 /// Returns the VSLangProj.VSProject object of the project containing the project item the code
187 /// generator was called on
190 /// The VSLangProj.VSProject object of the project containing the project item
191 /// the code generator was called on
193 protected VSProject
GetVSProject()
195 return (VSProject
)GetProject().Object
;