|  | // Copyright 2023 The Dawn & Tint Authors. | 
|  | // | 
|  | // Redistribution and use in source and binary forms, with or without | 
|  | // modification, are permitted provided that the following conditions are met: | 
|  | // | 
|  | // 1. Redistributions of source code must retain the above copyright notice, this | 
|  | //    list of conditions and the following disclaimer. | 
|  | // | 
|  | // 2. Redistributions in binary form must reproduce the above copyright notice, | 
|  | //    this list of conditions and the following disclaimer in the documentation | 
|  | //    and/or other materials provided with the distribution. | 
|  | // | 
|  | // 3. Neither the name of the copyright holder nor the names of its | 
|  | //    contributors may be used to endorse or promote products derived from | 
|  | //    this software without specific prior written permission. | 
|  | // | 
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
|  | // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|  | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
|  | // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | 
|  | // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
|  | // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 
|  | // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 
|  | // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
|  | // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
|  | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  |  | 
|  | package build | 
|  |  | 
|  | import ( | 
|  | "dawn.googlesource.com/dawn/tools/src/container" | 
|  | "dawn.googlesource.com/dawn/tools/src/transform" | 
|  | ) | 
|  |  | 
|  | // Dependencies describes the dependencies of a target | 
|  | type Dependencies struct { | 
|  | // The project | 
|  | project *Project | 
|  | // Target names of all dependencies of this target | 
|  | internal container.Set[TargetName] | 
|  | // All external dependencies used by this target | 
|  | external container.Set[ExternalDependencyName] | 
|  | } | 
|  |  | 
|  | // NewDependencies returns a new Dependencies | 
|  | func NewDependencies(p *Project) *Dependencies { | 
|  | return &Dependencies{ | 
|  | project:  p, | 
|  | internal: container.NewSet[TargetName](), | 
|  | external: container.NewSet[ExternalDependencyName](), | 
|  | } | 
|  | } | 
|  |  | 
|  | // AddInternal adds dep to the list of internal dependencies | 
|  | func (d *Dependencies) AddInternal(dep *Target) { | 
|  | d.internal.Add(dep.Name) | 
|  | } | 
|  |  | 
|  | // AddExternal adds dep to the list of external dependencies | 
|  | func (d *Dependencies) AddExternal(dep ExternalDependency) { | 
|  | d.external.Add(dep.Name) | 
|  | } | 
|  |  | 
|  | // Internal returns the sorted list of dependencies of this target | 
|  | func (d *Dependencies) Internal() []*Target { | 
|  | out := make([]*Target, len(d.internal)) | 
|  | for i, name := range d.internal.List() { | 
|  | out[i] = d.project.Targets[name] | 
|  | } | 
|  | return out | 
|  | } | 
|  |  | 
|  | // UnconditionalInternal returns the sorted list of dependencies that have no build condition. | 
|  | func (d *Dependencies) UnconditionalInternal() []*Target { | 
|  | return transform.Filter(d.Internal(), func(d *Target) bool { return d.Condition == nil }) | 
|  | } | 
|  |  | 
|  | // External returns the sorted list of external dependencies. | 
|  | func (d *Dependencies) External() []ExternalDependency { | 
|  | out := make([]ExternalDependency, 0, len(d.external)) | 
|  | for _, name := range d.external.List() { | 
|  | out = append(out, d.project.externals[name]) | 
|  | } | 
|  | return out | 
|  | } | 
|  |  | 
|  | // ConditionalExternalDependencies returns the sorted list of external dependencies that have a | 
|  | // build condition. | 
|  | func (d *Dependencies) ConditionalExternal() []ExternalDependency { | 
|  | return transform.Filter(d.External(), func(e ExternalDependency) bool { return e.Condition != nil }) | 
|  | } | 
|  |  | 
|  | // ConditionalExternalDependencies returns the sorted list of external dependencies that have no | 
|  | // build condition. | 
|  | func (d *Dependencies) UnconditionalExternal() []ExternalDependency { | 
|  | return transform.Filter(d.External(), func(e ExternalDependency) bool { return e.Condition == nil }) | 
|  | } | 
|  |  | 
|  | // ContainsExternal returns true if the external dependencies contains name | 
|  | func (d *Dependencies) ContainsExternal(name ExternalDependencyName) bool { | 
|  | return d.external.Contains(name) | 
|  | } |