public override void VisitView(ResolvedTreeRoot view) { lastMetadata = view.Metadata; var wrapperClassName = CreateControlClass(className, view.Metadata.Type); emitter.UseType(view.Metadata.Type); emitter.BuilderDataContextType = view.DataContextTypeStack?.DataContextType; emitter.ResultControlType = wrapperClassName; // build the statements emitter.PushNewMethod(DefaultViewCompilerCodeEmitter.BuildControlFunctionName, typeof(DotvvmControl), emitter.EmitControlBuilderParameter()); var pageName = emitter.EmitCreateObject(wrapperClassName); emitter.EmitSetDotvvmProperty(pageName, Internal.UniqueIDProperty, pageName); emitter.EmitSetDotvvmProperty(pageName, Internal.MarkupFileNameProperty, view.Metadata.VirtualPath); if (typeof(DotvvmView).IsAssignableFrom(view.Metadata.Type)) { emitter.EmitSetProperty(pageName, nameof(DotvvmView.ViewModelType), emitter.EmitValue(view.DataContextTypeStack.DataContextType)); } if (view.Metadata.Type.IsAssignableFrom(typeof(DotvvmView)) || 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(); }
public override void VisitView(ResolvedTreeRoot view) { lastMetadata = view.Metadata; var createsCustomDerivedType = view.Metadata.Type == typeof(DotvvmView); if (createsCustomDerivedType) { var resultControlType = className + "Control"; emitter.ResultControlTypeSyntax = SyntaxFactory.ParseTypeName(resultControlType); emitter.EmitControlClass(view.Metadata.Type, resultControlType); } else { emitter.ResultControlTypeSyntax = emitter.ParseTypeName(view.Metadata.Type); } 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.ResultControlTypeSyntax) : this.EmitCreateControl(view.Metadata.Type, new object[0]); emitter.RegisterDotvvmProperties(pageName); 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.CommitDotvvmProperties(pageName); emitter.EmitReturnClause(pageName); emitter.PopMethod(); }
public virtual ExpressionSyntax EmitCreateBinding(DefaultViewCompilerCodeEmitter emitter, ResolvedBinding binding) { var newbinding = CreateMinimalClone(binding); return(emitter.EmitValue(newbinding)); }
protected ExpressionSyntax GetCompiledBindingCreation(DefaultViewCompilerCodeEmitter emitter, string methodName, string updateMethodName, string originalString, ExpressionSyntax[] actionFilters, string javascript, string id) { var dict = new Dictionary<string, ExpressionSyntax>(); if (methodName != null) dict.Add(nameof(CompiledBindingExpression.Delegate), SyntaxFactory.ParseName(methodName)); if (updateMethodName != null) dict.Add(nameof(CompiledBindingExpression.UpdateDelegate), SyntaxFactory.ParseName(updateMethodName)); if (originalString != null) dict.Add(nameof(CompiledBindingExpression.OriginalString), emitter.EmitValue(originalString)); if (javascript != null) dict.Add(nameof(CompiledBindingExpression.Javascript), emitter.EmitValue(javascript)); if (id != null) dict.Add(nameof(CompiledBindingExpression.Id), emitter.EmitValue(id)); if (actionFilters != null) dict.Add(nameof(CompiledBindingExpression.ActionFilters), SyntaxFactory.ArrayCreationExpression( SyntaxFactory.ArrayType(SyntaxFactory.ParseTypeName(typeof(ActionFilterAttribute).FullName)) .WithRankSpecifiers( SyntaxFactory.SingletonList<ArrayRankSpecifierSyntax>( SyntaxFactory.ArrayRankSpecifier( SyntaxFactory.SingletonSeparatedList<ExpressionSyntax>( SyntaxFactory.OmittedArraySizeExpression())))), SyntaxFactory.InitializerExpression(SyntaxKind.CollectionInitializerExpression, SyntaxFactory.SeparatedList(actionFilters)))); return SyntaxFactory.ObjectCreationExpression( SyntaxFactory.ParseTypeName(typeof(CompiledBindingExpression).FullName), SyntaxFactory.ArgumentList(), SyntaxFactory.InitializerExpression(SyntaxKind.ObjectInitializerExpression, SyntaxFactory.SeparatedList( dict.Select(p => (ExpressionSyntax)SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, SyntaxFactory.IdentifierName(p.Key), p.Value ) ) ) ) ); }