Răsfoiți Sursa

2005-02-17 Gonzalo Paniagua Javier <[email protected]>

	* System.dll.sources: added CodeDomConfigurationHandler.
	* System.CodeDom.Compiler/CodeDomProvider.cs: implemented IsDefined* and
	GetCompilerInfo.
	* System.CodeDom.Compiler/CompilerInfo.cs: implemented.
	* System.CodeDom.Compiler/CodeDomConfigurationHandler.cs: system.codedom
	section reader.


svn path=/trunk/mcs/; revision=40814
Gonzalo Paniagua Javier 21 ani în urmă
părinte
comite
5e04df3d2f

+ 4 - 0
mcs/class/System/ChangeLog

@@ -1,3 +1,7 @@
+2005-02-17 Gonzalo Paniagua Javier <[email protected]>
+
+	* System.dll.sources: added CodeDomConfigurationHandler.
+
 2005-02-03  Raja R Harinath  <[email protected]>
 
 	* Makefile (TEST_RESOURCES): New.

+ 6 - 0
mcs/class/System/System.CodeDom.Compiler/ChangeLog

@@ -1,3 +1,9 @@
+2005-02-17 Gonzalo Paniagua Javier <[email protected]>
+
+	* CodeDomProvider.cs: implemented IsDefined* and GetCompilerInfo.
+	* CompilerInfo.cs: implemented.
+	* CodeDomConfigurationHandler.cs: system.codedom section reader.
+
 2005-01-27  LLuis Sanchez Gual  <[email protected]>
 
 	* CodeGenerator.cs: Write 'f' suffix for float constants.

+ 348 - 0
mcs/class/System/System.CodeDom.Compiler/CodeDomConfigurationHandler.cs

