blob: 85f3490e0b8d233e4a61b13752f228fd7c925268 [file] [log] [blame]
Shinichiro Hamaji1d545aa2015-06-23 15:29:13 +09001// 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
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090015#ifndef VAR_H_
16#define VAR_H_
17
18#include <memory>
19#include <string>
20#include <unordered_map>
21
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +090022#include "ast.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090023#include "string_piece.h"
24#include "value.h"
25
26using namespace std;
27
28class Evaluator;
29class Value;
30
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090031enum struct VarOrigin {
32 UNDEFINED,
33 DEFAULT,
34 ENVIRONMENT,
35 ENVIRONMENT_OVERRIDE,
36 FILE,
37 COMMAND_LINE,
38 OVERRIDE,
39 AUTOMATIC,
40};
41
42const char* GetOriginStr(VarOrigin origin);
43
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090044class Var : public Evaluable {
45 public:
46 virtual ~Var();
47
48 virtual const char* Flavor() const = 0;
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090049 virtual VarOrigin Origin() const = 0;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090050 virtual bool IsDefined() const { return true; }
51
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090052 virtual void AppendVar(Evaluator* ev, Value* v);
53
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090054 virtual StringPiece String() const = 0;
55
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090056 virtual string DebugString() const = 0;
57
58 protected:
59 Var();
60};
61
62class SimpleVar : public Var {
63 public:
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090064 SimpleVar(shared_ptr<string> v, VarOrigin origin);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090065
66 virtual const char* Flavor() const {
67 return "simple";
68 }
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090069 virtual VarOrigin Origin() const {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090070 return origin_;
71 }
72
73 virtual shared_ptr<string> Eval(Evaluator*) const override {
74 return v_;
75 }
76 virtual void Eval(Evaluator* ev, string* s) const override;
77
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090078 virtual void AppendVar(Evaluator* ev, Value* v);
79
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090080 virtual StringPiece String() const override;
81
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090082 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090083
84 private:
85 shared_ptr<string> v_;
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090086 VarOrigin origin_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090087};
88
89class RecursiveVar : public Var {
90 public:
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090091 RecursiveVar(Value* v, VarOrigin origin, StringPiece orig);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090092
93 virtual const char* Flavor() const {
94 return "recursive";
95 }
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090096 virtual VarOrigin Origin() const {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090097 return origin_;
98 }
99
100 virtual void Eval(Evaluator* ev, string* s) const override;
101
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +0900102 virtual void AppendVar(Evaluator* ev, Value* v);
103
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900104 virtual StringPiece String() const override;
105
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900106 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900107
108 private:
109 Value* v_;
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +0900110 VarOrigin origin_;
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900111 StringPiece orig_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900112};
113
114class UndefinedVar : public Var {
115 public:
116 UndefinedVar();
117
118 virtual const char* Flavor() const {
119 return "undefined";
120 }
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +0900121 virtual VarOrigin Origin() const {
122 return VarOrigin::UNDEFINED;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900123 }
124 virtual bool IsDefined() const { return false; }
125
126 virtual void Eval(Evaluator* ev, string* s) const override;
127
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900128 virtual StringPiece String() const override;
129
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900130 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900131};
132
133extern UndefinedVar* kUndefined;
134
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900135class RuleVar : public Var {
136 public:
137 RuleVar(Var* v, AssignOp op)
138 : v_(v), op_(op) {}
139 virtual ~RuleVar() {
140 delete v_;
141 }
142
143 virtual const char* Flavor() const {
144 return v_->Flavor();
145 }
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +0900146 virtual VarOrigin Origin() const {
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900147 return v_->Origin();
148 }
149 virtual bool IsDefined() const {
150 return v_->IsDefined();
151 }
152 virtual void Eval(Evaluator* ev, string* s) const {
153 v_->Eval(ev, s);
154 }
155 virtual void AppendVar(Evaluator* ev, Value* v) {
156 v_->AppendVar(ev, v);
157 }
158 virtual StringPiece String() const override {
159 return v_->String();
160 }
161 virtual string DebugString() const override {
162 return v_->DebugString();
163 }
164
165 Var* v() const { return v_; }
166 AssignOp op() const { return op_; }
167
168 private:
169 Var* v_;
170 AssignOp op_;
171};
172
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900173class Vars : public unordered_map<StringPiece, Var*> {
174 public:
175 ~Vars();
176
177 Var* Lookup(StringPiece name) const;
178
179 void Assign(StringPiece name, Var* v);
180};
181
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900182class ScopedVar {
183 public:
184 // Does not take ownerships of arguments.
185 ScopedVar(Vars* vars, StringPiece name, Var* var);
186 ~ScopedVar();
187
188 private:
189 Vars* vars_;
190 Var* orig_;
191 Vars::iterator iter_;
192};
193
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900194#endif // VAR_H_