public void Visit(ClassContext parserRule) { type = globalContext.GetType(parserRule.type.Text); if (parserRule.inherits != null) { if (!globalContext.IfDefineType(parserRule.inherits.Text)) { errorLogger.LogError($"El tipo con nombre {parserRule.inherits.Text} no ha sido encontrado"); } if (globalContext.Int.Name == parserRule.inherits.Text) { errorLogger.LogError($"El tipo {parserRule.type.Text} no puede heredar de Int"); } if (globalContext.String.Name == parserRule.inherits.Text) { errorLogger.LogError($"El tipo {parserRule.type.Text} no puede heredar de String"); } if (globalContext.Bool.Name == parserRule.inherits.Text) { errorLogger.LogError($"El tipo {parserRule.type.Text} no puede heredar de Bool"); } var inherits = globalContext.GetType(parserRule.inherits.Text); type.Inherits = inherits; if (inherits.Conform(type)) { errorLogger.LogError("No se permite la herencia cíclica"); } } foreach (var item in parserRule._features) { Visit(item); } //Verifico si la clase Main tiene el metodo main y si este no tiene parametros if (parserRule.type.Text == "Main") { if (type.IsDefineMethod("main")) { var main = type.GetMethod("main"); if (main.Formals.Length > 0) { errorLogger.LogError("El metodo main no tiene parametros"); } } else { errorLogger.LogError("El metodo main no esta definido en la clase Main"); } } }
//El unico chequeo que hay que ser es si el tipo heredado existe public void Visit(ClassContext parserRuleContext) { type = globalContext.GetType(parserRuleContext.type.Text); foreach (var item in parserRuleContext._features) { Visit(item); } }