/* 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 */ #include "mtype.h" #include "expression.h" #include "template.h" Expression *typeToExpression(Type *t); Expression *typeToExpressionHelper(TypeQualified *t, Expression *e, size_t i = 0); class TypeToExpressionVisitor : public Visitor { public: Expression *result; Type *itype; TypeToExpressionVisitor(Type *itype) { this->result = NULL; this->itype = itype; } void visit(Type *) { result = NULL; } void visit(TypeSArray *t) { Expression *e = typeToExpression(t->next); if (e) e = new ArrayExp(t->dim->loc, e, t->dim); result = e; } void visit(TypeAArray *t) { Expression *e = typeToExpression(t->next); if (e) { Expression *ei = typeToExpression(t->index); if (ei) { result = new ArrayExp(t->loc, e, ei); return; } } result = NULL; } void visit(TypeIdentifier *t) { result = typeToExpressionHelper(t, new IdentifierExp(t->loc, t->ident)); } void visit(TypeInstance *t) { result = typeToExpressionHelper(t, new ScopeExp(t->loc, t->tempinst)); } }; /* We've mistakenly parsed this as a type. * Redo it as an Expression. * NULL if cannot. */ Expression *typeToExpression(Type *t) { TypeToExpressionVisitor v = TypeToExpressionVisitor(t); t->accept(&v); return v.result; } /* Helper function for `typeToExpression`. Contains common code * for TypeQualified derived classes. */ Expression *typeToExpressionHelper(TypeQualified *t, Expression *e, size_t i) { //printf("toExpressionHelper(e = %s %s)\n", Token::toChars(e->op), e->toChars()); for (; i < t->idents.dim; i++) { RootObject *id = t->idents[i]; //printf("\t[%d] e: '%s', id: '%s'\n", i, e->toChars(), id->toChars()); switch (id->dyncast()) { case DYNCAST_IDENTIFIER: { // ... '. ident' e = new DotIdExp(e->loc, e, (Identifier *)id); break; } case DYNCAST_DSYMBOL: { // ... '. name!(tiargs)' TemplateInstance *ti = ((Dsymbol *)id)->isTemplateInstance(); assert(ti); e = new DotTemplateInstanceExp(e->loc, e, ti->name, ti->tiargs); break; } case DYNCAST_TYPE: // Bugzilla 1215 { // ... '[type]' e = new ArrayExp(t->loc, e, new TypeExp(t->loc, (Type *)id)); break; } case DYNCAST_EXPRESSION: // Bugzilla 1215 { // ... '[expr]' e = new ArrayExp(t->loc, e, (Expression *)id); break; } default: assert(0); } } return e; }