ProcessGeneratedCode() public method

public ProcessGeneratedCode ( CodeCompileUnit codeCompileUnit, CodeTypeDeclaration baseType, CodeTypeDeclaration derivedType, CodeMemberMethod buildMethod, CodeMemberMethod dataBindingMethod ) : void
codeCompileUnit System.CodeDom.CodeCompileUnit
baseType System.CodeDom.CodeTypeDeclaration
derivedType System.CodeDom.CodeTypeDeclaration
buildMethod System.CodeDom.CodeMemberMethod
dataBindingMethod System.CodeDom.CodeMemberMethod
return void
Example #1
0
		protected void CreateControlTree (ControlBuilder builder, bool inTemplate, bool childrenAsProperties)
		{
			EnsureID (builder);
			bool isTemplate = builder.IsTemplate;
			
			if (!isTemplate && !inTemplate) {
				CreateField (builder, true);
			} else if (!isTemplate) {
				bool doCheck = false;				
				bool singleInstance = false;
				ControlBuilder pb = builder.ParentBuilder;
				TemplateBuilder tpb;
				while (pb != null) {
					tpb = pb as TemplateBuilder;
					if (tpb == null) {
						pb = pb.ParentBuilder;
						continue;
					}
					
					if (tpb.TemplateInstance == TemplateInstance.Single)
						singleInstance = true;
					break;
				}
				
				if (!singleInstance)
					builder.ID = builder.GetNextID (null);
				else
					doCheck = true;

				CreateField (builder, doCheck);
			}

			InitMethod (builder, isTemplate, childrenAsProperties);
			if (!isTemplate || builder.GetType () == typeof (RootBuilder))
				CreateAssignStatementsFromAttributes (builder);

			if (builder.Children != null && builder.Children.Count > 0) {
				StringBuilder sb = new StringBuilder ();
				foreach (object b in builder.Children) {
					if (b is string) {
						sb.Append ((string) b);
						continue;
					}

					FlushText (builder, sb);
					if (b is ObjectTagBuilder) {
						ProcessObjectTag ((ObjectTagBuilder) b);
					} else if (b is StringPropertyBuilder) {
						StringPropertyBuilder pb = b as StringPropertyBuilder;
						if (pb.Children != null && pb.Children.Count > 0) {
							StringBuilder asb = new StringBuilder ();
							foreach (string s in pb.Children)
								asb.Append (s);
							CodeMemberMethod method = builder.Method;
							CodeAssignStatement assign = new CodeAssignStatement ();
							assign.Left = new CodePropertyReferenceExpression (ctrlVar, pb.PropertyName);
							assign.Right = new CodePrimitiveExpression (asb.ToString ());
							method.Statements.Add (AddLinePragma (assign, builder));
						}
					} else if (b is ContentBuilderInternal) {
						ContentBuilderInternal cb = (ContentBuilderInternal) b;
						CreateControlTree (cb, false, true);
						AddContentTemplateInvocation (cb, builder.Method, cb.Method.Name);
						continue;
					}

					// Ignore TemplateBuilders - they are processed in InitMethod
					else if (b is TemplateBuilder) {
					} else if (b is CodeRenderBuilder) {
						AddCodeRender (builder, (CodeRenderBuilder) b);
					} else if (b is DataBindingBuilder) {
						AddDataBindingLiteral (builder, (DataBindingBuilder) b);
					} else if (b is ControlBuilder) {
						ControlBuilder child = (ControlBuilder) b;
						CreateControlTree (child, inTemplate, builder.ChildrenAsProperties);
						AddChildCall (builder, child);
						continue;
					} else
						throw new Exception ("???");

					ControlBuilder bldr = b as ControlBuilder;
					bldr.ProcessGeneratedCode (CompileUnit, BaseType, DerivedType, bldr.Method, bldr.DataBindingMethod);
				}

				FlushText (builder, sb);
			}

			ControlBuilder defaultPropertyBuilder = builder.DefaultPropertyBuilder;
			if (defaultPropertyBuilder != null) {
				CreateControlTree (defaultPropertyBuilder, false, true);
				AddChildCall (builder, defaultPropertyBuilder);
			}
			
			if (builder.HasAspCode) {
				CodeMemberMethod renderMethod = builder.RenderMethod;
				CodeMethodReferenceExpression m = new CodeMethodReferenceExpression ();
				m.TargetObject = thisRef;
				m.MethodName = renderMethod.Name;

				CodeDelegateCreateExpression create = new CodeDelegateCreateExpression ();
				create.DelegateType = new CodeTypeReference (typeof (RenderMethod));
				create.TargetObject = thisRef;
				create.MethodName = renderMethod.Name;

				CodeMethodInvokeExpression invoke = new CodeMethodInvokeExpression ();
				invoke.Method = new CodeMethodReferenceExpression (ctrlVar, "SetRenderMethodDelegate");
				invoke.Parameters.Add (create);

				builder.MethodStatements.Add (invoke);
			}

			if (builder is RootBuilder)
				if (!String.IsNullOrEmpty (parser.MetaResourceKey))
					AssignPropertiesFromResources (builder, parser.BaseType, parser.MetaResourceKey);
			
			if ((!isTemplate || builder is RootBuilder) && !String.IsNullOrEmpty (builder.GetAttribute ("meta:resourcekey")))
				CreateAssignStatementFromAttribute (builder, "meta:resourcekey");
			
			if ((childrenAsProperties && builder.PropertyBuilderShouldReturnValue) || (!childrenAsProperties && typeof (Control).IsAssignableFrom (builder.ControlType)))
				builder.Method.Statements.Add (new CodeMethodReturnStatement (ctrlVar));

			builder.ProcessGeneratedCode (CompileUnit, BaseType, DerivedType, builder.Method, builder.DataBindingMethod);
		}
        protected virtual void BuildSourceDataTreeFromBuilder(ControlBuilder builder,
                                                    bool fInTemplate, bool topLevelControlInTemplate,
                                                    PropertyEntry pse) {

            // Don't do anything for Code blocks
            if (builder is CodeBlockBuilder || builder is CodeStatementBuilder)
                return;

            // Is the current builder for a template?
            bool fTemplate = (builder is TemplateBuilder);

            // For the control name in the compiled code, we use the
            // ID if one is available (but don't use the ID inside a template)
            // Otherwise, we generate a unique name.
            if (builder.ID == null || fInTemplate) {
                // Increase the control count to generate unique ID's
                _controlCount++;

                builder.ID = "__control" + _controlCount.ToString(NumberFormatInfo.InvariantInfo);
                builder.IsGeneratedID = true;
            }

            // Process the children
            if (builder.SubBuilders != null) {
                foreach (object child in builder.SubBuilders) {
                    if (child is ControlBuilder) {
                        // Do not treat it as top level control in template if the control is at top-level of a file.
                        bool isTopLevelCtrlInTemplate =
                            fTemplate && typeof(Control).IsAssignableFrom(((ControlBuilder)child).ControlType) && !(builder is RootBuilder);
                        BuildSourceDataTreeFromBuilder((ControlBuilder)child, fInTemplate, isTopLevelCtrlInTemplate, null);
                    }
                }
            }

            foreach (TemplatePropertyEntry entry in builder.TemplatePropertyEntries) {
                bool inTemplate = true;

                // If the template container does not allow multiple instances,
                // treat the controls as if not in templates.
                if (entry.PropertyInfo != null) {
                    inTemplate = entry.IsMultiple;
                }

                BuildSourceDataTreeFromBuilder(((TemplatePropertyEntry)entry).Builder, inTemplate, false /*topLevelControlInTemplate*/, entry);
            }

            foreach (ComplexPropertyEntry entry in builder.ComplexPropertyEntries) {
                // Don't create a build method for inner property strings
                if (!(entry.Builder is StringPropertyBuilder)) {
                    BuildSourceDataTreeFromBuilder(((ComplexPropertyEntry)entry).Builder, fInTemplate, false /*topLevelControlInTemplate*/, entry);
                }
            }

            // Build a field declaration for the control if ID is defined on the control.
            // (Not a generated ID)
            if (!builder.IsGeneratedID)
                BuildFieldDeclaration(builder);

            CodeMemberMethod buildMethod = null;
            CodeMemberMethod dataBindingMethod = null;

            // Skip the rest if we're only generating the intermediate class
            if (_sourceDataClass != null) {

                if (!_designerMode) {
                    // Build a Build method for the control
                    buildMethod = BuildBuildMethod(builder, fTemplate, fInTemplate, topLevelControlInTemplate, pse, false);
                }

                // Build a Render method for the control, unless it has no code
                if (builder.HasAspCode) {
                    BuildRenderMethod(builder, fTemplate);
                }

                // Build a method to extract values from the template
                BuildExtractMethod(builder);

                // Build a property binding method for the control
                dataBindingMethod = BuildPropertyBindingMethod(builder, false);
            }

            // Give the ControlBuilder a chance to look at and modify the tree
            builder.ProcessGeneratedCode(_codeCompileUnit, _intermediateClass,
                _sourceDataClass, buildMethod, dataBindingMethod);

            if (Parser.ControlBuilderInterceptor != null) {
                Parser.ControlBuilderInterceptor.OnProcessGeneratedCode(builder, _codeCompileUnit,
                    _intermediateClass, _sourceDataClass, buildMethod, dataBindingMethod, builder.AdditionalState);
            }

            // Give the ParseRecorder a chance to look at and modify the tree
            Parser.ParseRecorders.ProcessGeneratedCode(builder, _codeCompileUnit,
                _intermediateClass, _sourceDataClass, buildMethod, dataBindingMethod);
        }
 public void VerifyProcessGeneratedCode(ControlBuilder builder) {
     CodeCompileUnit ccu = new CodeCompileUnit();
     ccu.Namespaces.Add(new CodeNamespace());
     builder.ProcessGeneratedCode(ccu, null, null, null, null);
     VerifyDefaultNameSpaces(ccu);
 }
 protected virtual void BuildSourceDataTreeFromBuilder(ControlBuilder builder, bool fInTemplate, bool topLevelControlInTemplate, PropertyEntry pse)
 {
     if (!(builder is CodeBlockBuilder))
     {
         bool fTemplate = builder is TemplateBuilder;
         if ((builder.ID == null) || fInTemplate)
         {
             this._controlCount++;
             builder.ID = "__control" + this._controlCount.ToString(NumberFormatInfo.InvariantInfo);
             builder.IsGeneratedID = true;
         }
         if (builder.SubBuilders != null)
         {
             foreach (object obj2 in builder.SubBuilders)
             {
                 if (obj2 is ControlBuilder)
                 {
                     bool flag2 = (fTemplate && typeof(Control).IsAssignableFrom(((ControlBuilder) obj2).ControlType)) && !(builder is RootBuilder);
                     this.BuildSourceDataTreeFromBuilder((ControlBuilder) obj2, fInTemplate, flag2, null);
                 }
             }
         }
         foreach (TemplatePropertyEntry entry in builder.TemplatePropertyEntries)
         {
             bool isMultiple = true;
             if (entry.PropertyInfo != null)
             {
                 isMultiple = entry.IsMultiple;
             }
             this.BuildSourceDataTreeFromBuilder(entry.Builder, isMultiple, false, entry);
         }
         foreach (ComplexPropertyEntry entry2 in builder.ComplexPropertyEntries)
         {
             if (!(entry2.Builder is StringPropertyBuilder))
             {
                 this.BuildSourceDataTreeFromBuilder(entry2.Builder, fInTemplate, false, entry2);
             }
         }
         if (!builder.IsGeneratedID)
         {
             this.BuildFieldDeclaration(builder);
         }
         CodeMemberMethod buildMethod = null;
         CodeMemberMethod dataBindingMethod = null;
         if (base._sourceDataClass != null)
         {
             if (!base._designerMode)
             {
                 buildMethod = this.BuildBuildMethod(builder, fTemplate, fInTemplate, topLevelControlInTemplate, pse, false);
             }
             if (builder.HasAspCode)
             {
                 this.BuildRenderMethod(builder, fTemplate);
             }
             this.BuildExtractMethod(builder);
             dataBindingMethod = this.BuildPropertyBindingMethod(builder, false);
         }
         builder.ProcessGeneratedCode(base._codeCompileUnit, base._intermediateClass, base._sourceDataClass, buildMethod, dataBindingMethod);
     }
 }