Ejemplo n.º 1
0
 public override void CaseADeleteStm(ADeleteStm node)
 {
     InADeleteStm(node);
     if (node.GetExp() != null)
     {
         node.GetExp().Apply(this);
     }
     if (node.GetToken() != null)
     {
         node.GetToken().Apply(this);
     }
     OutADeleteStm(node);
 }
        public override void OutADeleteStm(ADeleteStm node)
        {
            //Child must be a pointer
            if (!(data.ExpTypes[node.GetExp()] is APointerType))
            {
                errors.Add(new ErrorCollection.Error(node.GetToken(), currentSourceFile, LocRM.GetString("ErrorText145")));
            }

            //Deconstructor must be visible
            else
            {
                APointerType pointer = (APointerType) data.ExpTypes[node.GetExp()];
                if (pointer.GetType() is ANamedType && data.StructTypeLinks.ContainsKey((ANamedType) pointer.GetType()))
                {
                    //Struct deconstructor
                    AStructDecl currentStr = Util.GetAncestor<AStructDecl>(node);
                    AStructDecl str = data.StructTypeLinks[(ANamedType) pointer.GetType()];
                    while (str != null)
                    {
                        ADeconstructorDecl deconstructor = data.StructDeconstructor[str];
                        if (deconstructor.GetVisibilityModifier() is APrivateVisibilityModifier &&
                            currentStr != str)
                        {
                            errors.Add(new ErrorCollection.Error(node.GetToken(),
                                                                 LocRM.GetString("ErrorText146"),
                                                                 false,
                                                                 new[]
                                                                     {
                                                                         new ErrorCollection.Error(
                                                                             deconstructor.GetName(), LocRM.GetString("ErrorText147"))
                                                                     }));
                        }
                        else if (deconstructor.GetVisibilityModifier() is AProtectedVisibilityModifier &&
                            !Util.Extends(str, currentStr, data))
                        {
                            errors.Add(new ErrorCollection.Error(node.GetToken(),
                                                                 LocRM.GetString("ErrorText148"),
                                                                 false,
                                                                 new[]
                                                                     {
                                                                         new ErrorCollection.Error(
                                                                             deconstructor.GetName(), LocRM.GetString("ErrorText147"))
                                                                     }));
                        }
                        if (str.GetBase() == null)
                            break;
                        str = data.StructTypeLinks[(ANamedType) str.GetBase()];
                    }
                }
                else
                {
                    //Enrichment deconstructor
                    AEnrichmentDecl currentEnrichment = Util.GetAncestor<AEnrichmentDecl>(node);
                    List<IList> visibleDecls = Util.GetVisibleDecls(node, true);
                    foreach (IList declList in visibleDecls)
                    {
                        foreach (PDecl decl in declList)
                        {
                            if (decl is AEnrichmentDecl)
                            {
                                AEnrichmentDecl enrichment = (AEnrichmentDecl)decl;
                                if (!Util.TypesEqual(pointer.GetType(), enrichment.GetType(), data))
                                    continue;
                                foreach (PDecl enrichmentDecl in enrichment.GetDecl())
                                {
                                    if (enrichmentDecl is ADeconstructorDecl)
                                    {
                                        ADeconstructorDecl deconstructor = (ADeconstructorDecl)enrichmentDecl;
                                        if (deconstructor.GetVisibilityModifier() is APrivateVisibilityModifier &&
                                            currentEnrichment != enrichment)
                                        {
                                            errors.Add(new ErrorCollection.Error(node.GetToken(),
                                                                                 LocRM.GetString("ErrorText146"),
                                                                                 false,
                                                                                 new[]
                                                                     {
                                                                         new ErrorCollection.Error(
                                                                             deconstructor.GetName(), LocRM.GetString("ErrorText147"))
                                                                     }));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            base.OutADeleteStm(node);
        }