2008-01-02 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Compilation / BaseCompiler.cs
index 41cf821f855e29a6dc6ad3e05cdf855e7165e1cb..802bd37b7597f43d84152196d53a1e1ec9c88e5d 100644 (file)
@@ -69,6 +69,74 @@ namespace System.Web.Compilation
                        this.parser = parser;
                }
 
+               internal CodeStatement AddLinePragma (CodeExpression expression, ControlBuilder builder)
+               {
+                       return AddLinePragma (new CodeExpressionStatement (expression), builder);
+               }
+               
+               internal CodeStatement AddLinePragma (CodeStatement statement, ControlBuilder builder)
+               {
+                       if (builder == null || statement == null)
+                               return statement;
+
+                       ILocation location = null;
+
+                       if (!(builder is CodeRenderBuilder))
+                               location = builder.location;
+                       
+                       if (location != null)
+                               return AddLinePragma (statement, location);
+                       else
+                               return AddLinePragma (statement, builder.line, builder.fileName);
+               }
+
+               internal CodeStatement AddLinePragma (CodeStatement statement, ILocation location)
+               {
+                       if (location == null || statement == null)
+                               return statement;
+                       
+                       return AddLinePragma (statement, location.BeginLine, location.Filename);
+               }
+
+               internal CodeStatement AddLinePragma (CodeStatement statement, int line, string fileName)
+               {
+                       if (statement == null)
+                               return null;
+                       
+                       statement.LinePragma = new CodeLinePragma (fileName, line);
+                       return statement;                       
+               }
+
+               internal CodeTypeMember AddLinePragma (CodeTypeMember member, ControlBuilder builder)
+               {
+                       if (builder == null || member == null)
+                               return member;
+
+                       ILocation location = builder.location;
+                       
+                       if (location != null)
+                               return AddLinePragma (member, location);
+                       else
+                               return AddLinePragma (member, builder.line, builder.fileName);
+               }
+               
+               internal CodeTypeMember AddLinePragma (CodeTypeMember member, ILocation location)
+               {
+                       if (location == null || member == null)
+                               return member;
+
+                       return AddLinePragma (member, location.BeginLine, location.Filename);
+               }
+               
+               internal CodeTypeMember AddLinePragma (CodeTypeMember member, int line, string fileName)
+               {
+                       if (member == null)
+                               return null;
+                       
+                       member.LinePragma = new CodeLinePragma (fileName, line);
+                       return member;
+               }
+               
                void Init ()
                {
                        unit = new CodeCompileUnit ();
@@ -183,6 +251,18 @@ namespace System.Web.Compilation
                        CreateConstructor (null, null);
                }
 
+               internal CodeFieldReferenceExpression GetMainClassFieldReferenceExpression (string fieldName)
+               {
+                       CodeTypeReference mainClassTypeRef;
+                       mainClassTypeRef = new CodeTypeReference (mainNS.Name + "." + mainClass.Name);
+
+#if NET_2_0
+                       mainClassTypeRef.Options |= CodeTypeReferenceOptions.GlobalReference;
+#endif
+                       return new CodeFieldReferenceExpression (
+                               new CodeTypeReferenceExpression (mainClassTypeRef), fieldName);
+               }
+               
                protected virtual void CreateStaticFields ()
                {
                        CodeMemberField fld = new CodeMemberField (typeof (bool), "__initialized");
@@ -207,7 +287,11 @@ namespace System.Web.Compilation
                        if (VirtualPathUtility.IsAbsolute (arvp))
                                arvp = "~" + arvp;
 
-                       CodeExpression cast = new CodeCastExpression (baseType, new CodeThisReferenceExpression ());
+                       CodeTypeReference baseTypeRef = new CodeTypeReference (baseType.FullName);
+                       if (parser.BaseTypeIsGlobal)
+                               baseTypeRef.Options |= CodeTypeReferenceOptions.GlobalReference;
+                       
+                       CodeExpression cast = new CodeCastExpression (baseTypeRef, new CodeThisReferenceExpression ());
                        CodePropertyReferenceExpression arvpProp = new CodePropertyReferenceExpression (cast, "AppRelativeVirtualPath");
                        CodeAssignStatement arvpAssign = new CodeAssignStatement ();
                        arvpAssign.Left = arvpProp;
@@ -223,21 +307,14 @@ namespace System.Web.Compilation
                        ctor.Attributes = MemberAttributes.Public;
                        mainClass.Members.Add (ctor);
 
-#if NET_2_0
-                       AssignAppRelativeVirtualPath (ctor);
-#endif
                        if (localVars != null)
                                ctor.Statements.AddRange (localVars);
 
-                       CodeTypeReferenceExpression r;
 #if NET_2_0
-                       if (parser.IsPartial)
-                               r = new CodeTypeReferenceExpression (mainClass.Name);
-                       else
+                       AssignAppRelativeVirtualPath (ctor);
 #endif
-                       r = new CodeTypeReferenceExpression (mainNS.Name + "." + mainClass.Name);
-                       CodeFieldReferenceExpression initialized;
-                       initialized = new CodeFieldReferenceExpression (r, "__initialized");
+
+                       CodeFieldReferenceExpression initialized = GetMainClassFieldReferenceExpression ("__initialized");
                        
                        CodeBinaryOperatorExpression bin;
                        bin = new CodeBinaryOperatorExpression (initialized,
@@ -247,9 +324,12 @@ namespace System.Web.Compilation
                        CodeAssignStatement assign = new CodeAssignStatement (initialized,
                                                                              new CodePrimitiveExpression (true));
 
-                       CodeConditionStatement cond = new CodeConditionStatement (bin, assign);
+                       CodeConditionStatement cond = new CodeConditionStatement ();
+                       cond.Condition = bin;
+                       
                        if (trueStmt != null)
                                cond.TrueStatements.AddRange (trueStmt);
+                       cond.TrueStatements.Add (assign);
                        
                        ctor.Statements.Add (cond);
                }
@@ -259,9 +339,15 @@ namespace System.Web.Compilation
                        if (parser.Scripts == null || parser.Scripts.Count == 0)
                                return;
 
+                       ServerSideScript sss;
+                       
                        foreach (object o in parser.Scripts) {
-                               if (o is string)
-                                       mainClass.Members.Add (new CodeSnippetTypeMember ((string) o));
+                               sss = o as ServerSideScript;
+
+                               if (sss == null)
+                                       continue;
+                               
+                               mainClass.Members.Add (AddLinePragma (new CodeSnippetTypeMember (sss.Script), sss.Location));
                        }
                }