@@ -0,0 +1,348 @@
+//
+// System.Configuration.CodeDomConfigurationHandler
+//
+// Authors:
+//	Gonzalo Paniagua Javier ([email protected])
+//
+// Copyright (c) 2005 Novell, Inc (http://www.novell.com)
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0 && XML_DEP
+using System;
+using System.Collections;
+using System.Configuration;
+using System.IO;
+using System.Xml;
+
+namespace System.CodeDom.Compiler
+{
+	class CodeDomConfigurationHandler : IConfigurationSectionHandler
+	{
+		public object Create (object parent, object context, XmlNode section)
+		{
+			return new CompilationConfigurationHandler ().Create (parent, context, section);
+		}
+	}
+
+	class CompilationConfigurationHandler : IConfigurationSectionHandler
+	{
+		public object Create (object parent, object context, XmlNode section)
+		{
+			CompilationConfiguration config = new CompilationConfiguration (parent);
+
+			config.TempDirectory = AttValue ("tempDirectory", section, true);
+			config.DefaultLanguage = AttValue ("defaultLanguage", section);
+			if (config.DefaultLanguage == null)
+				config.DefaultLanguage = "c#";
+
+			config.Debug = AttBoolValue ("debug", section, false);
+			config.Batch = AttBoolValue ("batch", section, false);
+			config.Explicit = AttBoolValue ("explicit", section, true);
+			config.Strict = AttBoolValue ("strict", section, false);
+			config.BatchTimeout = AttUIntValue ("batchTimeout", section, 0);
+			config.MaxBatchSize = AttUIntValue ("maxBatchSize", section, 0);
+			config.MaxBatchFileSize = AttUIntValue ("maxBatchFileSize", section, 0);
+			config.NumRecompilesBeforeAppRestart =
+					AttUIntValue ("numRecompilesBeforeAppRestart", section, 15);
+
+			if (section.Attributes != null && section.Attributes.Count != 0)
+				ThrowException ("Unrecognized attribute.", section);
+
+			XmlNodeList authNodes = section.ChildNodes;
+			foreach (XmlNode child in authNodes) {
+				XmlNodeType ntype = child.NodeType;
+				if (ntype != XmlNodeType.Element)
+					continue;
+				
+				if (child.Name == "compilers") {
+					ReadCompilers (child.ChildNodes, config);
+					continue;
+				}
+
+				ThrowException ("Unexpected element", child);
+			}
+
+			return config;
+		}
+
+		static void ReadCompilers (XmlNodeList nodes, CompilationConfiguration config)
+		{
+			foreach (XmlNode child in nodes) {
+				XmlNodeType ntype = child.NodeType;
+				if (ntype != XmlNodeType.Element)
+					continue;
+
+				if (child.Name != "compiler")
+					ThrowException ("Unexpected element", child);
+
+				CompilerInfo compiler = new CompilerInfo ();
+				compiler.Languages = AttValue ("language", child);
+				compiler.Extensions = AttValue ("extension", child);
+				compiler.TypeName = AttValue ("type", child);
+				compiler.CompilerOptions = AttValue ("compilerOptions", child, true, true);
+				compiler.WarningLevel = AttUIntValue ("warningLevel", child, 0);
+				config.Compilers [compiler.Languages] = compiler;
+			}
+		}
+
+		static string AttValue (string name, XmlNode node, bool optional)
+		{
+			return AttValue (name, node, optional, false);
+		}
+		
+		static string AttValue (string name, XmlNode node, bool optional, bool allowEmpty)
+		{
+			return ExtractAttributeValue (name, node, optional, allowEmpty);
+		}
+
+		static bool AttBoolValue (string name, XmlNode node, bool _default)
+		{
+			string v = AttValue (name, node, true);
+			if (v == null)
+				return _default;
+
+			bool result = (v == "true");
+			if (!result && v != "false")
+				ThrowException ("Invalid boolean value in " + name, node);
+
+			return result;
+		}
+
+		static int AttUIntValue (string name, XmlNode node, int _default)
+		{
+			string v = AttValue (name, node, true);
+			if (v == null)
+				return _default;
+
+			int result = 0;
+			try {
+				result = (int) UInt32.Parse (v);
+			} catch {
+				ThrowException ("Invalid number in " + name, node);
+			}
+
+			return result;
+		}
+
+		static string AttValue (string name, XmlNode node)
+		{
+			return ExtractAttributeValue (name, node, true);
+		}
+
+		static string ShortAsmName (string long_name)
+		{
+			int i = long_name.IndexOf (',');
+			if (i < 0)
+				return long_name + ".dll";
+			return long_name.Substring (0, i) + ".dll";
+		}
+		
+		static void ThrowException (string message, XmlNode node)
+		{
+			ThrowException (message, node);
+		}
+
+		static internal string ExtractAttributeValue (string attKey, XmlNode node)
+		{
+			return ExtractAttributeValue (attKey, node, false);
+		}
+			
+		static internal string ExtractAttributeValue (string attKey, XmlNode node, bool optional)
+		{
+			return ExtractAttributeValue (attKey, node, optional, false);
+		}
+		
+		static internal string ExtractAttributeValue (string attKey, XmlNode node, bool optional,
+							      bool allowEmpty)
+		{
+			if (node.Attributes == null) {
+				if (optional)
+					return null;
+
+				ThrowException ("Required attribute not found: " + attKey, node);
+			}
+
+			XmlNode att = node.Attributes.RemoveNamedItem (attKey);
+			if (att == null) {
+				if (optional)
+					return null;
+				ThrowException ("Required attribute not found: " + attKey, node);
+			}
+
+			string value = att.Value;
+			if (!allowEmpty && value == String.Empty) {
+				string opt = optional ? "Optional" : "Required";
+				ThrowException (opt + " attribute is empty: " + attKey, node);
+			}
+
+			return value;
+		}
+	}
+
+	sealed class CompilationConfiguration
+	{
+		bool debug;
+		bool batch;
+		int batch_timeout;
+		string default_language = "c#";
+		bool _explicit = true;
+		int max_batch_size = 30;
+		int max_batch_file_size = 3000;
+		int num_recompiles_before_app_restart = 15;
+		bool strict;
+		string temp_directory;
+		CompilerCollection compilers;
+
+		/* Only the config. handler should create instances of this. Use GetInstance (context) */
+		public CompilationConfiguration (object p)
+		{
+			CompilationConfiguration parent = p as CompilationConfiguration;
+			if (parent != null)
+				Init (parent);
+
+			if (compilers == null)
+				compilers = new CompilerCollection ();
+
+			if (temp_directory == null)
+				temp_directory = Path.GetTempPath ();
+		}
+
+		public CompilerInfo GetCompilerInfo (string language)
+		{
+			return Compilers [language];
+		}
+
+		void Init (CompilationConfiguration parent)
+		{
+			debug = parent.debug;
+			batch = parent.batch;
+			batch_timeout = parent.batch_timeout;
+			default_language = parent.default_language;
+			_explicit = parent._explicit;
+			max_batch_size = parent.max_batch_size;
+			max_batch_file_size = parent.max_batch_file_size;
+			num_recompiles_before_app_restart = parent.num_recompiles_before_app_restart;
+			strict = parent.strict;
+			temp_directory = parent.temp_directory;
+			compilers = new CompilerCollection (parent.compilers);
+		}
+
+		public bool Debug {
+			get { return debug; }
+			set { debug = value; }
+		}
+
+		public bool Batch {
+			get { return batch; }
+			set { batch = value; }
+		}
+
+		public int BatchTimeout {
+			get { return batch_timeout; }
+			set { batch_timeout = value; }
+		}
+
+		public string DefaultLanguage {
+			get { return default_language; }
+			set { default_language = value; }
+		}
+
+		public bool Explicit {
+			get { return _explicit; }
+			set { _explicit = value; }
+		}
+
+		public int MaxBatchSize {
+			get { return max_batch_size; }
+			set { max_batch_size = value; }
+		}
+
+		public int MaxBatchFileSize {
+			get { return max_batch_file_size; }
+			set { max_batch_file_size = value; }
+		}
+
+		public int NumRecompilesBeforeAppRestart {
+			get { return num_recompiles_before_app_restart; }
+			set { num_recompiles_before_app_restart = value; }
+		}
+
+		public bool Strict {
+			get { return strict; }
+			set { strict = value; }
+		}
+
+		public string TempDirectory {
+			get { return temp_directory; }
+			set {
+				if (value != null && !Directory.Exists (value))
+					throw new ArgumentException ("Directory does not exist");
+
+				temp_directory = value;
+			}
+		}
+
+		public CompilerCollection Compilers {
+			get { return compilers; }
+		}
+	}
+
+	sealed class CompilerCollection
+	{
+		Hashtable compilers;
+
+		public CompilerCollection () : this (null) {}
+
+		public CompilerCollection (CompilerCollection parent)
+		{
+			compilers = new Hashtable (CaseInsensitiveHashCodeProvider.Default,
+						   CaseInsensitiveComparer.Default);
+
+			if (parent != null && parent.compilers != null) {
+				foreach (DictionaryEntry entry in parent.compilers)
+					compilers [entry.Key] = entry.Value;
+			}
+		}
+
+		public CompilerInfo this [string language] {
+			get { return compilers [language] as CompilerInfo; }
+			set {
+				compilers [language] = value;
+				string [] langs = language.Split (';');
+				foreach (string s in langs) {
+					string x = s.Trim ();
+					if (x != "")
+						compilers [x] = value;
+				}
+			}
+		}
+
+		internal Hashtable Hash {
+			get { return compilers; }
+		}
+	}
+}
+
+#endif // NET_2_0 && XML_DEP
+

