//check condtion type and set returned type as in if
        public override void Visit(WhileNode node)
        {
            _stack_of_while_node.Add(node);
            base.Visit(node);
            _stack_of_while_node.Remove(node);
            TypeNode _type_to_set;

            if (!NamedTypeNode.BoolType().Equals(node.Condition.ExpressionType, false))
            {
                throw new Exception("Inpropper type in if condition");
            }
            if (!node.HasElse || !node.Body.ExpressionType.Equals(node.Else.ExpressionType))
            {
                _type_to_set = NamedTypeNode.VoidType();
            }
            else
            {
                _type_to_set = node.Body.ExpressionType;
            }
            if (node.ExpressionType == null)
            {
                node.ExpressionType = _type_to_set;
            }
            else
            if (!node.ExpressionType.Equals(_type_to_set))
            {
                throw new Exception("Type of Body and Else is not correct with set type.");
            }
            else
            {
                node.ExpressionType = _type_to_set;
            }
        }
示例#2
0
        public void ProgramWithAdditionAndMultiplication()
        {
            var tree     = ExpressionProgram(AddMulExpression());
            var expected = new ProgramNode(new LinkedList <FunctionDefinitionNode>(new FunctionDefinitionNode[] {
                new FunctionDefinitionNode(
                    "MyFunc",
                    new LinkedList <VariableDeclNode>(),
                    NamedTypeNode.IntType(true),
                    new OperatorNode(
                        OperatorType.PLUS,
                        new ExpressionNode[] {
                    new AtomNode(NamedTypeNode.IntType(true), "1"),
                    new OperatorNode(
                        OperatorType.MUL,
                        new ExpressionNode[] {
                        new AtomNode(NamedTypeNode.IntType(true), "2"),
                        new AtomNode(NamedTypeNode.IntType(true), "3"),
                    }
                        )
                }
                        )
                    )
            }), new LinkedList <RecordTypeDeclarationNode>());

            ConductTest(tree, expected);
        }
        private HashSet <TypeNode> deduceType(string value)
        {
            HashSet <TypeNode> _set_of_types = new HashSet <TypeNode>();
            bool out_bool;

            if (Boolean.TryParse(value, out out_bool))
            {
                _set_of_types.Add(NamedTypeNode.BoolType(true));
            }
            byte out_byte;

            if (Byte.TryParse(value, out out_byte))
            {
                _set_of_types.Add(NamedTypeNode.ByteType(true));
            }
            int out_int;

            if (Int32.TryParse(value, out out_int))
            {
                _set_of_types.Add(NamedTypeNode.IntType(true));
            }
            char out_char;

            if (value.Length == 3 && Char.TryParse(value.Trim(new char[] { '\'' }), out out_char))
            {
                _set_of_types.Add(NamedTypeNode.CharType(true));
            }
            return(_set_of_types);
        }
示例#4
0
        internal static NamedTypeNode MakePrimitiveType(PrimitiveType type, Mutablitity isConstant)
        {
            NamedTypeNode result = null;

            switch (type)
            {
            case PrimitiveType.Int:
                result = NamedTypeNode.IntType();
                break;

            case PrimitiveType.Byte:
                result = NamedTypeNode.ByteType();
                break;

            case PrimitiveType.Char:
                result = NamedTypeNode.CharType();
                break;

            case PrimitiveType.Bool:
                result = NamedTypeNode.BoolType();
                break;

            case PrimitiveType.Void:
                result = NamedTypeNode.VoidType();
                break;

            default:
                throw new Exception("Wrong primitive type");
            }
            result.IsConstant = isConstant == Mutablitity.Constant;
            return(result);
        }
