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); }
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); }