blob: 40c894a83d6c5cab5699eb5b8ecb03d17f1ce604 [file] [log] [blame]
/* 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;
}