summaryrefslogtreecommitdiff
path: root/gcc/d/dmd/hdrgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/d/dmd/hdrgen.c')
-rw-r--r--gcc/d/dmd/hdrgen.c3591
1 files changed, 0 insertions, 3591 deletions
diff --git a/gcc/d/dmd/hdrgen.c b/gcc/d/dmd/hdrgen.c
deleted file mode 100644
index 9397b1e8abd..00000000000
--- a/gcc/d/dmd/hdrgen.c
+++ /dev/null
@@ -1,3591 +0,0 @@
-
-/* Compiler implementation of the D programming language
- * Copyright (C) 1999-2021 by The D Language Foundation, All Rights Reserved
- * written by Dave Fladebo
- * http://www.digitalmars.com
- * Distributed under the Boost Software License, Version 1.0.
- * http://www.boost.org/LICENSE_1_0.txt
- * https://github.com/D-Programming-Language/dmd/blob/master/src/hdrgen.c
- */
-
-// Routines to emit header files
-
-#include "root/dsystem.h"
-#include "root/rmem.h"
-
-#include "mars.h"
-#include "id.h"
-#include "init.h"
-
-#include "attrib.h"
-#include "cond.h"
-#include "doc.h"
-#include "enum.h"
-#include "import.h"
-#include "module.h"
-#include "mtype.h"
-#include "parse.h"
-#include "scope.h"
-#include "staticassert.h"
-#include "target.h"
-#include "template.h"
-#include "utf.h"
-#include "version.h"
-
-#include "declaration.h"
-#include "aggregate.h"
-#include "expression.h"
-#include "ctfe.h"
-#include "statement.h"
-#include "aliasthis.h"
-#include "nspace.h"
-#include "hdrgen.h"
-
-void linkageToBuffer(OutBuffer *buf, LINK linkage);
-void MODtoBuffer(OutBuffer *buf, MOD mod);
-
-void genhdrfile(Module *m)
-{
- OutBuffer buf;
- buf.doindent = 1;
-
- buf.printf("// D import file generated from '%s'", m->srcfile->toChars());
- buf.writenl();
-
- HdrGenState hgs;
- hgs.hdrgen = true;
-
- toCBuffer(m, &buf, &hgs);
-
- // Transfer image to file
- m->hdrfile->setbuffer(buf.slice().ptr, buf.length());
- buf.extractData();
-
- ensurePathToNameExists(Loc(), m->hdrfile->toChars());
- writeFile(m->loc, m->hdrfile);
-}
-
-/**
- * Dumps the full contents of module `m` to `buf`.
- * Params:
- * buf = buffer to write to.
- * m = module to visit all members of.
- */
-void moduleToBuffer(OutBuffer *buf, Module *m)
-{
- HdrGenState hgs;
- hgs.fullDump = true;
- toCBuffer(m, buf, &hgs);
-}
-
-class PrettyPrintVisitor : public Visitor
-{
-public:
- OutBuffer *buf;
- HdrGenState *hgs;
- bool declstring; // set while declaring alias for string,wstring or dstring
- EnumDeclaration *inEnumDecl;
-
- PrettyPrintVisitor(OutBuffer *buf, HdrGenState *hgs)
- : buf(buf), hgs(hgs), declstring(false), inEnumDecl(NULL)
- {
- }
-
- void visit(Statement *)
- {
- buf->printf("Statement::toCBuffer()");
- buf->writenl();
- assert(0);
- }
-
- void visit(ErrorStatement *)
- {
- buf->printf("__error__");
- buf->writenl();
- }
-
- void visit(ExpStatement *s)
- {
- if (s->exp && s->exp->op == TOKdeclaration)
- {
- // bypass visit(DeclarationExp)
- ((DeclarationExp *)s->exp)->declaration->accept(this);
- return;
- }
- if (s->exp)
- s->exp->accept(this);
- buf->writeByte(';');
- if (!hgs->forStmtInit)
- buf->writenl();
- }
-
- void visit(CompileStatement *s)
- {
- buf->writestring("mixin(");
- argsToBuffer(s->exps);
- buf->writestring(");");
- if (!hgs->forStmtInit)
- buf->writenl();
- }
-
- void visit(CompoundStatement *s)
- {
- for (size_t i = 0; i < s->statements->length; i++)
- {
- Statement *sx = (*s->statements)[i];
- if (sx)
- sx->accept(this);
- }
- }
-
- void visit(CompoundDeclarationStatement *s)
- {
- bool anywritten = false;
- for (size_t i = 0; i < s->statements->length; i++)
- {
- Statement *sx = (*s->statements)[i];
- ExpStatement *ds = sx ? sx->isExpStatement() : NULL;
- if (ds && ds->exp->op == TOKdeclaration)
- {
- Dsymbol *d = ((DeclarationExp *)ds->exp)->declaration;
- assert(d->isDeclaration());
- if (VarDeclaration *v = d->isVarDeclaration())
- visitVarDecl(v, anywritten);
- else
- d->accept(this);
- anywritten = true;
- }
- }
- buf->writeByte(';');
- if (!hgs->forStmtInit)
- buf->writenl();
- }
-
- void visit(UnrolledLoopStatement *s)
- {
- buf->writestring("unrolled {");
- buf->writenl();
- buf->level++;
-
- for (size_t i = 0; i < s->statements->length; i++)
- {
- Statement *sx = (*s->statements)[i];
- if (sx)
- sx->accept(this);
- }
-
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- void visit(ScopeStatement *s)
- {
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
-
- if (s->statement)
- s->statement->accept(this);
-
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- void visit(WhileStatement *s)
- {
- buf->writestring("while (");
- s->condition->accept(this);
- buf->writeByte(')');
- buf->writenl();
- if (s->_body)
- s->_body->accept(this);
- }
-
- void visit(DoStatement *s)
- {
- buf->writestring("do");
- buf->writenl();
- if (s->_body)
- s->_body->accept(this);
- buf->writestring("while (");
- s->condition->accept(this);
- buf->writestring(");");
- buf->writenl();
- }
-
- void visit(ForStatement *s)
- {
- buf->writestring("for (");
- if (s->_init)
- {
- hgs->forStmtInit++;
- s->_init->accept(this);
- hgs->forStmtInit--;
- }
- else
- buf->writeByte(';');
- if (s->condition)
- {
- buf->writeByte(' ');
- s->condition->accept(this);
- }
- buf->writeByte(';');
- if (s->increment)
- {
- buf->writeByte(' ');
- s->increment->accept(this);
- }
- buf->writeByte(')');
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- if (s->_body)
- s->_body->accept(this);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- void foreachWithoutBody(ForeachStatement *s)
- {
- buf->writestring(Token::toChars(s->op));
- buf->writestring(" (");
- for (size_t i = 0; i < s->parameters->length; i++)
- {
- Parameter *p = (*s->parameters)[i];
- if (i)
- buf->writestring(", ");
- if (stcToBuffer(buf, p->storageClass))
- buf->writeByte(' ');
- if (p->type)
- typeToBuffer(p->type, p->ident);
- else
- buf->writestring(p->ident->toChars());
- }
- buf->writestring("; ");
- s->aggr->accept(this);
- buf->writeByte(')');
- buf->writenl();
- }
-
- void visit(ForeachStatement *s)
- {
- foreachWithoutBody(s);
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- if (s->_body)
- s->_body->accept(this);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- void foreachRangeWithoutBody(ForeachRangeStatement *s)
- {
- buf->writestring(Token::toChars(s->op));
- buf->writestring(" (");
-
- if (s->prm->type)
- typeToBuffer(s->prm->type, s->prm->ident);
- else
- buf->writestring(s->prm->ident->toChars());
-
- buf->writestring("; ");
- s->lwr->accept(this);
- buf->writestring(" .. ");
- s->upr->accept(this);
- buf->writeByte(')');
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- }
-
- void visit(ForeachRangeStatement *s)
- {
- foreachRangeWithoutBody(s);
- buf->level++;
- if (s->_body)
- s->_body->accept(this);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- void visit(StaticForeachStatement *s)
- {
- buf->writestring("static ");
- if (s->sfe->aggrfe)
- {
- visit(s->sfe->aggrfe);
- }
- else
- {
- assert(s->sfe->rangefe);
- visit(s->sfe->rangefe);
- }
- }
-
- void visit(IfStatement *s)
- {
- buf->writestring("if (");
- if (Parameter *p = s->prm)
- {
- StorageClass stc = p->storageClass;
- if (!p->type && !stc)
- stc = STCauto;
- if (stcToBuffer(buf, stc))
- buf->writeByte(' ');
- if (p->type)
- typeToBuffer(p->type, p->ident);
- else
- buf->writestring(p->ident->toChars());
- buf->writestring(" = ");
- }
- s->condition->accept(this);
- buf->writeByte(')');
- buf->writenl();
- if (s->ifbody->isScopeStatement())
- {
- s->ifbody->accept(this);
- }
- else
- {
- buf->level++;
- s->ifbody->accept(this);
- buf->level--;
- }
- if (s->elsebody)
- {
- buf->writestring("else");
- if (!s->elsebody->isIfStatement())
- {
- buf->writenl();
- }
- else
- {
- buf->writeByte(' ');
- }
- if (s->elsebody->isScopeStatement() || s->elsebody->isIfStatement())
- {
- s->elsebody->accept(this);
- }
- else
- {
- buf->level++;
- s->elsebody->accept(this);
- buf->level--;
- }
- }
- }
-
- void visit(ConditionalStatement *s)
- {
- s->condition->accept(this);
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- if (s->ifbody)
- s->ifbody->accept(this);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- if (s->elsebody)
- {
- buf->writestring("else");
- buf->writenl();
- buf->writeByte('{');
- buf->level++;
- buf->writenl();
- s->elsebody->accept(this);
- buf->level--;
- buf->writeByte('}');
- }
- buf->writenl();
- }
-
- void visit(PragmaStatement *s)
- {
- buf->writestring("pragma (");
- buf->writestring(s->ident->toChars());
- if (s->args && s->args->length)
- {
- buf->writestring(", ");
- argsToBuffer(s->args);
- }
- buf->writeByte(')');
- if (s->_body)
- {
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
-
- s->_body->accept(this);
-
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
- else
- {
- buf->writeByte(';');
- buf->writenl();
- }
- }
-
- void visit(StaticAssertStatement *s)
- {
- s->sa->accept(this);
- }
-
- void visit(SwitchStatement *s)
- {
- buf->writestring(s->isFinal ? "final switch (" : "switch (");
- s->condition->accept(this);
- buf->writeByte(')');
- buf->writenl();
- if (s->_body)
- {
- if (!s->_body->isScopeStatement())
- {
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- s->_body->accept(this);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
- else
- {
- s->_body->accept(this);
- }
- }
- }
-
- void visit(CaseStatement *s)
- {
- buf->writestring("case ");
- s->exp->accept(this);
- buf->writeByte(':');
- buf->writenl();
- s->statement->accept(this);
- }
-
- void visit(CaseRangeStatement *s)
- {
- buf->writestring("case ");
- s->first->accept(this);
- buf->writestring(": .. case ");
- s->last->accept(this);
- buf->writeByte(':');
- buf->writenl();
- s->statement->accept(this);
- }
-
- void visit(DefaultStatement *s)
- {
- buf->writestring("default:");
- buf->writenl();
- s->statement->accept(this);
- }
-
- void visit(GotoDefaultStatement *)
- {
- buf->writestring("goto default;");
- buf->writenl();
- }
-
- void visit(GotoCaseStatement *s)
- {
- buf->writestring("goto case");
- if (s->exp)
- {
- buf->writeByte(' ');
- s->exp->accept(this);
- }
- buf->writeByte(';');
- buf->writenl();
- }
-
- void visit(SwitchErrorStatement *)
- {
- buf->writestring("SwitchErrorStatement::toCBuffer()");
- buf->writenl();
- }
-
- void visit(ReturnStatement *s)
- {
- buf->printf("return ");
- if (s->exp)
- s->exp->accept(this);
- buf->writeByte(';');
- buf->writenl();
- }
-
- void visit(BreakStatement *s)
- {
- buf->writestring("break");
- if (s->ident)
- {
- buf->writeByte(' ');
- buf->writestring(s->ident->toChars());
- }
- buf->writeByte(';');
- buf->writenl();
- }
-
- void visit(ContinueStatement *s)
- {
- buf->writestring("continue");
- if (s->ident)
- {
- buf->writeByte(' ');
- buf->writestring(s->ident->toChars());
- }
- buf->writeByte(';');
- buf->writenl();
- }
-
- void visit(SynchronizedStatement *s)
- {
- buf->writestring("synchronized");
- if (s->exp)
- {
- buf->writeByte('(');
- s->exp->accept(this);
- buf->writeByte(')');
- }
- if (s->_body)
- {
- buf->writeByte(' ');
- s->_body->accept(this);
- }
- }
-
- void visit(WithStatement *s)
- {
- buf->writestring("with (");
- s->exp->accept(this);
- buf->writestring(")");
- buf->writenl();
- if (s->_body)
- s->_body->accept(this);
- }
-
- void visit(TryCatchStatement *s)
- {
- buf->writestring("try");
- buf->writenl();
- if (s->_body)
- s->_body->accept(this);
- for (size_t i = 0; i < s->catches->length; i++)
- {
- Catch *c = (*s->catches)[i];
- visit(c);
- }
- }
-
- void visit(TryFinallyStatement *s)
- {
- buf->writestring("try");
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- s->_body->accept(this);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- buf->writestring("finally");
- buf->writenl();
- if (s->finalbody->isScopeStatement())
- {
- s->finalbody->accept(this);
- }
- else
- {
- buf->level++;
- s->finalbody->accept(this);
- buf->level--;
- }
- buf->writeByte('}');
- buf->writenl();
- }
-
- void visit(ScopeGuardStatement *s)
- {
- buf->writestring(Token::toChars(s->tok));
- buf->writeByte(' ');
- s->statement->accept(this);
- }
-
- void visit(ThrowStatement *s)
- {
- buf->printf("throw ");
- s->exp->accept(this);
- buf->writeByte(';');
- buf->writenl();
- }
-
- void visit(DebugStatement *s)
- {
- if (s->statement)
- {
- s->statement->accept(this);
- }
- }
-
- void visit(GotoStatement *s)
- {
- buf->writestring("goto ");
- buf->writestring(s->ident->toChars());
- buf->writeByte(';');
- buf->writenl();
- }
-
- void visit(LabelStatement *s)
- {
- buf->writestring(s->ident->toChars());
- buf->writeByte(':');
- buf->writenl();
- if (s->statement)
- s->statement->accept(this);
- }
-
- void visit(AsmStatement *s)
- {
- buf->writestring("asm { ");
- Token *t = s->tokens;
- buf->level++;
- while (t)
- {
- buf->writestring(t->toChars());
- if (t->next &&
- t->value != TOKmin &&
- t->value != TOKcomma && t->next->value != TOKcomma &&
- t->value != TOKlbracket && t->next->value != TOKlbracket &&
- t->next->value != TOKrbracket &&
- t->value != TOKlparen && t->next->value != TOKlparen &&
- t->next->value != TOKrparen &&
- t->value != TOKdot && t->next->value != TOKdot)
- {
- buf->writeByte(' ');
- }
- t = t->next;
- }
- buf->level--;
- buf->writestring("; }");
- buf->writenl();
- }
-
- void visit(ImportStatement *s)
- {
- for (size_t i = 0; i < s->imports->length; i++)
- {
- Dsymbol *imp = (*s->imports)[i];
- imp->accept(this);
- }
- }
-
- void visit(Catch *c)
- {
- buf->writestring("catch");
- if (c->type)
- {
- buf->writeByte('(');
- typeToBuffer(c->type, c->ident);
- buf->writeByte(')');
- }
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- if (c->handler)
- c->handler->accept(this);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- ////////////////////////////////////////////////////////////////////////////
-
- /**************************************************
- * An entry point to pretty-print type.
- */
- void typeToBuffer(Type *t, Identifier *ident)
- {
- if (t->ty == Tfunction)
- {
- visitFuncIdentWithPrefix((TypeFunction *)t, ident, NULL);
- return;
- }
-
- visitWithMask(t, 0);
-
- if (ident)
- {
- buf->writeByte(' ');
- buf->writestring(ident->toChars());
- }
- }
-
- void visitWithMask(Type *t, unsigned char modMask)
- {
- // Tuples and functions don't use the type constructor syntax
- if (modMask == t->mod ||
- t->ty == Tfunction ||
- t->ty == Ttuple)
- {
- t->accept(this);
- }
- else
- {
- unsigned char m = t->mod & ~(t->mod & modMask);
- if (m & MODshared)
- {
- MODtoBuffer(buf, MODshared);
- buf->writeByte('(');
- }
- if (m & MODwild)
- {
- MODtoBuffer(buf, MODwild);
- buf->writeByte('(');
- }
- if (m & (MODconst | MODimmutable))
- {
- MODtoBuffer(buf, m & (MODconst | MODimmutable));
- buf->writeByte('(');
- }
-
- t->accept(this);
-
- if (m & (MODconst | MODimmutable))
- buf->writeByte(')');
- if (m & MODwild)
- buf->writeByte(')');
- if (m & MODshared)
- buf->writeByte(')');
- }
- }
-
- void visit(Type *t)
- {
- printf("t = %p, ty = %d\n", t, t->ty);
- assert(0);
- }
-
- void visit(TypeError *)
- {
- buf->writestring("_error_");
- }
-
- void visit(TypeBasic *t)
- {
- //printf("TypeBasic::toCBuffer2(t->mod = %d)\n", t->mod);
- buf->writestring(t->dstring);
- }
-
- void visit(TypeTraits *t)
- {
- //printf("TypeBasic::toCBuffer2(t.mod = %d)\n", t.mod);
- t->exp->accept(this);
- }
-
- void visit(TypeVector *t)
- {
- //printf("TypeVector::toCBuffer2(t->mod = %d)\n", t->mod);
- buf->writestring("__vector(");
- visitWithMask(t->basetype, t->mod);
- buf->writestring(")");
- }
-
- void visit(TypeSArray *t)
- {
- visitWithMask(t->next, t->mod);
- buf->writeByte('[');
- sizeToBuffer(t->dim);
- buf->writeByte(']');
- }
-
- void visit(TypeDArray *t)
- {
- Type *ut = t->castMod(0);
- if (declstring)
- goto L1;
- if (ut->equals(Type::tstring))
- buf->writestring("string");
- else if (ut->equals(Type::twstring))
- buf->writestring("wstring");
- else if (ut->equals(Type::tdstring))
- buf->writestring("dstring");
- else
- {
- L1:
- visitWithMask(t->next, t->mod);
- buf->writestring("[]");
- }
- }
-
- void visit(TypeAArray *t)
- {
- visitWithMask(t->next, t->mod);
- buf->writeByte('[');
- visitWithMask(t->index, 0);
- buf->writeByte(']');
- }
-
- void visit(TypePointer *t)
- {
- //printf("TypePointer::toCBuffer2() next = %d\n", t->next->ty);
- if (t->next->ty == Tfunction)
- visitFuncIdentWithPostfix((TypeFunction *)t->next, "function");
- else
- {
- visitWithMask(t->next, t->mod);
- buf->writeByte('*');
- }
- }
-
- void visit(TypeReference *t)
- {
- visitWithMask(t->next, t->mod);
- buf->writeByte('&');
- }
-
- void visit(TypeFunction *t)
- {
- //printf("TypeFunction::toCBuffer2() t = %p, ref = %d\n", t, t->isref);
- visitFuncIdentWithPostfix(t, NULL);
- }
-
- // callback for TypeFunction::attributesApply
- struct PrePostAppendStrings
- {
- OutBuffer *buf;
- bool isPostfixStyle;
- bool isCtor;
-
- static int fp(void *param, const char *str)
- {
- PrePostAppendStrings *p = (PrePostAppendStrings *)param;
-
- // don't write 'ref' for ctors
- if (p->isCtor && strcmp(str, "ref") == 0)
- return 0;
-
- if ( p->isPostfixStyle) p->buf->writeByte(' ');
- p->buf->writestring(str);
- if (!p->isPostfixStyle) p->buf->writeByte(' ');
- return 0;
- }
- };
-
- void visitFuncIdentWithPostfix(TypeFunction *t, const char *ident)
- {
- if (t->inuse)
- {
- t->inuse = 2; // flag error to caller
- return;
- }
- t->inuse++;
-
- PrePostAppendStrings pas;
- pas.buf = buf;
- pas.isCtor = false;
- pas.isPostfixStyle = true;
-
- if (t->linkage > LINKd && hgs->ddoc != 1 && !hgs->hdrgen)
- {
- linkageToBuffer(buf, t->linkage);
- buf->writeByte(' ');
- }
-
- if (t->next)
- {
- typeToBuffer(t->next, NULL);
- if (ident)
- buf->writeByte(' ');
- }
- else if (hgs->ddoc)
- buf->writestring("auto ");
-
- if (ident)
- buf->writestring(ident);
-
- parametersToBuffer(t->parameterList.parameters, t->parameterList.varargs);
-
- /* Use postfix style for attributes
- */
- if (t->mod)
- {
- buf->writeByte(' ');
- MODtoBuffer(buf, t->mod);
- }
- t->attributesApply(&pas, &PrePostAppendStrings::fp);
-
- t->inuse--;
- }
- void visitFuncIdentWithPrefix(TypeFunction *t, Identifier *ident, TemplateDeclaration *td)
- {
- if (t->inuse)
- {
- t->inuse = 2; // flag error to caller
- return;
- }
- t->inuse++;
-
- PrePostAppendStrings pas;
- pas.buf = buf;
- pas.isCtor = (ident == Id::ctor);
- pas.isPostfixStyle = false;
-
- /* Use 'storage class' (prefix) style for attributes
- */
- if (t->mod)
- {
- MODtoBuffer(buf, t->mod);
- buf->writeByte(' ');
- }
- t->attributesApply(&pas, &PrePostAppendStrings::fp);
-
- if (t->linkage > LINKd && hgs->ddoc != 1 && !hgs->hdrgen)
- {
- linkageToBuffer(buf, t->linkage);
- buf->writeByte(' ');
- }
-
- if (ident && ident->toHChars2() != ident->toChars())
- {
- // Don't print return type for ctor, dtor, unittest, etc
- }
- else if (t->next)
- {
- typeToBuffer(t->next, NULL);
- if (ident)
- buf->writeByte(' ');
- }
- else if (hgs->ddoc)
- buf->writestring("auto ");
-
- if (ident)
- buf->writestring(ident->toHChars2());
-
- if (td)
- {
- buf->writeByte('(');
- for (size_t i = 0; i < td->origParameters->length; i++)
- {
- TemplateParameter *p = (*td->origParameters)[i];
- if (i)
- buf->writestring(", ");
- p->accept(this);
- }
- buf->writeByte(')');
- }
- parametersToBuffer(t->parameterList.parameters, t->parameterList.varargs);
-
- t->inuse--;
- }
-
- void visit(TypeDelegate *t)
- {
- visitFuncIdentWithPostfix((TypeFunction *)t->next, "delegate");
- }
-
- void visitTypeQualifiedHelper(TypeQualified *t)
- {
- for (size_t i = 0; i < t->idents.length; i++)
- {
- RootObject *id = t->idents[i];
-
- if (id->dyncast() == DYNCAST_DSYMBOL)
- {
- buf->writeByte('.');
- TemplateInstance *ti = (TemplateInstance *)id;
- ti->accept(this);
- }
- else if (id->dyncast() == DYNCAST_EXPRESSION)
- {
- buf->writeByte('[');
- ((Expression *)id)->accept(this);
- buf->writeByte(']');
- }
- else if (id->dyncast() == DYNCAST_TYPE)
- {
- buf->writeByte('[');
- ((Type *)id)->accept(this);
- buf->writeByte(']');
- }
- else
- {
- buf->writeByte('.');
- buf->writestring(id->toChars());
- }
- }
- }
-
- void visit(TypeIdentifier *t)
- {
- buf->writestring(t->ident->toChars());
- visitTypeQualifiedHelper(t);
- }
-
- void visit(TypeInstance *t)
- {
- t->tempinst->accept(this);
- visitTypeQualifiedHelper(t);
- }
-
- void visit(TypeTypeof *t)
- {
- buf->writestring("typeof(");
- t->exp->accept(this);
- buf->writeByte(')');
- visitTypeQualifiedHelper(t);
- }
-
- void visit(TypeReturn *t)
- {
- buf->writestring("typeof(return)");
- visitTypeQualifiedHelper(t);
- }
-
- void visit(TypeEnum *t)
- {
- buf->writestring(t->sym->toChars());
- }
-
- void visit(TypeStruct *t)
- {
- // Bugzilla 13776: Don't use ti->toAlias() to avoid forward reference error
- // while printing messages.
- TemplateInstance *ti = t->sym->parent ? t->sym->parent->isTemplateInstance() : NULL;
- if (ti && ti->aliasdecl == t->sym)
- buf->writestring(hgs->fullQual ? ti->toPrettyChars() : ti->toChars());
- else
- buf->writestring(hgs->fullQual ? t->sym->toPrettyChars() : t->sym->toChars());
- }
-
- void visit(TypeClass *t)
- {
- // Bugzilla 13776: Don't use ti->toAlias() to avoid forward reference error
- // while printing messages.
- TemplateInstance *ti = t->sym->parent->isTemplateInstance();
- if (ti && ti->aliasdecl == t->sym)
- buf->writestring(hgs->fullQual ? ti->toPrettyChars() : ti->toChars());
- else
- buf->writestring(hgs->fullQual ? t->sym->toPrettyChars() : t->sym->toChars());
- }
-
- void visit(TypeTuple *t)
- {
- parametersToBuffer(t->arguments, 0);
- }
-
- void visit(TypeSlice *t)
- {
- visitWithMask(t->next, t->mod);
-
- buf->writeByte('[');
- sizeToBuffer(t->lwr);
- buf->writestring(" .. ");
- sizeToBuffer(t->upr);
- buf->writeByte(']');
- }
-
- void visit(TypeNull *)
- {
- buf->writestring("typeof(null)");
- }
-
- void visit(TypeMixin *t)
- {
- buf->writestring("mixin(");
- argsToBuffer(t->exps);
- buf->writeByte(')');
- }
-
- void visit(TypeNoreturn *)
- {
- buf->writestring("noreturn");
- }
-
- ////////////////////////////////////////////////////////////////////////////
-
- void visit(Dsymbol *s)
- {
- buf->writestring(s->toChars());
- }
-
- void visit(StaticAssert *s)
- {
- buf->writestring(s->kind());
- buf->writeByte('(');
- s->exp->accept(this);
- if (s->msg)
- {
- buf->writestring(", ");
- s->msg->accept(this);
- }
- buf->writestring(");");
- buf->writenl();
- }
-
- void visit(DebugSymbol *s)
- {
- buf->writestring("debug = ");
- if (s->ident)
- buf->writestring(s->ident->toChars());
- else
- buf->printf("%u", s->level);
- buf->writestring(";");
- buf->writenl();
- }
-
- void visit(VersionSymbol *s)
- {
- buf->writestring("version = ");
- if (s->ident)
- buf->writestring(s->ident->toChars());
- else
- buf->printf("%u", s->level);
- buf->writestring(";");
- buf->writenl();
- }
-
- void visit(EnumMember *em)
- {
- if (em->type)
- typeToBuffer(em->type, em->ident);
- else
- buf->writestring(em->ident->toChars());
- if (em->value())
- {
- buf->writestring(" = ");
- em->value()->accept(this);
- }
- }
-
- void visit(Import *imp)
- {
- if (hgs->hdrgen && imp->id == Id::object)
- return; // object is imported by default
-
- if (imp->isstatic)
- buf->writestring("static ");
- buf->writestring("import ");
- if (imp->aliasId)
- {
- buf->printf("%s = ", imp->aliasId->toChars());
- }
- if (imp->packages && imp->packages->length)
- {
- for (size_t i = 0; i < imp->packages->length; i++)
- {
- Identifier *pid = (*imp->packages)[i];
- buf->printf("%s.", pid->toChars());
- }
- }
- buf->printf("%s", imp->id->toChars());
- if (imp->names.length)
- {
- buf->writestring(" : ");
- for (size_t i = 0; i < imp->names.length; i++)
- {
- if (i)
- buf->writestring(", ");
-
- Identifier *name = imp->names[i];
- Identifier *alias = imp->aliases[i];
- if (alias)
- buf->printf("%s = %s", alias->toChars(), name->toChars());
- else
- buf->printf("%s", name->toChars());
- }
- }
- buf->printf(";");
- buf->writenl();
- }
-
- void visit(AliasThis *d)
- {
- buf->writestring("alias ");
- buf->writestring(d->ident->toChars());
- buf->writestring(" this;\n");
- }
-
- void visit(AttribDeclaration *d)
- {
- if (!d->decl)
- {
- buf->writeByte(';');
- buf->writenl();
- return;
- }
-
- if (d->decl->length == 0)
- buf->writestring("{}");
- else if (hgs->hdrgen && d->decl->length == 1 && (*d->decl)[0]->isUnitTestDeclaration())
- {
- // hack for bugzilla 8081
- buf->writestring("{}");
- }
- else if (d->decl->length == 1)
- {
- ((*d->decl)[0])->accept(this);
- return;
- }
- else
- {
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- for (size_t i = 0; i < d->decl->length; i++)
- {
- Dsymbol *de = (*d->decl)[i];
- de->accept(this);
- }
- buf->level--;
- buf->writeByte('}');
- }
- buf->writenl();
- }
-
- void visit(StorageClassDeclaration *d)
- {
- if (stcToBuffer(buf, d->stc))
- buf->writeByte(' ');
- visit((AttribDeclaration *)d);
- }
-
- void visit(DeprecatedDeclaration *d)
- {
- buf->writestring("deprecated(");
- d->msg->accept(this);
- buf->writestring(") ");
- visit((AttribDeclaration *)d);
- }
-
- void visit(LinkDeclaration *d)
- {
- const char *p;
-
- switch (d->linkage)
- {
- case LINKd: p = "D"; break;
- case LINKc: p = "C"; break;
- case LINKcpp: p = "C++"; break;
- case LINKwindows: p = "Windows"; break;
- case LINKobjc: p = "Objective-C"; break;
- default:
- assert(0);
- break;
- }
- buf->writestring("extern (");
- buf->writestring(p);
- buf->writestring(") ");
- visit((AttribDeclaration *)d);
- }
-
- void visit(CPPMangleDeclaration *d)
- {
- const char *p;
-
- switch (d->cppmangle)
- {
- case CPPMANGLEclass: p = "class"; break;
- case CPPMANGLEstruct: p = "struct"; break;
- default:
- assert(0);
- break;
- }
- buf->writestring("extern (C++, ");
- buf->writestring(p);
- buf->writestring(") ");
- visit((AttribDeclaration *)d);
- }
-
- void visit(ProtDeclaration *d)
- {
- protectionToBuffer(buf, d->protection);
- buf->writeByte(' ');
- visit((AttribDeclaration *)d);
- }
-
- void visit(AlignDeclaration *d)
- {
- if (!d->ealign)
- buf->printf("align ");
- else
- buf->printf("align (%s)", d->ealign->toChars());
- visit((AttribDeclaration *)d);
- }
-
- void visit(AnonDeclaration *d)
- {
- buf->printf(d->isunion ? "union" : "struct");
- buf->writenl();
- buf->writestring("{");
- buf->writenl();
- buf->level++;
- if (d->decl)
- {
- for (size_t i = 0; i < d->decl->length; i++)
- {
- Dsymbol *de = (*d->decl)[i];
- de->accept(this);
- }
- }
- buf->level--;
- buf->writestring("}");
- buf->writenl();
- }
-
- void visit(PragmaDeclaration *d)
- {
- buf->printf("pragma (%s", d->ident->toChars());
- if (d->args && d->args->length)
- {
- buf->writestring(", ");
- argsToBuffer(d->args);
- }
- buf->writeByte(')');
- visit((AttribDeclaration *)d);
- }
-
- void visit(ConditionalDeclaration *d)
- {
- d->condition->accept(this);
- if (d->decl || d->elsedecl)
- {
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- if (d->decl)
- {
- for (size_t i = 0; i < d->decl->length; i++)
- {
- Dsymbol *de = (*d->decl)[i];
- de->accept(this);
- }
- }
- buf->level--;
- buf->writeByte('}');
- if (d->elsedecl)
- {
- buf->writenl();
- buf->writestring("else");
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- for (size_t i = 0; i < d->elsedecl->length; i++)
- {
- Dsymbol *de = (*d->elsedecl)[i];
- de->accept(this);
- }
- buf->level--;
- buf->writeByte('}');
- }
- }
- else
- buf->writeByte(':');
- buf->writenl();
- }
-
- void visit(ForwardingStatement *s)
- {
- s->statement->accept(this);
- }
-
- void visit(StaticForeachDeclaration *s)
- {
- buf->writestring("static ");
- if (s->sfe->aggrfe)
- {
- foreachWithoutBody(s->sfe->aggrfe);
- }
- else
- {
- assert(s->sfe->rangefe);
- foreachRangeWithoutBody(s->sfe->rangefe);
- }
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- visit((AttribDeclaration *)s);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- void visit(CompileDeclaration *d)
- {
- buf->writestring("mixin(");
- argsToBuffer(d->exps);
- buf->writestring(");");
- buf->writenl();
- }
-
- void visit(UserAttributeDeclaration *d)
- {
- buf->writestring("@(");
- argsToBuffer(d->atts);
- buf->writeByte(')');
- visit((AttribDeclaration *)d);
- }
-
- void visit(TemplateDeclaration *d)
- {
- if ((hgs->hdrgen || hgs->fullDump) && visitEponymousMember(d))
- return;
-
- if (hgs->ddoc)
- buf->writestring(d->kind());
- else
- buf->writestring("template");
- buf->writeByte(' ');
- buf->writestring(d->ident->toChars());
- buf->writeByte('(');
- visitTemplateParameters(hgs->ddoc ? d->origParameters : d->parameters);
- buf->writeByte(')');
- visitTemplateConstraint(d->constraint);
-
- if (hgs->hdrgen || hgs->fullDump)
- {
- hgs->tpltMember++;
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- for (size_t i = 0; i < d->members->length; i++)
- {
- Dsymbol *s = (*d->members)[i];
- s->accept(this);
- }
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- hgs->tpltMember--;
- }
- }
-
- bool visitEponymousMember(TemplateDeclaration *d)
- {
- if (!d->members || d->members->length != 1)
- return false;
-
- Dsymbol *onemember = (*d->members)[0];
- if (onemember->ident != d->ident)
- return false;
-
- if (FuncDeclaration *fd = onemember->isFuncDeclaration())
- {
- assert(fd->type);
- if (stcToBuffer(buf, fd->storage_class))
- buf->writeByte(' ');
- functionToBufferFull((TypeFunction *)fd->type, buf, d->ident, hgs, d);
- visitTemplateConstraint(d->constraint);
-
- hgs->tpltMember++;
- bodyToBuffer(fd);
- hgs->tpltMember--;
- return true;
- }
- if (AggregateDeclaration *ad = onemember->isAggregateDeclaration())
- {
- buf->writestring(ad->kind());
- buf->writeByte(' ');
- buf->writestring(ad->ident->toChars());
- buf->writeByte('(');
- visitTemplateParameters(hgs->ddoc ? d->origParameters : d->parameters);
- buf->writeByte(')');
- visitTemplateConstraint(d->constraint);
- visitBaseClasses(ad->isClassDeclaration());
-
- hgs->tpltMember++;
- if (ad->members)
- {
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- for (size_t i = 0; i < ad->members->length; i++)
- {
- Dsymbol *s = (*ad->members)[i];
- s->accept(this);
- }
- buf->level--;
- buf->writeByte('}');
- }
- else
- buf->writeByte(';');
- buf->writenl();
- hgs->tpltMember--;
- return true;
- }
- if (VarDeclaration *vd = onemember->isVarDeclaration())
- {
- if (d->constraint)
- return false;
-
- if (stcToBuffer(buf, vd->storage_class))
- buf->writeByte(' ');
- if (vd->type)
- typeToBuffer(vd->type, vd->ident);
- else
- buf->writestring(vd->ident->toChars());
-
- buf->writeByte('(');
- visitTemplateParameters(hgs->ddoc ? d->origParameters : d->parameters);
- buf->writeByte(')');
-
- if (vd->_init)
- {
- buf->writestring(" = ");
- ExpInitializer *ie = vd->_init->isExpInitializer();
- if (ie && (ie->exp->op == TOKconstruct || ie->exp->op == TOKblit))
- ((AssignExp *)ie->exp)->e2->accept(this);
- else
- vd->_init->accept(this);
- }
- buf->writeByte(';');
- buf->writenl();
- return true;
- }
-
- return false;
- }
- void visitTemplateParameters(TemplateParameters *parameters)
- {
- if (!parameters || !parameters->length)
- return;
- for (size_t i = 0; i < parameters->length; i++)
- {
- TemplateParameter *p = (*parameters)[i];
- if (i)
- buf->writestring(", ");
- p->accept(this);
- }
- }
- void visitTemplateConstraint(Expression *constraint)
- {
- if (!constraint)
- return;
- buf->writestring(" if (");
- constraint->accept(this);
- buf->writeByte(')');
- }
-
- void visit(TemplateInstance *ti)
- {
- buf->writestring(ti->name->toChars());
- tiargsToBuffer(ti);
-
- if (hgs->fullDump)
- {
- buf->writenl();
- if (ti->aliasdecl)
- {
- // the ti.aliasDecl is the instantiated body
- // if we have it, print it.
- ti->aliasdecl->accept(this);
- }
- }
- }
-
- void visit(TemplateMixin *tm)
- {
- buf->writestring("mixin ");
-
- typeToBuffer(tm->tqual, NULL);
- tiargsToBuffer(tm);
-
- if (tm->ident && memcmp(tm->ident->toChars(), "__mixin", 7) != 0)
- {
- buf->writeByte(' ');
- buf->writestring(tm->ident->toChars());
- }
- buf->writeByte(';');
- buf->writenl();
- }
-
- void tiargsToBuffer(TemplateInstance *ti)
- {
- buf->writeByte('!');
- if (ti->nest)
- {
- buf->writestring("(...)");
- return;
- }
- if (!ti->tiargs)
- {
- buf->writestring("()");
- return;
- }
-
- if (ti->tiargs->length == 1)
- {
- RootObject *oarg = (*ti->tiargs)[0];
- if (Type *t = isType(oarg))
- {
- if (t->equals(Type::tstring) ||
- t->equals(Type::twstring) ||
- t->equals(Type::tdstring) ||
- (t->mod == 0 &&
- (t->isTypeBasic() ||
- (t->ty == Tident && ((TypeIdentifier *)t)->idents.length == 0))))
- {
- buf->writestring(t->toChars());
- return;
- }
- }
- else if (Expression *e = isExpression(oarg))
- {
- if (e->op == TOKint64 ||
- e->op == TOKfloat64 ||
- e->op == TOKnull ||
- e->op == TOKstring ||
- e->op == TOKthis)
- {
- buf->writestring(e->toChars());
- return;
- }
- }
- }
- buf->writeByte('(');
- ti->nest++;
- for (size_t i = 0; i < ti->tiargs->length; i++)
- {
- RootObject *arg = (*ti->tiargs)[i];
- if (i)
- buf->writestring(", ");
- objectToBuffer(arg);
- }
- ti->nest--;
- buf->writeByte(')');
- }
-
- /****************************************
- * This makes a 'pretty' version of the template arguments.
- * It's analogous to genIdent() which makes a mangled version.
- */
- void objectToBuffer(RootObject *oarg)
- {
- //printf("objectToBuffer()\n");
-
- /* The logic of this should match what genIdent() does. The _dynamic_cast()
- * function relies on all the pretty strings to be unique for different classes
- * (see Bugzilla 7375).
- * Perhaps it would be better to demangle what genIdent() does.
- */
- if (Type *t = isType(oarg))
- {
- //printf("\tt: %s ty = %d\n", t->toChars(), t->ty);
- typeToBuffer(t, NULL);
- }
- else if (Expression *e = isExpression(oarg))
- {
- if (e->op == TOKvar)
- e = e->optimize(WANTvalue); // added to fix Bugzilla 7375
- e->accept(this);
- }
- else if (Dsymbol *s = isDsymbol(oarg))
- {
- const char *p = s->ident ? s->ident->toChars() : s->toChars();
- buf->writestring(p);
- }
- else if (Tuple *v = isTuple(oarg))
- {
- Objects *args = &v->objects;
- for (size_t i = 0; i < args->length; i++)
- {
- RootObject *arg = (*args)[i];
- if (i)
- buf->writestring(", ");
- objectToBuffer(arg);
- }
- }
- else if (Parameter *p = isParameter(oarg))
- {
- p->accept(this);
- }
- else if (!oarg)
- {
- buf->writestring("NULL");
- }
- else
- {
- assert(0);
- }
- }
-
- void visit(EnumDeclaration *d)
- {
- EnumDeclaration *oldInEnumDecl = inEnumDecl;
- inEnumDecl = d;
- buf->writestring("enum ");
- if (d->ident)
- {
- buf->writestring(d->ident->toChars());
- buf->writeByte(' ');
- }
- if (d->memtype)
- {
- buf->writestring(": ");
- typeToBuffer(d->memtype, NULL);
- }
- if (!d->members)
- {
- buf->writeByte(';');
- buf->writenl();
- inEnumDecl = oldInEnumDecl;
- return;
- }
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- for (size_t i = 0; i < d->members->length; i++)
- {
- EnumMember *em = (*d->members)[i]->isEnumMember();
- if (!em)
- continue;
- em->accept(this);
- buf->writeByte(',');
- buf->writenl();
- }
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- inEnumDecl = oldInEnumDecl;
- }
-
- void visit(Nspace *d)
- {
- buf->writestring("extern (C++, ");
- buf->writestring(d->ident->toChars());
- buf->writeByte(')');
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- for (size_t i = 0; i < d->members->length; i++)
- {
- Dsymbol *s = (*d->members)[i];
- s->accept(this);
- }
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- void visit(StructDeclaration *d)
- {
- buf->printf("%s ", d->kind());
- if (!d->isAnonymous())
- buf->writestring(d->toChars());
- if (!d->members)
- {
- buf->writeByte(';');
- buf->writenl();
- return;
- }
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- for (size_t i = 0; i < d->members->length; i++)
- {
- Dsymbol *s = (*d->members)[i];
- s->accept(this);
- }
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
- }
-
- void visit(ClassDeclaration *d)
- {
- if (!d->isAnonymous())
- {
- buf->writestring(d->kind());
- buf->writeByte(' ');
- buf->writestring(d->ident->toChars());
- }
- visitBaseClasses(d);
- if (d->members)
- {
- buf->writenl();
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- for (size_t i = 0; i < d->members->length; i++)
- {
- Dsymbol *s = (*d->members)[i];
- s->accept(this);
- }
- buf->level--;
- buf->writeByte('}');
- }
- else
- buf->writeByte(';');
- buf->writenl();
- }
-
- void visitBaseClasses(ClassDeclaration *d)
- {
- if (!d || !d->baseclasses->length)
- return;
-
- buf->writestring(" : ");
- for (size_t i = 0; i < d->baseclasses->length; i++)
- {
- if (i)
- buf->writestring(", ");
- BaseClass *b = (*d->baseclasses)[i];
- typeToBuffer(b->type, NULL);
- }
- }
-
- void visit(AliasDeclaration *d)
- {
- if (d->storage_class & STClocal)
- return;
- buf->writestring("alias ");
- if (d->aliassym)
- {
- buf->writestring(d->ident->toChars());
- buf->writestring(" = ");
- if (stcToBuffer(buf, d->storage_class))
- buf->writeByte(' ');
- d->aliassym->accept(this);
- }
- else if (d->type->ty == Tfunction)
- {
- if (stcToBuffer(buf, d->storage_class))
- buf->writeByte(' ');
- typeToBuffer(d->type, d->ident);
- }
- else
- {
- declstring = (d->ident == Id::string || d->ident == Id::wstring || d->ident == Id::dstring);
- buf->writestring(d->ident->toChars());
- buf->writestring(" = ");
- if (stcToBuffer(buf, d->storage_class))
- buf->writeByte(' ');
- typeToBuffer(d->type, NULL);
- declstring = false;
- }
- buf->writeByte(';');
- buf->writenl();
- }
-
- void visit(VarDeclaration *d)
- {
- if (d->storage_class & STClocal)
- return;
- visitVarDecl(d, false);
- buf->writeByte(';');
- buf->writenl();
- }
- void visitVarDecl(VarDeclaration *v, bool anywritten)
- {
- if (anywritten)
- {
- buf->writestring(", ");
- buf->writestring(v->ident->toChars());
- }
- else
- {
- if (stcToBuffer(buf, v->storage_class))
- buf->writeByte(' ');
- if (v->type)
- typeToBuffer(v->type, v->ident);
- else
- buf->writestring(v->ident->toChars());
- }
- if (v->_init)
- {
- buf->writestring(" = ");
- ExpInitializer *ie = v->_init->isExpInitializer();
- if (ie && (ie->exp->op == TOKconstruct || ie->exp->op == TOKblit))
- ((AssignExp *)ie->exp)->e2->accept(this);
- else
- v->_init->accept(this);
- }
- }
-
- void visit(FuncDeclaration *f)
- {
- //printf("FuncDeclaration::toCBuffer() '%s'\n", f->toChars());
-
- if (stcToBuffer(buf, f->storage_class))
- buf->writeByte(' ');
- TypeFunction *tf = (TypeFunction *)f->type;
- typeToBuffer(tf, f->ident);
- if (hgs->hdrgen)
- {
- // if the return type is missing (e.g. ref functions or auto)
- if (!tf->next || f->storage_class & STCauto)
- {
- hgs->autoMember++;
- bodyToBuffer(f);
- hgs->autoMember--;
- }
- else if (hgs->tpltMember == 0 && global.params.hdrStripPlainFunctions)
- {
- buf->writeByte(';');
- buf->writenl();
- }
- else
- bodyToBuffer(f);
- }
- else
- bodyToBuffer(f);
- }
-
- void bodyToBuffer(FuncDeclaration *f)
- {
- if (!f->fbody || (hgs->hdrgen && global.params.hdrStripPlainFunctions && !hgs->autoMember && !hgs->tpltMember))
- {
- buf->writeByte(';');
- buf->writenl();
- return;
- }
-
- int savetlpt = hgs->tpltMember;
- int saveauto = hgs->autoMember;
- hgs->tpltMember = 0;
- hgs->autoMember = 0;
- buf->writenl();
- bool requireDo = false;
- // in{}
- if (f->frequires)
- {
- for (size_t i = 0; i < f->frequires->length; i++)
- {
- Statement *frequire = (*f->frequires)[i];
- buf->writestring("in");
- if (ExpStatement *es = frequire->isExpStatement())
- {
- assert(es->exp && es->exp->op == TOKassert);
- buf->writestring(" (");
- ((AssertExp *)es->exp)->e1->accept(this);
- buf->writeByte(')');
- buf->writenl();
- requireDo = false;
- }
- else
- {
- buf->writenl();
- frequire->accept(this);
- requireDo = true;
- }
- }
- }
-
- // out{}
- if (f->fensures)
- {
- for (size_t i = 0; i < f->fensures->length; i++)
- {
- Ensure fensure = (*f->fensures)[i];
- buf->writestring("out");
- if (ExpStatement *es = fensure.ensure->isExpStatement())
- {
- assert(es->exp && es->exp->op == TOKassert);
- buf->writestring(" (");
- if (fensure.id)
- {
- buf->writestring(fensure.id->toChars());
- }
- buf->writestring("; ");
- ((AssertExp *)es->exp)->e1->accept(this);
- buf->writeByte(')');
- buf->writenl();
- requireDo = false;
- }
- else
- {
- if (fensure.id)
- {
- buf->writeByte('(');
- buf->writestring(fensure.id->toChars());
- buf->writeByte(')');
- }
- buf->writenl();
- fensure.ensure->accept(this);
- requireDo = true;
- }
- }
- }
-
- if (requireDo)
- {
- buf->writestring("body");
- buf->writenl();
- }
-
- buf->writeByte('{');
- buf->writenl();
- buf->level++;
- f->fbody->accept(this);
- buf->level--;
- buf->writeByte('}');
- buf->writenl();
-
- hgs->tpltMember = savetlpt;
- hgs->autoMember = saveauto;
- }
-
- void visit(FuncLiteralDeclaration *f)
- {
- if (f->type->ty == Terror)
- {
- buf->writestring("__error");
- return;
- }
-
- if (f->tok != TOKreserved)
- {
- buf->writestring(f->kind());
- buf->writeByte(' ');
- }
-
- TypeFunction *tf = (TypeFunction *)f->type;
- // Don't print tf->mod, tf->trust, and tf->linkage
- if (!f->inferRetType && tf->next)
- typeToBuffer(tf->next, NULL);
- parametersToBuffer(tf->parameterList.parameters, tf->parameterList.varargs);
-
- CompoundStatement *cs = f->fbody->isCompoundStatement();
- Statement *s1;
- if (f->semanticRun >= PASSsemantic3done && cs)
- {
- s1 = (*cs->statements)[cs->statements->length - 1];
- }
- else
- s1 = !cs ? f->fbody : NULL;
- ReturnStatement *rs = s1 ? s1->isReturnStatement() : NULL;
- if (rs && rs->exp)
- {
- buf->writestring(" => ");
- rs->exp->accept(this);
- }
- else
- {
- hgs->tpltMember++;
- bodyToBuffer(f);
- hgs->tpltMember--;
- }
- }
-
- void visit(PostBlitDeclaration *d)
- {
- if (stcToBuffer(buf, d->storage_class))
- buf->writeByte(' ');
- buf->writestring("this(this)");
- bodyToBuffer(d);
- }
-
- void visit(DtorDeclaration *d)
- {
- if (d->storage_class & STCtrusted)
- buf->writestring("@trusted ");
- if (d->storage_class & STCsafe)
- buf->writestring("@safe ");
- if (d->storage_class & STCnogc)
- buf->writestring("@nogc ");
- if (d->storage_class & STCdisable)
- buf->writestring("@disable ");
-
- buf->writestring("~this()");
- bodyToBuffer(d);
- }
-
- void visit(StaticCtorDeclaration *d)
- {
- if (stcToBuffer(buf, d->storage_class & ~STCstatic))
- buf->writeByte(' ');
- if (d->isSharedStaticCtorDeclaration())
- buf->writestring("shared ");
- buf->writestring("static this()");
- if (hgs->hdrgen && !hgs->tpltMember)
- {
- buf->writeByte(';');
- buf->writenl();
- }
- else
- bodyToBuffer(d);
- }
-
- void visit(StaticDtorDeclaration *d)
- {
- if (hgs->hdrgen)
- return;
- if (stcToBuffer(buf, d->storage_class & ~STCstatic))
- buf->writeByte(' ');
- if (d->isSharedStaticDtorDeclaration())
- buf->writestring("shared ");
- buf->writestring("static ~this()");
- bodyToBuffer(d);
- }
-
- void visit(InvariantDeclaration *d)
- {
- if (hgs->hdrgen)
- return;
- if (stcToBuffer(buf, d->storage_class))
- buf->writeByte(' ');
- buf->writestring("invariant");
- if (ExpStatement *es = d->fbody->isExpStatement())
- {
- assert(es->exp && es->exp->op == TOKassert);
- buf->writestring(" (");
- ((AssertExp *)es->exp)->e1->accept(this);
- buf->writestring(");");
- buf->writenl();
- }
- else
- {
- bodyToBuffer(d);
- }
- }
-
- void visit(UnitTestDeclaration *d)
- {
- if (hgs->hdrgen)
- return;
- if (stcToBuffer(buf, d->storage_class))
- buf->writeByte(' ');
- buf->writestring("unittest");
- bodyToBuffer(d);
- }
-
- void visit(NewDeclaration *d)
- {
- if (stcToBuffer(buf, d->storage_class & ~STCstatic))
- buf->writeByte(' ');
- buf->writestring("new");
- parametersToBuffer(d->parameters, d->varargs);
- bodyToBuffer(d);
- }
-
- void visit(DeleteDeclaration *d)
- {
- if (stcToBuffer(buf, d->storage_class & ~STCstatic))
- buf->writeByte(' ');
- buf->writestring("delete");
- parametersToBuffer(d->parameters, 0);
- bodyToBuffer(d);
- }
-
- ////////////////////////////////////////////////////////////////////////////
-
- void visit(ErrorInitializer *)
- {
- buf->writestring("__error__");
- }
-
- void visit(VoidInitializer *)
- {
- buf->writestring("void");
- }
-
- void visit(StructInitializer *si)
- {
- //printf("StructInitializer::toCBuffer()\n");
- buf->writeByte('{');
- for (size_t i = 0; i < si->field.length; i++)
- {
- if (i)
- buf->writestring(", ");
- if (Identifier *id = si->field[i])
- {
- buf->writestring(id->toChars());
- buf->writeByte(':');
- }
- if (Initializer *iz = si->value[i])
- iz->accept(this);
- }
- buf->writeByte('}');
- }
-
- void visit(ArrayInitializer *ai)
- {
- buf->writeByte('[');
- for (size_t i = 0; i < ai->index.length; i++)
- {
- if (i)
- buf->writestring(", ");
- if (Expression *ex = ai->index[i])
- {
- ex->accept(this);
- buf->writeByte(':');
- }
- if (Initializer *iz = ai->value[i])
- iz->accept(this);
- }
- buf->writeByte(']');
- }
-
- void visit(ExpInitializer *ei)
- {
- ei->exp->accept(this);
- }
-
- ////////////////////////////////////////////////////////////////////////////
-
- /**************************************************
- * Write out argument list to buf.
- */
- void argsToBuffer(Expressions *expressions, Expression *basis = NULL)
- {
- if (!expressions || !expressions->length)
- return;
-
- for (size_t i = 0; i < expressions->length; i++)
- {
- Expression *el = (*expressions)[i];
- if (i)
- buf->writestring(", ");
- if (!el)
- el = basis;
- if (el)
- expToBuffer(el, PREC_assign);
- }
- }
-
- void sizeToBuffer(Expression *e)
- {
- if (e->type == Type::tsize_t)
- {
- Expression *ex = (e->op == TOKcast ? ((CastExp *)e)->e1 : e);
- ex = ex->optimize(WANTvalue);
-
- dinteger_t uval = ex->op == TOKint64 ? ex->toInteger() : (dinteger_t)-1;
- if ((sinteger_t)uval >= 0)
- {
- dinteger_t sizemax;
- if (target.ptrsize == 8)
- sizemax = 0xFFFFFFFFFFFFFFFFULL;
- else if (target.ptrsize == 4)
- sizemax = 0xFFFFFFFFUL;
- else if (target.ptrsize == 2)
- sizemax = 0xFFFFUL;
- else
- assert(0);
- if (uval <= sizemax && uval <= 0x7FFFFFFFFFFFFFFFULL)
- {
- buf->printf("%llu", uval);
- return;
- }
- }
- }
- expToBuffer(e, PREC_assign);
- }
-
- /**************************************************
- * Write expression out to buf, but wrap it
- * in ( ) if its precedence is less than pr.
- */
- void expToBuffer(Expression *e, PREC pr)
- {
- assert(precedence[e->op] != PREC_zero);
- assert(pr != PREC_zero);
-
- //if (precedence[e->op] == 0) e->print();
- /* Despite precedence, we don't allow a<b<c expressions.
- * They must be parenthesized.
- */
- if (precedence[e->op] < pr ||
- (pr == PREC_rel && precedence[e->op] == pr))
- {
- buf->writeByte('(');
- e->accept(this);
- buf->writeByte(')');
- }
- else
- e->accept(this);
- }
-
- void visit(Expression *e)
- {
- buf->writestring(Token::toChars(e->op));
- }
-
- void visit(IntegerExp *e)
- {
- dinteger_t v = e->toInteger();
-
- if (e->type)
- {
- Type *t = e->type;
- L1:
- switch (t->ty)
- {
- case Tenum:
- {
- TypeEnum *te = (TypeEnum *)t;
- if (hgs->fullDump)
- {
- EnumDeclaration *sym = te->sym;
- if (inEnumDecl != sym)
- {
- for (size_t i = 0; i < sym->members->length; i++)
- {
- EnumMember *em = (EnumMember *)(*sym->members)[i];
- if (em->value()->toInteger() == v)
- {
- buf->printf("%s.%s", sym->toChars(), em->ident->toChars());
- return;
- }
- }
- }
- }
- buf->printf("cast(%s)", te->sym->toChars());
- t = te->sym->memtype;
- goto L1;
- }
-
- case Twchar: // BUG: need to cast(wchar)
- case Tdchar: // BUG: need to cast(dchar)
- if ((uinteger_t)v > 0xFF)
- {
- buf->printf("'\\U%08x'", v);
- break;
- }
- /* fall through */
- case Tchar:
- {
- size_t o = buf->length();
- if (v == '\'')
- buf->writestring("'\\''");
- else if (isprint((int)v) && v != '\\')
- buf->printf("'%c'", (int)v);
- else
- buf->printf("'\\x%02x'", (int)v);
- if (hgs->ddoc)
- escapeDdocString(buf, o);
- break;
- }
-
- case Tint8:
- buf->writestring("cast(byte)");
- goto L2;
-
- case Tint16:
- buf->writestring("cast(short)");
- goto L2;
-
- case Tint32:
- L2:
- buf->printf("%d", (int)v);
- break;
-
- case Tuns8:
- buf->writestring("cast(ubyte)");
- goto L3;
-
- case Tuns16:
- buf->writestring("cast(ushort)");
- goto L3;
-
- case Tuns32:
- L3:
- buf->printf("%uu", (unsigned)v);
- break;
-
- case Tint64:
- buf->printf("%lldL", v);
- break;
-
- case Tuns64:
- L4:
- buf->printf("%lluLU", v);
- break;
-
- case Tbool:
- buf->writestring(v ? "true" : "false");
- break;
-
- case Tpointer:
- buf->writestring("cast(");
- buf->writestring(t->toChars());
- buf->writeByte(')');
- if (target.ptrsize == 8)
- goto L4;
- else if (target.ptrsize == 4 ||
- target.ptrsize == 2)
- goto L3;
- else
- assert(0);
-
- case Tvoid:
- buf->writestring("cast(void)0");
- break;
-
- default:
- /* This can happen if errors, such as
- * the type is painted on like in fromConstInitializer().
- */
- if (!global.errors)
- {
- assert(0);
- }
- break;
- }
- }
- else if (v & 0x8000000000000000LL)
- buf->printf("0x%llx", v);
- else
- buf->printf("%lld", v);
- }
-
- void visit(ErrorExp *)
- {
- buf->writestring("__error");
- }
-
- void floatToBuffer(Type *type, real_t value)
- {
- /** sizeof(value)*3 is because each byte of mantissa is max
- of 256 (3 characters). The string will be "-M.MMMMe-4932".
- (ie, 8 chars more than mantissa). Plus one for trailing \0.
- Plus one for rounding. */
- const size_t BUFFER_LEN = sizeof(value) * 3 + 8 + 1 + 1;
- char buffer[BUFFER_LEN];
- memset(buffer, 0, BUFFER_LEN);
- CTFloat::sprint(buffer, 'g', value);
- assert(strlen(buffer) < BUFFER_LEN);
-
- if (hgs->hdrgen)
- {
- real_t r = CTFloat::parse(buffer);
- if (r != value) // if exact duplication
- CTFloat::sprint(buffer, 'a', value);
- }
- buf->writestring(buffer);
-
- if (type)
- {
- Type *t = type->toBasetype();
- switch (t->ty)
- {
- case Tfloat32:
- case Timaginary32:
- case Tcomplex32:
- buf->writeByte('F');
- break;
-
- case Tfloat80:
- case Timaginary80:
- case Tcomplex80:
- buf->writeByte('L');
- break;
-
- default:
- break;
- }
- if (t->isimaginary())
- buf->writeByte('i');
- }
- }
-
- void visit(RealExp *e)
- {
- floatToBuffer(e->type, e->value);
- }
-
- void visit(ComplexExp *e)
- {
- /* Print as:
- * (re+imi)
- */
- buf->writeByte('(');
- floatToBuffer(e->type, creall(e->value));
- buf->writeByte('+');
- floatToBuffer(e->type, cimagl(e->value));
- buf->writestring("i)");
- }
-
- void visit(IdentifierExp *e)
- {
- if (hgs->hdrgen || hgs->ddoc)
- buf->writestring(e->ident->toHChars2());
- else
- buf->writestring(e->ident->toChars());
- }
-
- void visit(DsymbolExp *e)
- {
- buf->writestring(e->s->toChars());
- }
-
- void visit(ThisExp *)
- {
- buf->writestring("this");
- }
-
- void visit(SuperExp *)
- {
- buf->writestring("super");
- }
-
- void visit(NullExp *)
- {
- buf->writestring("null");
- }
-
- void visit(StringExp *e)
- {
- buf->writeByte('"');
- size_t o = buf->length();
- for (size_t i = 0; i < e->len; i++)
- {
- unsigned c = e->charAt(i);
- switch (c)
- {
- case '"':
- case '\\':
- buf->writeByte('\\');
- /* fall through */
- default:
- if (c <= 0xFF)
- {
- if (c <= 0x7F && isprint(c))
- buf->writeByte(c);
- else
- buf->printf("\\x%02x", c);
- }
- else if (c <= 0xFFFF)
- buf->printf("\\x%02x\\x%02x", c & 0xFF, c >> 8);
- else
- buf->printf("\\x%02x\\x%02x\\x%02x\\x%02x",
- c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF, c >> 24);
- break;
- }
- }
- if (hgs->ddoc)
- escapeDdocString(buf, o);
- buf->writeByte('"');
- if (e->postfix)
- buf->writeByte(e->postfix);
- }
-
- void visit(ArrayLiteralExp *e)
- {
- buf->writeByte('[');
- argsToBuffer(e->elements, e->basis);
- buf->writeByte(']');
- }
-
- void visit(AssocArrayLiteralExp *e)
- {
- buf->writeByte('[');
- for (size_t i = 0; i < e->keys->length; i++)
- {
- Expression *key = (*e->keys)[i];
- Expression *value = (*e->values)[i];
-
- if (i)
- buf->writestring(", ");
- expToBuffer(key, PREC_assign);
- buf->writeByte(':');
- expToBuffer(value, PREC_assign);
- }
- buf->writeByte(']');
- }
-
- void visit(StructLiteralExp *e)
- {
- buf->writestring(e->sd->toChars());
- buf->writeByte('(');
-
- // CTFE can generate struct literals that contain an AddrExp pointing
- // to themselves, need to avoid infinite recursion:
- // struct S { this(int){ this.s = &this; } S* s; }
- // const foo = new S(0);
- if (e->stageflags & stageToCBuffer)
- buf->writestring("<recursion>");
- else
- {
- int old = e->stageflags;
- e->stageflags |= stageToCBuffer;
- argsToBuffer(e->elements);
- e->stageflags = old;
- }
-
- buf->writeByte(')');
- }
-
- void visit(TypeExp *e)
- {
- typeToBuffer(e->type, NULL);
- }
-
- void visit(ScopeExp *e)
- {
- if (e->sds->isTemplateInstance())
- {
- e->sds->accept(this);
- }
- else if (hgs != NULL && hgs->ddoc)
- {
- // fixes bug 6491
- Module *m = e->sds->isModule();
- if (m)
- buf->writestring(m->md->toChars());
- else
- buf->writestring(e->sds->toChars());
- }
- else
- {
- buf->writestring(e->sds->kind());
- buf->writeByte(' ');
- buf->writestring(e->sds->toChars());
- }
- }
-
- void visit(TemplateExp *e)
- {
- buf->writestring(e->td->toChars());
- }
-
- void visit(NewExp *e)
- {
- if (e->thisexp)
- {
- expToBuffer(e->thisexp, PREC_primary);
- buf->writeByte('.');
- }
- buf->writestring("new ");
- if (e->newargs && e->newargs->length)
- {
- buf->writeByte('(');
- argsToBuffer(e->newargs);
- buf->writeByte(')');
- }
- typeToBuffer(e->newtype, NULL);
- if (e->arguments && e->arguments->length)
- {
- buf->writeByte('(');
- argsToBuffer(e->arguments);
- buf->writeByte(')');
- }
- }
-
- void visit(NewAnonClassExp *e)
- {
- if (e->thisexp)
- {
- expToBuffer(e->thisexp, PREC_primary);
- buf->writeByte('.');
- }
- buf->writestring("new");
- if (e->newargs && e->newargs->length)
- {
- buf->writeByte('(');
- argsToBuffer(e->newargs);
- buf->writeByte(')');
- }
- buf->writestring(" class ");
- if (e->arguments && e->arguments->length)
- {
- buf->writeByte('(');
- argsToBuffer(e->arguments);
- buf->writeByte(')');
- }
- if (e->cd)
- e->cd->accept(this);
- }
-
- void visit(SymOffExp *e)
- {
- if (e->offset)
- buf->printf("(& %s+%u)", e->var->toChars(), e->offset);
- else if (e->var->isTypeInfoDeclaration())
- buf->printf("%s", e->var->toChars());
- else
- buf->printf("& %s", e->var->toChars());
- }
-
- void visit(VarExp *e)
- {
- buf->writestring(e->var->toChars());
- }
-
- void visit(OverExp *e)
- {
- buf->writestring(e->vars->ident->toChars());
- }
-
- void visit(TupleExp *e)
- {
- if (e->e0)
- {
- buf->writeByte('(');
- e->e0->accept(this);
- buf->writestring(", tuple(");
- argsToBuffer(e->exps);
- buf->writestring("))");
- }
- else
- {
- buf->writestring("tuple(");
- argsToBuffer(e->exps);
- buf->writeByte(')');
- }
- }
-
- void visit(FuncExp *e)
- {
- e->fd->accept(this);
- //buf->writestring(e->fd->toChars());
- }
-
- void visit(DeclarationExp *e)
- {
- /* Normal dmd execution won't reach here - regular variable declarations
- * are handled in visit(ExpStatement), so here would be used only when
- * we'll directly call Expression::toChars() for debugging.
- */
- if (VarDeclaration *v = e->declaration->isVarDeclaration())
- {
- // For debugging use:
- // - Avoid printing newline.
- // - Intentionally use the format (Type var;)
- // which isn't correct as regular D code.
- buf->writeByte('(');
- visitVarDecl(v, false);
- buf->writeByte(';');
- buf->writeByte(')');
- }
- else
- e->declaration->accept(this);
- }
-
- void visit(TypeidExp *e)
- {
- buf->writestring("typeid(");
- objectToBuffer(e->obj);
- buf->writeByte(')');
- }
-
- void visit(TraitsExp *e)
- {
- buf->writestring("__traits(");
- if (e->ident)
- buf->writestring(e->ident->toChars());
- if (e->args)
- {
- for (size_t i = 0; i < e->args->length; i++)
- {
- RootObject *arg = (*e->args)[i];
- buf->writestring(", ");
- objectToBuffer(arg);
- }
- }
- buf->writeByte(')');
- }
-
- void visit(HaltExp *)
- {
- buf->writestring("halt");
- }
-
- void visit(IsExp *e)
- {
- buf->writestring("is(");
- typeToBuffer(e->targ, e->id);
- if (e->tok2 != TOKreserved)
- {
- buf->printf(" %s %s", Token::toChars(e->tok), Token::toChars(e->tok2));
- }
- else if (e->tspec)
- {
- if (e->tok == TOKcolon)
- buf->writestring(" : ");
- else
- buf->writestring(" == ");
- typeToBuffer(e->tspec, NULL);
- }
- if (e->parameters && e->parameters->length)
- {
- buf->writestring(", ");
- visitTemplateParameters(e->parameters);
- }
- buf->writeByte(')');
- }
-
- void visit(UnaExp *e)
- {
- buf->writestring(Token::toChars(e->op));
- expToBuffer(e->e1, precedence[e->op]);
- }
-
- void visit(BinExp *e)
- {
- expToBuffer(e->e1, precedence[e->op]);
- buf->writeByte(' ');
- buf->writestring(Token::toChars(e->op));
- buf->writeByte(' ');
- expToBuffer(e->e2, (PREC)(precedence[e->op] + 1));
- }
-
- void visit(CompileExp *e)
- {
- buf->writestring("mixin(");
- argsToBuffer(e->exps);
- buf->writeByte(')');
- }
-
- void visit(ImportExp *e)
- {
- buf->writestring("import(");
- expToBuffer(e->e1, PREC_assign);
- buf->writeByte(')');
- }
-
- void visit(AssertExp *e)
- {
- buf->writestring("assert(");
- expToBuffer(e->e1, PREC_assign);
- if (e->msg)
- {
- buf->writestring(", ");
- expToBuffer(e->msg, PREC_assign);
- }
- buf->writeByte(')');
- }
-
- void visit(DotIdExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('.');
- buf->writestring(e->ident->toChars());
- }
-
- void visit(DotTemplateExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('.');
- buf->writestring(e->td->toChars());
- }
-
- void visit(DotVarExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('.');
- buf->writestring(e->var->toChars());
- }
-
- void visit(DotTemplateInstanceExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('.');
- e->ti->accept(this);
- }
-
- void visit(DelegateExp *e)
- {
- buf->writeByte('&');
- if (!e->func->isNested())
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('.');
- }
- buf->writestring(e->func->toChars());
- }
-
- void visit(DotTypeExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('.');
- buf->writestring(e->sym->toChars());
- }
-
- void visit(CallExp *e)
- {
- if (e->e1->op == TOKtype)
- {
- /* Avoid parens around type to prevent forbidden cast syntax:
- * (sometype)(arg1)
- * This is ok since types in constructor calls
- * can never depend on parens anyway
- */
- e->e1->accept(this);
- }
- else
- expToBuffer(e->e1, precedence[e->op]);
- buf->writeByte('(');
- argsToBuffer(e->arguments);
- buf->writeByte(')');
- }
-
- void visit(PtrExp *e)
- {
- buf->writeByte('*');
- expToBuffer(e->e1, precedence[e->op]);
- }
-
- void visit(DeleteExp *e)
- {
- buf->writestring("delete ");
- expToBuffer(e->e1, precedence[e->op]);
- }
-
- void visit(CastExp *e)
- {
- buf->writestring("cast(");
- if (e->to)
- typeToBuffer(e->to, NULL);
- else
- {
- MODtoBuffer(buf, e->mod);
- }
- buf->writeByte(')');
- expToBuffer(e->e1, precedence[e->op]);
- }
-
- void visit(VectorExp *e)
- {
- buf->writestring("cast(");
- typeToBuffer(e->to, NULL);
- buf->writeByte(')');
- expToBuffer(e->e1, precedence[e->op]);
- }
-
- void visit(VectorArrayExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writestring(".array");
- }
-
- void visit(SliceExp *e)
- {
- expToBuffer(e->e1, precedence[e->op]);
- buf->writeByte('[');
- if (e->upr || e->lwr)
- {
- if (e->lwr)
- sizeToBuffer(e->lwr);
- else
- buf->writeByte('0');
- buf->writestring("..");
- if (e->upr)
- sizeToBuffer(e->upr);
- else
- buf->writeByte('$');
- }
- buf->writeByte(']');
- }
-
- void visit(ArrayLengthExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writestring(".length");
- }
-
- void visit(IntervalExp *e)
- {
- expToBuffer(e->lwr, PREC_assign);
- buf->writestring("..");
- expToBuffer(e->upr, PREC_assign);
- }
-
- void visit(DelegatePtrExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writestring(".ptr");
- }
-
- void visit(DelegateFuncptrExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writestring(".funcptr");
- }
-
- void visit(ArrayExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('[');
- argsToBuffer(e->arguments);
- buf->writeByte(']');
- }
-
- void visit(DotExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('.');
- expToBuffer(e->e2, PREC_primary);
- }
-
- void visit(IndexExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writeByte('[');
- sizeToBuffer(e->e2);
- buf->writeByte(']');
- }
-
- void visit(PostExp *e)
- {
- expToBuffer(e->e1, precedence[e->op]);
- buf->writestring(Token::toChars(e->op));
- }
-
- void visit(PreExp *e)
- {
- buf->writestring(Token::toChars(e->op));
- expToBuffer(e->e1, precedence[e->op]);
- }
-
- void visit(RemoveExp *e)
- {
- expToBuffer(e->e1, PREC_primary);
- buf->writestring(".remove(");
- expToBuffer(e->e2, PREC_assign);
- buf->writeByte(')');
- }
-
- void visit(CondExp *e)
- {
- expToBuffer(e->econd, PREC_oror);
- buf->writestring(" ? ");
- expToBuffer(e->e1, PREC_expr);
- buf->writestring(" : ");
- expToBuffer(e->e2, PREC_cond);
- }
-
- void visit(DefaultInitExp *e)
- {
- buf->writestring(Token::toChars(e->subop));
- }
-
- void visit(ClassReferenceExp *e)
- {
- buf->writestring(e->value->toChars());
- }
-
- ////////////////////////////////////////////////////////////////////////////
-
- void visit(TemplateTypeParameter *tp)
- {
- buf->writestring(tp->ident->toChars());
- if (tp->specType)
- {
- buf->writestring(" : ");
- typeToBuffer(tp->specType, NULL);
- }
- if (tp->defaultType)
- {
- buf->writestring(" = ");
- typeToBuffer(tp->defaultType, NULL);
- }
- }
-
- void visit(TemplateThisParameter *tp)
- {
- buf->writestring("this ");
- visit((TemplateTypeParameter *)tp);
- }
-
- void visit(TemplateAliasParameter *tp)
- {
- buf->writestring("alias ");
- if (tp->specType)
- typeToBuffer(tp->specType, tp->ident);
- else
- buf->writestring(tp->ident->toChars());
- if (tp->specAlias)
- {
- buf->writestring(" : ");
- objectToBuffer(tp->specAlias);
- }
- if (tp->defaultAlias)
- {
- buf->writestring(" = ");
- objectToBuffer(tp->defaultAlias);
- }
- }
-
- void visit(TemplateValueParameter *tp)
- {
- typeToBuffer(tp->valType, tp->ident);
- if (tp->specValue)
- {
- buf->writestring(" : ");
- tp->specValue->accept(this);
- }
- if (tp->defaultValue)
- {
- buf->writestring(" = ");
- tp->defaultValue->accept(this);
- }
- }
-
- void visit(TemplateTupleParameter *tp)
- {
- buf->writestring(tp->ident->toChars());
- buf->writestring("...");
- }
-
- ////////////////////////////////////////////////////////////////////////////
-
- void visit(DebugCondition *c)
- {
- if (c->ident)
- buf->printf("debug (%s)", c->ident->toChars());
- else
- buf->printf("debug (%u)", c->level);
- }
-
- void visit(VersionCondition *c)
- {
- if (c->ident)
- buf->printf("version (%s)", c->ident->toChars());
- else
- buf->printf("version (%u)", c->level);
- }
-
- void visit(StaticIfCondition *c)
- {
- buf->writestring("static if (");
- c->exp->accept(this);
- buf->writeByte(')');
- }
-
- ////////////////////////////////////////////////////////////////////////////
-
- void visit(Parameter *p)
- {
- if (p->userAttribDecl)
- {
- buf->writestring("@");
- bool isAnonymous = p->userAttribDecl->atts->length > 0
- && (*p->userAttribDecl->atts)[0]->op != TOKcall;
- if (isAnonymous)
- buf->writestring("(");
- argsToBuffer(p->userAttribDecl->atts);
- if (isAnonymous)
- buf->writestring(")");
- buf->writestring(" ");
- }
- if (p->storageClass & STCauto)
- buf->writestring("auto ");
-
- if (p->storageClass & STCreturn)
- buf->writestring("return ");
-
- if (p->storageClass & STCout)
- buf->writestring("out ");
- else if (p->storageClass & STCref)
- buf->writestring("ref ");
- else if (p->storageClass & STCin)
- buf->writestring("in ");
- else if (p->storageClass & STClazy)
- buf->writestring("lazy ");
- else if (p->storageClass & STCalias)
- buf->writestring("alias ");
-
- StorageClass stc = p->storageClass;
- if (p->type && p->type->mod & MODshared)
- stc &= ~STCshared;
-
- if (stcToBuffer(buf, stc & (STCconst | STCimmutable | STCwild | STCshared | STCscope | STCscopeinferred)))
- buf->writeByte(' ');
-
- if (p->storageClass & STCalias)
- {
- if (p->ident)
- buf->writestring(p->ident->toChars());
- }
- else if (p->type->ty == Tident &&
- strlen(((TypeIdentifier *)p->type)->ident->toChars()) > 3 &&
- strncmp(((TypeIdentifier *)p->type)->ident->toChars(), "__T", 3) == 0)
- {
- // print parameter name, instead of undetermined type parameter
- buf->writestring(p->ident->toChars());
- }
- else
- typeToBuffer(p->type, p->ident);
- if (p->defaultArg)
- {
- buf->writestring(" = ");
- p->defaultArg->accept(this);
- }
- }
-
- void parametersToBuffer(Parameters *parameters, int varargs)
- {
- buf->writeByte('(');
- if (parameters)
- {
- size_t dim = Parameter::dim(parameters);
- for (size_t i = 0; i < dim; i++)
- {
- if (i)
- buf->writestring(", ");
- Parameter *fparam = Parameter::getNth(parameters, i);
- fparam->accept(this);
- }
- if (varargs)
- {
- if (parameters->length && varargs == 1)
- buf->writestring(", ");
- buf->writestring("...");
- }
- }
- buf->writeByte(')');
- }
-
- void visit(Module *m)
- {
- if (m->md)
- {
- if (m->userAttribDecl)
- {
- buf->writestring("@(");
- argsToBuffer(m->userAttribDecl->atts);
- buf->writeByte(')');
- buf->writenl();
- }
- if (m->md->isdeprecated)
- {
- if (m->md->msg)
- {
- buf->writestring("deprecated(");
- m->md->msg->accept(this);
- buf->writestring(") ");
- }
- else
- buf->writestring("deprecated ");
- }
-
- buf->writestring("module ");
- buf->writestring(m->md->toChars());
- buf->writeByte(';');
- buf->writenl();
- }
- for (size_t i = 0; i < m->members->length; i++)
- {
- Dsymbol *s = (*m->members)[i];
- s->accept(this);
- }
- }
-};
-
-void toCBuffer(Statement *s, OutBuffer *buf, HdrGenState *hgs)
-{
- PrettyPrintVisitor v(buf, hgs);
- s->accept(&v);
-}
-
-void toCBuffer(Type *t, OutBuffer *buf, Identifier *ident, HdrGenState *hgs)
-{
- PrettyPrintVisitor v(buf, hgs);
- v.typeToBuffer(t, ident);
-}
-
-void toCBuffer(Dsymbol *s, OutBuffer *buf, HdrGenState *hgs)
-{
- PrettyPrintVisitor v(buf, hgs);
- s->accept(&v);
-}
-
-// used from TemplateInstance::toChars() and TemplateMixin::toChars()
-void toCBufferInstance(TemplateInstance *ti, OutBuffer *buf, bool qualifyTypes)
-{
- HdrGenState hgs;
- hgs.fullQual = qualifyTypes;
- PrettyPrintVisitor v(buf, &hgs);
- v.visit(ti);
-}
-
-void toCBuffer(Initializer *iz, OutBuffer *buf, HdrGenState *hgs)
-{
- PrettyPrintVisitor v(buf, hgs);
- iz->accept(&v);
-}
-
-bool stcToBuffer(OutBuffer *buf, StorageClass stc)
-{
- bool result = false;
- if ((stc & (STCreturn | STCscope)) == (STCreturn | STCscope))
- stc &= ~STCscope;
- if (stc & STCscopeinferred)
- stc &= ~(STCscope | STCscopeinferred);
- while (stc)
- {
- const char *p = stcToChars(stc);
- if (!p)
- break;
- if (!result)
- result = true;
- else
- buf->writeByte(' ');
- buf->writestring(p);
- }
- return result;
-}
-
-/*************************************************
- * Pick off one of the storage classes from stc,
- * and return a pointer to a string representation of it.
- * stc is reduced by the one picked.
- */
-const char *stcToChars(StorageClass& stc)
-{
- struct SCstring
- {
- StorageClass stc;
- TOK tok;
- const char *id;
- };
-
- static SCstring table[] =
- {
- { STCauto, TOKauto, NULL },
- { STCscope, TOKscope, NULL },
- { STCstatic, TOKstatic, NULL },
- { STCextern, TOKextern, NULL },
- { STCconst, TOKconst, NULL },
- { STCfinal, TOKfinal, NULL },
- { STCabstract, TOKabstract, NULL },
- { STCsynchronized, TOKsynchronized, NULL },
- { STCdeprecated, TOKdeprecated, NULL },
- { STCoverride, TOKoverride, NULL },
- { STClazy, TOKlazy, NULL },
- { STCalias, TOKalias, NULL },
- { STCout, TOKout, NULL },
- { STCin, TOKin, NULL },
- { STCmanifest, TOKenum, NULL },
- { STCimmutable, TOKimmutable, NULL },
- { STCshared, TOKshared, NULL },
- { STCnothrow, TOKnothrow, NULL },
- { STCwild, TOKwild, NULL },
- { STCpure, TOKpure, NULL },
- { STCref, TOKref, NULL },
- { STCtls, TOKreserved, NULL },
- { STCgshared, TOKgshared, NULL },
- { STCnogc, TOKat, "@nogc" },
- { STCproperty, TOKat, "@property" },
- { STCsafe, TOKat, "@safe" },
- { STCtrusted, TOKat, "@trusted" },
- { STCsystem, TOKat, "@system" },
- { STCdisable, TOKat, "@disable" },
- { STCfuture, TOKat, "@__future" },
- { STClocal, TOKat, "__local" },
- { 0, TOKreserved, NULL }
- };
-
- for (int i = 0; table[i].stc; i++)
- {
- StorageClass tbl = table[i].stc;
- assert(tbl & STCStorageClass);
- if (stc & tbl)
- {
- stc &= ~tbl;
- if (tbl == STCtls) // TOKtls was removed
- return "__thread";
-
- TOK tok = table[i].tok;
- if (tok == TOKat)
- return table[i].id;
- else
- return Token::toChars(tok);
- }
- }
- //printf("stc = %llx\n", stc);
- return NULL;
-}
-
-void trustToBuffer(OutBuffer *buf, TRUST trust)
-{
- const char *p = trustToChars(trust);
- if (p)
- buf->writestring(p);
-}
-
-const char *trustToChars(TRUST trust)
-{
- switch (trust)
- {
- case TRUSTdefault: return NULL;
- case TRUSTsystem: return "@system";
- case TRUSTtrusted: return "@trusted";
- case TRUSTsafe: return "@safe";
- default: assert(0);
- }
- return NULL; // never reached
-}
-
-void linkageToBuffer(OutBuffer *buf, LINK linkage)
-{
- const char *p = linkageToChars(linkage);
- if (p)
- {
- buf->writestring("extern (");
- buf->writestring(p);
- buf->writeByte(')');
- }
-}
-
-const char *linkageToChars(LINK linkage)
-{
- switch (linkage)
- {
- case LINKdefault: return NULL;
- case LINKd: return "D";
- case LINKc: return "C";
- case LINKcpp: return "C++";
- case LINKwindows: return "Windows";
- case LINKobjc: return "Objective-C";
- case LINKsystem: return "System";
- default: assert(0);
- }
- return NULL; // never reached
-}
-
-void protectionToBuffer(OutBuffer *buf, Prot prot)
-{
- const char *p = protectionToChars(prot.kind);
- if (p)
- buf->writestring(p);
-
- if (prot.kind == Prot::package_ && prot.pkg)
- {
- buf->writeByte('(');
- buf->writestring(prot.pkg->toPrettyChars(true));
- buf->writeByte(')');
- }
-}
-
-const char *protectionToChars(Prot::Kind kind)
-{
- switch (kind)
- {
- case Prot::undefined: return NULL;
- case Prot::none: return "none";
- case Prot::private_: return "private";
- case Prot::package_: return "package";
- case Prot::protected_: return "protected";
- case Prot::public_: return "public";
- case Prot::export_: return "export";
- default: assert(0);
- }
- return NULL; // never reached
-}
-
-// Print the full function signature with correct ident, attributes and template args
-void functionToBufferFull(TypeFunction *tf, OutBuffer *buf, Identifier *ident,
- HdrGenState* hgs, TemplateDeclaration *td)
-{
- //printf("TypeFunction::toCBuffer() this = %p\n", this);
- PrettyPrintVisitor v(buf, hgs);
- v.visitFuncIdentWithPrefix(tf, ident, td);
-}
-
-// ident is inserted before the argument list and will be "function" or "delegate" for a type
-void functionToBufferWithIdent(TypeFunction *tf, OutBuffer *buf, const char *ident)
-{
- HdrGenState hgs;
- PrettyPrintVisitor v(buf, &hgs);
- v.visitFuncIdentWithPostfix(tf, ident);
-}
-
-void toCBuffer(Expression *e, OutBuffer *buf, HdrGenState *hgs)
-{
- PrettyPrintVisitor v(buf, hgs);
- e->accept(&v);
-}
-
-/**************************************************
- * Write out argument types to buf.
- */
-void argExpTypesToCBuffer(OutBuffer *buf, Expressions *arguments)
-{
- if (!arguments || !arguments->length)
- return;
-
- HdrGenState hgs;
- PrettyPrintVisitor v(buf, &hgs);
- for (size_t i = 0; i < arguments->length; i++)
- {
- Expression *arg = (*arguments)[i];
- if (i)
- buf->writestring(", ");
- v.typeToBuffer(arg->type, NULL);
- }
-}
-
-void toCBuffer(TemplateParameter *tp, OutBuffer *buf, HdrGenState *hgs)
-{
- PrettyPrintVisitor v(buf, hgs);
- tp->accept(&v);
-}
-
-void arrayObjectsToBuffer(OutBuffer *buf, Objects *objects)
-{
- if (!objects || !objects->length)
- return;
-
- HdrGenState hgs;
- PrettyPrintVisitor v(buf, &hgs);
- for (size_t i = 0; i < objects->length; i++)
- {
- RootObject *o = (*objects)[i];
- if (i)
- buf->writestring(", ");
- v.objectToBuffer(o);
- }
-}
-
-/*************************************************************
- * Pretty print function parameters.
- * Params:
- * parameters = parameters to print, such as TypeFunction.parameters.
- * varargs = kind of varargs, see TypeFunction.varargs.
- * Returns: Null-terminated string representing parameters.
- */
-const char *parametersTypeToChars(ParameterList pl)
-{
- OutBuffer buf;
- HdrGenState hgs;
- PrettyPrintVisitor v(&buf, &hgs);
- v.parametersToBuffer(pl.parameters, pl.varargs);
- return buf.extractChars();
-}
-
-/*************************************************************
- * Pretty print function parameter.
- * Params:
- * parameter = parameter to print.
- * tf = TypeFunction which holds parameter.
- * fullQual = whether to fully qualify types.
- * Returns: Null-terminated string representing parameters.
- */
-const char *parameterToChars(Parameter *parameter, TypeFunction *tf, bool fullQual)
-{
- OutBuffer buf;
- HdrGenState hgs;
- hgs.fullQual = fullQual;
- PrettyPrintVisitor v(&buf, &hgs);
-
- parameter->accept(&v);
- if (tf->parameterList.varargs == 2 && parameter == tf->parameterList[tf->parameterList.parameters->length - 1])
- {
- buf.writestring("...");
- }
- return buf.extractChars();
-}