forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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++)");
|
||||||
|
|||||||
Reference in New Issue
Block a user