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