public override SemanticCheckResult VisitClass(ASTClassNode Class) { foreach (var item in Class.Methods) { Class.SemanticCheckResult.Ensure(item.Accept(this)); } return(Class.SemanticCheckResult); }
public virtual T VisitClass(ASTClassNode Class) { foreach (var item in Class.Methods) { item.Accept(this); } foreach (var item in Class.Atributes) { item.Accept(this); } return(default(T)); }
public override SemanticCheckResult VisitClass(ASTClassNode Class) { foreach (var item in Class.Methods) { Class.SemanticCheckResult.Ensure(item.Accept(this)); } foreach (var item in Class.Atributes) { Class.SemanticCheckResult.Ensure(item.Accept(this)); } CompilationUnit.TypeEnvironment.GetTypeDefinition(Class.TypeName, Class.SymbolTable, out var ret); Class.SemanticCheckResult.EnsureReturnType(ret); ret.SetAttributes(); return(Class.SemanticCheckResult); }
public ASTCILNode VisitClass(ASTClassNode Class) { compilationUnit.TypeEnvironment.GetTypeDefinition(Class.TypeName, Class.SymbolTable, out var type); var attributesInit = new List <ASTCILExpressionNode>(); if (type.Parent != null) { attributesInit.Add(new ASTCILFuncStaticCallNode(Functions.Init, type.Parent, new [] { new ASTCILSelfNode() })); } attributesInit.AddRange(Class.Atributes.Select(x => (ASTCILExpressionNode)x.Accept(this))); attributesInit.Add(new ASTCILSelfNode()); compilationUnit.MethodEnvironment.GetMethodIfDef(type, Functions.Init, out var methodInit); var methods = Class.Methods.Where(x => x.Name != Functions.Init).Select(x => (ASTCILFuncNode)x.Accept(this)) .Append(new ASTCILFuncNode(labelIlGenerator.GenerateInit(Class.TypeName), methodInit, attributesInit)); var virtualTable = compilationUnit.MethodEnvironment.GetVirtualTable(type); return(new ASTCILTypeNode(type, virtualTable, methods)); }
public override SemanticCheckResult VisitClass(ASTClassNode Class) { var exist = CompilationUnit.TypeEnvironment.GetTypeDefinition(Class.ParentTypeName, Class.SymbolTable, out var _); Class.SemanticCheckResult.Ensure(exist, new Lazy <Error>(() => new Error($"Missing declaration for type {Class.ParentTypeName}.", ErrorKind.TypeError, Class.ParentType.Line, Class.ParentType.Column))); Class.SemanticCheckResult.Ensure(!Types.IsStringBoolOrInt(Class.TypeName), new Lazy <Error>(() => new Error($"Not allowed to inerit from String Int or Bool.", ErrorKind.SemanticError, Class.ParentType.Line, Class.ParentType.Column))); var noinheritSelftype = !Types.IsSelfType(Class.ParentTypeName); Class.SemanticCheckResult.Ensure(noinheritSelftype, new Lazy <Error>(() => new Error($"Not Allowed {Class.ParentTypeName}", ErrorKind.SemanticError, Class.ParentType.Line, Class.ParentType.Column))); if (!noinheritSelftype) { return(Class.SemanticCheckResult); } if (exist && !Types.IsStringBoolOrInt(Class.TypeName) && CompilationUnit.TypeEnvironment.GetTypeDefinition(Class.TypeName, Class.SymbolTable, out var _)) { CompilationUnit.TypeEnvironment.AddInheritance(Class.TypeName, Class.ParentTypeName); } return(Class.SemanticCheckResult); }