aboutsummaryrefslogtreecommitdiffstats
path: root/binapigen/generator.go
diff options
context:
space:
mode:
authorNathan Skrzypczak <nathan.skrzypczak@gmail.com>2020-08-21 17:25:53 +0200
committerOndrej Fabry <ofabry@cisco.com>2020-09-03 15:11:13 +0000
commitc94a962279858fb13eaacc689f47aed358373e44 (patch)
tree0cade1807c10ed53bf7c1b623f4d26da639356f6 /binapigen/generator.go
parent42d11af03300fe0a3476c32ad8c70297862d9320 (diff)
Improve doc & fix import ordering
This also updates /binapi and adds a new make command to generate api files out of a local vpp repo clone Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com> Change-Id: Iff7965388a74ecd21af80f10b5a59d4ed8da6340
Diffstat (limited to 'binapigen/generator.go')
-rw-r--r--binapigen/generator.go24
1 files changed, 21 insertions, 3 deletions
diff --git a/binapigen/generator.go b/binapigen/generator.go
index a6f1615..e5eed5a 100644
--- a/binapigen/generator.go
+++ b/binapigen/generator.go
@@ -223,6 +223,13 @@ func (g *GenFile) Content() ([]byte, error) {
return g.injectImports(g.buf.Bytes())
}
+func getImportClass(importPath string) int {
+ if !strings.Contains(importPath, ".") {
+ return 0 /* std */
+ }
+ return 1 /* External */
+}
+
// injectImports parses source, injects import block declaration with all imports and return formatted
func (g *GenFile) injectImports(original []byte) ([]byte, error) {
// Parse source code
@@ -259,7 +266,12 @@ func (g *GenFile) injectImports(original []byte) ([]byte, error) {
}
// Sort imports by import path
sort.Slice(importPaths, func(i, j int) bool {
- return importPaths[i].Path < importPaths[j].Path
+ ci := getImportClass(importPaths[i].Path)
+ cj := getImportClass(importPaths[j].Path)
+ if ci == cj {
+ return importPaths[i].Path < importPaths[j].Path
+ }
+ return ci < cj
})
// Inject new import block into parsed AST
if len(importPaths) > 0 {
@@ -275,14 +287,20 @@ func (g *GenFile) injectImports(original []byte) ([]byte, error) {
}
// Prepare the import block
impDecl := &ast.GenDecl{Tok: token.IMPORT, TokPos: pos, Lparen: pos, Rparen: pos}
- for _, importPath := range importPaths {
+ for i, importPath := range importPaths {
var name *ast.Ident
if importPath.Name == "_" || strings.Contains(importPath.Path, ".") {
name = &ast.Ident{Name: importPath.Name, NamePos: pos}
}
+ value := strconv.Quote(importPath.Path)
+ if i < len(importPaths)-1 {
+ if getImportClass(importPath.Path) != getImportClass(importPaths[i+1].Path) {
+ value += "\n"
+ }
+ }
impDecl.Specs = append(impDecl.Specs, &ast.ImportSpec{
Name: name,
- Path: &ast.BasicLit{Kind: token.STRING, Value: strconv.Quote(importPath.Path), ValuePos: pos},
+ Path: &ast.BasicLit{Kind: token.STRING, Value: value, ValuePos: pos},
EndPos: pos,
})
}