1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package load
16
17
18
19
20
21
22 import (
23 "context"
24 "fmt"
25
26 "cuelang.org/go/cue/ast"
27 "cuelang.org/go/cue/build"
28 "cuelang.org/go/internal/cueexperiment"
29 "cuelang.org/go/internal/filetypes"
30 "cuelang.org/go/internal/mod/modimports"
31 "cuelang.org/go/internal/mod/modpkgload"
32 "cuelang.org/go/internal/mod/modrequirements"
33 "cuelang.org/go/mod/module"
34
35
36
37
38
39 _ "cuelang.org/go/pkg"
40 )
41
42
43
44
45
46
47 func Instances(args []string, c *Config) []*build.Instance {
48 ctx := context.TODO()
49 if c == nil {
50 c = &Config{}
51 }
52
53
54 if err := cueexperiment.Init(); err != nil {
55 return []*build.Instance{c.newErrInstance(err)}
56 }
57 newC, err := c.complete()
58 if err != nil {
59 return []*build.Instance{c.newErrInstance(err)}
60 }
61 c = newC
62
63
64
65 i := 0
66 for ; i < len(args) && filetypes.IsPackage(args[i]); i++ {
67 }
68 pkgArgs := args[:i]
69 otherArgs := args[i:]
70
71
72
73
74
75
76
77 pkgs, err := loadPackages(ctx, c, pkgArgs)
78 if err != nil {
79 return []*build.Instance{c.newErrInstance(err)}
80 }
81 tg := newTagger(c)
82 l := newLoader(c, tg, pkgs)
83
84 if c.Context == nil {
85 c.Context = build.NewContext(
86 build.Loader(l.buildLoadFunc()),
87 build.ParseFile(c.ParseFile),
88 )
89 }
90
91 a := []*build.Instance{}
92 if len(args) == 0 || i > 0 {
93 for _, m := range l.importPaths(pkgArgs) {
94 if m.Err != nil {
95 inst := c.newErrInstance(m.Err)
96 a = append(a, inst)
97 continue
98 }
99 a = append(a, m.Pkgs...)
100 }
101 }
102
103 if len(otherArgs) > 0 {
104 files, err := filetypes.ParseArgs(otherArgs)
105 if err != nil {
106 return []*build.Instance{c.newErrInstance(err)}
107 }
108 a = append(a, l.cueFilesPackage(files))
109 }
110
111 for _, p := range a {
112 tags, err := findTags(p)
113 if err != nil {
114 p.ReportError(err)
115 }
116 tg.tags = append(tg.tags, tags...)
117 }
118
119
120
121 if err := tg.injectTags(c.Tags); err != nil {
122 for _, p := range a {
123 p.ReportError(err)
124 }
125 return a
126 }
127
128 if tg.replacements == nil {
129 return a
130 }
131
132 for _, p := range a {
133 for _, f := range p.Files {
134 ast.Walk(f, nil, func(n ast.Node) {
135 if ident, ok := n.(*ast.Ident); ok {
136 if v, ok := tg.replacements[ident.Node]; ok {
137 ident.Node = v
138 }
139 }
140 })
141 }
142 }
143
144 return a
145 }
146
147 func loadPackages(ctx context.Context, cfg *Config, extraPkgs []string) (*modpkgload.Packages, error) {
148 if cfg.Registry == nil || cfg.modFile == nil || cfg.modFile.Module == "" {
149 return nil, nil
150 }
151 reqs := modrequirements.NewRequirements(
152 cfg.modFile.Module,
153 cfg.Registry,
154 cfg.modFile.DepVersions(),
155 cfg.modFile.DefaultMajorVersions(),
156 )
157 mainModLoc := module.SourceLoc{
158 FS: cfg.fileSystem.ioFS(cfg.ModuleRoot),
159 Dir: ".",
160 }
161 allImports, err := modimports.AllImports(modimports.AllModuleFiles(mainModLoc.FS, mainModLoc.Dir))
162 if err != nil {
163 return nil, fmt.Errorf("cannot enumerate all module imports: %v", err)
164 }
165
166
167 allImports = append(allImports, extraPkgs...)
168 return modpkgload.LoadPackages(
169 ctx,
170 cfg.Module,
171 mainModLoc,
172 reqs,
173 cfg.Registry,
174 allImports,
175 ), nil
176 }
177
View as plain text