- enhancement: Show code completion suggestion after "typedef" and "const".
This commit is contained in:
parent
9e5fd90196
commit
b571e5f535
1
NEWS.md
1
NEWS.md
|
@ -24,6 +24,7 @@ Red Panda C++ Version 2.23
|
||||||
- improvement: Correctly eppands macros when real param string contains '(' or ')'.
|
- improvement: Correctly eppands macros when real param string contains '(' or ')'.
|
||||||
- enhancement: add "OI Wiki" and "turtle graphics tutorial" in help menu for zh_CN locale.
|
- enhancement: add "OI Wiki" and "turtle graphics tutorial" in help menu for zh_CN locale.
|
||||||
- fix: Replace panel should be hidden after finding occurrencies.
|
- fix: Replace panel should be hidden after finding occurrencies.
|
||||||
|
- enhancement: Show code completion suggestion after "typedef" and "const".
|
||||||
|
|
||||||
Red Panda C++ Version 2.22
|
Red Panda C++ Version 2.22
|
||||||
|
|
||||||
|
|
|
@ -857,7 +857,12 @@ void Editor::keyPressEvent(QKeyEvent *event)
|
||||||
} else {
|
} else {
|
||||||
QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY());
|
QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY());
|
||||||
if (mParser && !lastWord.isEmpty()) {
|
if (mParser && !lastWord.isEmpty()) {
|
||||||
if (lastWord == "using") {
|
if (lastWord == "typedef" || lastWord == "const") {
|
||||||
|
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
|
||||||
|
showCompletion(lastWord,false, CodeCompletionType::Types);
|
||||||
|
handled=true;
|
||||||
|
return;
|
||||||
|
} else if (lastWord == "using") {
|
||||||
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
|
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
|
||||||
showCompletion(lastWord,false, CodeCompletionType::ComplexKeyword);
|
showCompletion(lastWord,false, CodeCompletionType::ComplexKeyword);
|
||||||
handled=true;
|
handled=true;
|
||||||
|
|
|
@ -589,6 +589,15 @@ PStatement CppParser::findAliasedStatement(const PStatement &statement)
|
||||||
return PStatement();
|
return PStatement();
|
||||||
return doFindAliasedStatement(statement);
|
return doFindAliasedStatement(statement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<PStatement> CppParser::listTypeStatements(const QString &fileName, int line)
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&mMutex);
|
||||||
|
if (mParsing)
|
||||||
|
return QList<PStatement>();
|
||||||
|
return doListTypeStatements(fileName,line);
|
||||||
|
}
|
||||||
|
|
||||||
PStatement CppParser::doFindAliasedStatement(const PStatement &statement) const
|
PStatement CppParser::doFindAliasedStatement(const PStatement &statement) const
|
||||||
{
|
{
|
||||||
if (!statement)
|
if (!statement)
|
||||||
|
@ -612,6 +621,36 @@ PStatement CppParser::doFindAliasedStatement(const PStatement &statement) const
|
||||||
return PStatement();
|
return PStatement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<PStatement> CppParser::doListTypeStatements(const QString &fileName, int line) const
|
||||||
|
{
|
||||||
|
QList<PStatement> result;
|
||||||
|
QSet<QString> usedNamespaces;
|
||||||
|
PStatement scopeStatement = doFindScopeStatement(fileName,line);
|
||||||
|
while (true) {
|
||||||
|
const StatementMap& statementMap = mStatementList.childrenStatements(scopeStatement);
|
||||||
|
foreach (const PStatement statement, statementMap.values()) {
|
||||||
|
if (isTypeStatement(statement->kind))
|
||||||
|
result.append(statement);
|
||||||
|
}
|
||||||
|
if (!scopeStatement)
|
||||||
|
break;
|
||||||
|
usedNamespaces = usedNamespaces.unite(scopeStatement->usingList);
|
||||||
|
scopeStatement=scopeStatement->parentScope.lock();
|
||||||
|
}
|
||||||
|
usedNamespaces = usedNamespaces.unite(internalGetFileUsings(fileName));
|
||||||
|
foreach(const QString& ns, usedNamespaces) {
|
||||||
|
PStatementList namespaceStatementsList=doFindNamespace(ns);
|
||||||
|
foreach (const PStatement& namespaceStatement,*namespaceStatementsList) {
|
||||||
|
const StatementMap& statementMap = mStatementList.childrenStatements(namespaceStatement);
|
||||||
|
foreach (const PStatement statement, statementMap.values()) {
|
||||||
|
if (isTypeStatement(statement->kind))
|
||||||
|
result.append(statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
PStatement CppParser::findStatementStartingFrom(const QString &fileName, const QString &phrase, const PStatement& startScope) const
|
PStatement CppParser::findStatementStartingFrom(const QString &fileName, const QString &phrase, const PStatement& startScope) const
|
||||||
{
|
{
|
||||||
PStatement scopeStatement = startScope;
|
PStatement scopeStatement = startScope;
|
||||||
|
|
|
@ -77,6 +77,8 @@ public:
|
||||||
int line);
|
int line);
|
||||||
PStatement findAliasedStatement(const PStatement& statement);
|
PStatement findAliasedStatement(const PStatement& statement);
|
||||||
|
|
||||||
|
QList<PStatement> listTypeStatements(const QString& fileName,int line);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief evaluate the expression
|
* @brief evaluate the expression
|
||||||
* @param fileName
|
* @param fileName
|
||||||
|
@ -251,6 +253,8 @@ private:
|
||||||
int line) const;
|
int line) const;
|
||||||
PStatement doFindAliasedStatement(const PStatement& statement) const;
|
PStatement doFindAliasedStatement(const PStatement& statement) const;
|
||||||
|
|
||||||
|
QList<PStatement> doListTypeStatements(const QString& fileName,int line) const;
|
||||||
|
|
||||||
PStatement doFindTypeDefinitionOf(const QString& fileName,
|
PStatement doFindTypeDefinitionOf(const QString& fileName,
|
||||||
const QString& aType,
|
const QString& aType,
|
||||||
const PStatement& currentClass) const;
|
const PStatement& currentClass) const;
|
||||||
|
|
|
@ -94,7 +94,11 @@ void CodeCompletionPopup::prepareSearch(
|
||||||
mMemberOperator = memberOperator;
|
mMemberOperator = memberOperator;
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case CodeCompletionType::ComplexKeyword:
|
case CodeCompletionType::ComplexKeyword:
|
||||||
getCompletionListForTypeKeywordComplex(preWord);
|
getCompletionListForComplexKeyword(preWord);
|
||||||
|
break;
|
||||||
|
case CodeCompletionType::Types:
|
||||||
|
mIncludedFiles = mParser->getFileIncludes(filename);
|
||||||
|
getCompletionListForTypes(preWord,filename,line);
|
||||||
break;
|
break;
|
||||||
case CodeCompletionType::FunctionWithoutDefinition:
|
case CodeCompletionType::FunctionWithoutDefinition:
|
||||||
mIncludedFiles = mParser->getFileIncludes(filename);
|
mIncludedFiles = mParser->getFileIncludes(filename);
|
||||||
|
@ -892,7 +896,7 @@ void CodeCompletionPopup::getCompletionForFunctionWithoutDefinition(const QStrin
|
||||||
});
|
});
|
||||||
|
|
||||||
if (memberOperator.isEmpty()) {
|
if (memberOperator.isEmpty()) {
|
||||||
getCompletionListForTypeKeywordComplex(preWord);
|
getCompletionListForComplexKeyword(preWord);
|
||||||
PStatement scopeStatement = mCurrentScope;
|
PStatement scopeStatement = mCurrentScope;
|
||||||
//add members of current scope that not added before
|
//add members of current scope that not added before
|
||||||
while (scopeStatement && scopeStatement->kind!=StatementKind::skNamespace
|
while (scopeStatement && scopeStatement->kind!=StatementKind::skNamespace
|
||||||
|
@ -960,7 +964,7 @@ void CodeCompletionPopup::getCompletionForFunctionWithoutDefinition(const QStrin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeCompletionPopup::getCompletionListForTypeKeywordComplex(const QString &preWord)
|
void CodeCompletionPopup::getCompletionListForComplexKeyword(const QString &preWord)
|
||||||
{
|
{
|
||||||
mFullCompletionStatementList.clear();
|
mFullCompletionStatementList.clear();
|
||||||
if (preWord == "long") {
|
if (preWord == "long") {
|
||||||
|
@ -1012,6 +1016,39 @@ void CodeCompletionPopup::getCompletionListForNamespaces(const QString &/*preWor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CodeCompletionPopup::getCompletionListForTypes(const QString &preWord, const QString &fileName, int line)
|
||||||
|
{
|
||||||
|
if (preWord=="typedef") {
|
||||||
|
addKeyword("const");
|
||||||
|
addKeyword("struct");
|
||||||
|
addKeyword("class");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mShowKeywords) {
|
||||||
|
//add keywords
|
||||||
|
foreach (const QString& keyword,CppTypeKeywords) {
|
||||||
|
addKeyword(keyword);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!mParser->enabled())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!mParser->freeze())
|
||||||
|
return;
|
||||||
|
{
|
||||||
|
auto action = finally([this]{
|
||||||
|
mParser->unFreeze();
|
||||||
|
});
|
||||||
|
QList<PStatement> statements = mParser->listTypeStatements(fileName,line);
|
||||||
|
foreach(const PStatement& statement, statements) {
|
||||||
|
if (isIncluded(statement->fileName)
|
||||||
|
|| isIncluded(statement->definitionFileName)) {
|
||||||
|
addStatement(statement,fileName,line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CodeCompletionPopup::addKeyword(const QString &keyword)
|
void CodeCompletionPopup::addKeyword(const QString &keyword)
|
||||||
{
|
{
|
||||||
PStatement statement = std::make_shared<Statement>();
|
PStatement statement = std::make_shared<Statement>();
|
||||||
|
|
|
@ -42,6 +42,7 @@ enum class CodeCompletionType {
|
||||||
ComplexKeyword,
|
ComplexKeyword,
|
||||||
FunctionWithoutDefinition,
|
FunctionWithoutDefinition,
|
||||||
Namespaces,
|
Namespaces,
|
||||||
|
Types,
|
||||||
KeywordsOnly
|
KeywordsOnly
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -151,10 +152,13 @@ private:
|
||||||
const QString& fileName,
|
const QString& fileName,
|
||||||
int line);
|
int line);
|
||||||
|
|
||||||
void getCompletionListForTypeKeywordComplex(const QString& preWord);
|
void getCompletionListForComplexKeyword(const QString& preWord);
|
||||||
void getCompletionListForNamespaces(const QString &preWord,
|
void getCompletionListForNamespaces(const QString &preWord,
|
||||||
const QString& fileName,
|
const QString& fileName,
|
||||||
int line);
|
int line);
|
||||||
|
void getCompletionListForTypes(const QString &preWord,
|
||||||
|
const QString& fileName,
|
||||||
|
int line);
|
||||||
void addKeyword(const QString& keyword);
|
void addKeyword(const QString& keyword);
|
||||||
bool isIncluded(const QString& fileName);
|
bool isIncluded(const QString& fileName);
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in New Issue