use super::ast::{Node, NodeKind};
use super::span::Span;
pub mod ast;
pub mod imports;
pub mod lexer;
pub mod parser;
pub mod refactor;
pub mod resolve;
pub mod tokens;
pub mod xlang;
pub use imports::{csharp_imports, csharp_imports_and_apis};
pub use refactor::{
add_csharp_comment, csharp_references, csharp_symbols, csharp_unit, rename_csharp_field,
rename_csharp_local, rename_csharp_method, rename_csharp_parameter, rename_csharp_symbol,
};
pub use xlang::{rename_member, rename_type};
pub fn csharp_code_span(node: &Node) -> Option<Span> {
match &node.kind {
NodeKind::CSharpMemberDef(def) => Some(def.code_span),
NodeKind::Command {
csharp: Some(cs), ..
} => match &cs.kind {
NodeKind::CSharpMemberDef(def) => Some(def.code_span),
_ => None,
},
_ => None,
}
}
#[cfg(test)]
mod tests {
use crate::v2::csharp::csharp_code_span;
use crate::v2::{parse, NodeKind};
fn add_type_node(src: &str) -> crate::v2::Node {
let out = parse(src);
let mut found = None;
out.script.walk(&mut |n| {
if matches!(n.kind, NodeKind::CSharpMemberDef(_)) && found.is_none() {
found = Some(n.clone());
}
});
found.expect("expected a CSharpMemberDef")
}
#[test]
fn code_span_points_at_inline_here_string_body() {
let src = "Add-Type -TypeDefinition @'\npublic class A { }\n'@\n";
let node = add_type_node(src);
let span = csharp_code_span(&node).expect("code span");
assert_eq!(span.slice(src), "public class A { }");
}
#[test]
fn code_span_points_at_single_quoted_body() {
let src = "Add-Type -MemberDefinition 'public static int N() { return 1; }' -Name X\n";
let node = add_type_node(src);
let span = csharp_code_span(&node).expect("code span");
assert_eq!(span.slice(src), "public static int N() { return 1; }");
}
#[test]
fn code_span_follows_a_variable_assignment() {
let src = "$code = @'\npublic class B { }\n'@\nAdd-Type -TypeDefinition $code\n";
let node = add_type_node(src);
let span = csharp_code_span(&node).expect("code span");
assert_eq!(span.slice(src), "public class B { }");
}
}