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));
 }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }