/// <summary> /// Emits control class definition if wrapper is DotvvmView and returns class name /// </summary> protected string CreateControlClass(string className, Type wrapperType) { if (wrapperType == typeof(DotvvmView)) { var controlClassName = className + "Control"; emitter.EmitControlClass(wrapperType, controlClassName); return(controlClassName); } else { return(wrapperType.FullName); } }
public override void VisitView(ResolvedTreeRoot view) { lastMetadata = view.Metadata; var createsCustomDerivedType = view.Metadata.Type == typeof(DotvvmView); if (createsCustomDerivedType) { emitter.ResultControlType = className + "Control"; emitter.EmitControlClass(view.Metadata.Type, emitter.ResultControlType); } else { emitter.ResultControlType = view.Metadata.Type.FullName; } emitter.UseType(view.Metadata.Type); emitter.BuilderDataContextType = view.DataContextTypeStack?.DataContextType; // build the statements emitter.PushNewMethod(nameof(IControlBuilder.BuildControl), typeof(DotvvmControl), emitter.EmitControlBuilderParameters()); var pageName = createsCustomDerivedType ? emitter.EmitCreateObject(emitter.ResultControlType) : this.EmitCreateControl(view.Metadata.Type, new object[0]); emitter.EmitSetDotvvmProperty(pageName, Internal.UniqueIDProperty, pageName); emitter.EmitSetDotvvmProperty(pageName, Internal.MarkupFileNameProperty, view.Metadata.VirtualPath); emitter.EmitSetDotvvmProperty(pageName, Internal.DataContextTypeProperty, emitter.EmitValue(view.DataContextTypeStack)); if (typeof(DotvvmView).IsAssignableFrom(view.Metadata.Type)) { emitter.EmitSetProperty(pageName, nameof(DotvvmView.ViewModelType), emitter.EmitValue(view.DataContextTypeStack.DataContextType)); } if (typeof(DotvvmView).IsAssignableFrom(view.Metadata.Type) || typeof(DotvvmMarkupControl).IsAssignableFrom(view.Metadata.Type)) { foreach (var directive in view.Directives) { emitter.EmitAddDirective(pageName, directive.Key, directive.Value.First().Value); } } controlName = pageName; base.VisitView(view); emitter.EmitReturnClause(pageName); emitter.PopMethod(); }