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(); } }
public IAbstractImportDirective BuildImportDirective( DothtmlDirectiveNode node, BindingParserNode aliasSyntax, BindingParserNode nameSyntax) { foreach (var syntaxNode in nameSyntax.EnumerateNodes().Concat(aliasSyntax?.EnumerateNodes() ?? Enumerable.Empty <BindingParserNode>())) { syntaxNode.NodeErrors.ForEach(node.AddError); } var visitor = new ExpressionBuildingVisitor(TypeRegistry.DirectivesDefault) { ResolveOnlyTypeName = true, Scope = null }; Expression expression; try { expression = visitor.Visit(nameSyntax); } catch (Exception ex) { node.AddError($"{nameSyntax.ToDisplayString()} is not a valid type or namespace: {ex.Message}"); return(new ResolvedImportDirective(aliasSyntax, nameSyntax, null) { DothtmlNode = node }); } if (expression is UnknownStaticClassIdentifierExpression) { var namespaceValid = expression .CastTo <UnknownStaticClassIdentifierExpression>().Name .Apply(ReflectionUtils.IsAssemblyNamespace); if (!namespaceValid) { node.AddError($"{nameSyntax.ToDisplayString()} is unknown type or namespace."); } return(new ResolvedImportDirective(aliasSyntax, nameSyntax, null) { DothtmlNode = node }); } else if (expression is StaticClassIdentifierExpression) { return(new ResolvedImportDirective(aliasSyntax, nameSyntax, expression.Type) { DothtmlNode = node }); } node.AddError($"{nameSyntax.ToDisplayString()} is not a type or namespace."); return(new ResolvedImportDirective(aliasSyntax, nameSyntax, null)); }
public IAbstractImportDirective BuildImportDirective( DothtmlDirectiveNode node, BindingParserNode aliasSyntax, BindingParserNode nameSyntax) { foreach (var syntaxNode in nameSyntax.EnumerateNodes().Concat(aliasSyntax?.EnumerateNodes() ?? Enumerable.Empty <BindingParserNode>())) { syntaxNode.NodeErrors.ForEach(node.AddError); } var expression = ParseDirectiveExpression(node, nameSyntax); if (expression is UnknownStaticClassIdentifierExpression) { var namespaceValid = expression .CastTo <UnknownStaticClassIdentifierExpression>().Name .Apply(compiledAssemblyCache.IsAssemblyNamespace); if (!namespaceValid) { node.AddError($"{nameSyntax.ToDisplayString()} is unknown type or namespace."); } return(new ResolvedImportDirective(aliasSyntax, nameSyntax, null) { DothtmlNode = node }); } else if (expression is StaticClassIdentifierExpression) { return(new ResolvedImportDirective(aliasSyntax, nameSyntax, expression.Type) { DothtmlNode = node }); } node.AddError($"{nameSyntax.ToDisplayString()} is not a type or namespace."); return(new ResolvedImportDirective(aliasSyntax, nameSyntax, null) { DothtmlNode = node }); }