示例#1
0
 public ResolvedContentNode(ControlResolverMetadata metadata, DothtmlNode node, List<ResolvedControl> content, DataContextStack dataContext)
 {
     Metadata = metadata;
     DothtmlNode = node;
     Content = content;
     DataContextTypeStack = dataContext;
 }
        public override void VisitView(ResolvedTreeRoot view)
        {
            lastMetadata = view.Metadata;
            var wrapperClassName = CreateControlClass(className, view.Metadata.Type);

            emitter.UsedAssemblies.Add(view.Metadata.Type.Assembly);
            emitter.BuilderDataContextType = view.DataContextTypeStack?.DataContextType;
            emitter.ResultControlType      = wrapperClassName;
            // build the statements
            emitter.PushNewMethod(DefaultViewCompilerCodeEmitter.BuildControlFunctionName);
            var pageName = emitter.EmitCreateObject(wrapperClassName);

            emitter.EmitSetAttachedProperty(pageName, Internal.UniqueIDProperty, pageName);
            emitter.EmitSetAttachedProperty(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)))
            {
                foreach (var directive in view.Directives)
                {
                    emitter.EmitAddDirective(pageName, directive.Key, directive.Value);
                }
            }

            controlName = pageName;

            base.VisitView(view);

            emitter.EmitReturnClause(pageName);
            emitter.PopMethod();
        }
示例#3
0
 public ResolvedContentNode(ControlResolverMetadata metadata, DothtmlNode node, List <ResolvedControl> content, DataContextStack dataContext)
 {
     Metadata             = metadata;
     DothtmlNode          = node;
     Content              = content;
     DataContextTypeStack = dataContext;
 }
 private static void EnsureContentAllowed(ControlResolverMetadata controlMetadata)
 {
     if (!controlMetadata.IsContentAllowed)
     {
         throw new DotvvmCompilationException($"The content is not allowed inside the control '{controlMetadata.Name}'!");
     }
 }
示例#5
0
 public PropertyControlCollectionInsertionInfo(DotvvmProperty dotvvmProperty, StyleOverrideOptions type,
                                               ControlResolverMetadata metadata, IStyle innerControlStyle)
 {
     this.dotvvmProperty    = dotvvmProperty;
     this.Type              = type;
     this.metadata          = metadata;
     this.innerControlStyle = innerControlStyle;
 }
示例#6
0
        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();
        }
示例#7
0
 public PropertyControlCollectionInsertionInfo(DotvvmProperty dotvvmProperty, StyleOverrideOptions type,
                                               ControlResolverMetadata metadata, IStyle innerControlStyle, object[] ctorParameters)
 {
     this.dotvvmProperty    = dotvvmProperty;
     this.Type              = type;
     this.metadata          = metadata;
     this.innerControlStyle = innerControlStyle;
     this.ctorParameters    = ctorParameters;
     this.propertyKind      = DeterminePropertyKind(dotvvmProperty, metadata);
 }
示例#8
0
 public ResolvedTreeRoot(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext, IReadOnlyDictionary <string, IReadOnlyList <IAbstractDirective> > directives)
     : base(metadata, node, dataContext)
 {
     Directives = directives.ToDictionary(d => d.Key, d => d.Value.ToList());
     foreach (var ds in Directives.Values)
     {
         foreach (var d in ds)
         {
             ((ResolvedDirective)d).Parent = this;
         }
     }
 }
示例#9
0
            static PropertyKind DeterminePropertyKind(DotvvmProperty property, ControlResolverMetadata controlMetadata)
            {
                var propType = property.PropertyType;

                if (typeof(ITemplate).IsAssignableFrom(propType))
                {
                    return(PropertyKind.Template);
                }
                else if (typeof(System.Collections.ICollection).IsAssignableFrom(propType) &&
                         ReflectionUtils.GetEnumerableType(propType).IsAssignableFrom(controlMetadata.Type))
                {
                    return(PropertyKind.Collection);
                }
                else if (typeof(DotvvmBindableObject).IsAssignableFrom(propType) &&
                         propType.IsAssignableFrom(controlMetadata.Type))
                {
                    return(PropertyKind.SingleControl);
                }
                else
                {
                    throw new Exception($"Can not set a control of type {controlMetadata.Type} to a property of type {propType}.");
                }
            }
示例#10
0
        public override void VisitView(ResolvedTreeRoot view)
        {
            lastMetadata = view.Metadata;
            var wrapperClassName = CreateControlClass(className, view.Metadata.Type);
            emitter.BuilderDataContextType = view.DataContextTypeStack?.DataContextType;
            // build the statements
            emitter.PushNewMethod(DefaultViewCompilerCodeEmitter.BuildControlFunctionName);
            var pageName = emitter.EmitCreateObject(wrapperClassName);
            emitter.EmitSetAttachedProperty(pageName, typeof(Internal).FullName, Internal.UniqueIDProperty.Name, pageName);
            if (view.Metadata.Type.IsAssignableFrom(typeof(DotvvmView)))
            {
                foreach (var directive in view.Directives)
                {
                    emitter.EmitAddDirective(pageName, directive.Key, directive.Value);
                }
            }

            controlName = pageName;

            base.VisitView(view);

            emitter.EmitReturnClause(pageName);
            emitter.PopMethod();
        }
