• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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