blob: cf6dd2d838cf703b0772ba7cb1b3926b58862759 [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
Dan Willemsen276e96a2017-10-03 14:24:48 -070018#include <memory>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090019#include <string>
20#include <unordered_map>
Shinichiro Hamaji5163e042015-07-14 03:51:44 +090021#include <unordered_set>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090022
Dan Willemsen276e96a2017-10-03 14:24:48 -070023#include "eval.h"
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090024#include "expr.h"
Dan Willemsen276e96a2017-10-03 14:24:48 -070025#include "log.h"
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090026#include "stmt.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090027#include "string_piece.h"
Shinichiro Hamajie7992752015-06-29 18:38:35 +090028#include "symtab.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090029
30using namespace std;
31
32class Evaluator;
33class Value;
34
Sasha Smundakae1d58c2018-08-22 09:39:42 -070035enum struct VarOrigin : char {
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +090036 UNDEFINED,
37 DEFAULT,
38 ENVIRONMENT,
39 ENVIRONMENT_OVERRIDE,
40 FILE,
41 COMMAND_LINE,
42 OVERRIDE,
43 AUTOMATIC,
44};
45
46const char* GetOriginStr(VarOrigin origin);
47
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090048class Var : public Evaluable {
49 public:
50 virtual ~Var();
51
52 virtual const char* Flavor() const = 0;
Sasha Smundakae1d58c2018-08-22 09:39:42 -070053
54 VarOrigin Origin() { return origin_; }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090055 virtual bool IsDefined() const { return true; }
56
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090057 virtual void AppendVar(Evaluator* ev, Value* v);
58
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090059 virtual StringPiece String() const = 0;
60
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090061 virtual string DebugString() const = 0;
62
Dan Willemsenf87d49e2016-09-29 20:09:47 -070063 bool ReadOnly() const { return readonly_; }
64 void SetReadOnly() { readonly_ = true; }
65
Sasha Smundakae1d58c2018-08-22 09:39:42 -070066 bool Deprecated() const { return deprecated_; }
67 void SetDeprecated(const StringPiece& msg);
Dan Willemsen276e96a2017-10-03 14:24:48 -070068
Sasha Smundakae1d58c2018-08-22 09:39:42 -070069 bool Obsolete() const { return obsolete_; }
70 void SetObsolete(const StringPiece& msg);
Dan Willemsen276e96a2017-10-03 14:24:48 -070071
Sasha Smundakae1d58c2018-08-22 09:39:42 -070072 const string& DeprecatedMessage() const;
Dan Willemsen276e96a2017-10-03 14:24:48 -070073
74 // This variable was used (either written or read from)
Sasha Smundakae1d58c2018-08-22 09:39:42 -070075 void Used(Evaluator* ev, const Symbol& sym) const;
Dan Willemsen276e96a2017-10-03 14:24:48 -070076
Sasha Smundakae1d58c2018-08-22 09:39:42 -070077 AssignOp op() const { return assign_op_; }
78 void SetAssignOp(AssignOp op) { assign_op_ = op; }
79
Dan Willemsenee57a3f2018-11-05 16:18:44 -080080 static Var* Undefined();
Dan Willemsen276e96a2017-10-03 14:24:48 -070081
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090082 protected:
83 Var();
Sasha Smundakae1d58c2018-08-22 09:39:42 -070084 explicit Var(VarOrigin origin);
Dan Willemsenf87d49e2016-09-29 20:09:47 -070085
86 private:
Sasha Smundakae1d58c2018-08-22 09:39:42 -070087 const VarOrigin origin_;
88 AssignOp assign_op_;
Dan Willemsenee57a3f2018-11-05 16:18:44 -080089 bool readonly_ : 1;
90 bool deprecated_ : 1;
91 bool obsolete_ : 1;
Sasha Smundakae1d58c2018-08-22 09:39:42 -070092
Dan Willemsenee57a3f2018-11-05 16:18:44 -080093 const char* diagnostic_message_text() const;
Sasha Smundakae1d58c2018-08-22 09:39:42 -070094
Dan Willemsenee57a3f2018-11-05 16:18:44 -080095 static unordered_map<const Var*, string> diagnostic_messages_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090096};
97
98class SimpleVar : public Var {
99 public:
Shinichiro Hamaji90e52ce2016-02-10 13:53:41 +0900100 explicit SimpleVar(VarOrigin origin);
Shinichiro Hamaji5081c712015-08-14 16:49:20 +0900101 SimpleVar(const string& v, VarOrigin origin);
Sasha Smundakae1d58c2018-08-22 09:39:42 -0700102 SimpleVar(VarOrigin, Evaluator* ev, Value* v);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900103
Dan Willemsen3ce083f2017-10-11 22:17:48 -0700104 virtual const char* Flavor() const override { return "simple"; }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900105
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900106 virtual void Eval(Evaluator* ev, string* s) const override;
107
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900108 virtual void AppendVar(Evaluator* ev, Value* v) override;
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +0900109
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900110 virtual StringPiece String() const override;
111
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900112 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900113
114 private:
Shinichiro Hamaji5081c712015-08-14 16:49:20 +0900115 string v_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900116};
117
118class RecursiveVar : public Var {
119 public:
Shinichiro Hamajif62e9a72015-06-26 04:18:21 +0900120 RecursiveVar(Value* v, VarOrigin origin, StringPiece orig);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900121
Dan Willemsen3ce083f2017-10-11 22:17:48 -0700122 virtual const char* Flavor() const override { return "recursive"; }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900123
124 virtual void Eval(Evaluator* ev, string* s) const override;
125
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900126 virtual void AppendVar(Evaluator* ev, Value* v) override;
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +0900127
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 private:
133 Value* v_;
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900134 StringPiece orig_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900135};
136
137class UndefinedVar : public Var {
138 public:
139 UndefinedVar();
140
Dan Willemsen3ce083f2017-10-11 22:17:48 -0700141 virtual const char* Flavor() const override { return "undefined"; }
Shinichiro Hamaji4b351ab2016-02-12 19:42:30 +0900142 virtual bool IsDefined() const override { return false; }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900143
144 virtual void Eval(Evaluator* ev, string* s) const override;
145
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900146 virtual StringPiece String() const override;
147
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900148 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900149};
150
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900151class Vars : public unordered_map<Symbol, Var*> {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900152 public:
153 ~Vars();
154
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900155 Var* Lookup(Symbol name) const;
Dan Willemsenff90ea32017-11-21 13:22:26 -0800156 Var* Peek(Symbol name) const;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900157
Dan Willemsenf87d49e2016-09-29 20:09:47 -0700158 void Assign(Symbol name, Var* v, bool* readonly);
Shinichiro Hamaji5163e042015-07-14 03:51:44 +0900159
Shinichiro Hamajic9b9e5e2016-02-18 18:18:54 +0900160 static void add_used_env_vars(Symbol v);
161
Sasha Smundak8174f9b2018-08-13 11:07:30 -0700162 static const SymbolSet used_env_vars() { return used_env_vars_; }
Shinichiro Hamaji5163e042015-07-14 03:51:44 +0900163
164 private:
Sasha Smundak8174f9b2018-08-13 11:07:30 -0700165 static SymbolSet used_env_vars_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900166};
167
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900168class ScopedVar {
169 public:
170 // Does not take ownerships of arguments.
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900171 ScopedVar(Vars* vars, Symbol name, Var* var);
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900172 ~ScopedVar();
173
174 private:
175 Vars* vars_;
176 Var* orig_;
177 Vars::iterator iter_;
178};
179
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900180#endif // VAR_H_