mirror of
https://github.com/lukaszraczylo/filepuff-mcp.git
synced 2026-10-18 05:48:00 +00:00
fix(parser): extract C++ in-class methods correctly
extractCFunction/extractCFunctionDecl scanned for the first 'identifier' in the declarator, which for C++ methods grabbed a parameter name (e.g. method setName surfaced as 'n') or, when the name was a field_identifier with no parameter identifier, dropped the symbol entirely. cDeclaratorName now descends the declarator field-chain to the real name (identifier/field_identifier/qualified_identifier/destructor/operator); in-class definitions are kinded as methods and qualified Class::method (out-of-line Class::method definitions detected via '::'). Adds TestExtractCppMethods.
This commit is contained in:
@@ -125,6 +125,36 @@ var globalVar = "test"
|
||||
|
||||
// Grouped var/const specs declare multiple names on one spec (var a, b = 1, 2);
|
||||
// every name must surface as its own symbol, not just the first.
|
||||
// C++ in-class methods must be extracted as methods qualified by their class
|
||||
// (Class::method), not misnamed after a parameter or dropped entirely.
|
||||
func TestExtractCppMethods(t *testing.T) {
|
||||
r := NewRegistry()
|
||||
defer r.Close()
|
||||
content := "class User {\npublic:\n void setName(const char* n) { name_ = n; }\n int id() const { return id_; }\nprivate:\n const char* name_;\n int id_;\n};\n\nvoid freeFunc() {}\n"
|
||||
result, err := r.Parse(context.Background(), "u.cpp", []byte(content))
|
||||
if err != nil {
|
||||
t.Fatalf("parse: %v", err)
|
||||
}
|
||||
syms := ExtractSymbols(result.Tree, []byte(content), protocol.LangCpp, "u.cpp")
|
||||
|
||||
kindByName := make(map[string]protocol.SymbolKind, len(syms))
|
||||
for _, s := range syms {
|
||||
kindByName[s.Name] = s.Kind
|
||||
}
|
||||
if kindByName["User::setName"] != protocol.SymbolMethod {
|
||||
t.Errorf("setName: want method User::setName, got %v", kindByName)
|
||||
}
|
||||
if kindByName["User::id"] != protocol.SymbolMethod {
|
||||
t.Errorf("id: want method User::id, got %v", kindByName)
|
||||
}
|
||||
if kindByName["freeFunc"] != protocol.SymbolFunction {
|
||||
t.Errorf("freeFunc: want function, got %v", kindByName)
|
||||
}
|
||||
if _, leaked := kindByName["n"]; leaked {
|
||||
t.Errorf("parameter 'n' leaked as a symbol: %v", kindByName)
|
||||
}
|
||||
}
|
||||
|
||||
// Function-local var/const declarations must NOT appear as top-level symbols
|
||||
// (they flood the list and aren't package/module symbols).
|
||||
func TestExtractSymbolsExcludesLocals(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user