Improve makefile parser
Improve the androidmk makefile parser based on ideas from go/ast and
friends:
- Use type switching instead of the As* mess
- Don't store endPos for every node, compute it based on the last
known position in the node plus the length of the last token
- Store positions as only the offset into the file, and then unpack
them into Line/Column scanner.Position objects later
Change-Id: I87eb6661859951e6c2ea5a85db6229fa5561d615
diff --git a/androidmk/parser/make_strings.go b/androidmk/parser/make_strings.go
index 558853f..00d331b 100644
--- a/androidmk/parser/make_strings.go
+++ b/androidmk/parser/make_strings.go
@@ -2,7 +2,6 @@
import (
"strings"
- "text/scanner"
"unicode"
)
@@ -18,18 +17,30 @@
// of Variables. The raw string list is always one longer than the variable
// list.
type MakeString struct {
- Pos scanner.Position
+ StringPos Pos
Strings []string
Variables []Variable
}
-func SimpleMakeString(s string, pos scanner.Position) *MakeString {
+func SimpleMakeString(s string, pos Pos) *MakeString {
return &MakeString{
- Pos: pos,
- Strings: []string{s},
+ StringPos: pos,
+ Strings: []string{s},
}
}
+func (ms *MakeString) Pos() Pos {
+ return ms.StringPos
+}
+
+func (ms *MakeString) End() Pos {
+ pos := ms.StringPos
+ if len(ms.Strings) > 1 {
+ pos = ms.Variables[len(ms.Variables)-1].End()
+ }
+ return Pos(int(pos) + len(ms.Strings[len(ms.Strings)-1]))
+}
+
func (ms *MakeString) appendString(s string) {
if len(ms.Strings) == 0 {
ms.Strings = []string{s}
@@ -97,7 +108,7 @@
func (ms *MakeString) SplitN(sep string, n int) []*MakeString {
ret := []*MakeString{}
- curMs := SimpleMakeString("", ms.Pos)
+ curMs := SimpleMakeString("", ms.Pos())
var i int
var s string
@@ -115,7 +126,7 @@
for _, r := range split[1:] {
ret = append(ret, curMs)
- curMs = SimpleMakeString(r, ms.Pos)
+ curMs = SimpleMakeString(r, ms.Pos())
}
} else {
curMs.appendString(s)
@@ -131,7 +142,9 @@
}
func (ms *MakeString) TrimLeftSpaces() {
+ l := len(ms.Strings[0])
ms.Strings[0] = strings.TrimLeftFunc(ms.Strings[0], unicode.IsSpace)
+ ms.StringPos += Pos(len(ms.Strings[0]) - l)
}
func (ms *MakeString) TrimRightSpaces() {