summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--androidmk/cmd/androidmk/androidmk.go20
-rw-r--r--androidmk/cmd/androidmk/androidmk_test.go35
2 files changed, 51 insertions, 4 deletions
diff --git a/androidmk/cmd/androidmk/androidmk.go b/androidmk/cmd/androidmk/androidmk.go
index a49f6200b..5cb3f7ac8 100644
--- a/androidmk/cmd/androidmk/androidmk.go
+++ b/androidmk/cmd/androidmk/androidmk.go
@@ -80,11 +80,23 @@ func (f *bpFile) addErrorText(message string) {
}
func (f *bpFile) setMkPos(pos, end scanner.Position) {
- if pos.Line < f.mkPos.Line {
- panic(fmt.Errorf("out of order lines, %q after %q", pos, f.mkPos))
+ // It is unusual but not forbidden for pos.Line to be smaller than f.mkPos.Line
+ // For example:
+ //
+ // if true # this line is emitted 1st
+ // if true # this line is emitted 2nd
+ // some-target: some-file # this line is emitted 3rd
+ // echo doing something # this recipe is emitted 6th
+ // endif #some comment # this endif is emitted 4th; this comment is part of the recipe
+ // echo doing more stuff # this is part of the recipe
+ // endif # this endif is emitted 5th
+ //
+ // However, if pos.Line < f.mkPos.Line, we treat it as though it were equal
+ if pos.Line >= f.mkPos.Line {
+ f.bpPos.Line += (pos.Line - f.mkPos.Line)
+ f.mkPos = end
}
- f.bpPos.Line += (pos.Line - f.mkPos.Line)
- f.mkPos = end
+
}
type conditional struct {
diff --git a/androidmk/cmd/androidmk/androidmk_test.go b/androidmk/cmd/androidmk/androidmk_test.go
index 4681a7d24..0b8654097 100644
--- a/androidmk/cmd/androidmk/androidmk_test.go
+++ b/androidmk/cmd/androidmk/androidmk_test.go
@@ -425,6 +425,41 @@ cc_library_shared {
}
}`,
},
+ {
+ // the important part of this test case is that it confirms that androidmk doesn't
+ // panic in this case
+ desc: "multiple directives inside recipe",
+ in: `
+ifeq ($(a),true)
+ifeq ($(b),false)
+imABuildStatement: somefile
+ echo begin
+endif # a==true
+ echo middle
+endif # b==false
+ echo end
+`,
+ expected: `
+// ANDROIDMK TRANSLATION ERROR: unsupported conditional
+// ifeq ($(a),true)
+
+// ANDROIDMK TRANSLATION ERROR: unsupported conditional
+// ifeq ($(b),false)
+
+// ANDROIDMK TRANSLATION ERROR: unsupported line
+// rule: imABuildStatement: somefile
+// echo begin
+// # a==true
+// echo middle
+// # b==false
+// echo end
+//
+// ANDROIDMK TRANSLATION ERROR: endif from unsupported contitional
+// endif
+// ANDROIDMK TRANSLATION ERROR: endif from unsupported contitional
+// endif
+ `,
+ },
}
func reformatBlueprint(input string) string {