示例#5
0
            private static void ResolveOperations(
                SchemaTypesDefinition schemaDef,
                Dictionary <OperationType, ITypeReference> operations,
                TypeRegistry typeRegistry)
            {
                if (operations.Count == 0)
                {
                    schemaDef.QueryType        = GetObjectType(OperationTypeNames.Query);
                    schemaDef.MutationType     = GetObjectType(OperationTypeNames.Mutation);
                    schemaDef.SubscriptionType = GetObjectType(OperationTypeNames.Subscription);
                }
                else
                {
                    schemaDef.QueryType        = GetOperationType(OperationType.Query);
                    schemaDef.MutationType     = GetOperationType(OperationType.Mutation);
                    schemaDef.SubscriptionType = GetOperationType(OperationType.Subscription);
                }

                ObjectType?GetObjectType(NameString typeName)
                {
                    foreach (RegisteredType registeredType in typeRegistry.Types)
                    {
                        if (registeredType.Type is ObjectType objectType &&
                            objectType.Name.Equals(typeName))
                        {
                            return(objectType);
                        }
                    }

                    return(null);
                }

                ObjectType?GetOperationType(OperationType operation)
                {
                    if (operations.TryGetValue(operation, out ITypeReference? reference))
                    {
                        if (reference is SchemaTypeReference sr)
                        {
                            return((ObjectType)sr.Type);
                        }

                        if (reference is ExtendedTypeReference cr &&
                            typeRegistry.TryGetType(cr, out RegisteredType? registeredType))
                        {
                            return((ObjectType)registeredType.Type);
                        }

                        if (reference is SyntaxTypeReference str)
                        {
                            NamedTypeNode namedType = str.Type.NamedType();
                            return(typeRegistry.Types
                                   .Select(t => t.Type)
                                   .OfType <ObjectType>()
                                   .FirstOrDefault(t => t.Name.Equals(namedType.Name.Value)));
                        }
                    }

                    return(null);
                }
            }
示例#6
0
 internal static VariableDeclNode Declaration(string name, NamedTypeNode type)
 {
     return(new VariableDeclNode {
         Name = name,
         Type = type,
         ExpressionType = type
     });
 }
 //check if body returns the same as set type
 public override void Visit(FunctionDefinitionNode node)
 {
     base.Visit(node);
     if (!node.ResultType.Equals(node.Body.ExpressionType, false))
     {
         throw new TypeCheckException("Body doesn't return the same type as set type.");
     }
     node.ExpressionType = NamedTypeNode.VoidType();
 }
 //check if number is int and rewrite ExpressionType to Array type
 public override void Visit(ElementNode node)
 {
     base.Visit(node);
     if (!NamedTypeNode.IntType().Equals(node.Index.ExpressionType, false))
     {
         throw new TypeCheckException("Index is not integer type.");
     }
     node.ExpressionType = node.Array.ExpressionType;
 }
        protected void Interface(NamedTypeNode type)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            ObjectDescription.Interfaces.Add(new TypeReference(type));
        }
示例#10
0
 public IUnionTypeDescriptor Type(NamedTypeNode objectType)
 {
     if (objectType is null)
     {
         throw new ArgumentNullException(nameof(objectType));
     }
     Definition.Types.Add(TypeReference.Create(objectType, TypeContext.Output));
     return(this);
 }
示例#11
0
        public IInterfaceTypeDescriptor Implements(NamedTypeNode type)
        {
            if (type is null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            Definition.Interfaces.Add(TypeReference.Create(type, TypeContext.Output));
            return(this);
        }
示例#12
0
        IObjectTypeDescriptor IObjectTypeDescriptor.Interface(NamedTypeNode type)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            Interfaces = Interfaces.Add(new TypeReference(type));
            return(this);
        }
示例#13
0
        public void TypeNode_NamedTypeNodeHash_Test()
        {
            var hashSet = new HashSet <TypeNode>();

            hashSet.Add(NamedTypeNode.BoolType());
            Assert.AreEqual(1, hashSet.Count);
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.BoolType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.ByteType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.CharType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.IntType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.VoidType()));
            hashSet.Add(NamedTypeNode.BoolType());
            Assert.AreEqual(1, hashSet.Count);

            hashSet.Add(NamedTypeNode.ByteType());
            Assert.AreEqual(2, hashSet.Count);
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.BoolType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.ByteType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.CharType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.IntType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.VoidType()));
            hashSet.Add(NamedTypeNode.ByteType());
            Assert.AreEqual(2, hashSet.Count);

            hashSet.Add(NamedTypeNode.CharType());
            Assert.AreEqual(3, hashSet.Count);
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.BoolType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.ByteType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.CharType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.IntType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.VoidType()));
            hashSet.Add(NamedTypeNode.CharType());
            Assert.AreEqual(3, hashSet.Count);

            hashSet.Add(NamedTypeNode.IntType());
            Assert.AreEqual(4, hashSet.Count);
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.BoolType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.ByteType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.CharType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.IntType()));
            Assert.IsFalse(hashSet.Contains(NamedTypeNode.VoidType()));
            hashSet.Add(NamedTypeNode.IntType());
            Assert.AreEqual(4, hashSet.Count);


            hashSet.Add(NamedTypeNode.VoidType());
            Assert.AreEqual(5, hashSet.Count);
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.BoolType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.ByteType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.CharType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.IntType()));
            Assert.IsTrue(hashSet.Contains(NamedTypeNode.VoidType()));
            hashSet.Add(NamedTypeNode.VoidType());
            Assert.AreEqual(5, hashSet.Count);
        }
