Analizor de cod Go pentru extragerea simbolurilor, structurii și documentației din fișiere Go. Folosește AST-ul nativ Go pentru parsare precisă. Indexează codul pentru căutare semantică în Qdrant.
Analizorul Go parsează fișierele .go și extrage:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Fișiere .go │────▶│ Go Analyzer │────▶│ CodeChunks │
│ (cod sursă) │ │ (go/ast parser) │ │ (structurat) │
└─────────────────┘ └──────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ Qdrant │
│ (vector store) │
└─────────────────┘
type: "function")// ProcessData transformă datele de intrare în formatul dorit.
// Returnează eroare dacă datele sunt invalide.
func ProcessData(input []byte, options ...Option) (Result, error) {
// implementare
}
Informații extrase:
| Câmp | Valoare | Descriere |
|——|———|———–|
| name | "ProcessData" | Numele funcției |
| signature | "func ProcessData(input []byte, options ...Option) (Result, error)" | Semnătura completă |
| parameters | [{name: "input", type: "[]byte"}, {name: "options", type: "...Option"}] | Parametri |
| returns | [{type: "Result"}, {type: "error"}] | Tipuri returnate |
| is_exported | true | Dacă e exportată (începe cu majusculă) |
| docstring | "ProcessData transformă..." | Comentariul GoDoc |
type: "method")// Save persistă utilizatorul în baza de date.
func (u *User) Save(ctx context.Context) error {
return u.db.Save(ctx, u)
}
Informații extrase:
| Câmp | Valoare | Descriere |
|——|———|———–|
| name | "Save" | Numele metodei |
| receiver | "*User" | Receiver-ul metodei |
| is_method | true | Este metodă, nu funcție |
| parameters | [{name: "ctx", type: "context.Context"}] | Parametri |
| returns | [{type: "error"}] | Tipuri returnate |
type: "struct")// User reprezintă un utilizator în sistem.
type User struct {
ID int64 `json:"id" db:"id"`
Name string `json:"name" db:"name"`
Email string `json:"email" db:"email"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
}
Informații extrase:
| Câmp | Valoare | Descriere |
|——|———|———–|
| name | "User" | Numele tipului |
| kind | "struct" | Tipul declarației |
| fields | [{name: "ID", type: "int64", tag: "json:\"id\"..."}, ...] | Câmpurile structurii |
| methods | [{name: "Save", ...}, ...] | Metodele asociate |
| is_exported | true | Dacă e exportat |
| docstring | "User reprezintă..." | Comentariul GoDoc |
type: "interface")// Repository definește operațiile de persistență.
type Repository interface {
// Find caută o entitate după ID.
Find(ctx context.Context, id int64) (*Entity, error)
// Save persistă o entitate.
Save(ctx context.Context, entity *Entity) error
// Delete șterge o entitate.
Delete(ctx context.Context, id int64) error
}
Informații extrase:
| Câmp | Valoare | Descriere |
|——|———|———–|
| name | "Repository" | Numele interfeței |
| kind | "interface" | Tipul declarației |
| methods | [{name: "Find", ...}, {name: "Save", ...}, ...] | Metodele interfeței |
type: "const")// StatusActive reprezintă un utilizator activ.
const StatusActive = "active"
const (
// MaxRetries este numărul maxim de reîncercări.
MaxRetries = 3
// DefaultTimeout este timeout-ul implicit.
DefaultTimeout = 30 * time.Second
)
Informații extrase:
| Câmp | Valoare | Descriere |
|——|———|———–|
| name | "StatusActive" | Numele constantei |
| type | "string" | Tipul (dacă e specificat) |
| value | "active" | Valoarea |
| is_exported | true | Dacă e exportată |
type: "var")// DefaultConfig conține configurația implicită.
var DefaultConfig = Config{
Timeout: 30 * time.Second,
Retries: 3,
}
golang/
├── types.go # Tipuri: PackageInfo, FunctionInfo, TypeInfo, etc.
├── analyzer.go # PathAnalyzer implementation (800+ linii)
├── api_analyzer.go # APIAnalyzer pentru documentație API
├── analyzer_test.go # Teste CodeAnalyzer
├── api_analyzer_test.go # Teste APIAnalyzer
└── README.md # Această documentație
import "github.com/doITmagic/rag-code-mcp/internal/ragcode/analyzers/golang"
// Creare analizor
analyzer := golang.NewCodeAnalyzer()
// Analiză un package
pkgInfo, err := analyzer.AnalyzePackage("./internal/mypackage")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Package: %s\n", pkgInfo.Name)
fmt.Printf("Functions: %d\n", len(pkgInfo.Functions))
fmt.Printf("Types: %d\n", len(pkgInfo.Types))
// Analiză directoare/fișiere
chunks, err := analyzer.AnalyzePaths([]string{"./internal/..."})
for _, chunk := range chunks {
fmt.Printf("[%s] %s.%s\n", chunk.Type, chunk.Package, chunk.Name)
}
Analizorul Go este selectat automat pentru:
go - proiecte Gogolang - alternativă| Fișier | Descriere |
|---|---|
go.mod |
Go modules (Go 1.11+) |
go.sum |
Checksums dependențe |
*.go |
Fișiere sursă Go |
| Type | Descriere | Exemplu |
|---|---|---|
function |
Funcție package-level | func Process() |
method |
Metodă pe tip | func (u *User) Save() |
struct |
Tip struct | type User struct{} |
interface |
Tip interface | type Reader interface{} |
const |
Constantă | const MaxSize = 100 |
var |
Variabilă package-level | var DefaultConfig = ... |
{
"is_exported": true,
"is_method": true,
"receiver": "*User",
"parameters": [
{"name": "ctx", "type": "context.Context"},
{"name": "id", "type": "int64"}
],
"returns": [
{"type": "*Entity"},
{"type": "error"}
]
}
{
"kind": "struct",
"is_exported": true,
"fields": [
{"name": "ID", "type": "int64", "tag": "json:\"id\""},
{"name": "Name", "type": "string", "tag": "json:\"name\""}
],
"methods": [
{"name": "Save", "signature": "func (u *User) Save() error"}
]
}
# Rulează toate testele Go analyzer
go test ./internal/ragcode/analyzers/golang/...
# Cu output verbose
go test -v ./internal/ragcode/analyzers/golang/...
# Cu coverage
go test -cover ./internal/ragcode/analyzers/golang/...
Folosește doar biblioteca standard Go:
go/ast - Abstract Syntax Treego/parser - Parser Gogo/doc - Extragere documentațiego/token - Tokenizarego/types - Informații despre tipuriAnalizorul sare automat:
*_test.go - fișiere de testvendor/ - dependențe vendoredtestdata/ - date de test.git/ - Git| Limitare | Descriere |
|---|---|
| Package-level | Analizează la nivel de package, nu fișier individual |
| No Cross-package | Nu rezolvă tipuri din alte package-uri |
| No Generics | Suport limitat pentru generics (Go 1.18+) |