示例#11
0
 public ResolvedTreeRoot(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext, IReadOnlyDictionary <string, IReadOnlyList <IAbstractDirective> > directives)
     : base(metadata, node, dataContext)
 {
     Directives = directives.ToDictionary(d => d.Key, d => d.Value.ToList());
     directives.SelectMany(d => d.Value).ToList().ForEach(d => { ((ResolvedDirective)d).Parent = this; });
 }
示例#12
0
 public ResolvedContentNode(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext)
     : this(metadata, node, new List<ResolvedControl>(), dataContext)
 { }
示例#13
0
 public ResolvedControl(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext)
     : base(metadata, node, dataContext)
 {
 }
示例#14
0
        private ResolvedControl ProcessNode(DothtmlNode node, ControlResolverMetadata parentMetadata, DataContextStack dataContext)
        {
            try
            {
                if (node is DothtmlBindingNode)
                {
                    EnsureContentAllowed(parentMetadata);

                    // binding in text
                    var binding = (DothtmlBindingNode)node;
                    var literal = new ResolvedControl(controlResolver.ResolveControl(typeof(Literal)), node, dataContext);
                    literal.SetProperty(new ResolvedPropertyBinding(Literal.TextProperty, ProcessBinding(binding, dataContext)));
                    literal.SetProperty(new ResolvedPropertyValue(Literal.RenderSpanElementProperty, false));
                    return(literal);
                }
                else if (node is DotHtmlCommentNode)
                {
                    var commentNode = node as DotHtmlCommentNode;

                    string text    = commentNode.IsServerSide ?  "" : "<!--" + commentNode.Value + "-->";
                    var    literal = new ResolvedControl(controlResolver.ResolveControl(typeof(RawLiteral)), node, dataContext);
                    literal.ContructorParameters = new object[] { text, commentNode.Value, true };
                    return(literal);
                }
                else if (node is DothtmlLiteralNode)
                {
                    var literalNode = ((DothtmlLiteralNode)node);
                    // text content
                    var whitespace = string.IsNullOrWhiteSpace(literalNode.Value);
                    if (!whitespace)
                    {
                        EnsureContentAllowed(parentMetadata);
                    }

                    string text;

                    if (literalNode.Escape)
                    {
                        text = WebUtility.HtmlEncode(literalNode.Value);
                    }
                    else
                    {
                        text = literalNode.Value;
                    }

                    var literal = new ResolvedControl(controlResolver.ResolveControl(typeof(RawLiteral)), node, dataContext);
                    literal.ContructorParameters = new object[] { text, literalNode.Value, whitespace };
                    return(literal);
                }
                else if (node is DothtmlElementNode)
                {
                    // HTML element
                    var element = (DothtmlElementNode)node;
                    EnsureContentAllowed(parentMetadata);

                    // the element is the content
                    return(ProcessObjectElement(element, dataContext));
                }
                else
                {
                    throw new NotSupportedException($"The node of type '{node.GetType()}' is not supported!");
                }
            }
            catch (DotvvmCompilationException ex)
            {
                if (ex.Tokens == null)
                {
                    ex.Tokens       = node.Tokens;
                    ex.ColumnNumber = node.Tokens.First().ColumnNumber;
                    ex.LineNumber   = node.Tokens.First().LineNumber;
                }
                throw;
            }
            catch (Exception ex)
            {
                throw new DotvvmCompilationException("", ex, node.Tokens);
            }
        }
示例#15
0
 private DotvvmProperty FindProperty(ControlResolverMetadata parentMetadata, string name)
 {
     return(parentMetadata.FindProperty(name) ?? (name.Contains(".") ? DotvvmProperty.ResolveProperty(name, false) : null));
 }
示例#16
0
 public ResolvedTreeRoot(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext)
     : base(metadata, node, dataContext)
 {
 }
 public BindingRequiredResourceVisitor(ControlResolverMetadata requiredResourceConrolMetadata)
 {
     this.requiredResourceConrolMetadata = requiredResourceConrolMetadata;
 }
示例#18
0
 public ResolvedContentNode(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext)
     : this(metadata, node, new List <ResolvedControl>(), dataContext)
 {
 }
示例#19
0
 public GlobalizeResourceVisitor(ControlResolverMetadata globalizeResourceControl)
 {
     this.globalizeResourceControl = globalizeResourceControl;
 }