Implement $(MAKEFILE_LIST)
diff --git a/parser.go b/parser.go
index ae44095..18b7183 100644
--- a/parser.go
+++ b/parser.go
@@ -11,7 +11,8 @@
)
type Makefile struct {
- stmts []AST
+ filename string
+ stmts []AST
}
type ifState struct {
@@ -22,7 +23,6 @@
type parser struct {
rd *bufio.Reader
mk Makefile
- filename string
lineno int
elineno int // lineno == elineno unless there is trailing '\'.
unBuf []byte
@@ -45,8 +45,8 @@
func newParser(rd io.Reader, filename string) *parser {
p := &parser{
rd: bufio.NewReader(rd),
- filename: filename,
}
+ p.mk.filename = filename
p.outStmts = &p.mk.stmts
return p
}
@@ -134,7 +134,7 @@
rhs: string(bytes.TrimLeft(line[esep:], " \t")),
op: string(line[sep:esep]),
}
- ast.filename = p.filename
+ ast.filename = p.mk.filename
ast.lineno = p.lineno
return ast
}
@@ -151,7 +151,7 @@
} else {
ast.expr = line
}
- ast.filename = p.filename
+ ast.filename = p.mk.filename
ast.lineno = p.lineno
/*
ast.cmdLineno = p.elineno + 1
@@ -175,7 +175,7 @@
expr: line[oplen+1:],
op: line[:oplen],
}
- ast.filename = p.filename
+ ast.filename = p.mk.filename
ast.lineno = p.lineno
return ast
}
@@ -185,7 +185,7 @@
op: line[:oplen],
lhs: strings.TrimSpace(line[oplen+1:]),
}
- ast.filename = p.filename
+ ast.filename = p.mk.filename
ast.lineno = p.lineno
p.addStatement(ast)
p.ifStack = append(p.ifStack, ifState{ast: ast})
@@ -287,7 +287,7 @@
func (p *parser) parseIfeq(line string, oplen int) AST {
lhs, rhs, ok := parseEq(strings.TrimSpace(line[oplen+1:]))
if !ok {
- Error(p.filename, p.lineno, `*** invalid syntax in conditional.`)
+ Error(p.mk.filename, p.lineno, `*** invalid syntax in conditional.`)
}
ast := &IfAST{
@@ -295,7 +295,7 @@
lhs: lhs,
rhs: rhs,
}
- ast.filename = p.filename
+ ast.filename = p.mk.filename
ast.lineno = p.lineno
p.addStatement(ast)
p.ifStack = append(p.ifStack, ifState{ast: ast})
@@ -305,7 +305,7 @@
func (p *parser) checkIfStack(curKeyword string) {
if len(p.ifStack) == 0 {
- Error(p.filename, p.lineno, `*** extraneous %q.`, curKeyword)
+ Error(p.mk.filename, p.lineno, `*** extraneous %q.`, curKeyword)
}
}
@@ -313,7 +313,7 @@
p.checkIfStack("else")
state := &p.ifStack[len(p.ifStack)-1]
if state.inElse {
- Error(p.filename, p.lineno, `*** only one "else" per conditional.`)
+ Error(p.mk.filename, p.lineno, `*** only one "else" per conditional.`)
}
state.inElse = true
p.outStmts = &state.ast.falseStmts
@@ -412,7 +412,7 @@
rhs: strings.Join(p.inDef[1:], "\n"),
op: "=",
}
- ast.filename = p.filename
+ ast.filename = p.mk.filename
ast.lineno = p.lineno - len(p.inDef)
p.addStatement(ast)
p.inDef = nil
@@ -427,7 +427,7 @@
}
if line[0] == '\t' {
ast := &CommandAST{cmd: string(p.processRecipeLine(line[1:]))}
- ast.filename = p.filename
+ ast.filename = p.mk.filename
ast.lineno = p.lineno
p.addStatement(ast)
continue
@@ -446,7 +446,7 @@
parenStack = append(parenStack, ch)
case ')', '}':
if len(parenStack) == 0 {
- Warn(p.filename, p.lineno, "Unmatched parens: %s", line)
+ Warn(p.mk.filename, p.lineno, "Unmatched parens: %s", line)
} else {
parenStack = parenStack[:len(parenStack)-1]
}