1 // Copyright 2015 Google Inc. All rights reserved
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // +build ignore
16
17 #include "stmt.h"
18
19 #include "eval.h"
20 #include "expr.h"
21 #include "stringprintf.h"
22 #include "strutil.h"
23
Stmt()24 Stmt::Stmt() {}
25
~Stmt()26 Stmt::~Stmt() {}
27
DebugString() const28 string RuleStmt::DebugString() const {
29 return StringPrintf("RuleStmt(expr=%s term=%d after_term=%s loc=%s:%d)",
30 expr->DebugString().c_str(),
31 term,
32 after_term->DebugString().c_str(),
33 LOCF(loc()));
34 }
35
DebugString() const36 string AssignStmt::DebugString() const {
37 const char* opstr = "???";
38 switch (op) {
39 case AssignOp::EQ: opstr = "EQ"; break;
40 case AssignOp::COLON_EQ: opstr = "COLON_EQ"; break;
41 case AssignOp::PLUS_EQ: opstr = "PLUS_EQ"; break;
42 case AssignOp::QUESTION_EQ: opstr = "QUESTION_EQ"; break;
43 }
44 const char* dirstr = "???";
45 switch (directive) {
46 case AssignDirective::NONE: dirstr = ""; break;
47 case AssignDirective::OVERRIDE: dirstr = "override"; break;
48 case AssignDirective::EXPORT: dirstr = "export"; break;
49 }
50 return StringPrintf("AssignStmt(lhs=%s rhs=%s (%s) "
51 "opstr=%s dir=%s loc=%s:%d)",
52 lhs->DebugString().c_str(),
53 rhs->DebugString().c_str(),
54 NoLineBreak(orig_rhs.as_string()).c_str(),
55 opstr, dirstr, LOCF(loc()));
56 }
57
GetLhsSymbol(Evaluator * ev) const58 Symbol AssignStmt::GetLhsSymbol(Evaluator* ev) const {
59 if (!lhs->IsLiteral()) {
60 string buf;
61 lhs->Eval(ev, &buf);
62 return Intern(buf);
63 }
64
65 if (!lhs_sym_cache_.IsValid()) {
66 lhs_sym_cache_ = Intern(lhs->GetLiteralValueUnsafe());
67 }
68 return lhs_sym_cache_;
69 }
70
DebugString() const71 string CommandStmt::DebugString() const {
72 return StringPrintf("CommandStmt(%s, loc=%s:%d)",
73 expr->DebugString().c_str(), LOCF(loc()));
74 }
75
DebugString() const76 string IfStmt::DebugString() const {
77 const char* opstr = "???";
78 switch (op) {
79 case CondOp::IFEQ: opstr = "ifeq"; break;
80 case CondOp::IFNEQ: opstr = "ifneq"; break;
81 case CondOp::IFDEF: opstr = "ifdef"; break;
82 case CondOp::IFNDEF: opstr = "ifndef"; break;
83 }
84 return StringPrintf("IfStmt(op=%s, lhs=%s, rhs=%s t=%zu f=%zu loc=%s:%d)",
85 opstr,
86 lhs->DebugString().c_str(),
87 rhs->DebugString().c_str(),
88 true_stmts.size(),
89 false_stmts.size(),
90 LOCF(loc()));
91 }
92
DebugString() const93 string IncludeStmt::DebugString() const {
94 return StringPrintf("IncludeStmt(%s, loc=%s:%d)",
95 expr->DebugString().c_str(), LOCF(loc()));
96 }
97
DebugString() const98 string ExportStmt::DebugString() const {
99 return StringPrintf("ExportStmt(%s, %d, loc=%s:%d)",
100 expr->DebugString().c_str(),
101 is_export,
102 LOCF(loc()));
103 }
104
DebugString() const105 string ParseErrorStmt::DebugString() const {
106 return StringPrintf("ParseErrorStmt(%s, loc=%s:%d)",
107 msg.c_str(),
108 LOCF(loc()));
109 }
110
~RuleStmt()111 RuleStmt::~RuleStmt() {
112 delete expr;
113 delete after_term;
114 }
115
Eval(Evaluator * ev) const116 void RuleStmt::Eval(Evaluator* ev) const {
117 ev->EvalRule(this);
118 }
119
~AssignStmt()120 AssignStmt::~AssignStmt() {
121 delete lhs;
122 delete rhs;
123 }
124
Eval(Evaluator * ev) const125 void AssignStmt::Eval(Evaluator* ev) const {
126 ev->EvalAssign(this);
127 }
128
~CommandStmt()129 CommandStmt::~CommandStmt() {
130 delete expr;
131 }
132
Eval(Evaluator * ev) const133 void CommandStmt::Eval(Evaluator* ev) const {
134 ev->EvalCommand(this);
135 }
136
~IfStmt()137 IfStmt::~IfStmt() {
138 delete lhs;
139 delete rhs;
140 }
141
Eval(Evaluator * ev) const142 void IfStmt::Eval(Evaluator* ev) const {
143 ev->EvalIf(this);
144 }
145
~IncludeStmt()146 IncludeStmt::~IncludeStmt() {
147 delete expr;
148 }
149
Eval(Evaluator * ev) const150 void IncludeStmt::Eval(Evaluator* ev) const {
151 ev->EvalInclude(this);
152 }
153
~ExportStmt()154 ExportStmt::~ExportStmt() {
155 delete expr;
156 }
157
Eval(Evaluator * ev) const158 void ExportStmt::Eval(Evaluator* ev) const {
159 ev->EvalExport(this);
160 }
161
~ParseErrorStmt()162 ParseErrorStmt::~ParseErrorStmt() {
163 }
164
Eval(Evaluator * ev) const165 void ParseErrorStmt::Eval(Evaluator* ev) const {
166 ev->set_loc(loc());
167 ev->Error(msg);
168 }
169