Mercurial > hg > CbC > CbC_gcc
diff gcc/d/dmd/attrib.h @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/d/dmd/attrib.h Thu Feb 13 11:34:05 2020 +0900 @@ -0,0 +1,275 @@ + +/* Compiler implementation of the D programming language + * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved + * written by Walter Bright + * http://www.digitalmars.com + * Distributed under the Boost Software License, Version 1.0. + * http://www.boost.org/LICENSE_1_0.txt + * https://github.com/dlang/dmd/blob/master/src/dmd/attrib.h + */ + +#pragma once + +#include "dsymbol.h" + +class Expression; +class Statement; +class LabelDsymbol; +class Initializer; +class Module; +class Condition; +class StaticForeach; + +/**************************************************************/ + +class AttribDeclaration : public Dsymbol +{ +public: + Dsymbols *decl; // array of Dsymbol's + + AttribDeclaration(Dsymbols *decl); + virtual Dsymbols *include(Scope *sc, ScopeDsymbol *sds); + int apply(Dsymbol_apply_ft_t fp, void *param); + static Scope *createNewScope(Scope *sc, + StorageClass newstc, LINK linkage, CPPMANGLE cppmangle, Prot protection, + int explicitProtection, AlignDeclaration *aligndecl, PINLINE inlining); + virtual Scope *newScope(Scope *sc); + void addMember(Scope *sc, ScopeDsymbol *sds); + void setScope(Scope *sc); + void importAll(Scope *sc); + void semantic(Scope *sc); + void semantic2(Scope *sc); + void semantic3(Scope *sc); + void addComment(const utf8_t *comment); + const char *kind() const; + bool oneMember(Dsymbol **ps, Identifier *ident); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); + bool hasPointers(); + bool hasStaticCtorOrDtor(); + void checkCtorConstInit(); + void addLocalClass(ClassDeclarations *); + AttribDeclaration *isAttribDeclaration() { return this; } + + void accept(Visitor *v) { v->visit(this); } +}; + +class StorageClassDeclaration : public AttribDeclaration +{ +public: + StorageClass stc; + + StorageClassDeclaration(StorageClass stc, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + Scope *newScope(Scope *sc); + bool oneMember(Dsymbol **ps, Identifier *ident); + void addMember(Scope *sc, ScopeDsymbol *sds); + StorageClassDeclaration *isStorageClassDeclaration() { return this; } + + void accept(Visitor *v) { v->visit(this); } +}; + +class DeprecatedDeclaration : public StorageClassDeclaration +{ +public: + Expression *msg; + const char *msgstr; + + DeprecatedDeclaration(Expression *msg, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + Scope *newScope(Scope *sc); + void setScope(Scope *sc); + void semantic2(Scope *sc); + const char *getMessage(); + void accept(Visitor *v) { v->visit(this); } +}; + +class LinkDeclaration : public AttribDeclaration +{ +public: + LINK linkage; + + LinkDeclaration(LINK p, Dsymbols *decl); + static LinkDeclaration *create(LINK p, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + Scope *newScope(Scope *sc); + const char *toChars(); + void accept(Visitor *v) { v->visit(this); } +}; + +class CPPMangleDeclaration : public AttribDeclaration +{ +public: + CPPMANGLE cppmangle; + + CPPMangleDeclaration(CPPMANGLE p, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + Scope *newScope(Scope *sc); + const char *toChars(); + void accept(Visitor *v) { v->visit(this); } +}; + +class ProtDeclaration : public AttribDeclaration +{ +public: + Prot protection; + Identifiers* pkg_identifiers; + + ProtDeclaration(Loc loc, Prot p, Dsymbols *decl); + ProtDeclaration(Loc loc, Identifiers* pkg_identifiers, Dsymbols *decl); + + Dsymbol *syntaxCopy(Dsymbol *s); + Scope *newScope(Scope *sc); + void addMember(Scope *sc, ScopeDsymbol *sds); + const char *kind() const; + const char *toPrettyChars(bool unused); + void accept(Visitor *v) { v->visit(this); } +}; + +class AlignDeclaration : public AttribDeclaration +{ +public: + Expression *ealign; + structalign_t salign; + + AlignDeclaration(Loc loc, Expression *ealign, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + Scope *newScope(Scope *sc); + void semantic2(Scope *sc); + structalign_t getAlignment(Scope *sc); + void accept(Visitor *v) { v->visit(this); } +}; + +class AnonDeclaration : public AttribDeclaration +{ +public: + bool isunion; + int sem; // 1 if successful semantic() + unsigned anonoffset; // offset of anonymous struct + unsigned anonstructsize; // size of anonymous struct + unsigned anonalignsize; // size of anonymous struct for alignment purposes + + AnonDeclaration(Loc loc, bool isunion, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + void setScope(Scope *sc); + void semantic(Scope *sc); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); + const char *kind() const; + AnonDeclaration *isAnonDeclaration() { return this; } + void accept(Visitor *v) { v->visit(this); } +}; + +class PragmaDeclaration : public AttribDeclaration +{ +public: + Expressions *args; // array of Expression's + + PragmaDeclaration(Loc loc, Identifier *ident, Expressions *args, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + Scope *newScope(Scope *sc); + void semantic(Scope *sc); + const char *kind() const; + void accept(Visitor *v) { v->visit(this); } +}; + +class ConditionalDeclaration : public AttribDeclaration +{ +public: + Condition *condition; + Dsymbols *elsedecl; // array of Dsymbol's for else block + + ConditionalDeclaration(Condition *condition, Dsymbols *decl, Dsymbols *elsedecl); + Dsymbol *syntaxCopy(Dsymbol *s); + bool oneMember(Dsymbol **ps, Identifier *ident); + Dsymbols *include(Scope *sc, ScopeDsymbol *sds); + void addComment(const utf8_t *comment); + void setScope(Scope *sc); + void accept(Visitor *v) { v->visit(this); } +}; + +class StaticIfDeclaration : public ConditionalDeclaration +{ +public: + ScopeDsymbol *scopesym; + bool addisdone; + + StaticIfDeclaration(Condition *condition, Dsymbols *decl, Dsymbols *elsedecl); + Dsymbol *syntaxCopy(Dsymbol *s); + Dsymbols *include(Scope *sc, ScopeDsymbol *sds); + void addMember(Scope *sc, ScopeDsymbol *sds); + void setScope(Scope *sc); + void importAll(Scope *sc); + void semantic(Scope *sc); + const char *kind() const; + void accept(Visitor *v) { v->visit(this); } +}; + +class StaticForeachDeclaration : public ConditionalDeclaration +{ +public: + StaticForeach *sfe; + ScopeDsymbol *scopesym; + bool cached; + Dsymbols *cache; + + Dsymbol *syntaxCopy(Dsymbol *s); + bool oneMember(Dsymbol **ps, Identifier *ident); + Dsymbols *include(Scope *sc, ScopeDsymbol *sds); + void addMember(Scope *sc, ScopeDsymbol *sds); + void addComment(const utf8_t *comment); + void setScope(Scope *sc); + void importAll(Scope *sc); + void semantic(Scope *sc); + const char *kind() const; + void accept(Visitor *v) { v->visit(this); } +}; + +class ForwardingAttribDeclaration : AttribDeclaration +{ +public: + ForwardingScopeDsymbol *sym; + + Scope *newScope(Scope *sc); + void addMember(Scope *sc, ScopeDsymbol *sds); + ForwardingAttribDeclaration *isForwardingAttribDeclaration() { return this; } +}; + +// Mixin declarations + +class CompileDeclaration : public AttribDeclaration +{ +public: + Expression *exp; + + ScopeDsymbol *scopesym; + bool compiled; + + CompileDeclaration(Loc loc, Expression *exp); + Dsymbol *syntaxCopy(Dsymbol *s); + void addMember(Scope *sc, ScopeDsymbol *sds); + void setScope(Scope *sc); + void compileIt(Scope *sc); + void semantic(Scope *sc); + const char *kind() const; + void accept(Visitor *v) { v->visit(this); } +}; + +/** + * User defined attributes look like: + * @(args, ...) + */ +class UserAttributeDeclaration : public AttribDeclaration +{ +public: + Expressions *atts; + + UserAttributeDeclaration(Expressions *atts, Dsymbols *decl); + Dsymbol *syntaxCopy(Dsymbol *s); + Scope *newScope(Scope *sc); + void setScope(Scope *sc); + void semantic(Scope *sc); + void semantic2(Scope *sc); + static Expressions *concat(Expressions *udas1, Expressions *udas2); + Expressions *getAttributes(); + const char *kind() const; + void accept(Visitor *v) { v->visit(this); } +};