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.Collections.Generic;
34 using System.ComponentModel;
35 using System.Configuration;
37 using System.Runtime.InteropServices;
38 using System.Security.Permissions;
40 namespace System.CodeDom.Compiler {
44 public abstract class CodeDomProvider : Component
49 protected CodeDomProvider()
56 public virtual string FileExtension {
62 public virtual LanguageOptions LanguageOptions {
64 return LanguageOptions.None;
71 [Obsolete ("ICodeCompiler is obsolete")]
72 public abstract ICodeCompiler CreateCompiler();
74 [Obsolete ("ICodeGenerator is obsolete")]
75 public abstract ICodeGenerator CreateGenerator();
77 public virtual ICodeGenerator CreateGenerator (string fileName)
79 return CreateGenerator();
82 public virtual ICodeGenerator CreateGenerator (TextWriter output)
84 return CreateGenerator();
87 [Obsolete ("ICodeParser is obsolete")]
88 public virtual ICodeParser CreateParser()
93 public virtual TypeConverter GetConverter (Type type)
95 return TypeDescriptor.GetConverter (type);
98 public virtual CompilerResults CompileAssemblyFromDom (CompilerParameters options, params CodeCompileUnit[] compilationUnits)
100 ICodeCompiler cc = CreateCompiler ();
102 throw GetNotImplemented ();
103 return cc.CompileAssemblyFromDomBatch (options, compilationUnits);
106 public virtual CompilerResults CompileAssemblyFromFile (CompilerParameters options, params string[] fileNames)
108 ICodeCompiler cc = CreateCompiler ();
110 throw GetNotImplemented ();
111 return cc.CompileAssemblyFromFileBatch (options, fileNames);
114 public virtual CompilerResults CompileAssemblyFromSource (CompilerParameters options, params string[] sources)
116 ICodeCompiler cc = CreateCompiler ();
118 throw GetNotImplemented ();
119 return cc.CompileAssemblyFromSourceBatch (options, sources);
122 public virtual string CreateEscapedIdentifier (string value)
124 ICodeGenerator cg = CreateGenerator ();
126 throw GetNotImplemented ();
127 return cg.CreateEscapedIdentifier (value);
130 #if CONFIGURATION_DEP
132 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
133 public static CodeDomProvider CreateProvider (string language)
135 CompilerInfo ci = GetCompilerInfo (language);
136 return (ci == null) ? null : ci.CreateProvider ();
139 public static CodeDomProvider CreateProvider (string language, IDictionary<string, string> providerOptions)
141 CompilerInfo ci = GetCompilerInfo (language);
142 return ci == null ? null : ci.CreateProvider (providerOptions);
146 public virtual string CreateValidIdentifier (string value)
148 ICodeGenerator cg = CreateGenerator ();
150 throw GetNotImplemented ();
151 return cg.CreateValidIdentifier (value);
154 public virtual void GenerateCodeFromCompileUnit (CodeCompileUnit compileUnit,
155 TextWriter writer, CodeGeneratorOptions options)
157 ICodeGenerator cg = CreateGenerator ();
159 throw GetNotImplemented ();
160 cg.GenerateCodeFromCompileUnit (compileUnit, writer, options);
163 public virtual void GenerateCodeFromExpression (CodeExpression expression, TextWriter writer, CodeGeneratorOptions options)
165 ICodeGenerator cg = CreateGenerator ();
167 throw GetNotImplemented ();
168 cg.GenerateCodeFromExpression (expression, writer, options);
171 public virtual void GenerateCodeFromMember (CodeTypeMember member, TextWriter writer, CodeGeneratorOptions options)
173 // Documented to always throw an exception (if not overriden)
174 throw GetNotImplemented ();
175 // Note: the pattern is different from other GenerateCodeFrom* because
176 // ICodeGenerator doesn't have a GenerateCodeFromMember member
179 public virtual void GenerateCodeFromNamespace (CodeNamespace codeNamespace, TextWriter writer, CodeGeneratorOptions options)
181 ICodeGenerator cg = CreateGenerator ();
183 throw GetNotImplemented ();
184 cg.GenerateCodeFromNamespace (codeNamespace, writer, options);
187 public virtual void GenerateCodeFromStatement (CodeStatement statement, TextWriter writer, CodeGeneratorOptions options)
189 ICodeGenerator cg = CreateGenerator ();
191 throw GetNotImplemented ();
192 cg.GenerateCodeFromStatement (statement, writer, options);
195 public virtual void GenerateCodeFromType (CodeTypeDeclaration codeType, TextWriter writer, CodeGeneratorOptions options)
197 ICodeGenerator cg = CreateGenerator ();
199 throw GetNotImplemented ();
200 cg.GenerateCodeFromType (codeType, writer, options);
203 #if CONFIGURATION_DEP
205 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
206 public static CompilerInfo[] GetAllCompilerInfo ()
209 return (Config == null) ? null : Config.CompilerInfos;
214 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
215 public static CompilerInfo GetCompilerInfo (string language)
217 if (language == null)
218 throw new ArgumentNullException ("language");
221 CompilerCollection cc = Config.Compilers;
226 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
227 public static string GetLanguageFromExtension (string extension)
229 if (extension == null)
230 throw new ArgumentNullException ("extension");
233 return Config.Compilers.GetLanguageFromExtension (extension);
237 public static CompilerInfo[] GetAllCompilerInfo () { return null; }
238 public static CompilerInfo GetCompilerInfo (string language) { return null; }
239 public static string GetLanguageFromExtension (string extension) { return null; }
242 public virtual string GetTypeOutput (CodeTypeReference type)
244 ICodeGenerator cg = CreateGenerator ();
246 throw GetNotImplemented ();
247 return cg.GetTypeOutput (type);
250 #if CONFIGURATION_DEP
252 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
253 public static bool IsDefinedExtension (string extension)
255 if (extension == null)
256 throw new ArgumentNullException ("extension");
259 return (Config.Compilers.GetCompilerInfoForExtension (extension) != null);
265 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
266 public static bool IsDefinedLanguage (string language)
268 if (language == null)
269 throw new ArgumentNullException ("language");
272 return (Config.Compilers.GetCompilerInfoForLanguage (language) != null);
278 public virtual bool IsValidIdentifier (string value)
280 ICodeGenerator cg = CreateGenerator ();
282 throw GetNotImplemented ();
283 return cg.IsValidIdentifier (value);
286 public virtual CodeCompileUnit Parse (TextReader codeStream)
288 ICodeParser cp = CreateParser ();
290 throw GetNotImplemented ();
291 return cp.Parse (codeStream);
294 public virtual bool Supports (GeneratorSupport supports)
296 ICodeGenerator cg = CreateGenerator ();
298 throw GetNotImplemented ();
299 return cg.Supports (supports);
302 #if CONFIGURATION_DEP
303 static CodeDomConfigurationHandler Config {
304 get { return ConfigurationManager.GetSection ("system.codedom") as CodeDomConfigurationHandler; }
309 // This is used to prevent confusing Moma about methods not implemented.
311 Exception GetNotImplemented ()
313 return new NotImplementedException ();