New test.
[mono.git] / mcs / class / System / System.CodeDom.Compiler / CodeDomProvider.cs
1 //
2 // System.CodeDom.Compiler.CodeDomProvider.cs
3 //
4 // Authors:
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>
9 //
10 // Copyright (C) 2002,2003,2004,2005 Novell, Inc (http://www.novell.com)
11 //
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:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
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.
30 //
31
32 using System.Collections;
33 using System.ComponentModel;
34 using System.Configuration;
35 using System.IO;
36 using System.Runtime.InteropServices;
37 using System.Security.Permissions;
38
39 namespace System.CodeDom.Compiler {
40
41 #if NET_2_0
42         [ComVisible (true)]
43 #endif
44         [ToolboxItem (false)]
45         public abstract class CodeDomProvider : Component
46         {
47                 //
48                 // Constructors
49                 //
50                 protected CodeDomProvider()
51                 {
52                 }
53
54                 //
55                 // Properties
56                 //
57                 public virtual string FileExtension {
58                         get {
59                                 return String.Empty;
60                         }
61                 }
62
63                 public virtual LanguageOptions LanguageOptions {
64                         get {
65                                 return LanguageOptions.None;
66                         }
67                 }
68
69                 //
70                 // Methods
71                 //
72 #if NET_2_0
73                 [Obsolete ("ICodeCompiler is obsolete")]
74 #endif
75                 public abstract ICodeCompiler CreateCompiler();
76
77 #if NET_2_0
78                 [Obsolete ("ICodeGenerator is obsolete")]
79 #endif
80                 public abstract ICodeGenerator CreateGenerator();
81                 
82                 public virtual ICodeGenerator CreateGenerator (string fileName)
83                 {
84                         return CreateGenerator();
85                 }
86
87                 public virtual ICodeGenerator CreateGenerator (TextWriter output)
88                 {
89                         return CreateGenerator();
90                 }
91
92 #if NET_2_0
93                 [Obsolete ("ICodeParser is obsolete")]
94 #endif
95                 public virtual ICodeParser CreateParser()
96                 {
97                         return null;
98                 }
99
100                 public virtual TypeConverter GetConverter (Type type)
101                 {
102                         return TypeDescriptor.GetConverter (type);
103                 }
104
105 #if NET_2_0
106                 public virtual CompilerResults CompileAssemblyFromDom (CompilerParameters options, params CodeCompileUnit[] compilationUnits)
107                 {
108                         ICodeCompiler cc = CreateCompiler ();
109                         if (cc == null)
110                                 throw new NotImplementedException ();
111                         return cc.CompileAssemblyFromDomBatch (options, compilationUnits);
112                 }
113
114                 public virtual CompilerResults CompileAssemblyFromFile (CompilerParameters options, params string[] fileNames)
115                 {
116                         ICodeCompiler cc = CreateCompiler ();
117                         if (cc == null)
118                                 throw new NotImplementedException ();
119                         return cc.CompileAssemblyFromFileBatch (options, fileNames);
120                 }
121
122                 public virtual CompilerResults CompileAssemblyFromSource (CompilerParameters options, params string[] fileNames)
123                 {
124                         ICodeCompiler cc = CreateCompiler ();
125                         if (cc == null)
126                                 throw new NotImplementedException ();
127                         return cc.CompileAssemblyFromSourceBatch (options, fileNames);
128                 }
129
130                 public virtual string CreateEscapedIdentifier (string value)
131                 {
132                         ICodeGenerator cg = CreateGenerator ();
133                         if (cg == null)
134                                 throw new NotImplementedException ();
135                         return cg.CreateEscapedIdentifier (value);
136                 }
137
138                 [ComVisible (false)]
139                 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
140                 public static CodeDomProvider CreateProvider (string language)
141                 {
142                         CompilerInfo ci = GetCompilerInfo (language);
143                         return (ci == null) ? null : ci.CreateProvider ();
144                 }
145
146                 public virtual string CreateValidIdentifier (string value)
147                 {
148                         ICodeGenerator cg = CreateGenerator ();
149                         if (cg == null)
150                                 throw new NotImplementedException ();
151                         return cg.CreateValidIdentifier (value);
152                 }
153
154                 public virtual void GenerateCodeFromCompileUnit (CodeCompileUnit compileUnit, 
155                         TextWriter writer, CodeGeneratorOptions options)
156                 {
157                         ICodeGenerator cg = CreateGenerator ();
158                         if (cg == null)
159                                 throw new NotImplementedException ();
160                         cg.GenerateCodeFromCompileUnit (compileUnit, writer, options);
161                 }
162
163                 public virtual void GenerateCodeFromExpression (CodeExpression expression, TextWriter writer, CodeGeneratorOptions options)
164                 {
165                         ICodeGenerator cg = CreateGenerator ();
166                         if (cg == null)
167                                 throw new NotImplementedException ();
168                         cg.GenerateCodeFromExpression (expression, writer, options);
169                 }
170
171                 public virtual void GenerateCodeFromMember (CodeTypeMember member, TextWriter writer, CodeGeneratorOptions options)
172                 {
173                         // Documented to always throw an exception (if not overriden)
174                         throw new NotImplementedException ();
175                         // Note: the pattern is different from other GenerateCodeFrom* because 
176                         // ICodeGenerator doesn't have a GenerateCodeFromMember member
177                 }
178
179                 public virtual void GenerateCodeFromNamespace (CodeNamespace codeNamespace, TextWriter writer, CodeGeneratorOptions options)
180                 {
181                         ICodeGenerator cg = CreateGenerator ();
182                         if (cg == null)
183                                 throw new NotImplementedException ();
184                         cg.GenerateCodeFromNamespace (codeNamespace, writer, options);
185                 }
186
187                 public virtual void GenerateCodeFromStatement (CodeStatement statement, TextWriter writer, CodeGeneratorOptions options)
188                 {
189                         ICodeGenerator cg = CreateGenerator ();
190                         if (cg == null)
191                                 throw new NotImplementedException ();
192                         cg.GenerateCodeFromStatement (statement, writer, options);
193                 }
194
195                 public virtual void GenerateCodeFromType (CodeTypeDeclaration codeType, TextWriter writer, CodeGeneratorOptions options)
196                 {
197                         ICodeGenerator cg = CreateGenerator ();
198                         if (cg == null)
199                                 throw new NotImplementedException ();
200                         cg.GenerateCodeFromType (codeType, writer, options);
201                 }
202
203                 [ComVisible (false)]
204                 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
205                 public static CompilerInfo[] GetAllCompilerInfo ()
206                 {
207                         int n = 0;
208                         if ((Config != null) && (Config.Compilers != null)) 
209                                 n = Config.Compilers.Hash.Count;
210                         CompilerInfo[] ci = new CompilerInfo [n];
211                         if (n > 0)
212                                 Config.Compilers.Hash.Values.CopyTo (ci, 0);
213                         return ci;
214                 }
215
216                 [ComVisible (false)]
217                 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
218                 public static CompilerInfo GetCompilerInfo (string language)
219                 {
220                         if (language == null)
221                                 throw new ArgumentNullException ("language");
222
223                         return (Config == null) ? null : Config.GetCompilerInfo (language);
224                 }
225
226                 [ComVisible (false)]
227                 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
228                 public static string GetLanguageFromExtension (string extension)
229                 {
230                         if (extension == null)
231                                 throw new ArgumentNullException ("extension");
232
233                         if (Config != null) {
234                                 foreach (DictionaryEntry de in Config.Compilers.Hash) {
235                                         CompilerInfo c = (CompilerInfo) de.Value;
236                                         if (Array.IndexOf (c.GetExtensions (), extension) != -1)
237                                                 return (string) de.Key;
238                                 }
239                         }
240                         return null;
241                 }
242
243                 public virtual string GetTypeOutput (CodeTypeReference type)
244                 {
245                         ICodeGenerator cg = CreateGenerator ();
246                         if (cg == null)
247                                 throw new NotImplementedException ();
248                         return cg.GetTypeOutput (type);
249                 }
250
251                 [ComVisible (false)]
252                 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
253                 public static bool IsDefinedExtension (string extension)
254                 {
255                         if (extension == null)
256                                 throw new ArgumentNullException ("extension");
257
258                         if (Config != null) {
259                                 foreach (CompilerInfo c in Config.Compilers.Hash.Values) {
260                                         if (Array.IndexOf (c.GetExtensions (), extension) != -1)
261                                                 return true;
262                                 }
263                         }
264                         return false;
265                 }
266
267                 [ComVisible (false)]
268                 [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
269                 public static bool IsDefinedLanguage (string language)
270                 {
271                         if (language == null)
272                                 throw new ArgumentNullException ("language");
273
274                         if (Config == null)
275                                 return false;
276                         return (Config.GetCompilerInfo (language) == null);
277                 }
278
279                 public virtual bool IsValidIdentifier (string value)
280                 {
281                         ICodeGenerator cg = CreateGenerator ();
282                         if (cg == null)
283                                 throw new NotImplementedException ();
284                         return cg.IsValidIdentifier (value);
285                 }
286
287                 public virtual CodeCompileUnit Parse (TextReader codeStream)
288                 {
289                         ICodeParser cp = CreateParser ();
290                         if (cp == null)
291                                 throw new NotImplementedException ();
292                         return cp.Parse (codeStream);
293                 }
294
295                 public virtual bool Supports (GeneratorSupport supports)
296                 {
297                         ICodeGenerator cg = CreateGenerator ();
298                         if (cg == null)
299                                 throw new NotImplementedException ();
300                         return cg.Supports (supports);
301                 }
302
303                 static CompilationConfiguration Config {
304                         get { return ConfigurationSettings.GetConfig ("system.codedom") as CompilationConfiguration; }
305                 }
306 #endif
307         }
308 }