xref: /aosp_15_r20/build/soong/androidmk/parser/ast.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage parser
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workertype Pos int
18*333d2b36SAndroid Build Coastguard Worker
19*333d2b36SAndroid Build Coastguard Workerconst NoPos Pos = 0
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workertype Node interface {
22*333d2b36SAndroid Build Coastguard Worker	Dump() string
23*333d2b36SAndroid Build Coastguard Worker	Pos() Pos
24*333d2b36SAndroid Build Coastguard Worker	End() Pos
25*333d2b36SAndroid Build Coastguard Worker}
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workertype Assignment struct {
28*333d2b36SAndroid Build Coastguard Worker	Target *MakeString
29*333d2b36SAndroid Build Coastguard Worker	Name   *MakeString
30*333d2b36SAndroid Build Coastguard Worker	Value  *MakeString
31*333d2b36SAndroid Build Coastguard Worker	Type   string
32*333d2b36SAndroid Build Coastguard Worker}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workerfunc (x *Assignment) Dump() string {
35*333d2b36SAndroid Build Coastguard Worker	target := ""
36*333d2b36SAndroid Build Coastguard Worker	if x.Target != nil {
37*333d2b36SAndroid Build Coastguard Worker		target = x.Target.Dump() + ": "
38*333d2b36SAndroid Build Coastguard Worker	}
39*333d2b36SAndroid Build Coastguard Worker	return target + x.Name.Dump() + " " + x.Type + " " + x.Value.Dump()
40*333d2b36SAndroid Build Coastguard Worker}
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Workerfunc (x *Assignment) Pos() Pos {
43*333d2b36SAndroid Build Coastguard Worker	if x.Target != nil {
44*333d2b36SAndroid Build Coastguard Worker		return x.Target.Pos()
45*333d2b36SAndroid Build Coastguard Worker	}
46*333d2b36SAndroid Build Coastguard Worker	return x.Name.Pos()
47*333d2b36SAndroid Build Coastguard Worker}
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Workerfunc (x *Assignment) End() Pos { return x.Value.End() }
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Workertype Comment struct {
52*333d2b36SAndroid Build Coastguard Worker	CommentPos Pos
53*333d2b36SAndroid Build Coastguard Worker	Comment    string
54*333d2b36SAndroid Build Coastguard Worker}
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Workerfunc (x *Comment) Dump() string {
57*333d2b36SAndroid Build Coastguard Worker	return "#" + x.Comment
58*333d2b36SAndroid Build Coastguard Worker}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Workerfunc (x *Comment) Pos() Pos { return x.CommentPos }
61*333d2b36SAndroid Build Coastguard Workerfunc (x *Comment) End() Pos { return Pos(int(x.CommentPos) + len(x.Comment)) }
62*333d2b36SAndroid Build Coastguard Worker
63*333d2b36SAndroid Build Coastguard Workertype Directive struct {
64*333d2b36SAndroid Build Coastguard Worker	NamePos Pos
65*333d2b36SAndroid Build Coastguard Worker	Name    string
66*333d2b36SAndroid Build Coastguard Worker	Args    *MakeString
67*333d2b36SAndroid Build Coastguard Worker	EndPos  Pos
68*333d2b36SAndroid Build Coastguard Worker}
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Workerfunc (x *Directive) Dump() string {
71*333d2b36SAndroid Build Coastguard Worker	return x.Name + " " + x.Args.Dump()
72*333d2b36SAndroid Build Coastguard Worker}
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Workerfunc (x *Directive) Pos() Pos { return x.NamePos }
75*333d2b36SAndroid Build Coastguard Workerfunc (x *Directive) End() Pos {
76*333d2b36SAndroid Build Coastguard Worker	if x.EndPos != NoPos {
77*333d2b36SAndroid Build Coastguard Worker		return x.EndPos
78*333d2b36SAndroid Build Coastguard Worker	}
79*333d2b36SAndroid Build Coastguard Worker	return x.Args.End()
80*333d2b36SAndroid Build Coastguard Worker}
81*333d2b36SAndroid Build Coastguard Worker
82*333d2b36SAndroid Build Coastguard Workertype Rule struct {
83*333d2b36SAndroid Build Coastguard Worker	Target        *MakeString
84*333d2b36SAndroid Build Coastguard Worker	Prerequisites *MakeString
85*333d2b36SAndroid Build Coastguard Worker	RecipePos     Pos
86*333d2b36SAndroid Build Coastguard Worker	Recipe        string
87*333d2b36SAndroid Build Coastguard Worker	RecipeEndPos  Pos
88*333d2b36SAndroid Build Coastguard Worker}
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Workerfunc (x *Rule) Dump() string {
91*333d2b36SAndroid Build Coastguard Worker	recipe := ""
92*333d2b36SAndroid Build Coastguard Worker	if x.Recipe != "" {
93*333d2b36SAndroid Build Coastguard Worker		recipe = "\n" + x.Recipe
94*333d2b36SAndroid Build Coastguard Worker	}
95*333d2b36SAndroid Build Coastguard Worker	return "rule:       " + x.Target.Dump() + ": " + x.Prerequisites.Dump() + recipe
96*333d2b36SAndroid Build Coastguard Worker}
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Workerfunc (x *Rule) Pos() Pos { return x.Target.Pos() }
99*333d2b36SAndroid Build Coastguard Workerfunc (x *Rule) End() Pos { return x.RecipeEndPos }
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Workertype Variable struct {
102*333d2b36SAndroid Build Coastguard Worker	Name *MakeString
103*333d2b36SAndroid Build Coastguard Worker}
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Workerfunc (x *Variable) Pos() Pos { return x.Name.Pos() }
106*333d2b36SAndroid Build Coastguard Workerfunc (x *Variable) End() Pos { return x.Name.End() }
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Workerfunc (x *Variable) Dump() string {
109*333d2b36SAndroid Build Coastguard Worker	return "$(" + x.Name.Dump() + ")"
110*333d2b36SAndroid Build Coastguard Worker}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Worker// Sort interface for []Node by position
113*333d2b36SAndroid Build Coastguard Workertype byPosition []Node
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Workerfunc (s byPosition) Len() int {
116*333d2b36SAndroid Build Coastguard Worker	return len(s)
117*333d2b36SAndroid Build Coastguard Worker}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Workerfunc (s byPosition) Swap(i, j int) {
120*333d2b36SAndroid Build Coastguard Worker	s[i], s[j] = s[j], s[i]
121*333d2b36SAndroid Build Coastguard Worker}
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Workerfunc (s byPosition) Less(i, j int) bool {
124*333d2b36SAndroid Build Coastguard Worker	return s[i].Pos() < s[j].Pos()
125*333d2b36SAndroid Build Coastguard Worker}
126