mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 17:57:35 +00:00
LanguageServers/Cpp: Add SemanticType::PreprocessorMacro
This adds a new semantic token type, PreprocessorMacro. Calls to preprocessor macros will now be highlighted when semantic highlighting is enabled in Hack Studio.
This commit is contained in:
parent
597ca68e2d
commit
9cd27d1e15
4 changed files with 18 additions and 5 deletions
|
@ -149,8 +149,8 @@ void ConnectionFromClient::get_tokens_info(String const& filename)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto token_info = m_autocomplete_engine->get_tokens_info(filename);
|
auto tokens_info = m_autocomplete_engine->get_tokens_info(filename);
|
||||||
async_tokens_info_result(move(token_info));
|
async_tokens_info_result(move(tokens_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -429,15 +429,21 @@ RefPtr<Declaration> CppComprehensionEngine::find_declaration_of(const DocumentDa
|
||||||
Optional<GUI::AutocompleteProvider::ProjectLocation> CppComprehensionEngine::find_preprocessor_definition(const DocumentData& document, const GUI::TextPosition& text_position)
|
Optional<GUI::AutocompleteProvider::ProjectLocation> CppComprehensionEngine::find_preprocessor_definition(const DocumentData& document, const GUI::TextPosition& text_position)
|
||||||
{
|
{
|
||||||
Position cpp_position { text_position.line(), text_position.column() };
|
Position cpp_position { text_position.line(), text_position.column() };
|
||||||
|
auto substitution = find_preprocessor_substitution(document, cpp_position);
|
||||||
|
if (!substitution.has_value())
|
||||||
|
return {};
|
||||||
|
return GUI::AutocompleteProvider::ProjectLocation { substitution->defined_value.filename, substitution->defined_value.line, substitution->defined_value.column };
|
||||||
|
}
|
||||||
|
|
||||||
|
Optional<Cpp::Preprocessor::Substitution> CppComprehensionEngine::find_preprocessor_substitution(DocumentData const& document, Cpp::Position const& cpp_position)
|
||||||
|
{
|
||||||
// Search for a replaced preprocessor token that intersects with text_position
|
// Search for a replaced preprocessor token that intersects with text_position
|
||||||
for (auto& substitution : document.preprocessor().substitutions()) {
|
for (auto& substitution : document.preprocessor().substitutions()) {
|
||||||
if (substitution.original_tokens.first().start() > cpp_position)
|
if (substitution.original_tokens.first().start() > cpp_position)
|
||||||
continue;
|
continue;
|
||||||
if (substitution.original_tokens.first().end() < cpp_position)
|
if (substitution.original_tokens.first().end() < cpp_position)
|
||||||
continue;
|
continue;
|
||||||
|
return substitution;
|
||||||
return GUI::AutocompleteProvider::ProjectLocation { substitution.defined_value.filename, substitution.defined_value.line, substitution.defined_value.column };
|
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -978,6 +984,9 @@ GUI::AutocompleteProvider::TokenInfo::SemanticType CppComprehensionEngine::get_t
|
||||||
|
|
||||||
GUI::AutocompleteProvider::TokenInfo::SemanticType CppComprehensionEngine::get_semantic_type_for_identifier(DocumentData const& document, Position position)
|
GUI::AutocompleteProvider::TokenInfo::SemanticType CppComprehensionEngine::get_semantic_type_for_identifier(DocumentData const& document, Position position)
|
||||||
{
|
{
|
||||||
|
if (find_preprocessor_substitution(document, position).has_value())
|
||||||
|
return GUI::AutocompleteProvider::TokenInfo::SemanticType::PreprocessorMacro;
|
||||||
|
|
||||||
auto decl = find_declaration_of(document, GUI::TextPosition { position.line, position.column });
|
auto decl = find_declaration_of(document, GUI::TextPosition { position.line, position.column });
|
||||||
if (!decl)
|
if (!decl)
|
||||||
return GUI::AutocompleteProvider::TokenInfo::SemanticType::Identifier;
|
return GUI::AutocompleteProvider::TokenInfo::SemanticType::Identifier;
|
||||||
|
|
|
@ -127,6 +127,7 @@ private:
|
||||||
Vector<StringView> scope_of_reference_to_symbol(const ASTNode&) const;
|
Vector<StringView> scope_of_reference_to_symbol(const ASTNode&) const;
|
||||||
|
|
||||||
Optional<GUI::AutocompleteProvider::ProjectLocation> find_preprocessor_definition(const DocumentData&, const GUI::TextPosition&);
|
Optional<GUI::AutocompleteProvider::ProjectLocation> find_preprocessor_definition(const DocumentData&, const GUI::TextPosition&);
|
||||||
|
Optional<Cpp::Preprocessor::Substitution> find_preprocessor_substitution(DocumentData const&, Cpp::Position const&);
|
||||||
|
|
||||||
OwnPtr<DocumentData> create_document_data(String&& text, const String& filename);
|
OwnPtr<DocumentData> create_document_data(String&& text, const String& filename);
|
||||||
Optional<Vector<GUI::AutocompleteProvider::Entry>> try_autocomplete_property(const DocumentData&, const ASTNode&, Optional<Token> containing_token) const;
|
Optional<Vector<GUI::AutocompleteProvider::Entry>> try_autocomplete_property(const DocumentData&, const ASTNode&, Optional<Token> containing_token) const;
|
||||||
|
|
|
@ -100,6 +100,8 @@ static Syntax::TextStyle style_for_token_type(Gfx::Palette const& palette, GUI::
|
||||||
return { palette.syntax_member(), false };
|
return { palette.syntax_member(), false };
|
||||||
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Parameter:
|
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Parameter:
|
||||||
return { palette.syntax_parameter(), false };
|
return { palette.syntax_parameter(), false };
|
||||||
|
case GUI::AutocompleteProvider::TokenInfo::SemanticType::PreprocessorMacro:
|
||||||
|
return { palette.syntax_preprocessor_value(), false };
|
||||||
default:
|
default:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
return { palette.base_text(), false };
|
return { palette.base_text(), false };
|
||||||
|
@ -152,7 +154,8 @@ bool SemanticSyntaxHighlighter::is_identifier(u64 token_type) const
|
||||||
|| type == AutocompleteProvider::TokenInfo::SemanticType::CustomType
|
|| type == AutocompleteProvider::TokenInfo::SemanticType::CustomType
|
||||||
|| type == AutocompleteProvider::TokenInfo::SemanticType::Namespace
|
|| type == AutocompleteProvider::TokenInfo::SemanticType::Namespace
|
||||||
|| type == AutocompleteProvider::TokenInfo::SemanticType::Member
|
|| type == AutocompleteProvider::TokenInfo::SemanticType::Member
|
||||||
|| type == AutocompleteProvider::TokenInfo::SemanticType::Parameter;
|
|| type == AutocompleteProvider::TokenInfo::SemanticType::Parameter
|
||||||
|
|| type == AutocompleteProvider::TokenInfo::SemanticType::PreprocessorMacro;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SemanticSyntaxHighlighter::is_navigatable(u64 token_type) const
|
bool SemanticSyntaxHighlighter::is_navigatable(u64 token_type) const
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue