mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-29 11:01:57 +00:00
Add ClangCursor::get_spelling_range and change some ResolveSpelling calls to get_spelling_range
This commit is contained in:
parent
a6496a0f8f
commit
02246a5c4b
@ -123,6 +123,21 @@ std::string ClangCursor::get_spelling() const {
|
||||
return ::ToString(clang_getCursorSpelling(cx_cursor));
|
||||
}
|
||||
|
||||
Range ClangCursor::get_spelling_range(CXFile* cx_file) const {
|
||||
// TODO for Objective-C methods and Objective-C message expressions, there are
|
||||
// multiple pieces for each selector identifier.
|
||||
CXSourceRange range = clang_Cursor_getSpellingNameRange(cx_cursor, 0, 0);
|
||||
CXSourceLocation start = clang_getRangeStart(range);
|
||||
CXSourceLocation end = clang_getRangeEnd(range);
|
||||
|
||||
unsigned int start_line, start_column;
|
||||
clang_getSpellingLocation(start, cx_file, &start_line, &start_column, nullptr);
|
||||
unsigned int end_line, end_column;
|
||||
clang_getSpellingLocation(end, nullptr, &end_line, &end_column, nullptr);
|
||||
return Range(Position((int16_t)start_line, (int16_t)start_column) /*start*/,
|
||||
Position((int16_t)end_line, (int16_t)end_column) /*end*/);
|
||||
}
|
||||
|
||||
std::string ClangCursor::get_display_name() const {
|
||||
return ::ToString(clang_getCursorDisplayName(cx_cursor));
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "position.h"
|
||||
|
||||
#include <clang-c/Index.h>
|
||||
#include <optional.h>
|
||||
|
||||
@ -45,6 +47,7 @@ class ClangCursor {
|
||||
ClangCursor get_declaration() const;
|
||||
ClangType get_type() const;
|
||||
std::string get_spelling() const;
|
||||
Range get_spelling_range(CXFile* cx_file = nullptr) const;
|
||||
std::string get_display_name() const;
|
||||
std::string get_usr() const;
|
||||
|
||||
|
@ -657,7 +657,7 @@ void VisitDeclForTypeUsageVisitorHandler(ClangCursor cursor,
|
||||
IndexType* ref_type_def = db->Resolve(ref_type_id);
|
||||
// TODO: Should we even be visiting this if the file is not from the main
|
||||
// def? Try adding assert on |loc| later.
|
||||
Range loc = ResolveSpelling(cursor.cx_cursor);
|
||||
Range loc = cursor.get_spelling_range();
|
||||
UniqueAdd(ref_type_def->uses, loc);
|
||||
}
|
||||
|
||||
@ -886,7 +886,7 @@ ClangCursor::VisitResult AddDeclInitializerUsagesVisitor(ClangCursor cursor,
|
||||
if (ref_usr == "")
|
||||
break;
|
||||
|
||||
Range loc = ResolveSpelling(cursor.cx_cursor);
|
||||
Range loc = cursor.get_spelling_range();
|
||||
IndexVarId ref_id = db->ToVarId(ref_usr);
|
||||
IndexVar* ref_def = db->Resolve(ref_id);
|
||||
UniqueAdd(ref_def->uses, loc);
|
||||
@ -985,14 +985,14 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
||||
data->db->Resolve(data->db->ToVarId(ref_cursor.get_usr()));
|
||||
if (ref_index->def.short_name.empty()) {
|
||||
ref_index->def.definition_spelling =
|
||||
ResolveSpelling(ref_cursor.cx_cursor);
|
||||
ref_cursor.get_spelling_range();
|
||||
ref_index->def.definition_extent =
|
||||
ResolveExtent(ref_cursor.cx_cursor);
|
||||
ref_index->def.short_name = ref_cursor.get_spelling();
|
||||
ref_index->def.detailed_name = ref_index->def.short_name;
|
||||
ref_index->uses.push_back(ResolveSpelling(ref_cursor.cx_cursor));
|
||||
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
||||
}
|
||||
UniqueAdd(ref_index->uses, ResolveSpelling(cursor.cx_cursor));
|
||||
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1009,7 +1009,7 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
||||
IndexFuncId called_id = data->db->ToFuncId(ref_usr);
|
||||
IndexFunc* called = data->db->Resolve(called_id);
|
||||
OnIndexReference_Function(data->db,
|
||||
ResolveSpelling(cursor.cx_cursor),
|
||||
cursor.get_spelling_range(),
|
||||
data->container, called_id, called,
|
||||
/*implicit=*/false);
|
||||
break;
|
||||
@ -1030,14 +1030,14 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
||||
// {Class,Function}Template. Thus we need to initialize it here.
|
||||
if (ref_index->def.short_name.empty()) {
|
||||
ref_index->def.definition_spelling =
|
||||
ResolveSpelling(ref_cursor.cx_cursor);
|
||||
ref_cursor.get_spelling_range();
|
||||
ref_index->def.definition_extent =
|
||||
ResolveExtent(ref_cursor.cx_cursor);
|
||||
ref_index->def.short_name = ref_cursor.get_spelling();
|
||||
ref_index->def.detailed_name = ref_index->def.short_name;
|
||||
ref_index->uses.push_back(ResolveSpelling(ref_cursor.cx_cursor));
|
||||
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
||||
}
|
||||
UniqueAdd(ref_index->uses, ResolveSpelling(cursor.cx_cursor));
|
||||
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1053,14 +1053,14 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
||||
// {Class,Function}Template. Thus we need to initialize it here.
|
||||
if (ref_index->def.short_name.empty()) {
|
||||
ref_index->def.definition_spelling =
|
||||
ResolveSpelling(ref_cursor.cx_cursor);
|
||||
ref_cursor.get_spelling_range();
|
||||
ref_index->def.definition_extent =
|
||||
ResolveExtent(ref_cursor.cx_cursor);
|
||||
ref_index->def.short_name = ref_cursor.get_spelling();
|
||||
ref_index->def.detailed_name = ref_index->def.short_name;
|
||||
ref_index->uses.push_back(ResolveSpelling(ref_cursor.cx_cursor));
|
||||
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
||||
}
|
||||
UniqueAdd(ref_index->uses, ResolveSpelling(cursor.cx_cursor));
|
||||
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1177,9 +1177,8 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
case CXIdxEntity_Field:
|
||||
case CXIdxEntity_Variable:
|
||||
case CXIdxEntity_CXXStaticVariable: {
|
||||
Range decl_loc_spelling = ResolveSpelling(decl->cursor);
|
||||
|
||||
ClangCursor decl_cursor = decl->cursor;
|
||||
Range decl_spell = decl_cursor.get_spelling_range();
|
||||
|
||||
// Do not index implicit template instantiations.
|
||||
if (decl_cursor !=
|
||||
@ -1231,13 +1230,12 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
//}
|
||||
|
||||
if (decl->isDefinition) {
|
||||
var->def.definition_spelling = ResolveSpelling(decl->cursor);
|
||||
var->def.definition_spelling = decl_spell;
|
||||
var->def.definition_extent = ResolveExtent(decl->cursor);
|
||||
;
|
||||
} else {
|
||||
var->def.declaration = ResolveSpelling(decl->cursor);
|
||||
var->def.declaration = decl_spell;
|
||||
}
|
||||
UniqueAdd(var->uses, decl_loc_spelling);
|
||||
UniqueAdd(var->uses, decl_spell);
|
||||
|
||||
AddDeclInitializerUsages(db, decl_cursor);
|
||||
var = db->Resolve(var_id);
|
||||
@ -1288,10 +1286,10 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
case CXIdxEntity_CXXInstanceMethod:
|
||||
case CXIdxEntity_CXXStaticMethod:
|
||||
case CXIdxEntity_CXXConversionFunction: {
|
||||
Range decl_spelling = ResolveSpelling(decl->cursor);
|
||||
ClangCursor decl_cursor = decl->cursor;
|
||||
Range decl_spelling = decl_cursor.get_spelling_range();
|
||||
Range decl_extent = ResolveExtent(decl->cursor);
|
||||
|
||||
ClangCursor decl_cursor = decl->cursor;
|
||||
ClangCursor decl_cursor_resolved =
|
||||
decl_cursor.template_specialization_to_template_definition();
|
||||
bool is_template_specialization = decl_cursor != decl_cursor_resolved;
|
||||
@ -1326,7 +1324,7 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
for (ClangCursor arg : decl_cursor.get_arguments()) {
|
||||
switch (arg.get_kind()) {
|
||||
case CXCursor_ParmDecl: {
|
||||
Range param_spelling = ResolveSpelling(arg.cx_cursor);
|
||||
Range param_spelling = arg.get_spelling_range();
|
||||
|
||||
// If the name is empty (which is common for parameters), clang
|
||||
// will report a range with length 1, which is not correct.
|
||||
@ -1425,8 +1423,6 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
|
||||
case CXIdxEntity_Typedef:
|
||||
case CXIdxEntity_CXXTypeAlias: {
|
||||
Range decl_loc_spelling = ResolveSpelling(decl->cursor);
|
||||
|
||||
// Note we want to fetch the first TypeRef. Running
|
||||
// ResolveCursorType(decl->cursor) would return
|
||||
// the type of the typedef/using, not the type of the referenced type.
|
||||
@ -1439,7 +1435,8 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
if (alias_of)
|
||||
type->def.alias_of = alias_of.value();
|
||||
|
||||
Range spell = ResolveSpelling(decl->cursor);
|
||||
ClangCursor decl_cursor = decl->cursor;
|
||||
Range spell = decl_cursor.get_spelling_range();
|
||||
Range extent = ResolveExtent(decl->cursor);
|
||||
type->def.definition_spelling = spell;
|
||||
type->def.definition_extent = extent;
|
||||
@ -1448,7 +1445,6 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
type->def.detailed_name =
|
||||
ns->QualifiedName(decl->semanticContainer, type->def.short_name);
|
||||
|
||||
ClangCursor decl_cursor = decl->cursor;
|
||||
type->def.comments = decl_cursor.get_comments();
|
||||
|
||||
// For Typedef/CXXTypeAlias spanning a few lines, display the declaration
|
||||
@ -1470,7 +1466,7 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
}
|
||||
}
|
||||
|
||||
UniqueAdd(type->uses, decl_loc_spelling);
|
||||
UniqueAdd(type->uses, spell);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1481,7 +1477,8 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
case CXIdxEntity_Union:
|
||||
case CXIdxEntity_Struct:
|
||||
case CXIdxEntity_CXXClass: {
|
||||
Range decl_loc_spelling = ResolveSpelling(decl->cursor);
|
||||
ClangCursor decl_cursor = decl->cursor;
|
||||
Range decl_loc_spelling = decl_cursor.get_spelling_range();
|
||||
|
||||
IndexTypeId type_id = db->ToTypeId(decl->entityInfo->USR);
|
||||
IndexType* type = db->Resolve(type_id);
|
||||
@ -1504,12 +1501,11 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
||||
|
||||
type->def.detailed_name =
|
||||
ns->QualifiedName(decl->semanticContainer, type->def.short_name);
|
||||
ClangCursor decl_cursor = decl->cursor;
|
||||
type->def.comments = decl_cursor.get_comments();
|
||||
// }
|
||||
|
||||
if (decl->isDefinition) {
|
||||
type->def.definition_spelling = ResolveSpelling(decl->cursor);
|
||||
type->def.definition_spelling = decl_loc_spelling;
|
||||
type->def.definition_extent = ResolveExtent(decl->cursor);
|
||||
}
|
||||
UniqueAdd(type->uses, decl_loc_spelling);
|
||||
@ -1599,7 +1595,8 @@ void OnIndexReference(CXClientData client_data, const CXIdxEntityRefInfo* ref) {
|
||||
case CXIdxEntity_CXXStaticVariable:
|
||||
case CXIdxEntity_Variable:
|
||||
case CXIdxEntity_Field: {
|
||||
Range loc_spelling = ResolveSpelling(ref->cursor);
|
||||
ClangCursor ref_cursor(ref->cursor);
|
||||
Range loc_spelling = ref_cursor.get_spelling_range();
|
||||
|
||||
ClangCursor referenced = ref->referencedEntity->cursor;
|
||||
referenced = referenced.template_specialization_to_template_definition();
|
||||
@ -1612,8 +1609,7 @@ void OnIndexReference(CXClientData client_data, const CXIdxEntityRefInfo* ref) {
|
||||
// as lambdas cannot be split across files.
|
||||
if (var->def.short_name.empty()) {
|
||||
CXFile referenced_file;
|
||||
Range spelling =
|
||||
ResolveSpelling(referenced.cx_cursor, &referenced_file);
|
||||
Range spelling = referenced.get_spelling_range(&referenced_file);
|
||||
if (file == referenced_file) {
|
||||
var->def.definition_spelling = spelling;
|
||||
var->def.definition_extent = ResolveExtent(referenced.cx_cursor);
|
||||
@ -1628,7 +1624,7 @@ void OnIndexReference(CXClientData client_data, const CXIdxEntityRefInfo* ref) {
|
||||
var->def.cls = VarClass::Local;
|
||||
ClangCursor decl_cursor = referenced;
|
||||
var->def.comments = decl_cursor.get_comments();
|
||||
UniqueAdd(var->uses, ResolveSpelling(referenced.cx_cursor));
|
||||
UniqueAdd(var->uses, referenced.get_spelling_range());
|
||||
AddDeclInitializerUsages(db, referenced.cx_cursor);
|
||||
// TODO Use proper semantic_container and lexical_container.
|
||||
AddDeclTypeUsages(db, referenced.cx_cursor, nullptr, nullptr);
|
||||
|
Loading…
Reference in New Issue
Block a user