示例#14
0
 protected override NamedTypeNode RewriteNamedType(
     NamedTypeNode node,
     Context context)
 {
     if (context.Names.TryGetValue(node.Name.Value,
                                   out NameString newName))
     {
         return(node.WithName(node.Name.WithValue(newName)));
     }
     return(node);
 }
        //type is the last one element, if don't have set void
        public override void Visit(BlockExpressionNode node)
        {
            base.Visit(node);
            TypeNode last_element_type = NamedTypeNode.VoidType();

            foreach (var element in node.Elements)
            {
                last_element_type = element.ExpressionType;
            }
            node.ExpressionType = last_element_type;
        }
示例#16
0
        public IObjectTypeDescriptor Interface(
            NamedTypeNode namedTypeNode)
        {
            if (namedTypeNode == null)
            {
                throw new ArgumentNullException(nameof(namedTypeNode));
            }

            Definition.Interfaces.Add(new SyntaxTypeReference(
                                          namedTypeNode, TypeContext.Output));
            return(this);
        }
        public void TypeCheck_AssignIf_Test()
        {
            var _2_sub_3 = Utils.Sub(Utils.IntLiteral(2), Utils.IntLiteral(3));
            var _if      = Utils.IfElse(Utils.BoolLiteral(true), Utils.IntLiteral(5), _2_sub_3);

            var _decl = Utils.Declaration("x", NamedTypeNode.IntType());
            var _def  = Utils.Definition(_decl, _if);

            _def.Accept(new TypeCheckVisitor());

            Assert.IsTrue(NamedTypeNode.IntType().Equals(_def.ExpressionType));
        }
 //write type the same as in array node and check if Left and Right have int type
 public override void Visit(SliceNode node)
 {
     base.Visit(node);
     if (!NamedTypeNode.IntType().Equals(node.Left.ExpressionType, false))
     {
         throw new TypeCheckException("Left is not int value.");
     }
     if (!NamedTypeNode.IntType().Equals(node.Right.ExpressionType, false))
     {
         throw new TypeCheckException("Right is not int value.");
     }
     node.ExpressionType = node.Array.ExpressionType;
     ((ArrayTypeNode)node.ExpressionType).IsFixedSize = false;
 }
示例#19
0
        public void ProgramWithTheSimplestFunction()
        {
            var tree     = ExpressionProgram(NumberExpression());
            var expected = new ProgramNode(new LinkedList <FunctionDefinitionNode>(new FunctionDefinitionNode[] {
                new FunctionDefinitionNode(
                    "MyFunc",
                    new LinkedList <VariableDeclNode>(),
                    NamedTypeNode.IntType(true),
                    new AtomNode(NamedTypeNode.IntType(true), "42")
                    )
            }), new LinkedList <RecordTypeDeclarationNode>());

            ConductTest(tree, expected);
        }
 //check if condition is bool and set common return type of Then and Else
 public override void Visit(IfNode node)
 {
     base.Visit(node);
     if (!NamedTypeNode.BoolType().Equals(node.Condition.ExpressionType, false))
     {
         throw new Exception("Improper type in if condition");
     }
     if (!node.HasElse || !node.Then.ExpressionType.Equals(node.Else.ExpressionType, false))
     {
         node.ExpressionType = NamedTypeNode.VoidType();
     }
     else
     {
         node.ExpressionType = node.Then.ExpressionType;
     }
 }
示例#21
0
 public static IError FragmentTypeConditionUnknown(
     this IDocumentValidatorContext context,
     ISyntaxNode node,
     NamedTypeNode typeCondition)
 {
     return(ErrorBuilder.New()
            .SetMessage(
                Resources.ErrorHelper_FragmentTypeConditionUnknown,
                typeCondition.Name.Value)
            .AddLocation(node)
            .SetPath(context.CreateErrorPath())
            .SetExtension("typeCondition", typeCondition.Name.Value)
            .SetFragmentName(node)
            .SpecifiedBy("sec-Fragment-Spread-Type-Existence")
            .Build());
 }
示例#22
0
        public void TypeReference_Create()
        {
            // arrange
            var namedType = new NamedTypeNode("Foo");

            // act
            SyntaxTypeReference typeReference = TypeReference.Create(
                namedType,
                TypeContext.Input,
                scope: "foo");

            // assert
            Assert.Equal(namedType, typeReference.Type);
            Assert.Equal(TypeContext.Input, typeReference.Context);
            Assert.Equal("foo", typeReference.Scope);
        }
