blob: 5ba5fcbba4d3ca04291731403508a7b193f0ccb6 [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
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090018#include <string>
19#include <unordered_map>
Shinichiro Hamaji5163e042015-07-14 03:51:44 +090020#include <unordered_set>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090021
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090022#include "expr.h"
23#include "stmt.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090024#include "string_piece.h"
Shinichiro Hamajie7992752015-06-29 18:38:35 +090025#include "symtab.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090026
27using namespace std;
28
29class Evaluator;
30class Value;
31
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090032enum struct VarOrigin {
33 UNDEFINED,
34 DEFAULT,
35 ENVIRONMENT,
36 ENVIRONMENT_OVERRIDE,
37 FILE,
38 COMMAND_LINE,
39 OVERRIDE,
40 AUTOMATIC,
41};
42
43const char* GetOriginStr(VarOrigin origin);
44
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090045class Var : public Evaluable {
46 public:
47 virtual ~Var();
48
49 virtual const char* Flavor() const = 0;
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090050 virtual VarOrigin Origin() const = 0;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090051 virtual bool IsDefined() const { return true; }
52
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090053 virtual void AppendVar(Evaluator* ev, Value* v);
54
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090055 virtual StringPiece String() const = 0;
56
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090057 virtual string DebugString() const = 0;
58
59 protected:
60 Var();
61};
62
63class SimpleVar : public Var {
64 public:
Shinichiro Hamaji90e52ce2016-02-10 13:53:41 +090065 explicit SimpleVar(VarOrigin origin);
Shinichiro Hamaji5081c712015-08-14 16:49:20 +090066 SimpleVar(const string& v, VarOrigin origin);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090067
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +090068 virtual const char* Flavor() const override {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090069 return "simple";
70 }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +090071 virtual VarOrigin Origin() const override {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090072 return origin_;
73 }
74
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090075 virtual void Eval(Evaluator* ev, string* s) const override;
76
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +090077 virtual void AppendVar(Evaluator* ev, Value* v) override;
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090078
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090079 virtual StringPiece String() const override;
80
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090081 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090082
Shinichiro Hamaji90e52ce2016-02-10 13:53:41 +090083 string* mutable_value() { return &v_; }
84
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090085 private:
Shinichiro Hamaji5081c712015-08-14 16:49:20 +090086 string v_;
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090087 VarOrigin origin_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090088};
89
90class RecursiveVar : public Var {
91 public:
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090092 RecursiveVar(Value* v, VarOrigin origin, StringPiece orig);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090093
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +090094 virtual const char* Flavor() const override {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090095 return "recursive";
96 }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +090097 virtual VarOrigin Origin() const override {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090098 return origin_;
99 }
100
101 virtual void Eval(Evaluator* ev, string* s) const override;
102
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900103 virtual void AppendVar(Evaluator* ev, Value* v) override;
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +0900104
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900105 virtual StringPiece String() const override;
106
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900107 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900108
109 private:
110 Value* v_;
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +0900111 VarOrigin origin_;
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900112 StringPiece orig_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900113};
114
115class UndefinedVar : public Var {
116 public:
117 UndefinedVar();
118
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900119 virtual const char* Flavor() const override {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900120 return "undefined";
121 }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900122 virtual VarOrigin Origin() const override {
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +0900123 return VarOrigin::UNDEFINED;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900124 }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900125 virtual bool IsDefined() const override { return false; }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900126
127 virtual void Eval(Evaluator* ev, string* s) const override;
128
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900129 virtual StringPiece String() const override;
130
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900131 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900132};
133
134extern UndefinedVar* kUndefined;
135
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900136class RuleVar : public Var {
137 public:
138 RuleVar(Var* v, AssignOp op)
139 : v_(v), op_(op) {}
140 virtual ~RuleVar() {
141 delete v_;
142 }
143
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900144 virtual const char* Flavor() const override {
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900145 return v_->Flavor();
146 }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900147 virtual VarOrigin Origin() const override {
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900148 return v_->Origin();
149 }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900150 virtual bool IsDefined() const override {
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900151 return v_->IsDefined();
152 }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900153 virtual void Eval(Evaluator* ev, string* s) const override {
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900154 v_->Eval(ev, s);
155 }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900156 virtual void AppendVar(Evaluator* ev, Value* v) override {
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900157 v_->AppendVar(ev, v);
158 }
159 virtual StringPiece String() const override {
160 return v_->String();
161 }
162 virtual string DebugString() const override {
163 return v_->DebugString();
164 }
165
166 Var* v() const { return v_; }
167 AssignOp op() const { return op_; }
168
169 private:
170 Var* v_;
171 AssignOp op_;
172};
173
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900174class Vars : public unordered_map<Symbol, Var*> {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900175 public:
176 ~Vars();
177
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900178 Var* Lookup(Symbol name) const;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900179
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900180 void Assign(Symbol name, Var* v);
Shinichiro Hamaji5163e042015-07-14 03:51:44 +0900181
182 static const unordered_set<Symbol>& used_env_vars() {
183 return used_env_vars_;
184 }
185
186 private:
187 static unordered_set<Symbol> used_env_vars_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900188};
189
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900190class ScopedVar {
191 public:
192 // Does not take ownerships of arguments.
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900193 ScopedVar(Vars* vars, Symbol name, Var* var);
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900194 ~ScopedVar();
195
196 private:
197 Vars* vars_;
198 Var* orig_;
199 Vars::iterator iter_;
200};
201
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900202#endif // VAR_H_