@@ -33,32 +33,40 @@ import (
3333
3434// This file contains logic for placing orphan files within a CUE namespace.
3535
36- func (b * buildPlan ) placeOrphans (i * build.Instance ) (ok bool , err error ) {
37- var (
38- perFile = flagFiles .Bool (b .cmd )
39- useList = flagList .Bool (b .cmd )
40- path = flagPath .StringArray (b .cmd )
41- useContext = flagWithContext .Bool (b .cmd )
42- )
43- if ! b .importing && ! perFile && ! useList && len (path ) == 0 {
44- if useContext {
45- return false , fmt .Errorf (
36+ func (b * buildPlan ) usePlacement () bool {
37+ return b .perFile || b .useList || len (b .path ) > 0
38+ }
39+
40+ func (b * buildPlan ) parsePlacementFlags () error {
41+ cmd := b .cmd
42+ b .perFile = flagFiles .Bool (cmd )
43+ b .useList = flagList .Bool (cmd )
44+ b .path = flagPath .StringArray (cmd )
45+ b .useContext = flagWithContext .Bool (cmd )
46+
47+ if ! b .importing && ! b .perFile && ! b .useList && len (b .path ) == 0 {
48+ if b .useContext {
49+ return fmt .Errorf (
4650 "flag %q must be used with at least one of flag %q, %q, or %q" ,
4751 flagWithContext , flagPath , flagList , flagFiles ,
4852 )
4953 }
50- // TODO: should we remove this optimization? This is really added as a
51- // conversion safety.
52- if len ( i . OrphanedFiles ) + len ( i . BuildFiles ) <= 1 || b . cfg . noMerge {
53- return false , err
54- }
54+ } else if b . schema != nil {
55+ return fmt . Errorf (
56+ "cannot combine --%s flag with flag %q, %q, or %q" ,
57+ flagSchema , flagPath , flagList , flagFiles ,
58+ )
5559 }
60+ return nil
61+ }
62+
63+ func (b * buildPlan ) placeOrphans (i * build.Instance ) error {
5664
5765 pkg := b .encConfig .PkgName
5866 if pkg == "" {
5967 pkg = i .PkgName
6068 } else if pkg != "" && i .PkgName != "" && i .PkgName != pkg && ! flagForce .Bool (b .cmd ) {
61- return false , fmt .Errorf (
69+ return fmt .Errorf (
6270 "%q flag clashes with existing package name (%s vs %s)" ,
6371 flagPackage , pkg , i .PkgName ,
6472 )
@@ -68,7 +76,7 @@ func (b *buildPlan) placeOrphans(i *build.Instance) (ok bool, err error) {
6876
6977 re , err := regexp .Compile (b .cfg .fileFilter )
7078 if err != nil {
71- return false , err
79+ return err
7280 }
7381
7482 for _ , f := range i .OrphanedFiles {
@@ -95,14 +103,14 @@ func (b *buildPlan) placeOrphans(i *build.Instance) (ok bool, err error) {
95103 }
96104 }
97105 if err := d .Err (); err != nil {
98- return false , err
106+ return err
99107 }
100108
101- if perFile {
109+ if b . perFile {
102110 for i , obj := range objs {
103111 f , err := placeOrphans (b .cmd , d .Filename (), pkg , obj )
104112 if err != nil {
105- return false , err
113+ return err
106114 }
107115 f .Filename = newName (d .Filename (), i )
108116 files = append (files , f )
@@ -112,13 +120,13 @@ func (b *buildPlan) placeOrphans(i *build.Instance) (ok bool, err error) {
112120 // TODO: consider getting rid of this requirement. It is important that
113121 // import will catch conflicts ahead of time then, though, and report
114122 // this messages as a possible solution if there are conflicts.
115- if b .importing && len (objs ) > 1 && len (path ) == 0 && ! useList {
116- return false , fmt .Errorf (
123+ if b .importing && len (objs ) > 1 && len (b . path ) == 0 && ! b . useList {
124+ return fmt .Errorf (
117125 "%s, %s, or %s flag needed to handle multiple objects in file %s" ,
118126 flagPath , flagList , flagFiles , shortFile (i .Root , f ))
119127 }
120128
121- if ! useList && len (path ) == 0 && ! useContext {
129+ if ! b . useList && len (b . path ) == 0 && ! b . useContext {
122130 for _ , f := range objs {
123131 if pkg := c .PkgName ; pkg != "" {
124132 internal .SetPackage (f , pkg , false )
@@ -129,7 +137,7 @@ func (b *buildPlan) placeOrphans(i *build.Instance) (ok bool, err error) {
129137 // TODO: handle imports correctly, i.e. for proto.
130138 f , err := placeOrphans (b .cmd , d .Filename (), pkg , objs ... )
131139 if err != nil {
132- return false , err
140+ return err
133141 }
134142 f .Filename = newName (d .Filename (), 0 )
135143 files = append (files , f )
@@ -139,15 +147,15 @@ func (b *buildPlan) placeOrphans(i *build.Instance) (ok bool, err error) {
139147 b .imported = append (b .imported , files ... )
140148 for _ , f := range files {
141149 if err := i .AddSyntax (f ); err != nil {
142- return false , err
150+ return err
143151 }
144152 i .BuildFiles = append (i .BuildFiles , & build.File {
145153 Filename : f .Filename ,
146154 Encoding : build .CUE ,
147155 Source : f ,
148156 })
149157 }
150- return true , nil
158+ return nil
151159}
152160
153161func placeOrphans (cmd * Command , filename , pkg string , objs ... * ast.File ) (* ast.File , error ) {
0 commit comments