(&mut self, class_node: Node<'t>, class_row: u32)
| 1366 | } |
| 1367 | |
| 1368 | fn synthesize_lombok_members(&mut self, class_node: Node<'t>, class_row: u32) { |
| 1369 | let class_anns = self.lombok_annotation_names(class_node); |
| 1370 | let class_getter = class_anns.contains("Getter"); |
| 1371 | let class_setter = class_anns.contains("Setter"); |
| 1372 | let is_data = class_anns.contains("Data"); |
| 1373 | let is_value = class_anns.contains("Value"); |
| 1374 | let has_builder = class_anns.contains("Builder") || class_anns.contains("SuperBuilder"); |
| 1375 | let has_to_string = is_data || is_value || class_anns.contains("ToString"); |
| 1376 | let has_equals = is_data || is_value || class_anns.contains("EqualsAndHashCode"); |
| 1377 | let log_ann = class_anns.iter().find(|a| is_lombok_log_annotation(a)).cloned(); |
| 1378 | |
| 1379 | let Some(body) = class_node.child_by_field_name("body") else { return }; |
| 1380 | let fields: Vec<Node> = (0..body.named_child_count()) |
| 1381 | .filter_map(|i| body.named_child(i)) |
| 1382 | .filter(|c| c.kind() == "field_declaration") |
| 1383 | .collect(); |
| 1384 | |
| 1385 | let class_has_lombok = class_getter |
| 1386 | || class_setter |
| 1387 | || is_data |
| 1388 | || is_value |
| 1389 | || has_builder |
| 1390 | || has_to_string |
| 1391 | || has_equals |
| 1392 | || log_ann.is_some(); |
| 1393 | if !class_has_lombok && !fields.iter().any(|f| !self.lombok_annotation_names(*f).is_empty()) { |
| 1394 | return; |
| 1395 | } |
| 1396 | |
| 1397 | // Members the source already declares (exact `classQN::name` matches). |
| 1398 | let class_qn = self.nodes_meta[class_row as usize].qualified_name.clone(); |
| 1399 | let class_name = self.nodes_meta[class_row as usize].name.clone(); |
| 1400 | let mut taken_methods: HashSet<String> = HashSet::new(); |
| 1401 | let mut taken_fields: HashSet<String> = HashSet::new(); |
| 1402 | for m in &self.nodes_meta { |
| 1403 | if m.qualified_name == format!("{class_qn}::{}", m.name) { |
| 1404 | match m.kind { |
| 1405 | "method" | "function" => { |
| 1406 | taken_methods.insert(m.name.clone()); |
| 1407 | } |
| 1408 | "field" | "variable" | "constant" | "property" => { |
| 1409 | taken_fields.insert(m.name.clone()); |
| 1410 | } |
| 1411 | _ => {} |
| 1412 | } |
| 1413 | } |
| 1414 | } |
| 1415 | |
| 1416 | let class_name_node = class_node.child_by_field_name("name").unwrap_or(class_node); |
| 1417 | |
| 1418 | macro_rules! emit_method { |
| 1419 | ($name:expr, $anchor:expr, $sig:expr, $from:expr, $is_static:expr, $ret:expr) => {{ |
| 1420 | let name: String = $name; |
| 1421 | if !name.is_empty() && !taken_methods.contains(&name) { |
| 1422 | taken_methods.insert(name.clone()); |
| 1423 | self.create_node( |
| 1424 | "method", |
| 1425 | &name, |
no test coverage detected