Exemplo n.º 1
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();
            }
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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
            });
        }