diff --git a/pkg/gci/internal/testdata/cgo-block-mixed-with-content.cfg.yaml b/pkg/gci/internal/testdata/cgo-block-mixed-with-content.cfg.yaml new file mode 100644 index 0000000..68c1f75 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-mixed-with-content.cfg.yaml @@ -0,0 +1 @@ +no-prefixComments: true diff --git a/pkg/gci/internal/testdata/cgo-block-mixed-with-content.in.go b/pkg/gci/internal/testdata/cgo-block-mixed-with-content.in.go new file mode 100644 index 0000000..525aed5 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-mixed-with-content.in.go @@ -0,0 +1,6 @@ +package main + +import ( + /* #include "types.h" + #include "other.h" */"C" +) diff --git a/pkg/gci/internal/testdata/cgo-block-mixed-with-content.out.go b/pkg/gci/internal/testdata/cgo-block-mixed-with-content.out.go new file mode 100644 index 0000000..24840a6 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-mixed-with-content.out.go @@ -0,0 +1,9 @@ +package main + +import ( + /* + #include "types.h" + #include "other.h" + */ + "C" +) diff --git a/pkg/gci/internal/testdata/cgo-block-mixed.cfg.yaml b/pkg/gci/internal/testdata/cgo-block-mixed.cfg.yaml new file mode 100644 index 0000000..68c1f75 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-mixed.cfg.yaml @@ -0,0 +1 @@ +no-prefixComments: true diff --git a/pkg/gci/internal/testdata/cgo-block-mixed.in.go b/pkg/gci/internal/testdata/cgo-block-mixed.in.go new file mode 100644 index 0000000..16448b7 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-mixed.in.go @@ -0,0 +1,6 @@ +package main + +import ( + /* #include "types.h" + */"C" +) diff --git a/pkg/gci/internal/testdata/cgo-block-mixed.out.go b/pkg/gci/internal/testdata/cgo-block-mixed.out.go new file mode 100644 index 0000000..864b6e3 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-mixed.out.go @@ -0,0 +1,8 @@ +package main + +import ( + /* + #include "types.h" + */ + "C" +) diff --git a/pkg/gci/internal/testdata/cgo-block-prefix.cfg.yaml b/pkg/gci/internal/testdata/cgo-block-prefix.cfg.yaml new file mode 100644 index 0000000..68c1f75 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-prefix.cfg.yaml @@ -0,0 +1 @@ +no-prefixComments: true diff --git a/pkg/gci/internal/testdata/cgo-block-prefix.in.go b/pkg/gci/internal/testdata/cgo-block-prefix.in.go new file mode 100644 index 0000000..fa6bac4 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-prefix.in.go @@ -0,0 +1,5 @@ +package main + +import ( + /* #include "types.h" */ "C" +) diff --git a/pkg/gci/internal/testdata/cgo-block-prefix.out.go b/pkg/gci/internal/testdata/cgo-block-prefix.out.go new file mode 100644 index 0000000..864b6e3 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-prefix.out.go @@ -0,0 +1,8 @@ +package main + +import ( + /* + #include "types.h" + */ + "C" +) diff --git a/pkg/gci/internal/testdata/cgo-block-single-line.cfg.yaml b/pkg/gci/internal/testdata/cgo-block-single-line.cfg.yaml new file mode 100644 index 0000000..68c1f75 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-single-line.cfg.yaml @@ -0,0 +1 @@ +no-prefixComments: true diff --git a/pkg/gci/internal/testdata/cgo-block-single-line.in.go b/pkg/gci/internal/testdata/cgo-block-single-line.in.go new file mode 100644 index 0000000..e26d6a6 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-single-line.in.go @@ -0,0 +1,6 @@ +package main + +import ( + /* #include "types.h" */ + "C" +) diff --git a/pkg/gci/internal/testdata/cgo-block-single-line.out.go b/pkg/gci/internal/testdata/cgo-block-single-line.out.go new file mode 100644 index 0000000..864b6e3 --- /dev/null +++ b/pkg/gci/internal/testdata/cgo-block-single-line.out.go @@ -0,0 +1,8 @@ +package main + +import ( + /* + #include "types.h" + */ + "C" +) diff --git a/pkg/gci/parse.go b/pkg/gci/parse.go index b2edade..df31005 100644 --- a/pkg/gci/parse.go +++ b/pkg/gci/parse.go @@ -23,33 +23,37 @@ func parseToImportDefinitions(unformattedLines []string) ([]importPkg.ImportDef, continue } - // FIXME: this doesn't correctly handle block comments that start part-way through a line or end part-way through a line, for example: - // /* some comment */ "golang.org/x/tools" - // Or: - // /* some comment - // */ "golang.org/x/tools" - // - // It only supports block comments that start and end on their own line, for example: - // /* some comment */ - // "golang.org/x/tools" - // Or: - // /* - // some comment - // */ - // "golang.org/x/tools" - if inBlockComment { - if strings.HasSuffix(line, constants.BlockCommentEndFlag) { - inBlockComment = false - } else { - line = "\t" + line + if blockCommentStartsOnThisLine := strings.HasPrefix(line, constants.BlockCommentStartFlag); inBlockComment || blockCommentStartsOnThisLine { + blockCommentEndIndex := strings.Index(line, constants.BlockCommentEndFlag) + blockCommentEndsOnThisLine := blockCommentEndIndex != -1 + contentStartsAtIndex := 0 + contentEndsAtIndex := len(line) + + if blockCommentStartsOnThisLine { + newImport.PrefixComment = append(newImport.PrefixComment, constants.BlockCommentStartFlag) + contentStartsAtIndex = len(constants.BlockCommentStartFlag) } - newImport.PrefixComment = append(newImport.PrefixComment, line) - continue - } else if strings.HasPrefix(line, constants.BlockCommentStartFlag) { - inBlockComment = true - newImport.PrefixComment = append(newImport.PrefixComment, line) - continue + if blockCommentEndsOnThisLine { + contentEndsAtIndex = blockCommentEndIndex + } + + if content := strings.TrimSpace(line[contentStartsAtIndex:contentEndsAtIndex]); content != "" { + newImport.PrefixComment = append(newImport.PrefixComment, "\t"+content) + } + + inBlockComment = !blockCommentEndsOnThisLine + + if !blockCommentEndsOnThisLine { + continue + } + + newImport.PrefixComment = append(newImport.PrefixComment, constants.BlockCommentEndFlag) + line = line[blockCommentEndIndex+len(constants.BlockCommentEndFlag):] + + if line == "" { + continue + } } // split inline comment from import