Jo Shields 3c1f479b9d Imported Upstream version 4.0.0~alpha1
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
2015-04-07 09:35:12 +01:00

250 lines
6.6 KiB
C#

//
// System.Web.Compilation.BuildProvider
//
// Authors:
// Chris Toshok (toshok@ximian.com)
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2006-2009 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.
//
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Reflection;
using System.Web.Configuration;
using System.Web.Hosting;
using System.Web.Util;
namespace System.Web.Compilation
{
public abstract class BuildProvider
{
static Dictionary <string, Type> registeredBuildProviderTypes;
ArrayList ref_assemblies;
ICollection vpath_deps;
CompilationSection compilationSection;
VirtualPath vpath;
CompilationSection CompilationConfig {
get {
if (compilationSection == null)
compilationSection = WebConfigurationManager.GetWebApplicationSection ("system.web/compilation") as CompilationSection;
return compilationSection;
}
}
internal virtual string LanguageName {
get { return CompilationConfig.DefaultLanguage; }
}
protected BuildProvider()
{
ref_assemblies = new ArrayList ();
}
internal void SetVirtualPath (VirtualPath virtualPath)
{
vpath = virtualPath;
}
internal virtual void GenerateCode ()
{
}
internal virtual IDictionary <string, bool> ExtractDependencies ()
{
return null;
}
public virtual void GenerateCode (AssemblyBuilder assemblyBuilder)
{
}
public virtual string GetCustomString (CompilerResults results)
{
return null;
}
protected CompilerType GetDefaultCompilerType ()
{
return BuildManager.GetDefaultCompilerTypeForLanguage (CompilationConfig.DefaultLanguage, CompilationConfig);
}
protected CompilerType GetDefaultCompilerTypeForLanguage (string language)
{
return BuildManager.GetDefaultCompilerTypeForLanguage (language, null);
}
public virtual Type GetGeneratedType (CompilerResults results)
{
return null;
}
public virtual BuildProviderResultFlags GetResultFlags (CompilerResults results)
{
return BuildProviderResultFlags.Default;
}
protected TextReader OpenReader ()
{
return OpenReader (VirtualPath);
}
protected TextReader OpenReader (string virtualPath)
{
Stream st = OpenStream (virtualPath);
return new StreamReader (st, WebEncoding.FileEncoding);
}
protected Stream OpenStream ()
{
return OpenStream (VirtualPath);
}
protected Stream OpenStream (string virtualPath)
{
// MS also throws a NullReferenceException here when not hosted.
return VirtualPathProvider.OpenFile (virtualPath);
}
public static void RegisterBuildProvider (string extension, Type providerType)
{
if (String.IsNullOrEmpty (extension))
throw new ArgumentException ("The string parameter 'extension' cannot be null or empty.", "extension");
if (providerType == null)
throw new ArgumentNullException ("providerType");
if (!typeof (BuildProvider).IsAssignableFrom (providerType))
throw new ArgumentException ("The parameter 'providerType' is invalid", "providerType");
BuildManager.AssertPreStartMethodsRunning ();
if (registeredBuildProviderTypes == null)
registeredBuildProviderTypes = new Dictionary <string, Type> (StringComparer.OrdinalIgnoreCase);
registeredBuildProviderTypes [extension] = providerType;
}
internal static Type GetProviderTypeForExtension (string extension)
{
if (String.IsNullOrEmpty (extension))
return null;
Type type = null;
if (registeredBuildProviderTypes == null || !registeredBuildProviderTypes.TryGetValue (extension, out type) || type == null) {
var cs = WebConfigurationManager.GetSection ("system.web/compilation") as CompilationSection;
BuildProviderCollection bpcoll = cs != null ? cs.BuildProviders : null;
global::System.Web.Configuration.BuildProvider bpcfg = bpcoll != null ? bpcoll [extension] : null;
if (bpcfg != null)
type = HttpApplication.LoadType (bpcfg.Type);
}
return type;
}
internal static BuildProvider GetProviderInstanceForExtension (string extension)
{
Type type = GetProviderTypeForExtension (extension);
if (type == null)
return null;
return Activator.CreateInstance (type, null) as global::System.Web.Compilation.BuildProvider;
}
public virtual CompilerType CodeCompilerType {
get { return null; } // Documented to return null
}
protected ICollection ReferencedAssemblies {
get { return ref_assemblies; }
}
protected internal string VirtualPath {
get { return vpath != null ? vpath.Absolute : null; }
}
internal VirtualPath VirtualPathInternal {
get { return vpath; }
}
public virtual ICollection VirtualPathDependencies {
get {
if (vpath_deps == null)
vpath_deps = new OneNullCollection ();
return vpath_deps;
}
}
internal virtual CodeCompileUnit CodeUnit {
get { return null; }
}
}
class OneNullCollection : ICollection {
public int Count {
get { return 1; }
}
public bool IsSynchronized {
get { return false; }
}
public object SyncRoot {
get { return this; }
}
public void CopyTo (Array array, int index)
{
if (array == null)
throw new ArgumentNullException ();
if (index < 0)
throw new ArgumentOutOfRangeException ();
if (array.Rank > 1)
throw new ArgumentException ();
int length = array.Length;
if (index >= length || index > length - 1)
throw new ArgumentException ();
array.SetValue (null, index);
}
public IEnumerator GetEnumerator ()
{
yield return null;
}
}
}