示例#23
0
        private bool TryGetType <T>(
            ISyntaxTypeReference reference,
            out T type)
            where T : IType
        {
            NamedTypeNode namedType = reference.Type.NamedType();

            if (_typeInitializer.TryGetType(namedType.Name.Value, out IType t) &&
                WrapType(t, reference.Type) is T casted)
            {
                type = casted;
                return(true);
            }

            type = default;
            return(false);
        }
示例#24
0
 protected sealed override ISyntaxVisitorAction Enter(
     ISyntaxNode node,
     ISyntaxVisitorContext context)
 {
     return(node switch
     {
         DocumentNode n => Enter(n, context),
         OperationDefinitionNode n => Enter(n, context),
         VariableDefinitionNode n => Enter(n, context),
         VariableNode n => Enter(n, context),
         SelectionSetNode n => Enter(n, context),
         FieldNode n => Enter(n, context),
         ArgumentNode n => Enter(n, context),
         FragmentSpreadNode n => Enter(n, context),
         InlineFragmentNode n => Enter(n, context),
         FragmentDefinitionNode n => Enter(n, context),
         DirectiveNode n => Enter(n, context),
         NamedTypeNode n => Enter(n, context),
         ListTypeNode n => Enter(n, context),
         NonNullTypeNode n => Enter(n, context),
         ListValueNode n => Enter(n, context),
         ObjectValueNode n => Enter(n, context),
         ObjectFieldNode n => Enter(n, context),
         IValueNode n => Enter(n, context),
         SchemaDefinitionNode n => Enter(n, context),
         OperationTypeDefinitionNode n => Enter(n, context),
         ScalarTypeDefinitionNode n => Enter(n, context),
         ObjectTypeDefinitionNode n => Enter(n, context),
         FieldDefinitionNode n => Enter(n, context),
         InputValueDefinitionNode n => Enter(n, context),
         InterfaceTypeDefinitionNode n => Enter(n, context),
         UnionTypeDefinitionNode n => Enter(n, context),
         EnumTypeDefinitionNode n => Enter(n, context),
         EnumValueDefinitionNode n => Enter(n, context),
         InputObjectTypeDefinitionNode n => Enter(n, context),
         DirectiveDefinitionNode n => Enter(n, context),
         SchemaExtensionNode n => Enter(n, context),
         ScalarTypeExtensionNode n => Enter(n, context),
         ObjectTypeExtensionNode n => Enter(n, context),
         InterfaceTypeExtensionNode n => Enter(n, context),
         UnionTypeExtensionNode n => Enter(n, context),
         EnumTypeExtensionNode n => Enter(n, context),
         InputObjectTypeExtensionNode n => Enter(n, context),
         _ => throw new NotSupportedException()
     });
        private IOutputType GetReturnType(
            MatchSelectionsContext context,
            FieldNode node,
            IOutputType type)
        {
            if (GetDirective(node, "_return") is DirectiveNode directive &&
                directive.Arguments.Count == 1 &&
                directive.Arguments[0] is { Name: { Value : "type" } } argument&&
                argument.Value is StringValueNode value)
            {
                ITypeNode     typeSyntax      = Utf8GraphQLParser.Syntax.ParseTypeReference(value.Value);
                NamedTypeNode namedTypeSyntax = typeSyntax.NamedType();
                var           named           = context.Schema.GetType <INamedOutputType>(namedTypeSyntax.Name.Value);
                return((IOutputType)typeSyntax.ToType(named));
            }

            return(type);
        }
        public void TypeReference_Create()
        {
            // arrange
            var namedType = new NamedTypeNode("Foo");

            // act
            SyntaxTypeReference typeReference = TypeReference.Create(
                namedType,
                TypeContext.Input,
                scope: "foo",
                nullable: new bool[] { false });

            // assert
            Assert.Equal(namedType, typeReference.Type);
            Assert.Equal(TypeContext.Input, typeReference.Context);
            Assert.Equal("foo", typeReference.Scope);
            Assert.Collection(typeReference.Nullable, Assert.False);
        }
示例#27
0
 public void TypeNode_NamedTypeNodeEquals_Test()
 {
     Assert.IsTrue(NamedTypeNode.BoolType().Equals(NamedTypeNode.BoolType()));
     Assert.IsTrue(NamedTypeNode.ByteType().Equals(NamedTypeNode.ByteType()));
     Assert.IsTrue(NamedTypeNode.CharType().Equals(NamedTypeNode.CharType()));
     Assert.IsTrue(NamedTypeNode.IntType().Equals(NamedTypeNode.IntType()));
     Assert.IsTrue(NamedTypeNode.VoidType().Equals(NamedTypeNode.VoidType()));
     Assert.IsFalse(NamedTypeNode.ByteType().Equals(NamedTypeNode.VoidType()));
     Assert.IsFalse(NamedTypeNode.BoolType().Equals(NamedTypeNode.VoidType()));
     Assert.IsFalse(NamedTypeNode.IntType().Equals(NamedTypeNode.VoidType()));
     Assert.IsFalse(NamedTypeNode.CharType().Equals(NamedTypeNode.VoidType()));
     Assert.IsFalse(NamedTypeNode.BoolType().Equals(NamedTypeNode.IntType()));
     Assert.IsFalse(NamedTypeNode.ByteType().Equals(NamedTypeNode.IntType()));
     Assert.IsFalse(NamedTypeNode.CharType().Equals(NamedTypeNode.IntType()));
     Assert.IsFalse(NamedTypeNode.BoolType().Equals(NamedTypeNode.CharType()));
     Assert.IsFalse(NamedTypeNode.ByteType().Equals(NamedTypeNode.CharType()));
     Assert.IsFalse(NamedTypeNode.BoolType().Equals(NamedTypeNode.ByteType()));
     Assert.IsFalse(NamedTypeNode.ByteType().Equals(NamedTypeNode.BoolType()));
 }
示例#28
0
 private IDictionary <string, object?> CreateTypeDto(
     ITypeNode type,
     IDictionary <string, TypeKind> typeKinds)
 {
     return(type switch
     {
         NonNullTypeNode nnt => new Dictionary <string, object?>
         {
             { "kind", TypeKind.NonNull }, { "ofType", CreateTypeDto(nnt.Type, typeKinds) },
         },
         ListTypeNode lt => new Dictionary <string, object?>
         {
             { "kind", TypeKind.List }, { "ofType", CreateTypeDto(lt.Type, typeKinds) },
         },
         NamedTypeNode nt => new Dictionary <string, object?>
         {
             { "kind", typeKinds[nt.Name.Value] }, { "name", nt.Name.Value },
         },
         _ => throw new InvalidOperationException("Invalid Type Structure.")
     });
示例#29
0
        private ObjectType ResolveOperation(
            TypeInitializer initializer,
            OperationType operation)
        {
            if (!_operations.ContainsKey(operation))
            {
                NameString typeName = operation.ToString();
                return(initializer.Types.Values
                       .Select(t => t.Type)
                       .OfType <ObjectType>()
                       .FirstOrDefault(t => t.Name.Equals(typeName)));
            }
            else if (_operations.TryGetValue(operation,
                                             out ITypeReference reference))
            {
                if (reference is ISchemaTypeReference sr)
                {
                    return((ObjectType)sr.Type);
                }

                if (reference is IClrTypeReference cr &&
                    initializer.TryGetRegisteredType(cr,
                                                     out RegisteredType registeredType))
                {
                    return((ObjectType)registeredType.Type);
                }

                if (reference is ISyntaxTypeReference str)
                {
                    NamedTypeNode namedType = str.Type.NamedType();
                    return(initializer.Types.Values
                           .Select(t => t.Type)
                           .OfType <ObjectType>()
                           .FirstOrDefault(t => t.Name.Equals(
                                               namedType.Name.Value)));
                }
            }

            return(null);
        }
示例#30
0
            private static ObjectType?ResolveOperation(
                OperationType operation,
                Dictionary <OperationType, ITypeReference> operations,
                TypeRegistry typeRegistry)
            {
                if (!operations.ContainsKey(operation))
                {
                    NameString typeName = operation.ToString();
                    return(typeRegistry.Types
                           .Select(t => t.Type)
                           .OfType <ObjectType>()
                           .FirstOrDefault(t => t.Name.Equals(typeName)));
                }
                else if (operations.TryGetValue(operation, out ITypeReference? reference))
                {
                    if (reference is SchemaTypeReference sr)
                    {
                        return((ObjectType)sr.Type);
                    }

                    if (reference is ExtendedTypeReference cr &&
                        typeRegistry.TryGetType(cr, out RegisteredType? registeredType))
                    {
                        return((ObjectType)registeredType.Type);
                    }

                    if (reference is SyntaxTypeReference str)
                    {
                        NamedTypeNode namedType = str.Type.NamedType();
                        return(typeRegistry.Types
                               .Select(t => t.Type)
                               .OfType <ObjectType>()
                               .FirstOrDefault(t => t.Name.Equals(
                                                   namedType.Name.Value)));
                    }
                }

                return(null);
            }