+ 31 - 3
mcs/class/System/System.CodeDom.Compiler/CodeDomProvider.cs

@@ -4,8 +4,9 @@
 // Author:
 //   Daniel Stodden ([email protected])
 //   Marek Safar ([email protected])
+//   Gonzalo Paniagua Javier ([email protected])
 //
-// (C) 2002 Ximian, Inc.
+// copyright (C) 2002,2003,2004,2005 Novell, Inc.
 //
 
 //
@@ -30,6 +31,7 @@
 //
 
 using System.ComponentModel;
+using System.Configuration;
 using System.IO;
 
 namespace System.CodeDom.Compiler
@@ -109,10 +111,33 @@ namespace System.CodeDom.Compiler
 			CreateGenerator ().GenerateCodeFromStatement (statement, writer, options);
 		}
 
-		[MonoTODO ("Not implemented")]
 		public static CompilerInfo GetCompilerInfo (string language)
 		{
-			return null;
+			if (language == null)
+				throw new ArgumentNullException ("language");
+
+			return Config.GetCompilerInfo (language);
+		}
+
+		public static bool IsDefinedExtension (string extension)
+		{
+			if (extension == null)
+				throw new ArgumentNullException ("extension");
+
+			foreach (CompilerInfo c in Config.Compilers.Hash.Values) {
+				if (Array.IndexOf (c.GetExtensions (), extension) != -1)
+					return true;
+			}
+
+			return false;
+		}
+
+		public static bool IsDefinedLanguage (string language)
+		{
+			if (language == null)
+				throw new ArgumentNullException ("language");
+
+			return (Config.GetCompilerInfo (language) == null);
 		}
 
 		public virtual bool Supports (GeneratorSupport supports)
