2007-03-13 Marek Habersack <mhabersack@novell.com>
authorMarek Habersack <grendel@twistedcode.net>
Tue, 13 Mar 2007 13:11:04 +0000 (13:11 -0000)
committerMarek Habersack <grendel@twistedcode.net>
Tue, 13 Mar 2007 13:11:04 +0000 (13:11 -0000)
* TemplateParser.cs: name generated classes the same way MS.NET
does - include the app-relative path to the control/page in the
class name.
* PageCompiler.cs: interfaces are to be implemented by the parent
partial class, not the generated one.
* TemplateControlCompiler.cs:
Put field declarations for controls in the partial class.
* BaseCompiler.cs:
Change the generated code model for pages/controls to comply with
the way MS.NET does (partial class contains only two properties
plus declarations of all the controls, the actual control/page
class inherits from the partial class). Fixes bug #81001.

svn path=/trunk/mcs/; revision=74167

mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs
mcs/class/System.Web/System.Web.Compilation/ChangeLog
mcs/class/System.Web/System.Web.Compilation/PageCompiler.cs
mcs/class/System.Web/System.Web.Compilation/TemplateControlCompiler.cs
mcs/class/System.Web/System.Web.UI/ChangeLog
mcs/class/System.Web/System.Web.UI/TemplateParser.cs

index 102454e43286c5fef61526b4d29833c41ed79972..284fd9094efae73cf1e148321f62c6df29fdb2c6 100644 (file)
@@ -57,6 +57,8 @@ namespace System.Web.Compilation
 #if NET_2_0
                bool isRebuilding = false;
                protected Hashtable partialNameOverride = new Hashtable();
+               protected CodeTypeDeclaration partialClass;
+               protected CodeTypeReferenceExpression partialClassExpr;
 #endif
                protected CodeTypeDeclaration mainClass;
                protected CodeTypeReferenceExpression mainClassExpr;
@@ -82,24 +84,35 @@ namespace System.Web.Compilation
                                        classtype = classtype.Substring (dot + 1);
                                }
                                
-                               mainNS = new CodeNamespace (ns);
-                               mainClass = new CodeTypeDeclaration (classtype);
-                               mainClass.IsPartial = true;     
-                               mainClassExpr = new CodeTypeReferenceExpression (parser.PartialClassName);
-                       } else {
+                               CodeNamespace partialNS = new CodeNamespace (ns);
+                               partialClass = new CodeTypeDeclaration (classtype);
+                               partialClass.IsPartial = true;  
+                               partialClassExpr = new CodeTypeReferenceExpression (parser.PartialClassName);
+                               
+                               unit.Namespaces.Add (partialNS);
+                               partialClass.TypeAttributes = TypeAttributes.Public;
+                               partialNS.Types.Add (partialClass);
+                       }
 #endif
                        mainNS = new CodeNamespace ("ASP");
                        mainClass = new CodeTypeDeclaration (parser.ClassName);
-                       CodeTypeReference baseTypeRef = new CodeTypeReference (parser.BaseType.FullName);
+                       CodeTypeReference baseTypeRef;
 #if NET_2_0
-                       if (parser.BaseTypeIsGlobal)
+                       if (partialClass != null) {
+                               baseTypeRef = new CodeTypeReference (parser.PartialClassName);
                                baseTypeRef.Options |= CodeTypeReferenceOptions.GlobalReference;
+                       } else {
+                               baseTypeRef = new CodeTypeReference (parser.BaseType.FullName);
+                               if (parser.BaseTypeIsGlobal)
+                                       baseTypeRef.Options |= CodeTypeReferenceOptions.GlobalReference;
+                       }
+#else
+                       baseTypeRef = new CodeTypeReference (parser.BaseType.FullName);
 #endif
                        mainClass.BaseTypes.Add (baseTypeRef);
+
                        mainClassExpr = new CodeTypeReferenceExpression ("ASP." + parser.ClassName);
-#if NET_2_0
-                       }
-#endif
+
                        unit.Namespaces.Add (mainNS);
                        mainClass.TypeAttributes = TypeAttributes.Public;
                        mainNS.Types.Add (mainClass);
@@ -271,7 +284,10 @@ namespace System.Web.Compilation
                        cast.Expression = refexp;
                        
                        property.GetStatements.Add (ret);
-                       mainClass.Members.Add (property);
+                       if (partialClass == null)
+                               mainClass.Members.Add (property);
+                       else
+                               partialClass.Members.Add (property);
                }
                
                protected void CreateProfileProperty ()
index b8624581c9d01105f77e0d42dfb144746446be0f..542df64ffb817c58e3d11d42ef9dccf848b83fcd 100644 (file)
@@ -1,13 +1,21 @@
 2007-03-13  Marek Habersack  <mhabersack@novell.com>
 
+       * PageCompiler.cs: interfaces are to be implemented by the parent
+       partial class, not the generated one.
+
        * AppResourceFilesCollection.cs: added separate constructor for
        local resources handling.
 
        * TemplateControlCompiler.cs: request the local resource object
        with proper virtual path.
+       Put field declarations for controls in the partial class.
 
        * BaseCompiler.cs: added code to assing AppRelativeVirtualPath
        property in the page/control constructor.
+       Change the generated code model for pages/controls to comply with
+       the way MS.NET does (partial class contains only two properties
+       plus declarations of all the controls, the actual control/page
+       class inherits from the partial class). Fixes bug #81001.
 
        * AppResourcesCompiler.cs: does not require specifying manually
        whether it's a global or local resource compiler anymore. New
