protected virtual IAbstractDirective ProcessServiceInjectDirective(DothtmlDirectiveNode directiveNode)
        {
            var valueSyntaxRoot = ParseImportDirectiveValue(directiveNode);

            if (valueSyntaxRoot is BinaryOperatorBindingParserNode assigment)
            {
                var name = assigment.FirstExpression as SimpleNameBindingParserNode;
                if (name == null)
                {
                    directiveNode.AddError($"Identifier expected on the left side of the assigment.");
                    name = new SimpleNameBindingParserNode(new BindingToken {
                        Text = "service"
                    });
                }
                var type = assigment.SecondExpression;
                return(treeBuilder.BuildServiceInjectDirective(directiveNode, name, type));
            }
            else
            {
                directiveNode.AddError($"Assignment operation expected - the correct form is `@{ParserConstants.ServiceInjectDirective} myStringService = ISomeService<string>`");
                return(treeBuilder.BuildServiceInjectDirective(directiveNode, new SimpleNameBindingParserNode(new BindingToken {
                    Text = "service"
                }), valueSyntaxRoot));
            }
        }
예제 #2
0
        public IAbstractServiceInjectDirective BuildServiceInjectDirective(
            DothtmlDirectiveNode node,
            SimpleNameBindingParserNode nameSyntax,
            BindingParserNode typeSyntax)
        {
            foreach (var syntaxNode in nameSyntax.EnumerateNodes().Concat(typeSyntax?.EnumerateNodes() ?? Enumerable.Empty <BindingParserNode>()))
            {
                syntaxNode.NodeErrors.ForEach(node.AddError);
            }

            var expression = ParseDirectiveExpression(node, typeSyntax);

            if (expression is UnknownStaticClassIdentifierExpression)
            {
                node.AddError($"{typeSyntax.ToDisplayString()} is not a valid type.");
                return(new ResolvedServiceInjectDirective(nameSyntax, typeSyntax, null)
                {
                    DothtmlNode = node
                });
            }
            else if (expression is StaticClassIdentifierExpression)
            {
                return(new ResolvedServiceInjectDirective(nameSyntax, typeSyntax, expression.Type)
                {
                    DothtmlNode = node
                });
            }
            else
            {
                throw new NotSupportedException();
            }
        }
예제 #3
0
 protected override Expression VisitSimpleName(SimpleNameBindingParserNode node)
 {
     return(GetMemberOrTypeExpression(node, null));
 }
 public ResolvedServiceInjectDirective(SimpleNameBindingParserNode nameSyntax, BindingParserNode typeSyntax, Type injectedType)
 {
     NameSyntax = nameSyntax;
     TypeSyntax = typeSyntax;
     Type       = injectedType;
 }