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(); }
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}'!"); } }
public PropertyControlCollectionInsertionInfo(DotvvmProperty dotvvmProperty, StyleOverrideOptions type, ControlResolverMetadata metadata, IStyle innerControlStyle) { this.dotvvmProperty = dotvvmProperty; this.Type = type; this.metadata = metadata; this.innerControlStyle = innerControlStyle; }
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 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); }
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; } } }
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}."); } }
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(); }
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; }); }
public ResolvedContentNode(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext) : this(metadata, node, new List<ResolvedControl>(), dataContext) { }
public ResolvedControl(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext) : base(metadata, node, dataContext) { }
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); } }
private DotvvmProperty FindProperty(ControlResolverMetadata parentMetadata, string name) { return(parentMetadata.FindProperty(name) ?? (name.Contains(".") ? DotvvmProperty.ResolveProperty(name, false) : null)); }
public ResolvedTreeRoot(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext) : base(metadata, node, dataContext) { }
public BindingRequiredResourceVisitor(ControlResolverMetadata requiredResourceConrolMetadata) { this.requiredResourceConrolMetadata = requiredResourceConrolMetadata; }
public ResolvedContentNode(ControlResolverMetadata metadata, DothtmlNode node, DataContextStack dataContext) : this(metadata, node, new List <ResolvedControl>(), dataContext) { }
public GlobalizeResourceVisitor(ControlResolverMetadata globalizeResourceControl) { this.globalizeResourceControl = globalizeResourceControl; }