typesem.c revision 1.1.1.1
1 2/* Compiler implementation of the D programming language 3 * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved 4 * written by Walter Bright 5 * http://www.digitalmars.com 6 * Distributed under the Boost Software License, Version 1.0. 7 * http://www.boost.org/LICENSE_1_0.txt 8 */ 9 10#include "mtype.h" 11#include "expression.h" 12#include "template.h" 13 14Expression *typeToExpression(Type *t); 15Expression *typeToExpressionHelper(TypeQualified *t, Expression *e, size_t i = 0); 16 17class TypeToExpressionVisitor : public Visitor 18{ 19public: 20 Expression *result; 21 Type *itype; 22 23 TypeToExpressionVisitor(Type *itype) 24 { 25 this->result = NULL; 26 this->itype = itype; 27 } 28 29 void visit(Type *) 30 { 31 result = NULL; 32 } 33 34 void visit(TypeSArray *t) 35 { 36 Expression *e = typeToExpression(t->next); 37 if (e) 38 e = new ArrayExp(t->dim->loc, e, t->dim); 39 result = e; 40 } 41 42 void visit(TypeAArray *t) 43 { 44 Expression *e = typeToExpression(t->next); 45 if (e) 46 { 47 Expression *ei = typeToExpression(t->index); 48 if (ei) 49 { 50 result = new ArrayExp(t->loc, e, ei); 51 return; 52 } 53 } 54 result = NULL; 55 } 56 57 void visit(TypeIdentifier *t) 58 { 59 result = typeToExpressionHelper(t, new IdentifierExp(t->loc, t->ident)); 60 } 61 62 void visit(TypeInstance *t) 63 { 64 result = typeToExpressionHelper(t, new ScopeExp(t->loc, t->tempinst)); 65 } 66}; 67 68/* We've mistakenly parsed this as a type. 69 * Redo it as an Expression. 70 * NULL if cannot. 71 */ 72Expression *typeToExpression(Type *t) 73{ 74 TypeToExpressionVisitor v = TypeToExpressionVisitor(t); 75 t->accept(&v); 76 return v.result; 77} 78 79/* Helper function for `typeToExpression`. Contains common code 80 * for TypeQualified derived classes. 81 */ 82Expression *typeToExpressionHelper(TypeQualified *t, Expression *e, size_t i) 83{ 84 //printf("toExpressionHelper(e = %s %s)\n", Token::toChars(e->op), e->toChars()); 85 for (; i < t->idents.dim; i++) 86 { 87 RootObject *id = t->idents[i]; 88 //printf("\t[%d] e: '%s', id: '%s'\n", i, e->toChars(), id->toChars()); 89 90 switch (id->dyncast()) 91 { 92 case DYNCAST_IDENTIFIER: 93 { 94 // ... '. ident' 95 e = new DotIdExp(e->loc, e, (Identifier *)id); 96 break; 97 } 98 case DYNCAST_DSYMBOL: 99 { 100 // ... '. name!(tiargs)' 101 TemplateInstance *ti = ((Dsymbol *)id)->isTemplateInstance(); 102 assert(ti); 103 e = new DotTemplateInstanceExp(e->loc, e, ti->name, ti->tiargs); 104 break; 105 } 106 case DYNCAST_TYPE: // Bugzilla 1215 107 { 108 // ... '[type]' 109 e = new ArrayExp(t->loc, e, new TypeExp(t->loc, (Type *)id)); 110 break; 111 } 112 case DYNCAST_EXPRESSION: // Bugzilla 1215 113 { 114 // ... '[expr]' 115 e = new ArrayExp(t->loc, e, (Expression *)id); 116 break; 117 } 118 default: 119 assert(0); 120 } 121 } 122 return e; 123} 124