package astwalk

import (
	"go/ast"
	"strings"
)

type commentWalker struct {
	visitor CommentVisitor
}

func (w *commentWalker) WalkFile(f *ast.File) {
	if !w.visitor.EnterFile(f) {
		return
	}

	for _, cg := range f.Comments {
		visitCommentGroups(cg, w.visitor.VisitComment)
	}
}

func visitCommentGroups(cg *ast.CommentGroup, visit func(*ast.CommentGroup)) {
	var group []*ast.Comment
	visitGroup := func(list []*ast.Comment) {
		if len(list) == 0 {
			return
		}
		cg := &ast.CommentGroup{List: list}
		visit(cg)
	}
	for _, comment := range cg.List {
		if strings.HasPrefix(comment.Text, "/*") {
			visitGroup(group)
			group = group[:0]
			visitGroup([]*ast.Comment{comment})
		} else {
			group = append(group, comment)
		}
	}
	visitGroup(group)
}