blob: 96816e2aaddec8b9a411a734536a56af01c97f50 [file] [log] [blame]
Fumitoshi Ukai119dc912015-03-30 16:52:41 +09001package main
2
Shinichiro Hamaji52e83aa2015-04-06 17:20:28 +09003import (
Fumitoshi Ukaib06cd9d2015-05-07 12:56:12 +09004 "bytes"
Shinichiro Hamaji52e83aa2015-04-06 17:20:28 +09005 "fmt"
6 "strings"
7)
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +09008
Fumitoshi Ukai103a7962015-04-08 15:53:53 +09009const BootstrapMakefile = "*bootstrap*"
10
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090011type AST interface {
Fumitoshi Ukaie34c1792015-03-30 17:53:47 +090012 eval(*Evaluator)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090013 show()
14}
15
16type ASTBase struct {
Shinichiro Hamaji685fecf2015-03-30 18:28:12 +090017 filename string
18 lineno int
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090019}
20
21type AssignAST struct {
22 ASTBase
Fumitoshi Ukaib36f3872015-04-10 15:06:38 +090023 // TODO(ukai): use Value.
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090024 lhs string
25 rhs string
26 op string
Fumitoshi Ukaib2c300f2015-04-23 00:59:26 +090027 opt string // "override", "export"
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090028}
29
Fumitoshi Ukaie34c1792015-03-30 17:53:47 +090030func (ast *AssignAST) eval(ev *Evaluator) {
31 ev.evalAssign(ast)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090032}
33
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090034func (ast *AssignAST) evalRHS(ev *Evaluator, lhs string) Var {
Fumitoshi Ukai103a7962015-04-08 15:53:53 +090035 origin := "file"
36 if ast.filename == BootstrapMakefile {
37 origin = "default"
38 }
Fumitoshi Ukaib2c300f2015-04-23 00:59:26 +090039 if ast.opt == "override" {
40 origin = "override"
41 }
42 // TODO(ukai): handle ast.opt == "export"
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090043 switch ast.op {
44 case ":=":
Fumitoshi Ukai00178d12015-04-18 00:11:05 +090045 rexpr, _, err := parseExpr([]byte(ast.rhs), nil)
46 if err != nil {
47 panic(fmt.Errorf("parse assign rhs %s:%d %v", ast.filename, ast.lineno, err))
48 }
Fumitoshi Ukaib06cd9d2015-05-07 12:56:12 +090049 var buf bytes.Buffer
50 rexpr.Eval(&buf, ev)
51 return SimpleVar{value: buf.Bytes(), origin: origin}
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090052 case "=":
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}
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090058 case "+=":
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +090059 prev := ev.LookupVarInCurrentScope(lhs)
Fumitoshi Ukaic1847602015-04-02 16:18:02 +090060 if !prev.IsDefined() {
Fumitoshi Ukaib36f3872015-04-10 15:06:38 +090061 v, _, err := parseExpr([]byte(ast.rhs), nil)
62 if err != nil {
63 panic(err)
64 }
65 return RecursiveVar{expr: v, origin: origin}
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090066 }
Fumitoshi Ukaic1847602015-04-02 16:18:02 +090067 return prev.Append(ev, ast.rhs)
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090068 case "?=":
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +090069 prev := ev.LookupVarInCurrentScope(lhs)
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090070 if prev.IsDefined() {
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090071 return prev
72 }
Fumitoshi Ukaib36f3872015-04-10 15:06:38 +090073 v, _, err := parseExpr([]byte(ast.rhs), nil)
74 if err != nil {
75 panic(err)
76 }
77 return RecursiveVar{expr: v, origin: origin}
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090078 default:
79 panic(fmt.Sprintf("unknown assign op: %q", ast.op))
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090080 }
81}
82
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090083func (ast *AssignAST) show() {
Fumitoshi Ukaib2c300f2015-04-23 00:59:26 +090084 Log("%s %s %s %q", ast.opt, ast.lhs, ast.op, ast.rhs)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090085}
86
Shinichiro Hamajide829712015-03-31 18:26:56 +090087// Note we cannot be sure what this is, until all variables in |expr|
88// are expanded.
89type MaybeRuleAST struct {
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090090 ASTBase
Shinichiro Hamaji486e9de2015-04-09 15:20:32 +090091 expr string
Shinichiro Hamajie12e24d2015-04-11 23:09:20 +090092 equalIndex int
Shinichiro Hamaji486e9de2015-04-09 15:20:32 +090093 semicolonIndex int
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090094}
95
Shinichiro Hamajide829712015-03-31 18:26:56 +090096func (ast *MaybeRuleAST) eval(ev *Evaluator) {
97 ev.evalMaybeRule(ast)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090098}
99
Shinichiro Hamajide829712015-03-31 18:26:56 +0900100func (ast *MaybeRuleAST) show() {
101 Log("%s", ast.expr)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900102}
Shinichiro Hamaji685fecf2015-03-30 18:28:12 +0900103
Shinichiro Hamaji0b93c862015-04-07 06:15:15 +0900104type CommandAST struct {
105 ASTBase
Fumitoshi Ukai103a7962015-04-08 15:53:53 +0900106 cmd string
Shinichiro Hamaji0b93c862015-04-07 06:15:15 +0900107}
108
109func (ast *CommandAST) eval(ev *Evaluator) {
110 ev.evalCommand(ast)
111}
112
113func (ast *CommandAST) show() {
114 Log("\t%s", strings.Replace(ast.cmd, "\n", `\n`, -1))
115}
116
Shinichiro Hamajid7bef602015-03-30 19:55:32 +0900117type IncludeAST struct {
118 ASTBase
119 expr string
120 op string
121}
122
123func (ast *IncludeAST) eval(ev *Evaluator) {
124 ev.evalInclude(ast)
125}
126
127func (ast *IncludeAST) show() {
128 Log("include %s", ast.expr)
129}
Shinichiro Hamaji497754d2015-03-31 02:02:11 +0900130
131type IfAST struct {
132 ASTBase
Shinichiro Hamajiae32b782015-03-31 14:41:19 +0900133 op string
134 lhs string
135 rhs string // Empty if |op| is ifdef or ifndef.
136 trueStmts []AST
Shinichiro Hamaji497754d2015-03-31 02:02:11 +0900137 falseStmts []AST
138}
139
140func (ast *IfAST) eval(ev *Evaluator) {
141 ev.evalIf(ast)
142}
143
144func (ast *IfAST) show() {
145 // TODO
146 Log("if")
147}
Shinichiro Hamaji7e521422015-05-29 14:23:30 +0900148
149type ExportAST struct {
150 ASTBase
151 name string
152 export bool
153}
154
155func (ast *ExportAST) eval(ev *Evaluator) {
156 ev.evalExport(ast)
157}
158
159func (ast *ExportAST) show() {
160 // TODO
161 Log("if")
162}