Beispiel #1
0
        public void RecordType_DifferentFieldNames()
        {
            var fields1 = new Fields { { "name", StringType.Create() }, { "lastname", StringType.Create() } };
            var fields2 = new Fields { { "name_", StringType.Create() }, { "lastname", StringType.Create() } };

            var t1 = new RecordType("somerecord", fields1);
            var t2 = new RecordType("somerecord", fields2);

            Assert.That(t1 != t2);
        }
Beispiel #2
0
        public void ArrayType_DifferentReference()
        {
            var fields1 = new Fields { { "name", StringType.Create() }, { "lastname", StringType.Create() } };
            var fields2 = new Fields { { "name", StringType.Create() }, { "lastname", StringType.Create() } };

            var t1 = new RecordType("somerecord", fields1);
            var t2 = new RecordType("somerecord", fields2);

            var a1 = new ArrayType("somearray", t1);
            var a2 = new ArrayType("somearray", t2);

            Assert.That(a1 != a2);
        }
        public override void CheckSemantic(Scope scope, IList<Error> errors)
        {
            //Comprobar que no haya sido definido este tipo en este mismo scope
            //Comprobar que no haya dos campos con un mismo nombre
            //Comprobar que todos los tipos de los campos esten definidos

            int errorsCount = errors.Count;

            IDictionary<string, TigerType> fields = new Dictionary<string, TigerType>();

            foreach (var field in Fields) {
                bool errorInField = false;
                //Comprobando que el tipo de este campo este definido
                if (!scope.ExistsType(field.TypeId)) {
                    errors.Add(new UndefinedTypeError(Line, Column, field.TypeId));
                    errorInField = true;
                }
                //Comprobando que no exista ya un campo con este nombre
                if (fields.ContainsKey(field.Id))
                {
                    errors.Add(new DuplicateFieldError(Line, Column, field.Id));
                    errorInField = true;
                }
                if (!errorInField) {
                    fields.Add(field.Id, scope.GetType(field.TypeId));
                }
            }

            //Si ocurrio un error
            if (errorsCount != errors.Count) {
                return;
            }

            //Si no ocurrio ningun error, actualizamos la definicion de este tipo
            //Guardamos el record en este nodo para usarlo en la generacion de codigo
            RecordType = new RecordType(Name, new Fields(fields));
            scope.Add(RecordType, updateIfExists: true);
        }