C++: Fix handling of Objective-C/C++

- Objective C/C++ was not enabled in highlighter.
- QMake project part for Objective C/C++ did not have ObjectiveC extension enabled.
- As languageFeatures.objCEnabled is a bitfield, it was actually always set to 0.
- Highlight ObjC class & protocol declarations.
- Highlight ObjC message passing.

Change-Id: I64d12c9509058d05f7adce94598cb7ce91727ac8
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Francois Ferrand
2016-09-12 13:42:42 +02:00
parent 8f0ddff1cc
commit 38ae5aec10
7 changed files with 70 additions and 2 deletions

View File

@@ -203,6 +203,7 @@ static Tokens getTokens(const QTextCursor &cursor, int &prevState)
features.cxx11Enabled = true; features.cxx11Enabled = true;
features.cxxEnabled = true; features.cxxEnabled = true;
features.c99Enabled = true; features.c99Enabled = true;
features.objCEnabled = true;
SimpleLexer tokenize; SimpleLexer tokenize;
tokenize.setLanguageFeatures(features); tokenize.setLanguageFeatures(features);

View File

@@ -872,7 +872,7 @@ AssistInterface *CppEditorWidget::createAssistInterface(AssistKind kind, AssistR
LanguageFeatures features = LanguageFeatures::defaultFeatures(); LanguageFeatures features = LanguageFeatures::defaultFeatures();
if (Document::Ptr doc = d->m_lastSemanticInfo.doc) if (Document::Ptr doc = d->m_lastSemanticInfo.doc)
features = doc->languageFeatures(); features = doc->languageFeatures();
features.objCEnabled = cppEditorDocument()->isObjCEnabled(); features.objCEnabled |= cppEditorDocument()->isObjCEnabled();
return cap->createAssistInterface( return cap->createAssistInterface(
textDocument()->filePath().toString(), textDocument()->filePath().toString(),
this, this,

View File

@@ -75,6 +75,7 @@ void CppHighlighter::highlightBlock(const QString &text)
features.cxx11Enabled = true; features.cxx11Enabled = true;
features.cxxEnabled = true; features.cxxEnabled = true;
features.c99Enabled = true; features.c99Enabled = true;
features.objCEnabled = true;
SimpleLexer tokenize; SimpleLexer tokenize;
tokenize.setLanguageFeatures(features); tokenize.setLanguageFeatures(features);

View File

@@ -568,6 +568,58 @@ bool CheckSymbols::visit(ElaboratedTypeSpecifierAST *ast)
return false; return false;
} }
bool CheckSymbols::visit(ObjCProtocolDeclarationAST *ast)
{
accept(ast->attribute_list);
accept(ast->name);
accept(ast->protocol_refs);
accept(ast->member_declaration_list);
addUse(ast->name, SemanticHighlighter::TypeUse);
return false;
}
bool CheckSymbols::visit(ObjCProtocolForwardDeclarationAST *ast)
{
accept(ast->attribute_list);
accept(ast->identifier_list);
for (NameListAST *i = ast->identifier_list; i; i = i->next)
addUse(i->value, SemanticHighlighter::TypeUse);
return false;
}
bool CheckSymbols::visit(ObjCClassDeclarationAST *ast)
{
accept(ast->attribute_list);
accept(ast->class_name);
accept(ast->category_name);
accept(ast->superclass);
accept(ast->protocol_refs);
accept(ast->inst_vars_decl);
accept(ast->member_declaration_list);
addUse(ast->class_name, SemanticHighlighter::TypeUse);
if (ast->superclass && maybeType(ast->superclass->name))
addUse(ast->superclass, SemanticHighlighter::TypeUse);
return false;
}
bool CheckSymbols::visit(ObjCClassForwardDeclarationAST *ast)
{
accept(ast->attribute_list);
accept(ast->identifier_list);
for (NameListAST *i = ast->identifier_list ; i != 0; i = i->next)
addUse(i->value, SemanticHighlighter::TypeUse);
return false;
}
bool CheckSymbols::visit(ObjCProtocolRefsAST *ast)
{
accept(ast->identifier_list);
for (NameListAST *i = ast->identifier_list; i; i = i->next)
if (maybeType(i->value->name))
addUse(i->value, SemanticHighlighter::TypeUse);
return false;
}
bool CheckSymbols::visit(MemberAccessAST *ast) bool CheckSymbols::visit(MemberAccessAST *ast)
{ {
accept(ast->base_expression); accept(ast->base_expression);
@@ -657,6 +709,12 @@ bool CheckSymbols::visit(CallAST *ast)
return false; return false;
} }
bool CheckSymbols::visit(ObjCSelectorArgumentAST *ast)
{
addUse(ast->firstToken(), SemanticHighlighter::FunctionUse);
return true;
}
bool CheckSymbols::visit(NewExpressionAST *ast) bool CheckSymbols::visit(NewExpressionAST *ast)
{ {
accept(ast->new_placement); accept(ast->new_placement);

View File

@@ -154,6 +154,12 @@ protected:
virtual bool visit(CPlusPlus::ElaboratedTypeSpecifierAST *ast); virtual bool visit(CPlusPlus::ElaboratedTypeSpecifierAST *ast);
virtual bool visit(CPlusPlus::ObjCProtocolDeclarationAST *ast);
virtual bool visit(CPlusPlus::ObjCProtocolForwardDeclarationAST *ast);
virtual bool visit(CPlusPlus::ObjCClassDeclarationAST *ast);
virtual bool visit(CPlusPlus::ObjCClassForwardDeclarationAST *ast);
virtual bool visit(CPlusPlus::ObjCProtocolRefsAST *ast);
virtual bool visit(CPlusPlus::SimpleNameAST *ast); virtual bool visit(CPlusPlus::SimpleNameAST *ast);
virtual bool visit(CPlusPlus::DestructorNameAST *ast); virtual bool visit(CPlusPlus::DestructorNameAST *ast);
virtual bool visit(CPlusPlus::QualifiedNameAST *ast); virtual bool visit(CPlusPlus::QualifiedNameAST *ast);
@@ -161,6 +167,7 @@ protected:
virtual bool visit(CPlusPlus::MemberAccessAST *ast); virtual bool visit(CPlusPlus::MemberAccessAST *ast);
virtual bool visit(CPlusPlus::CallAST *ast); virtual bool visit(CPlusPlus::CallAST *ast);
virtual bool visit(CPlusPlus::ObjCSelectorArgumentAST *ast);
virtual bool visit(CPlusPlus::NewExpressionAST *ast); virtual bool visit(CPlusPlus::NewExpressionAST *ast);
virtual bool visit(CPlusPlus::GotoStatementAST *ast); virtual bool visit(CPlusPlus::GotoStatementAST *ast);

View File

@@ -48,7 +48,7 @@ void ProjectPart::updateLanguageFeatures()
languageFeatures.cxx11Enabled = languageVersion >= CXX11; languageFeatures.cxx11Enabled = languageVersion >= CXX11;
languageFeatures.cxxEnabled = languageVersion >= CXX98; languageFeatures.cxxEnabled = languageVersion >= CXX98;
languageFeatures.c99Enabled = languageVersion >= C99; languageFeatures.c99Enabled = languageVersion >= C99;
languageFeatures.objCEnabled = languageExtensions & ObjectiveCExtensions; languageFeatures.objCEnabled = languageExtensions.testFlag(ObjectiveCExtensions);
languageFeatures.qtEnabled = hasQt; languageFeatures.qtEnabled = hasQt;
languageFeatures.qtMocRunEnabled = hasQt; languageFeatures.qtMocRunEnabled = hasQt;
if (!hasQt) { if (!hasQt) {

View File

@@ -497,6 +497,7 @@ void QmakeProject::updateCppCodeModel()
ProjectFile::CXXSource)); ProjectFile::CXXSource));
pinfo.appendProjectPart(cppPart); pinfo.appendProjectPart(cppPart);
objcppPart->displayName += QLatin1String(" (ObjC++)"); objcppPart->displayName += QLatin1String(" (ObjC++)");
objcppPart->languageExtensions |= ProjectPart::ObjectiveCExtensions;
if (!objcppPart->files.isEmpty()) { if (!objcppPart->files.isEmpty()) {
pinfo.appendProjectPart(objcppPart); pinfo.appendProjectPart(objcppPart);
cppPart->displayName += QLatin1String(" (C++)"); cppPart->displayName += QLatin1String(" (C++)");