aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/vendor/golang.org/x/mod/modfile/rule.go
diff options
context:
space:
mode:
authorKatie Hockman <katie@golang.org>2021-09-20 15:45:51 -0400
committerKatie Hockman <katie@golang.org>2021-09-20 15:46:10 -0400
commitc6c884be3854f3c94f1ee93a273544c9c5c35df5 (patch)
tree12e3ece09595d359f9edc99025c3f3192aea2213 /src/cmd/vendor/golang.org/x/mod/modfile/rule.go
parent51ca5706ab2074a624f8a2590a2a81e6a5821e48 (diff)
parentaf72ddfcd7826df9aefb2207b8ac270bb91fea2f (diff)
downloadgo-c6c884be3854f3c94f1ee93a273544c9c5c35df5.tar.gz
go-c6c884be3854f3c94f1ee93a273544c9c5c35df5.zip
[dev.fuzz] all: merge master (af72ddf) into dev.fuzz
This now includes the fix in CL 350729, which means we no longer need to skip the test in dev.fuzz. Conflicts: - src/cmd/compile/internal/noder/unified_test.go Merge List: + 2021-09-20 af72ddfcd7 cmd/compile: extend dump-to-file to handle "genssa" (asm) case. + 2021-09-20 3c764babe7 cmd/go: write go.mod requirements more consistently for go 1.17+ + 2021-09-20 6268468e02 cmd/link: generate DIE for types referenced only through dictionaries + 2021-09-20 6acac8b685 cmd/compile: delay all transforms for generic funcs/methods + 2021-09-20 988f18d61d go/types: export Named._Orig as Named.Origin + 2021-09-20 b6dddaccd7 cmd/compile: fix transform.AssignOp to deal with tricky case + 2021-09-20 9e60c37147 cmd/compile: document register-based ABI for ppc64 + 2021-09-20 79159f2e83 cmd/compile: fix simplification rules on arm/arm64 + 2021-09-20 eff27e858b cmd/compile: ensure constant shift amounts are in range for arm + 2021-09-20 9ebe7c8ec6 go/test: add a test for issue 48344 + 2021-09-20 6f35430faa cmd/compile: allow rotates to be merged with logical ops on arm64 + 2021-09-20 2d9b486420 cmd/compile: update doc at top of iexport.go on the changes for typeparams + 2021-09-20 a81b0dc6ee cmd/compile: rename instType -> instanceType + 2021-09-20 119213566a cmd/cgo: remove hardcoded '-pie' ldflag for linux/arm + 2021-09-20 a83a558733 cmd/compile: fix export/import of range loop. + 2021-09-19 315dbd10c9 cmd/compile: fold double negate on arm64 + 2021-09-19 83b36ffb10 cmd/compile: implement constant rotates on arm64 + 2021-09-19 771b8ea4f4 cmd/compile: fix missing markHiddenClosureDead in deadcode pass + 2021-09-18 c894b442d1 net/rpc: remove warnings on incompatible methods at registration + 2021-09-17 4b654c0eec cmd/compile: SSA ".this" variable + 2021-09-17 f01721efb9 cmd/compile: remove self copies in tail-call wrappers + 2021-09-17 163871feb1 time: re-add space-padded day of year to docs + 2021-09-17 ac7c34767d time: support fractional timezone minutes in MarshalBinary + 2021-09-17 07b30a4f77 cmd/compile: delay transformAssign if lhs/rhs have typeparam + 2021-09-17 c10b980220 cmd/compile: restore tail call for method wrappers + 2021-09-17 50e4508269 cmd/compile: fix import/export of Init and Def fields. + 2021-09-17 3fa35b5f97 go/types: ensure that we always get a new signature in expandNamed + 2021-09-17 3fa7dbeff5 cmd/go: fix GOARCH value in GOAMD64 docs + 2021-09-17 974b0166d6 syscall: implement Pipe using pipe2 syscall on all linux platforms + 2021-09-17 1a49dcb82f syscall: remove //sysnb comment generating Setreuid for linux/arm64 + 2021-09-17 cea7a71d40 cmd/compile: fix generic type handling in crawler + 2021-09-17 74e384f50d internal/poll: inject a hook into the runtime finalizer to count the closed pipes + 2021-09-17 323c6f74d3 log: don't format if writing to io.Discard + 2021-09-17 7f36ef0aff cmd/compile/internal/noder: hide TestUnifiedCompare behind -cmp flag + 2021-09-17 70493b3eb0 runtime/cgo: save and restore X3 (aka GP) for crosscall1 on riscv64 + 2021-09-17 6d02ce8584 runtime: fix prettyprinting of parametric types in gdb + 2021-09-17 6602c86a38 cmd/internal/obj/riscv: improve instruction validation + 2021-09-17 14e812bfc5 syscall: do not use handle lists on windows when NoInheritHandles is true + 2021-09-16 8d2a9c32a2 all: remove incorrectly repeated words in comments + 2021-09-16 af9da137a9 A+C: update name to real name and add to AUTHORS + 2021-09-16 265b59aefd cmd/cgo: for godefs, don't let field prefix removal cause duplicates + 2021-09-16 4efdaa7bc7 testing: skip panics when picking the line number for decoration + 2021-09-16 e09dcc211a go/types, types2: add an additional shift test case + 2021-09-16 5402b4376c spec: fix incorrect type in a shift example + 2021-09-16 d09e09bc61 cmd/compile: fixing writebarrier.go for -G=3 + 2021-09-16 bcdc61d830 cmd/compile: preserve statements better in expandCalls + 2021-09-16 48e2b1ea91 cmd/compile: fix LocResults formatting + 2021-09-16 b1bedc0774 cmd/go: add GOAMD64 environment variable + 2021-09-16 04f5116c98 cmd/go: clean paths before checking same directory + 2021-09-16 e7dbe3908e cmd/cgo: add missing tab in exports for a result of void + 2021-09-15 cfa233d76b cmd/compile: remove unneeded early transforms, with dictionary change + 2021-09-15 59a9a035ff cmd/compile: switch to computing dict format on instantiated functions + 2021-09-15 0edc6c4fa0 cmd/internal/obj/ppc64: generate prologue code compatible with new ABI + 2021-09-15 03df68d3c3 runtime: fix setting of cpu features for amd64 + 2021-09-15 6196979365 cmd/go/internal/modload: prevent tidy downgrading disambiguating modules + 2021-09-15 72bb8185b5 cmd/compile: emit DWARF info about dictionary entries + 2021-09-15 5b48fca1fa cmd/compile: mark wrapper functions with DW_AT_trampoline + 2021-09-15 e4dfd788e6 go/internal/gcimporter,cmd/compile: minor clean-up in iimport.go + 2021-09-15 4847c47cb8 cmd/compile/internal/types2: eliminate Named.instPos + 2021-09-15 3100f54f20 cmd/compile/internal/types2: merge Named type loading and expansion + 2021-09-15 738cebb174 cmd/compile/internal/types2: implement Identical for *Union types + 2021-09-15 b26d325cb1 cmd/compile/internal/types2: remove some unnecessary loading/expansion of Named types + 2021-09-15 9fc28892cb cmd/compile/internal/types2: export TypeHash, return value without blanks + 2021-09-15 2da3375e9b runtime: in adjustTimers back up as far as necessary + 2021-09-15 c7f2f51fed cmd/go: remove subcommand prefix from error messages + 2021-09-15 0bb40b08c4 go/types: implement Identical for *Union types + 2021-09-15 cb4e1de021 go/types: minor cleanup of instantiation + 2021-09-15 a0f3129466 go/types: instantiate methods when instantiating Named types + 2021-09-14 bf26e43d0f go/types: eliminate Named.instPos + 2021-09-14 2933c451a0 go/types: merge Named type loading and expansion + 2021-09-14 137543bb93 cmd/compile: set IsShape based on type being in the Shapes pkg + 2021-09-14 3a72175cdc cmd/compile: fix test/typeparam/mdempsky/4.go for -G=3 + 2021-09-14 b2c04f0d48 runtime: avoid loop variable capture in test + 2021-09-14 181e8cde30 go/internal/gcimporter: remove outdated comment + 2021-09-14 8699425b55 syscall: remove use of IN_KUBERNETES in test + 2021-09-14 b3c6de9dcd cmd/internal/obj/ppc64: allow VR register arguments to VS registers + 2021-09-14 ee91bb8319 cmd/compile: prevent typecheck importer reading type parameter twice + 2021-09-14 2953cd0083 go/internal/gcimporter: prevent importReader reading type parameter twice + 2021-09-14 b8c802b116 cmd/compile: prevent importReader reading type parameter twice + 2021-09-14 4a4221e818 all: remove some unused code + 2021-09-14 71adc658de runtime: change time.now to ABIInternal + 2021-09-14 146e8d4994 reflect: use Value.Len instead of conversion to slice header + 2021-09-13 9a58aa267e spec: fix prose about terminating statements + 2021-09-13 42057e9848 cmd/compile: save the note of fields when translating struct + 2021-09-13 960d036f8f cmd/go: add missing parenthesis in a call to "PrintVersion" + 2021-09-13 81a4fe6fd2 cmd/link/internal/ld: re-enable DWARF tests on solaris/illumos + 2021-09-13 f93a63addb reflect: add a floating point section to DeepEqual tests + 2021-09-13 a0c409cbc8 reflect: add fast paths for common, simple Kinds to DeepEqual + 2021-09-13 ac40c9872f reflect: fix _faststr optimization + 2021-09-13 c8a58f29dc cmd/go: add test to check for a potential workspace loading issue + 2021-09-13 e74e363a6b strings: add Clone function + 2021-09-13 bced369a50 cmd/link: minor code cleanup in dwarf gen + 2021-09-13 c3b217a0e5 cmd/go: document 'go install cmd@version' ignores vendor directories + 2021-09-12 ad97d204f0 go/types: remove some unnecessary loading/expansion of Named types + 2021-09-12 0d8a4bfc96 bufio: add Writer.AvailableBuffer + 2021-09-11 23832ba2e2 reflect: optimize for maps with string keys + 2021-09-11 a50225a0dc bufio: make Reader.Reset and Writer.Reset work on the zero value + 2021-09-10 cf2fe5d6f1 doc/asm: fix HTML markup + 2021-09-10 1bf2cd1291 debug/elf: retain original error message when getSymbols fails. + 2021-09-10 5a4b9f9494 time: reference -tags=timetzdata in testing panic + 2021-09-10 025308fe08 testing: increase alternation precedence + 2021-09-10 5a94a90d84 cmd/compile/internal/types2: better error message for invalid array decls + 2021-09-10 da1aa65053 cmd/compile/internal/syntax: correct follow token for type parameter lists + 2021-09-10 96ab854ab0 cmd/compile/internal: better AST line highlight in ssa.html + 2021-09-10 90c5660616 embed: guarantee the returned file of FS.Open implements io.Seeker + 2021-09-10 c69f5c0d76 cmd/compile: add support for Abs and Copysign intrinsics on riscv64 + 2021-09-10 2091bd3f26 cmd/compile: simiplify arm64 bitfield optimizations + 2021-09-09 b32209d22d cmd/compile: fix test case for unified IR (fix build) + 2021-09-09 1a708bcf1d cmd/compile: don't crash while reporting invalid alias cycle + 2021-09-09 426ff3746f cmd/cgo, runtime/cgo: avoid GCC/clang conversion warnings + 2021-09-09 73483df406 cmd/compile/internal/syntax: better error message for missing type constraint + 2021-09-09 e1c3f2158f time: propagate "," separator for fractional seconds into Format + 2021-09-09 c981874a5a cmd/compile: fix implement for closure in a global assignment + 2021-09-09 2c4f389c02 cmd/link: enable internal linker in more cases for ppc64le + 2021-09-09 fb84e99eb7 test: add compiler regress tests for #46461 + 2021-09-09 b9e1a24581 cmd/compile: fix case where init info of OAS node is dropped + 2021-09-09 f9271e4f85 go/types, types2: rename RParams -> RecvTypeParams + 2021-09-09 ea434450c2 reflect: add hooks for dealing with narrow width floats + 2021-09-09 a53e3d5f88 net: deprecate (net.Error).Temporary + 2021-09-09 19457a58e5 cmd/compile: stenciled conversions might be NOPs + 2021-09-09 a295b3cec8 test: re-enable AsmCheck tests for types2-based frontends + 2021-09-09 66f0d35f71 go/types: reduce number of delayed functions + 2021-09-09 d2a77f1c76 go/types: handle recursive type parameter constraints + 2021-09-09 9e1eea6f8b go/types: detect constraint type inference cycles + 2021-09-09 b86e8dd0f3 test/typeparam: fix issue48094b test build + 2021-09-09 c84f3a4004 syscall: drop fallback to pipe in Pipe on linux/arm + 2021-09-09 376a079762 cmd/compile: fix unified IR panic when expanding nested inline function + 2021-09-09 6edc57983a internal/poll: report open fds when TestSplicePipePool fails + 2021-09-09 2481f6e367 cmd/compile: fix wrong instantiated type for embedded receiver + 2021-09-09 d62866ef79 cmd/compile: move checkptr alignment to SSA generation + 2021-09-09 8fad81cd62 cmd/compile: fold handling OCONV logic to separate function + 2021-09-09 9cbc76bdf9 cmd/internal/obj/arm64: add checks for incorrect use of REGTMP register + 2021-09-09 42563f89d7 cmd/compile: remove 'ext' fields from unified IR reader/writer types + 2021-09-09 4c52eac49b cmd/compile: simplify value coding for unified IR + 2021-09-09 e30a09013b cmd/compile: extrapolate $GOROOT in unified IR + 2021-09-08 a1f6208e56 go/types, types2: add Environment to Config + 2021-09-08 f5f8a911d8 cmd/compile/internal/types2: spell out 'Type' in type parameter APIs + 2021-09-08 bff39cf6cb cmd/compile: add automated rewrite cycle detection + 2021-09-08 b61e1ed863 cmd/compile/internal/types2: temporarily pin the Checker to Interface during checking + 2021-09-08 47f3e1e02c cmd/compile/internal/types2: move NewTypeParam off of Checker + 2021-09-08 ccc927b8f6 cmd/compile/internal/types2: move typeHash to environment.go + 2021-09-08 30e9bfbcef cmd/compile/internal/types2: implement deduplication of instances using the Environment + 2021-09-08 0406d3a8e5 go/ast: rename MultiIndexExpr to IndexListExpr Change-Id: I7f917d45b0507c122c212305144b0b455618ff54
Diffstat (limited to 'src/cmd/vendor/golang.org/x/mod/modfile/rule.go')
-rw-r--r--src/cmd/vendor/golang.org/x/mod/modfile/rule.go295
1 files changed, 171 insertions, 124 deletions
diff --git a/src/cmd/vendor/golang.org/x/mod/modfile/rule.go b/src/cmd/vendor/golang.org/x/mod/modfile/rule.go
index d6a2d3879e..98211a450a 100644
--- a/src/cmd/vendor/golang.org/x/mod/modfile/rule.go
+++ b/src/cmd/vendor/golang.org/x/mod/modfile/rule.go
@@ -1034,170 +1034,217 @@ func (f *File) SetRequire(req []*Require) {
// SetRequireSeparateIndirect updates the requirements of f to contain the given
// requirements. Comment contents (except for 'indirect' markings) are retained
-// from the first existing requirement for each module path, and block structure
-// is maintained as long as the indirect markings match.
+// from the first existing requirement for each module path. Like SetRequire,
+// SetRequireSeparateIndirect adds requirements for new paths in req,
+// updates the version and "// indirect" comment on existing requirements,
+// and deletes requirements on paths not in req. Existing duplicate requirements
+// are deleted.
//
-// Any requirements on paths not already present in the file are added. Direct
-// requirements are added to the last block containing *any* other direct
-// requirement. Indirect requirements are added to the last block containing
-// *only* other indirect requirements. If no suitable block exists, a new one is
-// added, with the last block containing a direct dependency (if any)
-// immediately before the first block containing only indirect dependencies.
+// As its name suggests, SetRequireSeparateIndirect puts direct and indirect
+// requirements into two separate blocks, one containing only direct
+// requirements, and the other containing only indirect requirements.
+// SetRequireSeparateIndirect may move requirements between these two blocks
+// when their indirect markings change. However, SetRequireSeparateIndirect
+// won't move requirements from other blocks, especially blocks with comments.
//
-// The Syntax field is ignored for requirements in the given blocks.
+// If the file initially has one uncommented block of requirements,
+// SetRequireSeparateIndirect will split it into a direct-only and indirect-only
+// block. This aids in the transition to separate blocks.
func (f *File) SetRequireSeparateIndirect(req []*Require) {
- type modKey struct {
- path string
- indirect bool
- }
- need := make(map[modKey]string)
- for _, r := range req {
- need[modKey{r.Mod.Path, r.Indirect}] = r.Mod.Version
+ // hasComments returns whether a line or block has comments
+ // other than "indirect".
+ hasComments := func(c Comments) bool {
+ return len(c.Before) > 0 || len(c.After) > 0 || len(c.Suffix) > 1 ||
+ (len(c.Suffix) == 1 &&
+ strings.TrimSpace(strings.TrimPrefix(c.Suffix[0].Token, string(slashSlash))) != "indirect")
}
- comments := make(map[string]Comments)
- for _, r := range f.Require {
- v, ok := need[modKey{r.Mod.Path, r.Indirect}]
- if !ok {
- if _, ok := need[modKey{r.Mod.Path, !r.Indirect}]; ok {
- if _, dup := comments[r.Mod.Path]; !dup {
- comments[r.Mod.Path] = r.Syntax.Comments
- }
+ // moveReq adds r to block. If r was in another block, moveReq deletes
+ // it from that block and transfers its comments.
+ moveReq := func(r *Require, block *LineBlock) {
+ var line *Line
+ if r.Syntax == nil {
+ line = &Line{Token: []string{AutoQuote(r.Mod.Path), r.Mod.Version}}
+ r.Syntax = line
+ if r.Indirect {
+ r.setIndirect(true)
}
- r.markRemoved()
- continue
+ } else {
+ line = new(Line)
+ *line = *r.Syntax
+ if !line.InBlock && len(line.Token) > 0 && line.Token[0] == "require" {
+ line.Token = line.Token[1:]
+ }
+ r.Syntax.Token = nil // Cleanup will delete the old line.
+ r.Syntax = line
}
- r.setVersion(v)
- delete(need, modKey{r.Mod.Path, r.Indirect})
+ line.InBlock = true
+ block.Line = append(block.Line, line)
}
+ // Examine existing require lines and blocks.
var (
- lastDirectOrMixedBlock Expr
- firstIndirectOnlyBlock Expr
- lastIndirectOnlyBlock Expr
+ // We may insert new requirements into the last uncommented
+ // direct-only and indirect-only blocks. We may also move requirements
+ // to the opposite block if their indirect markings change.
+ lastDirectIndex = -1
+ lastIndirectIndex = -1
+
+ // If there are no direct-only or indirect-only blocks, a new block may
+ // be inserted after the last require line or block.
+ lastRequireIndex = -1
+
+ // If there's only one require line or block, and it's uncommented,
+ // we'll move its requirements to the direct-only or indirect-only blocks.
+ requireLineOrBlockCount = 0
+
+ // Track the block each requirement belongs to (if any) so we can
+ // move them later.
+ lineToBlock = make(map[*Line]*LineBlock)
)
- for _, stmt := range f.Syntax.Stmt {
+ for i, stmt := range f.Syntax.Stmt {
switch stmt := stmt.(type) {
case *Line:
if len(stmt.Token) == 0 || stmt.Token[0] != "require" {
continue
}
- if isIndirect(stmt) {
- lastIndirectOnlyBlock = stmt
- } else {
- lastDirectOrMixedBlock = stmt
+ lastRequireIndex = i
+ requireLineOrBlockCount++
+ if !hasComments(stmt.Comments) {
+ if isIndirect(stmt) {
+ lastIndirectIndex = i
+ } else {
+ lastDirectIndex = i
+ }
}
+
case *LineBlock:
if len(stmt.Token) == 0 || stmt.Token[0] != "require" {
continue
}
- indirectOnly := true
+ lastRequireIndex = i
+ requireLineOrBlockCount++
+ allDirect := len(stmt.Line) > 0 && !hasComments(stmt.Comments)
+ allIndirect := len(stmt.Line) > 0 && !hasComments(stmt.Comments)
for _, line := range stmt.Line {
- if len(line.Token) == 0 {
- continue
- }
- if !isIndirect(line) {
- indirectOnly = false
- break
+ lineToBlock[line] = stmt
+ if hasComments(line.Comments) {
+ allDirect = false
+ allIndirect = false
+ } else if isIndirect(line) {
+ allDirect = false
+ } else {
+ allIndirect = false
}
}
- if indirectOnly {
- lastIndirectOnlyBlock = stmt
- if firstIndirectOnlyBlock == nil {
- firstIndirectOnlyBlock = stmt
- }
- } else {
- lastDirectOrMixedBlock = stmt
+ if allDirect {
+ lastDirectIndex = i
+ }
+ if allIndirect {
+ lastIndirectIndex = i
}
}
}
- isOrContainsStmt := func(stmt Expr, target Expr) bool {
- if stmt == target {
- return true
- }
- if stmt, ok := stmt.(*LineBlock); ok {
- if target, ok := target.(*Line); ok {
- for _, line := range stmt.Line {
- if line == target {
- return true
- }
- }
+ oneFlatUncommentedBlock := requireLineOrBlockCount == 1 &&
+ !hasComments(*f.Syntax.Stmt[lastRequireIndex].Comment())
+
+ // Create direct and indirect blocks if needed. Convert lines into blocks
+ // if needed. If we end up with an empty block or a one-line block,
+ // Cleanup will delete it or convert it to a line later.
+ insertBlock := func(i int) *LineBlock {
+ block := &LineBlock{Token: []string{"require"}}
+ f.Syntax.Stmt = append(f.Syntax.Stmt, nil)
+ copy(f.Syntax.Stmt[i+1:], f.Syntax.Stmt[i:])
+ f.Syntax.Stmt[i] = block
+ return block
+ }
+
+ ensureBlock := func(i int) *LineBlock {
+ switch stmt := f.Syntax.Stmt[i].(type) {
+ case *LineBlock:
+ return stmt
+ case *Line:
+ block := &LineBlock{
+ Token: []string{"require"},
+ Line: []*Line{stmt},
}
+ stmt.Token = stmt.Token[1:] // remove "require"
+ stmt.InBlock = true
+ f.Syntax.Stmt[i] = block
+ return block
+ default:
+ panic(fmt.Sprintf("unexpected statement: %v", stmt))
}
- return false
}
- addRequire := func(path, vers string, indirect bool, comments Comments) {
- var line *Line
- if indirect {
- if lastIndirectOnlyBlock != nil {
- line = f.Syntax.addLine(lastIndirectOnlyBlock, "require", path, vers)
- } else {
- // Add a new require block after the last direct-only or mixed "require"
- // block (if any).
- //
- // (f.Syntax.addLine would add the line to an existing "require" block if
- // present, but here the existing "require" blocks are all direct-only, so
- // we know we need to add a new block instead.)
- line = &Line{Token: []string{"require", path, vers}}
- lastIndirectOnlyBlock = line
- firstIndirectOnlyBlock = line // only block implies first block
- if lastDirectOrMixedBlock == nil {
- f.Syntax.Stmt = append(f.Syntax.Stmt, line)
- } else {
- for i, stmt := range f.Syntax.Stmt {
- if isOrContainsStmt(stmt, lastDirectOrMixedBlock) {
- f.Syntax.Stmt = append(f.Syntax.Stmt, nil) // increase size
- copy(f.Syntax.Stmt[i+2:], f.Syntax.Stmt[i+1:]) // shuffle elements up
- f.Syntax.Stmt[i+1] = line
- break
- }
- }
- }
- }
+ var lastDirectBlock *LineBlock
+ if lastDirectIndex < 0 {
+ if lastIndirectIndex >= 0 {
+ lastDirectIndex = lastIndirectIndex
+ lastIndirectIndex++
+ } else if lastRequireIndex >= 0 {
+ lastDirectIndex = lastRequireIndex + 1
} else {
- if lastDirectOrMixedBlock != nil {
- line = f.Syntax.addLine(lastDirectOrMixedBlock, "require", path, vers)
- } else {
- // Add a new require block before the first indirect block (if any).
- //
- // That way if the file initially contains only indirect lines,
- // the direct lines still appear before it: we preserve existing
- // structure, but only to the extent that that structure already
- // reflects the direct/indirect split.
- line = &Line{Token: []string{"require", path, vers}}
- lastDirectOrMixedBlock = line
- if firstIndirectOnlyBlock == nil {
- f.Syntax.Stmt = append(f.Syntax.Stmt, line)
- } else {
- for i, stmt := range f.Syntax.Stmt {
- if isOrContainsStmt(stmt, firstIndirectOnlyBlock) {
- f.Syntax.Stmt = append(f.Syntax.Stmt, nil) // increase size
- copy(f.Syntax.Stmt[i+1:], f.Syntax.Stmt[i:]) // shuffle elements up
- f.Syntax.Stmt[i] = line
- break
- }
- }
- }
- }
+ lastDirectIndex = len(f.Syntax.Stmt)
}
+ lastDirectBlock = insertBlock(lastDirectIndex)
+ } else {
+ lastDirectBlock = ensureBlock(lastDirectIndex)
+ }
- line.Comments.Before = commentsAdd(line.Comments.Before, comments.Before)
- line.Comments.Suffix = commentsAdd(line.Comments.Suffix, comments.Suffix)
+ var lastIndirectBlock *LineBlock
+ if lastIndirectIndex < 0 {
+ lastIndirectIndex = lastDirectIndex + 1
+ lastIndirectBlock = insertBlock(lastIndirectIndex)
+ } else {
+ lastIndirectBlock = ensureBlock(lastIndirectIndex)
+ }
- r := &Require{
- Mod: module.Version{Path: path, Version: vers},
- Indirect: indirect,
- Syntax: line,
+ // Delete requirements we don't want anymore.
+ // Update versions and indirect comments on requirements we want to keep.
+ // If a requirement is in last{Direct,Indirect}Block with the wrong
+ // indirect marking after this, or if the requirement is in an single
+ // uncommented mixed block (oneFlatUncommentedBlock), move it to the
+ // correct block.
+ //
+ // Some blocks may be empty after this. Cleanup will remove them.
+ need := make(map[string]*Require)
+ for _, r := range req {
+ need[r.Mod.Path] = r
+ }
+ have := make(map[string]*Require)
+ for _, r := range f.Require {
+ path := r.Mod.Path
+ if need[path] == nil || have[path] != nil {
+ // Requirement not needed, or duplicate requirement. Delete.
+ r.markRemoved()
+ continue
+ }
+ have[r.Mod.Path] = r
+ r.setVersion(need[path].Mod.Version)
+ r.setIndirect(need[path].Indirect)
+ if need[path].Indirect &&
+ (oneFlatUncommentedBlock || lineToBlock[r.Syntax] == lastDirectBlock) {
+ moveReq(r, lastIndirectBlock)
+ } else if !need[path].Indirect &&
+ (oneFlatUncommentedBlock || lineToBlock[r.Syntax] == lastIndirectBlock) {
+ moveReq(r, lastDirectBlock)
}
- r.setIndirect(indirect)
- f.Require = append(f.Require, r)
}
- for k, vers := range need {
- addRequire(k.path, vers, k.indirect, comments[k.path])
+ // Add new requirements.
+ for path, r := range need {
+ if have[path] == nil {
+ if r.Indirect {
+ moveReq(r, lastIndirectBlock)
+ } else {
+ moveReq(r, lastDirectBlock)
+ }
+ f.Require = append(f.Require, r)
+ }
}
+
f.SortBlocks()
}