protected void AddChildCall (ControlBuilder parent, ControlBuilder child) { if (parent == null || child == null) return; CodeStatementCollection methodStatements = parent.MethodStatements; CodeMethodReferenceExpression m = new CodeMethodReferenceExpression (thisRef, child.Method.Name); CodeMethodInvokeExpression expr = new CodeMethodInvokeExpression (m); object [] atts = null; if (child.ControlType != null) atts = child.ControlType.GetCustomAttributes (typeof (PartialCachingAttribute), true); if (atts != null && atts.Length > 0) { PartialCachingAttribute pca = (PartialCachingAttribute) atts [0]; CodeTypeReferenceExpression cc = new CodeTypeReferenceExpression("System.Web.UI.StaticPartialCachingControl"); CodeMethodInvokeExpression build = new CodeMethodInvokeExpression (cc, "BuildCachedControl"); CodeExpressionCollection parms = build.Parameters; parms.Add (new CodeArgumentReferenceExpression("__ctrl")); parms.Add (new CodePrimitiveExpression (child.ID)); if (pca.Shared) parms.Add (new CodePrimitiveExpression (child.ControlType.GetHashCode ().ToString ())); else parms.Add (new CodePrimitiveExpression (Guid.NewGuid ().ToString ())); parms.Add (new CodePrimitiveExpression (pca.Duration)); parms.Add (new CodePrimitiveExpression (pca.VaryByParams)); parms.Add (new CodePrimitiveExpression (pca.VaryByControls)); parms.Add (new CodePrimitiveExpression (pca.VaryByCustom)); parms.Add (new CodePrimitiveExpression (pca.SqlDependency)); parms.Add (new CodeDelegateCreateExpression ( new CodeTypeReference (typeof (System.Web.UI.BuildMethod)), thisRef, child.Method.Name)); #if NET_4_0 string value = pca.ProviderName; if (!String.IsNullOrEmpty (value) && String.Compare (OutputCache.DEFAULT_PROVIDER_NAME, value, StringComparison.Ordinal) != 0) parms.Add (new CodePrimitiveExpression (value)); else parms.Add (new CodePrimitiveExpression (null)); #endif methodStatements.Add (AddLinePragma (build, parent)); if (parent.HasAspCode) AddRenderControl (parent); return; } if (child.IsProperty || parent.ChildrenAsProperties) { if (!child.PropertyBuilderShouldReturnValue) { expr.Parameters.Add (new CodeFieldReferenceExpression (ctrlVar, child.TagName)); parent.MethodStatements.Add (AddLinePragma (expr, parent)); } else { string localVarName = parent.GetNextLocalVariableName ("__ctrl"); methodStatements.Add (new CodeVariableDeclarationStatement (child.Method.ReturnType, localVarName)); CodeVariableReferenceExpression localVarRef = new CodeVariableReferenceExpression (localVarName); CodeAssignStatement assign = new CodeAssignStatement (); assign.Left = localVarRef; assign.Right = expr; methodStatements.Add (AddLinePragma (assign, parent)); assign = new CodeAssignStatement (); assign.Left = new CodeFieldReferenceExpression (ctrlVar, child.TagName); assign.Right = localVarRef; methodStatements.Add (AddLinePragma (assign, parent)); } return; } methodStatements.Add (AddLinePragma (expr, parent)); CodeFieldReferenceExpression field = new CodeFieldReferenceExpression (thisRef, child.ID); if (parent.ControlType == null || typeof (IParserAccessor).IsAssignableFrom (parent.ControlType)) AddParsedSubObjectStmt (parent, field); else { CodeMethodInvokeExpression invoke = new CodeMethodInvokeExpression (ctrlVar, "Add"); invoke.Parameters.Add (field); methodStatements.Add (AddLinePragma (invoke, parent)); } if (parent.HasAspCode) AddRenderControl (parent); }