index 0dad3cc7d5de1f9939fdd500b227b67f5667c358..00630b59a67844e3d9f802d00be1746544d52490 100644 (file)
@@ -71,11 +71,29 @@ namespace System.Web.Compilation
                protected override void AddInterfaces () 
                {
                        base.AddInterfaces ();
-                       if (pageParser.EnableSessionState)
-                               mainClass.BaseTypes.Add (new CodeTypeReference (typeof(IRequiresSessionState)));
-
-                       if (pageParser.ReadOnlySessionState)
-                               mainClass.BaseTypes.Add (new CodeTypeReference (typeof (IReadOnlySessionState)));
+                       CodeTypeReference cref;
+                       
+                       if (pageParser.EnableSessionState) {
+                               cref = new CodeTypeReference (typeof(IRequiresSessionState));
+#if NET_2_0
+                               cref.Options |= CodeTypeReferenceOptions.GlobalReference;
+                               if (partialClass != null)
+                                       partialClass.BaseTypes.Add (cref);
+                               else
+#endif
+                                       mainClass.BaseTypes.Add (cref);
+                       }
+                       
+                       if (pageParser.ReadOnlySessionState) {
+                               cref = new CodeTypeReference (typeof (IReadOnlySessionState));
+#if NET_2_0
+                               cref.Options |= CodeTypeReferenceOptions.GlobalReference;
+                               if (partialClass != null)
+                                       partialClass.BaseTypes.Add (cref);                                      
+                               else
+#endif
+                                       mainClass.BaseTypes.Add (cref);
+                       }
                }
 
                void CreateGetTypeHashCode () 
index 260edad1b4856214606cd8181bdcb5774c5ebf62..fcfd5e70603e78ce78cf271ced22e6f4be571cf9 100644 (file)
@@ -91,7 +91,12 @@ namespace System.Web.Compilation
                        CodeMemberField field;
                        field = new CodeMemberField (builder.ControlType.FullName, builder.ID);
                        field.Attributes = MemberAttributes.Family;
-                       mainClass.Members.Add (field);
+#if NET_2_0
+                       if (partialClass != null)
+                               partialClass.Members.Add (field);
+                       else
+#endif
+                               mainClass.Members.Add (field);
                }
 
                bool CheckBaseFieldOrProperty (string id, Type type)
@@ -175,14 +180,8 @@ namespace System.Web.Compilation
                        
                        if (childrenAsProperties || builder.ControlType == null) {
                                string typeString;
-                               if (builder is RootBuilder) {
-#if NET_2_0
-                                       if (parser.IsPartial)
-                                               typeString = parser.PartialClassName;
-                                       else
-#endif
-                                               typeString = parser.ClassName;
-                               }
+                               if (builder is RootBuilder)
+                                       typeString = parser.ClassName;
                                else {
                                        if (builder.ControlType != null && builder.isProperty &&
                                            !typeof (ITemplate).IsAssignableFrom (builder.ControlType))
@@ -1475,6 +1474,11 @@ namespace System.Web.Compilation
 
                        CodeCastExpression cast = new CodeCastExpression (appType.FullName, propRef);
                        prop.GetStatements.Add (new CodeMethodReturnStatement (cast));
+#if NET_2_0
+                       if (partialClass != null)
+                               partialClass.Members.Add (prop);
+                       else
+#endif
                        mainClass.Members.Add (prop);
                }
 
index b65f4032e6306cbcac7c780b74afd86ab43cd54e..21219f0340d79b7bc35ffa2a08f0d49b945a3ef4 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-13  Marek Habersack  <mhabersack@novell.com>
+
+       * TemplateParser.cs: name generated classes the same way MS.NET
+       does - include the app-relative path to the control/page in the
+       class name.
+
 2007-03-13  Adar Wesley <adarw@mainsoft.com>
 
        * Page.cs: improved Async Page implementation.
index 3805dfe04ae6fe3b70d7e3c77f6c2bcf7975b246..3506ff9ee86871b3fcaedcdadf548ece64680e6a 100644 (file)
@@ -570,11 +570,11 @@ namespace System.Web.UI {
 
                        if (inherits != null)
                                SetBaseType (inherits);
-
+#endif
                        className = GetString (atts, "ClassName", null);
                        if (className != null && !CodeGenerator.IsValidLanguageIndependentIdentifier (className))
                                ThrowParseException (String.Format ("'{0}' is not valid for 'className'", className));
-#endif
+
 
                        if (atts.Count > 0)
                                ThrowParseException ("Unknown attribute: " + GetOneKey (atts));
@@ -669,6 +669,15 @@ namespace System.Web.UI {
                                if (className != null)
                                        return className;
 
+#if NET_2_0
+                               string physPath = HttpContext.Current.Request.PhysicalApplicationPath;
+                               
+                               if (StrUtils.StartsWith (inputFile, physPath)) {
+                                       className = inputFile.Substring (physPath.Length).ToLower (CultureInfo.InvariantCulture);
+                                       className = className.Replace ('.', '_');
+                                       className = className.Replace ('/', '_').Replace ('\\', '_');
+                               } else
+#endif
                                className = Path.GetFileName (inputFile).Replace ('.', '_');
                                className = className.Replace ('-', '_'); 
                                className = className.Replace (' ', '_');