private void CheckClassDef(LatteParser.ClassDefContext classDef) { var fieldMethod = new HashSet <string>(); classDef.fieldOrMethodDef().ToList().ForEach(fm => { switch (fm) { case LatteParser.ClassFieldDefContext field: field.fieldDef().ID().ToList().ForEach(f => { if (fieldMethod.Contains(f.GetText())) { _errorState.AddErrorMessage( new ErrorMessage(fm.start.Line, ErrorMessages.FieldOrMethodAlreadyDefined(f.GetText()))); } else { fieldMethod.Add(field.GetText()); } }); break; case LatteParser.ClassMethodDefContext method: var methodId = method.methodDef().ID().GetText(); if (fieldMethod.Contains(methodId)) { _errorState.AddErrorMessage( new ErrorMessage(fm.start.Line, ErrorMessages.FieldOrMethodAlreadyDefined(methodId))); } else { fieldMethod.Add(method.methodDef().ID().GetText()); } break; } }); }
public override void EnterClassDef(LatteParser.ClassDefContext context) { _environment.DetachVarEnv(); _environment.DetachFuncEnv(); _environment.CurrentClassName = context.ID()[0].GetText(); foreach (var fm in context.fieldOrMethodDef()) { switch (fm) { case LatteParser.ClassFieldDefContext fields: fields.fieldDef().ID().ToList().ForEach(field => _environment.NameToVarDef[field.GetText()] = new VarDef(fields.fieldDef().type(), field.GetText())); break; case LatteParser.ClassMethodDefContext method: _environment.NameToFunctionDef[method.methodDef().ID().GetText()] = new FunctionDef(method.methodDef()); break; } } }
public override void EnterProgram(LatteParser.ProgramContext context) { _environment.AddPredefinedFunctions(); context.topDef().ToList().ForEach(topDef => { var id = topDef switch { LatteParser.FunctionDefContext fDef => fDef.ID().GetText(), LatteParser.ClassDefContext cDef => cDef.ID()[0].GetText() }; if (_environment.NameToFunctionDef.ContainsKey(id) || _environment.NameToClassDef.ContainsKey(id)) { _errorState.AddErrorMessage(new ErrorMessage( topDef.start.Line, ErrorMessages.FuncOrClassAlreadyDefined(id))); } if (topDef is LatteParser.ClassDefContext classDef) { CheckClassDef(classDef); } FrontendEnvironment.Instance.AddTopDef(topDef); }); _environment.NameToClassDef.Values.ToList().ForEach(classDef => { if (classDef.ParentId != null && !_environment.NameToClassDef.ContainsKey(classDef.ParentId)) { _errorState.AddErrorMessage( new ErrorMessage(ErrorMessages.ParentNorDefinedException(classDef.Id, classDef.ParentId))); } }); }
public override void ExitClassDef(LatteParser.ClassDefContext context) { _environment.RestorePreviousVarEnv(); _environment.RestorePreviousFuncEnv(); _environment.CurrentClassName = null; }