blob: 28c42e9acce0649b2a19d0264f2f032a5317e971 [file] [log] [blame]
Chris Lattner1b926492006-08-23 06:42:10 +00001//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Expr class and subclasses.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/Expr.h"
Chris Lattnere165d942006-08-24 04:40:38 +000015#include "clang/Lex/IdentifierTable.h"
Chris Lattner1b926492006-08-23 06:42:10 +000016#include <iostream>
17using namespace llvm;
18using namespace clang;
19
20void Expr::dump() const {
Chris Lattnere165d942006-08-24 04:40:38 +000021 if (this == 0) {
Chris Lattner1b926492006-08-23 06:42:10 +000022 std::cerr << "<null expr>";
Chris Lattnere165d942006-08-24 04:40:38 +000023 return;
24 }
25 std::cerr << "(";
26 dump_impl();
27 std::cerr << ")";
Chris Lattner1b926492006-08-23 06:42:10 +000028}
29
Chris Lattner0eedafe2006-08-24 04:56:27 +000030//===----------------------------------------------------------------------===//
31// Primary Expressions.
32//===----------------------------------------------------------------------===//
33
Chris Lattner879b9ad2006-08-24 04:53:44 +000034void DeclExpr::dump_impl() const {
35 std::cerr << "x";
36}
Chris Lattner1b926492006-08-23 06:42:10 +000037
38void IntegerConstant::dump_impl() const {
39 std::cerr << "1";
40}
41
42void FloatingConstant::dump_impl() const {
43 std::cerr << "1.0";
44}
45
46void ParenExpr::dump_impl() const {
47 std::cerr << "'('";
48 Val->dump();
49 std::cerr << "')'";
50}
51
52/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
53/// corresponds to, e.g. "sizeof" or "[pre]++".
54const char *UnaryOperator::getOpcodeStr(Opcode Op) {
55 switch (Op) {
56 default: assert(0 && "Unknown binary operator");
57 case PostInc: return "[post]++";
58 case PostDec: return "[post]--";
59 case PreInc: return "[pre]++";
60 case PreDec: return "[pre]--";
61 case AddrOf: return "&";
62 case Deref: return "*";
63 case Plus: return "+";
64 case Minus: return "-";
65 case Not: return "~";
66 case LNot: return "!";
67 case Real: return "__real";
68 case Imag: return "__imag";
Chris Lattner26115ac2006-08-24 06:10:04 +000069 case SizeOf: return "sizeof";
70 case AlignOf: return "alignof";
Chris Lattner1b926492006-08-23 06:42:10 +000071 }
72}
73
74void UnaryOperator::dump_impl() const {
Chris Lattnere165d942006-08-24 04:40:38 +000075 std::cerr << getOpcodeStr(Opc);
Chris Lattner1b926492006-08-23 06:42:10 +000076 Input->dump();
Chris Lattnere165d942006-08-24 04:40:38 +000077}
78
Chris Lattner0eedafe2006-08-24 04:56:27 +000079//===----------------------------------------------------------------------===//
80// Postfix Operators.
81//===----------------------------------------------------------------------===//
Chris Lattnere165d942006-08-24 04:40:38 +000082
83void ArraySubscriptExpr::dump_impl() const {
84 Base->dump();
85 std::cerr << "[";
86 Idx->dump();
87 std::cerr << "]";
88}
89
90CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
91 : Fn(fn), NumArgs(numargs) {
92 Args = new Expr*[numargs];
93 for (unsigned i = 0; i != numargs; ++i)
94 Args[i] = args[i];
95}
96
97void CallExpr::dump_impl() const {
98 Fn->dump();
99 std::cerr << "(";
100 for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
101 if (i) std::cerr << ", ";
102 getArg(i)->dump();
103 }
Chris Lattner1b926492006-08-23 06:42:10 +0000104 std::cerr << ")";
105}
106
Chris Lattnere165d942006-08-24 04:40:38 +0000107CallExprLOC::CallExprLOC(Expr *Fn, SourceLocation lparenloc, Expr **Args,
108 unsigned NumArgs, SourceLocation *commalocs,
109 SourceLocation rparenloc)
110 : CallExpr(Fn, Args, NumArgs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
111 unsigned NumCommas = getNumCommas();
112 if (NumCommas)
113 CommaLocs = new SourceLocation[NumCommas];
114 else
115 CommaLocs = 0;
116
117 for (unsigned i = 0; i != NumCommas; ++i)
118 CommaLocs[i] = commalocs[i];
119}
120
121
122void MemberExpr::dump_impl() const {
123 Base->dump();
Chris Lattner6f3a1172006-08-24 05:19:28 +0000124 std::cerr << (isArrow ? "->" : ".");
125
126 if (MemberDecl)
127 /*TODO: Print MemberDecl*/;
128 std::cerr << "member";
Chris Lattnere165d942006-08-24 04:40:38 +0000129}
130
Chris Lattnere550a4e2006-08-24 06:37:51 +0000131
132void CastExpr::dump_impl() const {
133 std::cerr << "'('";
134 // TODO PRINT TYPE
135 std::cerr << "<type>";
136 std::cerr << "')'";
137 Op->dump();
138}
139
Chris Lattner1b926492006-08-23 06:42:10 +0000140/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
141/// corresponds to, e.g. "<<=".
142const char *BinaryOperator::getOpcodeStr(Opcode Op) {
143 switch (Op) {
144 default: assert(0 && "Unknown binary operator");
145 case Mul: return "*";
146 case Div: return "/";
147 case Rem: return "%";
148 case Add: return "+";
149 case Sub: return "-";
150 case Shl: return "<<";
151 case Shr: return ">>";
152 case LT: return "<";
153 case GT: return ">";
154 case LE: return "<=";
155 case GE: return ">=";
156 case EQ: return "==";
157 case NE: return "!=";
158 case And: return "&";
159 case Xor: return "^";
160 case Or: return "|";
161 case LAnd: return "&&";
162 case LOr: return "||";
163 case Assign: return "=";
164 case MulAssign: return "*=";
165 case DivAssign: return "/=";
166 case RemAssign: return "%=";
167 case AddAssign: return "+=";
168 case SubAssign: return "-=";
169 case ShlAssign: return "<<=";
170 case ShrAssign: return ">>=";
171 case AndAssign: return "&=";
172 case XorAssign: return "^=";
173 case OrAssign: return "|=";
174 case Comma: return ",";
175 }
176}
177
178void BinaryOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000179 LHS->dump();
180 std::cerr << " " << getOpcodeStr(Opc) << " ";
181 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000182}
183
184void ConditionalOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000185 Cond->dump();
186 std::cerr << " ? ";
187 LHS->dump();
188 std::cerr << " : ";
189 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000190}