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)); } }
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(); } }
protected override Expression VisitSimpleName(SimpleNameBindingParserNode node) { return(GetMemberOrTypeExpression(node, null)); }
public ResolvedServiceInjectDirective(SimpleNameBindingParserNode nameSyntax, BindingParserNode typeSyntax, Type injectedType) { NameSyntax = nameSyntax; TypeSyntax = typeSyntax; Type = injectedType; }