| 195 | } |
| 196 | |
| 197 | func findPackage(decls []ast.Decl) (Package, error) { |
| 198 | name := "" |
| 199 | atoms := []ast.Atom{} |
| 200 | for _, decl := range decls { |
| 201 | if decl.DeclaredAtom.Predicate != symbols.Package { |
| 202 | continue |
| 203 | } |
| 204 | for _, desc := range decl.Descr { |
| 205 | if desc.Predicate == nameSym { |
| 206 | if len(desc.Args) != 1 { |
| 207 | return Package{}, fmt.Errorf("unexpected length %v", len(desc.Args)) |
| 208 | } |
| 209 | n, ok := desc.Args[0].(ast.Constant) |
| 210 | if !ok { |
| 211 | return Package{}, fmt.Errorf("invalid description %v for name", desc) |
| 212 | } |
| 213 | |
| 214 | var err error |
| 215 | name, err = n.StringValue() |
| 216 | if err != nil { |
| 217 | return Package{}, err |
| 218 | } |
| 219 | } else { |
| 220 | atoms = append(atoms, desc) |
| 221 | } |
| 222 | } |
| 223 | break |
| 224 | } |
| 225 | return Package{Name: name, Atoms: atoms}, nil |
| 226 | } |
| 227 | |
| 228 | // Merge merges two packages. |
| 229 | func (p *Package) Merge(other Package) error { |