Ejemplo n.º 1
0
        public override bool VisitRecordDeclaration(RecordDeclarationAST recordDeclaration)
        {
            recordDeclaration.CurrentScope = _scope;

            //se asuma que no habra problemas
            recordDeclaration.ReturnType = TigerType.GetType <NoType>();
            //la clase base verifica el ID del type
            if (VisitTypeDeclaration(recordDeclaration))
            {
                var rt = new RecordType(recordDeclaration.TypeId);
                //se anade el record creado al scope para q puedan haber records recursivos en su def
                _scope.AddType(recordDeclaration.TypeId, rt);
                //se verifica cada una de las declaraciones de los campos del record
                int savedErrorPos = _errorListener.Count;
                foreach (var kvp in recordDeclaration.Fields)
                {
                    if (!rt.Contains(kvp.Key))
                    {
                        TigerType tt;
                        if (_scope.HasType(kvp.Value, out tt) == ScopeLocation.NotDeclared)
                        {
                            KeyValuePair <string, string> savedKvp = kvp;
                            _scope.TypeAdded += (sender, args) =>
                            {
                                if (args.TypeName == savedKvp.Value)
                                {
                                    rt.AddField(savedKvp.Key, args.NewType);
                                }
                            };
                            _scope.FinalizeScope += (sender, args) =>
                            {
                                if (sender.HasType(savedKvp.Value) ==
                                    ScopeLocation.NotDeclared)
                                {
                                    _errorListener.Insert(savedErrorPos,
                                                          new AnalysisError(
                                                              string.Format(
                                                                  AnalysisError.LoadMessage("TypeUndecl"),
                                                                  savedKvp.Value), recordDeclaration.Line, recordDeclaration.Columns));
                                    recordDeclaration.ReturnType = TigerType.GetType <ErrorType>();
                                }
                            };
                        }
                        else
                        {
                            rt.AddField(kvp.Key, tt);
                        }
                    }
                    else
                    {
                        _errorListener.Add(new AnalysisError(string.Format(AnalysisError.LoadMessage("RecDecl"), kvp.Key, recordDeclaration.TypeId),
                                                             recordDeclaration.Line, recordDeclaration.Columns));
                    }
                }
                //TODO aqui se ve el prob con los ret Types y los return true pq no se puede decir nada en este momento
                return(true);
            }
            return(false);
        }
Ejemplo n.º 2
0
        private void CollectInnerType(RecordNode node, PackageType packageType)
        {
            var record = new RecordType(packageType.Name, node.Name);

            foreach (var item in node.Vars)
            {
                var varInfo = GetVar(item);

                record.AddField(varInfo.Name, varInfo.Type);
            }

            bool ok = packageType.AddType(record);

            types.AddType(record);

            if (!ok)
            {
                Log(String.Format("Запись с именем {0} уже существует", node.Name), node);
            }
        }
        public IRecordType RunWithResult(SyneryParser.RecordTypeDeclarationContext context, RecordTypeDelcarationContainer declaration)
        {
            IRecordType recordType;
            IRecordType baseRecordType = null;

            string name = declaration.Name;
            string baseRecordFullName = declaration.BaseRecordFullName;

            if (String.IsNullOrEmpty(baseRecordFullName) == false)
            {
                baseRecordType = (from r in Memory.RecordTypes
                                  where r.Value.FullName == baseRecordFullName
                                  select r.Value).FirstOrDefault();

                if (baseRecordType == null)
                {
                    throw new SyneryInterpretationException(context, String.Format(
                                                                "Base record type with name='{0}' not found while initializing the declaration for '{1}'", baseRecordFullName, name));
                }
            }

            recordType = new RecordType(name, baseRecordType);

            if (context.parameterDeclartions() != null)
            {
                IEnumerable <IFunctionParameterDefinition> listOfParameterDefinitions = Controller
                                                                                        .Interpret <SyneryParser.ParameterDeclartionsContext, IEnumerable <IFunctionParameterDefinition> >(context.parameterDeclartions());

                foreach (var parameterDefinition in listOfParameterDefinitions)
                {
                    recordType.AddField(parameterDefinition.Name, parameterDefinition.Type, parameterDefinition.DefaultValue);
                }
            }

            return(recordType);
        }