pub struct JavaKotlinResolver;
impl NameResolver for JavaKotlinResolver {
fn can_resolve(
&self,
source_language: Language,
target_language: Language,
_source: &UnifiedNode,
reference: &crate::ast::polyglot::unified_node::NodeReference,
target: &UnifiedNode,
) -> bool {
if !((source_language == Language::Java && target_language == Language::Kotlin)
|| (source_language == Language::Kotlin && target_language == Language::Java))
{
return false;
}
if reference.target_name == target.name {
return true;
}
if reference.target_name == target.fqn {
return true;
}
let src_parts: Vec<&str> = reference.target_name.split('.').collect();
let tgt_parts: Vec<&str> = target.fqn.split('.').collect();
if src_parts.len() == tgt_parts.len() {
if src_parts[0..src_parts.len() - 1] == tgt_parts[0..tgt_parts.len() - 1] {
if src_parts.last().expect("internal error")
== tgt_parts.last().expect("internal error")
{
return true;
}
}
}
false
}
}
pub struct JavaScalaResolver;
impl NameResolver for JavaScalaResolver {
fn can_resolve(
&self,
source_language: Language,
target_language: Language,
_source: &UnifiedNode,
reference: &crate::ast::polyglot::unified_node::NodeReference,
target: &UnifiedNode,
) -> bool {
if !((source_language == Language::Java && target_language == Language::Scala)
|| (source_language == Language::Scala && target_language == Language::Java))
{
return false;
}
if reference.target_name == target.name {
return true;
}
if reference.target_name == target.fqn {
return true;
}
let src_parts: Vec<&str> = reference.target_name.split('.').collect();
let tgt_parts: Vec<&str> = target.fqn.split('.').collect();
if src_parts.len() == tgt_parts.len() {
if src_parts[0..src_parts.len() - 1] == tgt_parts[0..tgt_parts.len() - 1] {
if src_parts.last().expect("internal error")
== tgt_parts.last().expect("internal error")
{
return true;
}
}
}
false
}
}
pub struct TypeScriptJavaResolver;
impl NameResolver for TypeScriptJavaResolver {
fn can_resolve(
&self,
source_language: Language,
target_language: Language,
_source: &UnifiedNode,
reference: &crate::ast::polyglot::unified_node::NodeReference,
target: &UnifiedNode,
) -> bool {
if !((source_language == Language::TypeScript && target_language == Language::Java)
|| (source_language == Language::Java && target_language == Language::TypeScript))
{
return false;
}
if reference.target_name == target.name {
return true;
}
if target.fqn.ends_with(&reference.target_name) {
return true;
}
if source_language == Language::TypeScript
&& reference.target_name.starts_with('I')
&& reference.target_name.len() > 1
{
let name_without_i = reference.target_name.get(1..).unwrap_or_default();
if name_without_i == target.name {
return true;
}
if target.fqn.ends_with(name_without_i) {
return true;
}
}
false
}
}