MCPcopy Create free account
hub / github.com/colbymchenry/codegraph / normalize_fn_ref_value

Method normalize_fn_ref_value

codegraph-kernel/src/kotlin.rs:1285–1348  ·  view source on GitHub ↗
(&mut self, v: Node<'t>, from: u32, depth: u32)

Source from the content-addressed store, hash-verified

1283 }
1284
1285 fn normalize_fn_ref_value(&mut self, v: Node<'t>, from: u32, depth: u32) {
1286 if depth > 4 {
1287 return;
1288 }
1289 match v.kind() {
1290 // value_argument layer with NO field resolution (zero fields) —
1291 // the label-forward skip is DEAD for kotlin; fan out namedChildren.
1292 "value_argument" => {
1293 for i in 0..v.named_child_count() {
1294 if let Some(c) = v.named_child(i) {
1295 self.normalize_fn_ref_value(c, from, depth + 1);
1296 }
1297 }
1298 }
1299 // `::topLevel` / `OtherClass::handle` — receiver = LAST
1300 // type_identifier child, member = LAST simple_identifier child;
1301 // `String::class` has no member (anon keyword) → nothing;
1302 // lowercase receivers dropped by the CASE regex, not node type.
1303 "callable_reference" => {
1304 let mut receiver: Option<Node> = None;
1305 let mut member: Option<Node> = None;
1306 for i in 0..v.named_child_count() {
1307 let Some(child) = v.named_child(i) else { continue };
1308 if child.kind() == "type_identifier" {
1309 receiver = Some(child);
1310 }
1311 if child.kind() == "simple_identifier" {
1312 member = Some(child);
1313 }
1314 }
1315 let Some(member) = member else { return };
1316 let m = self.text(member);
1317 match receiver {
1318 None => self.push_fn_ref_cand(from, m, member),
1319 Some(recv) => {
1320 let recv_text = self.text(recv);
1321 if recv_text.as_bytes().first().map(|b| b.is_ascii_uppercase()).unwrap_or(false) {
1322 let name = format!("{recv_text}::{m}");
1323 self.push_fn_ref_cand(from, &name, member);
1324 }
1325 }
1326 }
1327 }
1328 // `this::caller` → this.<member> (class-scoped, always flushes).
1329 "navigation_expression" => {
1330 if !self.text(v).starts_with("this::") {
1331 return;
1332 }
1333 for i in 0..v.named_child_count() {
1334 let Some(child) = v.named_child(i) else { continue };
1335 if child.kind() == "navigation_suffix" && self.text(child).starts_with("::") {
1336 if child.named_child_count() > 0 {
1337 if let Some(id) = child.named_child(child.named_child_count() - 1) {
1338 let name = format!("this.{}", self.text(id));
1339 self.push_fn_ref_cand(from, &name, id);
1340 }
1341 }
1342 return;

Callers 1

maybe_capture_fn_refsMethod · 0.45

Calls 2

textMethod · 0.45
push_fn_ref_candMethod · 0.45

Tested by

no test coverage detected