@@ -120,6 +145,9 @@ namespace System.CodeDom.Compiler
 			return CreateGenerator ().Supports (supports);
 		}
 
+		static CompilationConfiguration Config {
+			get { return ConfigurationSettings.GetConfig ("system.codedom") as CompilationConfiguration; }
+		}
 #endif
 
 	}

+ 61 - 7
mcs/class/System/System.CodeDom.Compiler/CompilerInfo.cs

@@ -2,9 +2,10 @@
 // System.CodeDom.Compiler CompilerInfo class
 //
 // Author:
-//   Marek Safar ([email protected])
+// 	Marek Safar ([email protected])
+//	Gonzalo Paniagua Javier ([email protected])
 //
-// (C) 2004 Ximian, Inc.
+// Copyright (c) 2004,2005 Novell, Inc. (http://www.novell.com)
 //
 
 //
@@ -29,20 +30,73 @@
 //
 
 #if NET_2_0
-
 namespace System.CodeDom.Compiler
 {
 	public sealed class CompilerInfo
 	{
-		private CompilerInfo () {}
+		internal string Languages;
+		internal string Extensions;
+		internal string TypeName;
+		internal int WarningLevel;
+		internal string CompilerOptions;
+		bool inited;
+		Type type;
+
+		internal CompilerInfo ()
+		{
+		}
+
+		void Init ()
+		{
+			if (inited)
+				return;
+
+			inited = true;
+			type = Type.GetType (TypeName);
+			if (type == null)
+				return;
+
+			if (!typeof (CodeDomProvider).IsAssignableFrom (type))
+				type = null;
+		}
+
+		public Type CodeDomProviderType {
+			get { return type; }
+		}
+
+		public bool IsCodeDomProviderTypeValid {
+			get { return type != null; }
+		}
 
-		[MonoTODO]
 		public CodeDomProvider CreateProvider ()
 		{
-			throw new NotImplementedException ();
+			return (CodeDomProvider) Activator.CreateInstance (type);
+		}
+
+		public override bool Equals (object o)
+		{
+			if (!(o is CompilerInfo))
+				return false;
+
+			CompilerInfo c = (CompilerInfo) o;
+			return c.TypeName == TypeName;
+		}
+
+		public override int GetHashCode ()
+		{
+			return TypeName.GetHashCode ();
+		}
+
+		public string [] GetExtensions ()
+		{
+			return Extensions.Split (';');
+		}
+
+		public string [] GetLanguages ()
+		{
+			return Languages.Split (';');
 		}
 	}
 }
-
 #endif
 

+ 1 - 0
mcs/class/System/System.dll.sources

@@ -107,6 +107,7 @@ System.CodeDom/CodeTypeReferenceOptions.cs
 System.CodeDom/CodeVariableDeclarationStatement.cs
 System.CodeDom/CodeVariableReferenceExpression.cs
 System.CodeDom.Compiler/CodeCompiler.cs
+System.CodeDom.Compiler/CodeDomConfigurationHandler.cs
 System.CodeDom.Compiler/CodeDomProvider.cs
 System.CodeDom.Compiler/CodeGenerator.cs
 System.CodeDom.Compiler/CodeGeneratorOptions.cs