blob: 678f2b0b2c8ebd8c946b168fb9639ac2768736b5 [file] [log] [blame]
Fumitoshi Ukai119dc912015-03-30 16:52:41 +09001package main
2
Shinichiro Hamaji52e83aa2015-04-06 17:20:28 +09003import (
4 "fmt"
5 "strings"
6)
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +09007
Fumitoshi Ukai103a7962015-04-08 15:53:53 +09008const BootstrapMakefile = "*bootstrap*"
9
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090010type AST interface {
Fumitoshi Ukaie34c1792015-03-30 17:53:47 +090011 eval(*Evaluator)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090012 show()
13}
14
15type ASTBase struct {
Shinichiro Hamaji685fecf2015-03-30 18:28:12 +090016 filename string
17 lineno int
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090018}
19
20type AssignAST struct {
21 ASTBase
Fumitoshi Ukaib36f3872015-04-10 15:06:38 +090022 // TODO(ukai): use Value.
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090023 lhs string
24 rhs string
25 op string
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090026}
27
Fumitoshi Ukaie34c1792015-03-30 17:53:47 +090028func (ast *AssignAST) eval(ev *Evaluator) {
29 ev.evalAssign(ast)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090030}
31
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090032func (ast *AssignAST) evalRHS(ev *Evaluator, lhs string) Var {
Fumitoshi Ukai103a7962015-04-08 15:53:53 +090033 origin := "file"
34 if ast.filename == BootstrapMakefile {
35 origin = "default"
36 }
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090037 switch ast.op {
38 case ":=":
Fumitoshi Ukai00178d12015-04-18 00:11:05 +090039 rexpr, _, err := parseExpr([]byte(ast.rhs), nil)
40 if err != nil {
41 panic(fmt.Errorf("parse assign rhs %s:%d %v", ast.filename, ast.lineno, err))
42 }
43 return SimpleVar{value: ev.Value(rexpr), origin: origin}
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090044 case "=":
Fumitoshi Ukaib36f3872015-04-10 15:06:38 +090045 v, _, err := parseExpr([]byte(ast.rhs), nil)
46 if err != nil {
47 panic(err)
48 }
49 return RecursiveVar{expr: v, origin: origin}
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090050 case "+=":
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +090051 prev := ev.LookupVarInCurrentScope(lhs)
Fumitoshi Ukaic1847602015-04-02 16:18:02 +090052 if !prev.IsDefined() {
Fumitoshi Ukaib36f3872015-04-10 15:06:38 +090053 v, _, err := parseExpr([]byte(ast.rhs), nil)
54 if err != nil {
55 panic(err)
56 }
57 return RecursiveVar{expr: v, origin: origin}
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090058 }
Fumitoshi Ukaic1847602015-04-02 16:18:02 +090059 return prev.Append(ev, ast.rhs)
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090060 case "?=":
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +090061 prev := ev.LookupVarInCurrentScope(lhs)
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090062 if prev.IsDefined() {
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090063 return prev
64 }
Fumitoshi Ukaib36f3872015-04-10 15:06:38 +090065 v, _, err := parseExpr([]byte(ast.rhs), nil)
66 if err != nil {
67 panic(err)
68 }
69 return RecursiveVar{expr: v, origin: origin}
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090070 default:
71 panic(fmt.Sprintf("unknown assign op: %q", ast.op))
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090072 }
73}
74
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090075func (ast *AssignAST) show() {
Fumitoshi Ukai8773e5e2015-04-01 11:23:18 +090076 Log("%s=%q", ast.lhs, ast.rhs)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090077}
78
Shinichiro Hamajide829712015-03-31 18:26:56 +090079// Note we cannot be sure what this is, until all variables in |expr|
80// are expanded.
81type MaybeRuleAST struct {
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090082 ASTBase
Shinichiro Hamaji486e9de2015-04-09 15:20:32 +090083 expr string
Shinichiro Hamajie12e24d2015-04-11 23:09:20 +090084 equalIndex int
Shinichiro Hamaji486e9de2015-04-09 15:20:32 +090085 semicolonIndex int
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090086}
87
Shinichiro Hamajide829712015-03-31 18:26:56 +090088func (ast *MaybeRuleAST) eval(ev *Evaluator) {
89 ev.evalMaybeRule(ast)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090090}
91
Shinichiro Hamajide829712015-03-31 18:26:56 +090092func (ast *MaybeRuleAST) show() {
93 Log("%s", ast.expr)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090094}
Shinichiro Hamaji685fecf2015-03-30 18:28:12 +090095
Shinichiro Hamaji0b93c862015-04-07 06:15:15 +090096type CommandAST struct {
97 ASTBase
Fumitoshi Ukai103a7962015-04-08 15:53:53 +090098 cmd string
Shinichiro Hamaji0b93c862015-04-07 06:15:15 +090099}
100
101func (ast *CommandAST) eval(ev *Evaluator) {
102 ev.evalCommand(ast)
103}
104
105func (ast *CommandAST) show() {
106 Log("\t%s", strings.Replace(ast.cmd, "\n", `\n`, -1))
107}
108
Shinichiro Hamajid7bef602015-03-30 19:55:32 +0900109type IncludeAST struct {
110 ASTBase
111 expr string
112 op string
113}
114
115func (ast *IncludeAST) eval(ev *Evaluator) {
116 ev.evalInclude(ast)
117}
118
119func (ast *IncludeAST) show() {
120 Log("include %s", ast.expr)
121}
Shinichiro Hamaji497754d2015-03-31 02:02:11 +0900122
123type IfAST struct {
124 ASTBase
Shinichiro Hamajiae32b782015-03-31 14:41:19 +0900125 op string
126 lhs string
127 rhs string // Empty if |op| is ifdef or ifndef.
128 trueStmts []AST
Shinichiro Hamaji497754d2015-03-31 02:02:11 +0900129 falseStmts []AST
130}
131
132func (ast *IfAST) eval(ev *Evaluator) {
133 ev.evalIf(ast)
134}
135
136func (ast *IfAST) show() {
137 // TODO
138 Log("if")
139}