New test.
[mono.git] / mcs / class / System.Web / System.Web.UI / TemplateParser.cs
index 8a82aca3bbfad06f20414100410a2327c214b2dd..c99f839de2d80da3c50737dec3fedb6b0495f3d7 100644 (file)
@@ -67,9 +67,13 @@ namespace System.Web.UI {
                string oc_header, oc_custom, oc_param, oc_controls;
                bool oc_shared;
                OutputCacheLocation oc_location;
+#if NET_2_0
+               string src;
+               string partialClassName;
+#endif
                Assembly srcAssembly;
                int appAssemblyIndex = -1;
-                
+
                internal TemplateParser ()
                {
                        imports = new ArrayList ();
@@ -88,10 +92,26 @@ namespace System.Web.UI {
                        imports.Add ("System.Web.UI.HtmlControls");
 
                        assemblies = new ArrayList ();
+#if NET_2_0
+                       bool addAssembliesInBin = false;
+                       foreach (AssemblyInfo info in CompilationConfig.Assemblies) {
+                               if (info.Assembly == "*")
+                                       addAssembliesInBin = true;
+                               else
+                                       AddAssemblyByName (info.Assembly);
+                       }
+                       if (addAssembliesInBin)
+                               AddAssembliesInBin ();
+
+                       foreach (NamespaceInfo info in PagesConfig.Namespaces) {
+                               imports.Add (info.Namespace);
+                       }
+#else
                        foreach (string a in CompilationConfig.Assemblies)
                                AddAssemblyByName (a);
                        if (CompilationConfig.AssembliesInBin)
                                AddAssembliesInBin ();
+#endif
 
                        language = CompilationConfig.DefaultLanguage;
                }
@@ -374,6 +394,22 @@ namespace System.Web.UI {
                        }
                }
 
+               internal virtual Assembly AddAssemblyByFileName (string filename)
+               {
+                       Assembly assembly = null;
+                       Exception error = null;
+
+                       try {
+                               assembly = Assembly.LoadFrom (filename);
+                       } catch (Exception e) { error = e; }
+
+                       if (assembly == null)
+                               ThrowParseException ("Assembly " + filename + " not found", error);
+
+                       AddAssembly (assembly, true);
+                       return assembly;
+               }
+
                internal virtual Assembly AddAssemblyByName (string name)
                {
                        if (anames == null)
@@ -400,7 +436,7 @@ namespace System.Web.UI {
                                        assembly = Assembly.LoadWithPartialName (name);
                                } catch (Exception e) { error = e; }
                        }
-
+                       
                        if (assembly == null)
                                ThrowParseException ("Assembly " + name + " not found", error);
 
@@ -421,21 +457,48 @@ namespace System.Web.UI {
                        language = GetString (atts, "Language", CompilationConfig.DefaultLanguage);
                        strictOn = GetBool (atts, "Strict", CompilationConfig.Strict);
                        explicitOn = GetBool (atts, "Explicit", CompilationConfig.Explicit);
+
+                       string inherits = GetString (atts, "Inherits", null);
 #if NET_2_0
-                       string src = GetString (atts, "CodeFile", null);
+                       // In ASP 2, the source file is actually integrated with
+                       // the generated file via the use of partial classes. This
+                       // means that the code file has to be confirmed, but not
+                       // used at this point.
+                       src = GetString (atts, "CodeFile", null);
+
+                       if (src != null && inherits != null) {
+                               // Make sure the source exists
+                               src = UrlUtils.Combine (BaseVirtualDir, src);
+                               string realPath = MapPath (src, false);
+                               if (!File.Exists (realPath))
+                                       ThrowParseException ("File " + src + " not found");
+
+                               // Verify that the inherits is a valid identify not a
+                               // fully-qualified name.
+                               if (!CodeGenerator.IsValidLanguageIndependentIdentifier (inherits))
+                                       ThrowParseException (String.Format ("'{0}' is not valid for 'inherits'", inherits));
+
+                               // We are going to create a partial class that shares
+                               // the same name as the inherits tag, so reset the
+                               // name. The base type is changed because it is the
+                               // code file's responsibilty to extend the classes
+                               // needed.
+                               partialClassName = inherits;
+
+                               // Add the code file as an option to the
+                               // compiler. This lets both files be compiled at once.
+                               compilerOptions += " \"" + realPath + "\"";
+                       } else if (inherits != null) {
+                               // We just set the inherits directly because this is a
+                               // Single-Page model.
+                               SetBaseType (inherits);
+                       }
 #else
                        string src = GetString (atts, "Src", null);
-#endif
+
                        if (src != null)
                                srcAssembly = GetAssemblyFromSource (src);
 
-                       string inherits = GetString (atts, "Inherits", null);
-#if NET_2_0
-                       if (srcAssembly == null)
-                               className = inherits;
-                       else
-                               SetBaseType (inherits);
-#else
                        if (inherits != null)
                                SetBaseType (inherits);
 
@@ -498,6 +561,18 @@ namespace System.Web.UI {
                        set { inputFile = value; }
                }
 
+#if NET_2_0
+               internal bool IsPartial
+               {
+                       get { return src != null; }
+               }
+
+               internal string PartialClassName
+               {
+                       get { return partialClassName; }
+               }
+#endif
+
                internal string Text
                {
                        get { return text; }
@@ -635,9 +710,17 @@ namespace System.Web.UI {
                        get { return oc_param; }
                }
 
+#if NET_2_0
+               internal PagesSection PagesConfig {
+                       get {
+                               return WebConfigurationManager.GetSection ("system.web/pages") as PagesSection;
+                       }
+               }
+#else
                internal PagesConfiguration PagesConfig {
                        get { return PagesConfiguration.GetInstance (Context); }
                }
+#endif
        }
 }