use clang::*;
use clang::completion::*;
pub fn test(clang: &Clang) {
let source = "
struct A {
/// \\brief An integer field.
int a;
int b;
int c;
};
void b() { A a; a. }
";
super::with_temporary_file("test.cpp", source, |_, f| {
let index = Index::new(&clang, false, false);
let tu = index.parser(f).briefs_in_completion_results(true).parse().unwrap();
let results = tu.completer(f, 8, 27).briefs(true).complete();
assert_eq!(results.get_container_kind(), Some((EntityKind::StructDecl, false)));
assert!(results.get_diagnostics(&tu).is_empty());
assert_eq!(results.get_usr(), Some(Usr("c:@S@A".into())));
let context = results.get_context().unwrap();
assert!(!context.all_types);
assert!(!context.all_values);
assert!(!context.class_type_values);
assert!(context.dot_members);
assert!(!context.arrow_members);
assert!(!context.enum_tags);
assert!(!context.union_tags);
assert!(!context.struct_tags);
assert!(!context.class_names);
assert!(!context.namespaces);
assert!(!context.nested_name_specifiers);
assert!(!context.macro_names);
assert!(!context.natural_language);
assert!(!context.objc_object_values);
assert!(!context.objc_selector_values);
assert!(!context.objc_property_members);
assert!(!context.objc_interfaces);
assert!(!context.objc_protocols);
assert!(!context.objc_categories);
assert!(!context.objc_instance_messages);
assert!(!context.objc_class_messages);
assert!(!context.objc_selector_names);
if cfg!(feature="clang_6_0") {
return;
}
let mut results = results.get_results();
if cfg!(target_os="windows") && cfg!(feature="clang_3_8") {
assert_eq!(results.len(), 7);
} else {
assert_eq!(results.len(), 6);
}
results.sort();
macro_rules! assert_result_eq {
($result:expr, $kind:expr, $priority:expr, $brief:expr, $parent:expr, $typed:expr, $chunks:expr) => ({
let result = $result;
assert_eq!(result.kind, $kind);
assert_eq!(result.string.get_priority(), $priority);
assert_eq!(result.string.get_annotations().len(), 0);
assert_eq!(result.string.get_availability(), Availability::Available);
assert_eq!(result.string.get_comment_brief(), $brief);
assert_eq!(result.string.get_parent_name(), Some($parent.into()));
assert_eq!(result.string.get_typed_text(), Some($typed.into()));
assert_eq!(result.string.get_chunks(), $chunks);
});
}
assert_result_eq!(results[0], EntityKind::Method, 34, None, "A", "operator=", &[
CompletionChunk::ResultType("A &".into()),
CompletionChunk::TypedText("operator=".into()),
CompletionChunk::LeftParenthesis,
CompletionChunk::Placeholder("const A &".into()),
CompletionChunk::RightParenthesis,
]);
let offset = if cfg!(target_os="windows") && cfg!(feature="clang_3_8") {
assert_result_eq!(results[1], EntityKind::Method, 34, None, "A", "operator=", &[
CompletionChunk::ResultType("A &".into()),
CompletionChunk::TypedText("operator=".into()),
CompletionChunk::LeftParenthesis,
CompletionChunk::Placeholder("A &&".into()),
CompletionChunk::RightParenthesis,
]);
1
} else {
0
};
assert_result_eq!(results[1 + offset], EntityKind::Destructor, 34, None, "A", "~A", &[
CompletionChunk::ResultType("void".into()),
CompletionChunk::TypedText("~A".into()),
CompletionChunk::LeftParenthesis,
CompletionChunk::RightParenthesis,
]);
let brief = Some("An integer field.".into());
assert_result_eq!(results[2 + offset], EntityKind::FieldDecl, 35, brief, "A", "a", &[
CompletionChunk::ResultType("int".into()),
CompletionChunk::TypedText("a".into()),
]);
assert_result_eq!(results[3 + offset], EntityKind::FieldDecl, 35, None, "A", "b", &[
CompletionChunk::ResultType("int".into()),
CompletionChunk::TypedText("b".into()),
]);
assert_result_eq!(results[4 + offset], EntityKind::FieldDecl, 35, None, "A", "c", &[
CompletionChunk::ResultType("int".into()),
CompletionChunk::TypedText("c".into()),
]);
assert_result_eq!(results[5 + offset], EntityKind::StructDecl, 75, None, "A", "A", &[
CompletionChunk::TypedText("A".into()),
CompletionChunk::Text("::".into()),
]);
});
}