blob: eac1f4529963b73c6a76753c2fd033ff2e0ab09f [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"
Shinichiro Hamajie7992752015-06-29 18:38:35 +090024#include "symtab.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090025#include "value.h"
26
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 Hamajif62e9a72015-06-26 04:18:21 +090065 SimpleVar(shared_ptr<string> v, VarOrigin origin);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090066
67 virtual const char* Flavor() const {
68 return "simple";
69 }
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090070 virtual VarOrigin Origin() const {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090071 return origin_;
72 }
73
74 virtual shared_ptr<string> Eval(Evaluator*) const override {
75 return v_;
76 }
77 virtual void Eval(Evaluator* ev, string* s) const override;
78
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090079 virtual void AppendVar(Evaluator* ev, Value* v);
80
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090081 virtual StringPiece String() const override;
82
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090083 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090084
85 private:
86 shared_ptr<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
94 virtual const char* Flavor() const {
95 return "recursive";
96 }
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090097 virtual VarOrigin Origin() const {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090098 return origin_;
99 }
100
101 virtual void Eval(Evaluator* ev, string* s) const override;
102
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +0900103 virtual void AppendVar(Evaluator* ev, Value* v);
104
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
119 virtual const char* Flavor() const {
120 return "undefined";
121 }
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +0900122 virtual VarOrigin Origin() const {
123 return VarOrigin::UNDEFINED;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900124 }
125 virtual bool IsDefined() const { return false; }
126
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
144 virtual const char* Flavor() const {
145 return v_->Flavor();
146 }
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +0900147 virtual VarOrigin Origin() const {
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900148 return v_->Origin();
149 }
150 virtual bool IsDefined() const {
151 return v_->IsDefined();
152 }
153 virtual void Eval(Evaluator* ev, string* s) const {
154 v_->Eval(ev, s);
155 }
156 virtual void AppendVar(Evaluator* ev, Value* v) {
157 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 Hamaji776ca302015-06-06 03:52:48 +0900181};
182
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900183class ScopedVar {
184 public:
185 // Does not take ownerships of arguments.
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900186 ScopedVar(Vars* vars, Symbol name, Var* var);
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900187 ~ScopedVar();
188
189 private:
190 Vars* vars_;
191 Var* orig_;
192 Vars::iterator iter_;
193};
194
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900195#endif // VAR_H_