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