private void EnterFunctionDef(FunctionDef context, int line, LatteParser.BlockContext block, LatteParser.ArgContext arg) { _environment.DetachVarEnv(); _environment.CurrentFunctionName = context.Id; if (!context.Type.Equals(new LatteParser.TVoidContext()) && !new ReturnsCheckVisitor().Visit(block)) { _errorState.AddErrorMessage(new ErrorMessage( line, ErrorMessages.FunctionBranchWithoutRet(_environment.CurrentFunctionName))); } if (arg == null) { return; } var args = arg.type().Zip(arg.ID(), (a, b) => (a, b)); foreach (var(type, id) in args) { var ident = id.GetText(); if (_environment.NameToVarDef.ContainsKey(ident)) { _errorState.AddErrorMessage(new ErrorMessage( line, ErrorMessages.VarAlreadyDefined(ident))); } _environment.NameToVarDef[ident] = new VarDef(type, ident); } }
public Block(LatteParser.BlockContext context) { context?.stmt().ToList().ForEach(stmt => Stmts.Add(Utils.StmtFromStmtContext(stmt))); }