2 // System.CodeDom.Compiler.CodeDomProvider.cs
5 // Daniel Stodden (stodden@in.tum.de)
6 // Marek Safar (marek.safar@seznam.cz)
7 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
8 // Sebastien Pouliot <sebastien@ximian.com>
10 // Copyright (C) 2002,2003,2004,2005 Novell, Inc (http://www.novell.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections;
33 using System.ComponentModel;
34 using System.Configuration;
36 using System.Runtime.InteropServices;
37 using System.Security.Permissions;
39 namespace System.CodeDom.Compiler {
45 public abstract class CodeDomProvider : Component
50 protected CodeDomProvider()
57 public virtual string FileExtension {
63 public virtual LanguageOptions LanguageOptions {
65 return LanguageOptions.None;
73 [Obsolete ("ICodeCompiler is obsolete")]
75 public abstract ICodeCompiler CreateCompiler();
78 [Obsolete ("ICodeGenerator is obsolete")]
80 public abstract ICodeGenerator CreateGenerator();
82 public virtual ICodeGenerator CreateGenerator (string fileName)
84 return CreateGenerator();
87 public virtual ICodeGenerator CreateGenerator (TextWriter output)
89 return CreateGenerator();
93 [Obsolete ("ICodeParser is obsolete")]
95 public virtual ICodeParser CreateParser()
100 public virtual TypeConverter GetConverter (Type type)
102 return TypeDescriptor.GetConverter (type);
106 public virtual CompilerResults CompileAssemblyFromDom (CompilerParameters options, params CodeCompileUnit[] compilationUnits)
108 ICodeCompiler cc = CreateCompiler ();
110 throw GetNotImplemented ();
111 return cc.CompileAssemblyFromDomBatch (options, compilationUnits);
114 public virtual CompilerResults CompileAssemblyFromFile (CompilerParameters options, params string[] fileNames)
116 ICodeCompiler cc = CreateCompiler ();
118 throw GetNotImplemented ();
119 return cc.CompileAssemblyFromFileBatch (options, fileNames);
122 public virtual CompilerResults CompileAssemblyFromSource (CompilerParameters options, params string[] fileNames)
124 ICodeCompiler cc = CreateCompiler ();
126 throw GetNotImplemented ();
127 return cc.CompileAssemblyFromSourceBatch (options, fileNames);
130 public virtual string CreateEscapedIdentifier (string value)
132 ICodeGenerator cg = CreateGenerator ();
134 throw GetNotImplemented ();
135 return cg.CreateEscapedIdentifier (value);
138 #if CONFIGURATION_DEP
140 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
141 public static CodeDomProvider CreateProvider (string language)
143 CompilerInfo ci = GetCompilerInfo (language);
144 return (ci == null) ? null : ci.CreateProvider ();
148 public virtual string CreateValidIdentifier (string value)
150 ICodeGenerator cg = CreateGenerator ();
152 throw GetNotImplemented ();
153 return cg.CreateValidIdentifier (value);
156 public virtual void GenerateCodeFromCompileUnit (CodeCompileUnit compileUnit,
157 TextWriter writer, CodeGeneratorOptions options)
159 ICodeGenerator cg = CreateGenerator ();
161 throw GetNotImplemented ();
162 cg.GenerateCodeFromCompileUnit (compileUnit, writer, options);
165 public virtual void GenerateCodeFromExpression (CodeExpression expression, TextWriter writer, CodeGeneratorOptions options)
167 ICodeGenerator cg = CreateGenerator ();
169 throw GetNotImplemented ();
170 cg.GenerateCodeFromExpression (expression, writer, options);
173 public virtual void GenerateCodeFromMember (CodeTypeMember member, TextWriter writer, CodeGeneratorOptions options)
175 // Documented to always throw an exception (if not overriden)
176 throw GetNotImplemented ();
177 // Note: the pattern is different from other GenerateCodeFrom* because
178 // ICodeGenerator doesn't have a GenerateCodeFromMember member
181 public virtual void GenerateCodeFromNamespace (CodeNamespace codeNamespace, TextWriter writer, CodeGeneratorOptions options)
183 ICodeGenerator cg = CreateGenerator ();
185 throw GetNotImplemented ();
186 cg.GenerateCodeFromNamespace (codeNamespace, writer, options);
189 public virtual void GenerateCodeFromStatement (CodeStatement statement, TextWriter writer, CodeGeneratorOptions options)
191 ICodeGenerator cg = CreateGenerator ();
193 throw GetNotImplemented ();
194 cg.GenerateCodeFromStatement (statement, writer, options);
197 public virtual void GenerateCodeFromType (CodeTypeDeclaration codeType, TextWriter writer, CodeGeneratorOptions options)
199 ICodeGenerator cg = CreateGenerator ();
201 throw GetNotImplemented ();
202 cg.GenerateCodeFromType (codeType, writer, options);
205 #if CONFIGURATION_DEP
207 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
208 public static CompilerInfo[] GetAllCompilerInfo ()
211 return (Config == null) ? null : Config.CompilerInfos;
216 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
217 public static CompilerInfo GetCompilerInfo (string language)
219 if (language == null)
220 throw new ArgumentNullException ("language");
223 CompilerCollection cc = Config.Compilers;
228 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
229 public static string GetLanguageFromExtension (string extension)
231 if (extension == null)
232 throw new ArgumentNullException ("extension");
235 return Config.Compilers.GetLanguageFromExtension (extension);
240 public virtual string GetTypeOutput (CodeTypeReference type)
242 ICodeGenerator cg = CreateGenerator ();
244 throw GetNotImplemented ();
245 return cg.GetTypeOutput (type);
248 #if CONFIGURATION_DEP
250 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
251 public static bool IsDefinedExtension (string extension)
253 if (extension == null)
254 throw new ArgumentNullException ("extension");
257 return (Config.Compilers.GetCompilerInfoForExtension (extension) != null);
263 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
264 public static bool IsDefinedLanguage (string language)
266 if (language == null)
267 throw new ArgumentNullException ("language");
270 return (Config.Compilers.GetCompilerInfoForLanguage (language) != null);
276 public virtual bool IsValidIdentifier (string value)
278 ICodeGenerator cg = CreateGenerator ();
280 throw GetNotImplemented ();
281 return cg.IsValidIdentifier (value);
284 public virtual CodeCompileUnit Parse (TextReader codeStream)
286 ICodeParser cp = CreateParser ();
288 throw GetNotImplemented ();
289 return cp.Parse (codeStream);
292 public virtual bool Supports (GeneratorSupport supports)
294 ICodeGenerator cg = CreateGenerator ();
296 throw GetNotImplemented ();
297 return cg.Supports (supports);
300 #if CONFIGURATION_DEP
301 static CodeDomConfigurationHandler Config {
302 get { return ConfigurationManager.GetSection ("system.codedom") as CodeDomConfigurationHandler; }
307 // This is used to prevent confusing Moma about methods not implemented.
309 Exception GetNotImplemented ()
311 return new NotImplementedException ();