blob: b8dc4a1b7a0d4b100bf1d8c8e71628dd766d2040 [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 RULE_H_
16#define RULE_H_
17
Shinichiro Hamajic4f76622016-06-30 13:05:10 +090018#include <functional>
19#include <string>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090020#include <vector>
21
22#include "loc.h"
23#include "log.h"
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090024#include "stmt.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090025#include "string_piece.h"
Shinichiro Hamajie7992752015-06-29 18:38:35 +090026#include "symtab.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090027
28using namespace std;
29
30class Value;
31
32class Rule {
33 public:
34 Rule();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090035
Shinichiro Hamajie30b3be2015-06-19 16:15:42 +090036 Loc cmd_loc() const { return Loc(loc.filename, cmd_lineno); }
37
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090038 string DebugString() const;
39
Sasha Smundakce812f52018-08-15 14:49:39 -070040 void ParseInputs(const StringPiece& inputs_string);
41
42 void ParsePrerequisites(const StringPiece& line,
43 size_t pos,
44 const RuleStmt* rule_stmt);
45
46 static bool IsPatternRule(const StringPiece& target_string) {
47 return target_string.find('%') != string::npos;
48 }
49
Shinichiro Hamajie7992752015-06-29 18:38:35 +090050 vector<Symbol> outputs;
51 vector<Symbol> inputs;
52 vector<Symbol> order_only_inputs;
53 vector<Symbol> output_patterns;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090054 bool is_double_colon;
55 bool is_suffix_rule;
56 vector<Value*> cmds;
57 Loc loc;
58 int cmd_lineno;
59
60 private:
Dan Willemsen3ce083f2017-10-11 22:17:48 -070061 void Error(const string& msg) { ERROR_LOC(loc, "%s", msg.c_str()); }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090062};
63
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090064#endif // RULE_H_