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:
- Simboluri - funcții, metode, tipuri (struct/interface), constante, variabile
- Documentație - comentarii GoDoc pentru toate simbolurile
- Metadate - semnături, parametri, return types, receivers
- Exemple - funcții Example* pentru documentație
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Fișiere .go │────▶│ Go Analyzer │────▶│ CodeChunks │
│ (cod sursă) │ │ (go/ast parser) │ │ (structurat) │
└─────────────────┘ └──────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ Qdrant │
│ (vector store) │
└─────────────────┘
// 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 |
// 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 |
// 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 |
// 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 |
// 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ă |
// 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 tipuri
Analizorul 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+) |
- Suport complet generics (Go 1.18+)
- Cross-package type resolution
- Dependency graph între packages
- Test coverage analysis
- Benchmark detection