- enhancement: support C++ 17 structured binding in stl map containers foreach loop.
This commit is contained in:
parent
131941801d
commit
ebeea19794
1
NEWS.md
1
NEWS.md
|
@ -158,6 +158,7 @@ Red Panda C++ Version 2.27
|
||||||
- enhancement: Support macro in #include preprocessing statements.
|
- enhancement: Support macro in #include preprocessing statements.
|
||||||
- fix: In options -> code format -> Program, Choose astyle path button doesn't work.
|
- fix: In options -> code format -> Program, Choose astyle path button doesn't work.
|
||||||
- fix: project not correctly reparsed after rename unit.
|
- fix: project not correctly reparsed after rename unit.
|
||||||
|
- enhancement: support C++ 17 structured binding in stl map containers foreach loop.
|
||||||
|
|
||||||
Red Panda C++ Version 2.26
|
Red Panda C++ Version 2.26
|
||||||
- enhancement: Code suggestion for embedded std::vectors.
|
- enhancement: Code suggestion for embedded std::vectors.
|
||||||
|
|
|
@ -2299,6 +2299,9 @@ void CppParser::checkAndHandleMethodOrVar(KeywordType keywordType, int maxIndex)
|
||||||
mIndex,
|
mIndex,
|
||||||
isStatic, maxIndex);
|
isStatic, maxIndex);
|
||||||
return;
|
return;
|
||||||
|
} else if (mTokenizer[mIndex]->text.startsWith("[")) {
|
||||||
|
handleStructredBinding(sType,maxIndex);
|
||||||
|
return;
|
||||||
} else if (mTokenizer[mIndex + 1]->text == '(') {
|
} else if (mTokenizer[mIndex + 1]->text == '(') {
|
||||||
#ifdef ENABLE_SDCC
|
#ifdef ENABLE_SDCC
|
||||||
if (mLanguage==ParserLanguage::SDCC && mTokenizer[mIndex]->text=="__at") {
|
if (mLanguage==ParserLanguage::SDCC && mTokenizer[mIndex]->text=="__at") {
|
||||||
|
@ -2627,6 +2630,32 @@ PStatement CppParser::getTypeDef(const PStatement& statement,
|
||||||
return PStatement();
|
return PStatement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CppParser::doAddVar(const QString &name, const QString &type, bool isConst, const QString& suffix)
|
||||||
|
{
|
||||||
|
if (!isIdentifier(name))
|
||||||
|
return;
|
||||||
|
if (type.isEmpty())
|
||||||
|
return;
|
||||||
|
QString realType = type;
|
||||||
|
if (isConst)
|
||||||
|
realType = "const "+realType;
|
||||||
|
if (!suffix.isEmpty())
|
||||||
|
realType += " "+suffix;
|
||||||
|
addChildStatement(
|
||||||
|
getCurrentScope(),
|
||||||
|
mCurrentFile,
|
||||||
|
realType,
|
||||||
|
name,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
mTokenizer[mIndex]->line,
|
||||||
|
StatementKind::Variable,
|
||||||
|
getScope(),
|
||||||
|
mCurrentMemberAccessibility,
|
||||||
|
StatementProperty::HasDefinition);
|
||||||
|
}
|
||||||
|
|
||||||
void CppParser::handleConcept(int maxIndex)
|
void CppParser::handleConcept(int maxIndex)
|
||||||
{
|
{
|
||||||
mIndex++; // skip 'concept';
|
mIndex++; // skip 'concept';
|
||||||
|
@ -3892,6 +3921,58 @@ void CppParser::handleStructs(bool isTypedef, int maxIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CppParser::handleStructredBinding(const QString &sType, int maxIndex)
|
||||||
|
{
|
||||||
|
if (mIndex+1 < maxIndex
|
||||||
|
&& AutoTypes.contains(sType)
|
||||||
|
&& ((mTokenizer[mIndex+1]->text == ":")
|
||||||
|
|| (mTokenizer[mIndex+1]->text == "="))) {
|
||||||
|
QString typeName;
|
||||||
|
QString templateParams;
|
||||||
|
int endIndex = indexOfNextSemicolon(mIndex+2, maxIndex);
|
||||||
|
QString expressionText;
|
||||||
|
for (int i=mIndex+2;i<endIndex;i++) {
|
||||||
|
expressionText+=mTokenizer[i]->text+" ";
|
||||||
|
}
|
||||||
|
QStringList phraseExpression = splitExpression(expressionText);
|
||||||
|
int pos = 0;
|
||||||
|
PEvalStatement aliasStatement = doEvalExpression(mCurrentFile,
|
||||||
|
phraseExpression,
|
||||||
|
pos,
|
||||||
|
getCurrentScope(),
|
||||||
|
PEvalStatement(),
|
||||||
|
true,false);
|
||||||
|
if(aliasStatement && aliasStatement->effectiveTypeStatement) {
|
||||||
|
if ( mTokenizer[mIndex+1]->text == ":" ) {
|
||||||
|
if (STLMaps.contains(aliasStatement->effectiveTypeStatement->fullName)) {
|
||||||
|
typeName = "std::pair";
|
||||||
|
templateParams = aliasStatement->templateParams;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (typeName == "std::pair" && !templateParams.isEmpty()) {
|
||||||
|
QString firstType = doFindFirstTemplateParamOf(mCurrentFile,aliasStatement->templateParams,
|
||||||
|
getCurrentScope());
|
||||||
|
QString secondType = doFindTemplateParamOf(mCurrentFile,aliasStatement->templateParams,1,
|
||||||
|
getCurrentScope());
|
||||||
|
QString s = mTokenizer[mIndex]->text;
|
||||||
|
s = s.mid(1,s.length()-2);
|
||||||
|
QStringList lst = s.split(",");
|
||||||
|
if (lst.length()==2) {
|
||||||
|
QString firstVar = lst[0].trimmed();
|
||||||
|
QString secondVar = lst[1].trimmed;
|
||||||
|
bool isConst = sType.startsWith("const");
|
||||||
|
QString suffix;
|
||||||
|
if (sType.endsWith("&&")) suffix = "&&";
|
||||||
|
else if (sType.endsWith("&")) suffix = "&";
|
||||||
|
doAddVar(firstVar, firstType, isConst, suffix);
|
||||||
|
doAddVar(secondVar, secondType, isConst, suffix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mIndex = indexOfNextPeriodOrSemicolon(mIndex+1, maxIndex);
|
||||||
|
}
|
||||||
|
|
||||||
void CppParser::handleUsing(int maxIndex)
|
void CppParser::handleUsing(int maxIndex)
|
||||||
{
|
{
|
||||||
int startLine = mTokenizer[mIndex]->line;
|
int startLine = mTokenizer[mIndex]->line;
|
||||||
|
@ -4185,7 +4266,6 @@ void CppParser::handleVar(const QString& typePrefix,bool isExtern,bool isStatic,
|
||||||
StatementKind::Variable,
|
StatementKind::Variable,
|
||||||
getScope(),
|
getScope(),
|
||||||
mCurrentMemberAccessibility,
|
mCurrentMemberAccessibility,
|
||||||
//True,
|
|
||||||
(isExtern?StatementProperty::None:StatementProperty::HasDefinition)
|
(isExtern?StatementProperty::None:StatementProperty::HasDefinition)
|
||||||
| (isStatic?StatementProperty::Static:StatementProperty::None)
|
| (isStatic?StatementProperty::Static:StatementProperty::None)
|
||||||
| StatementProperty::FunctionPointer);
|
| StatementProperty::FunctionPointer);
|
||||||
|
@ -4273,7 +4353,6 @@ void CppParser::handleVar(const QString& typePrefix,bool isExtern,bool isStatic,
|
||||||
StatementKind::Variable,
|
StatementKind::Variable,
|
||||||
getScope(),
|
getScope(),
|
||||||
mCurrentMemberAccessibility,
|
mCurrentMemberAccessibility,
|
||||||
//True,
|
|
||||||
(isExtern?StatementProperty::None:StatementProperty::HasDefinition)
|
(isExtern?StatementProperty::None:StatementProperty::HasDefinition)
|
||||||
| (isStatic?StatementProperty::Static:StatementProperty::None));
|
| (isStatic?StatementProperty::Static:StatementProperty::None));
|
||||||
tempType="";
|
tempType="";
|
||||||
|
|
|
@ -508,6 +508,7 @@ private:
|
||||||
PStatement getTypeDef(const PStatement& statement,
|
PStatement getTypeDef(const PStatement& statement,
|
||||||
const QString& fileName, const QString& aType) const;
|
const QString& fileName, const QString& aType) const;
|
||||||
// void handleCatchBlock();
|
// void handleCatchBlock();
|
||||||
|
void doAddVar(const QString& name, const QString& type, bool isConst, const QString& suffix);
|
||||||
void handleConcept(int maxIndex);
|
void handleConcept(int maxIndex);
|
||||||
void handleEnum(bool isTypedef, int maxIndex);
|
void handleEnum(bool isTypedef, int maxIndex);
|
||||||
void handleForBlock(int maxIndex);
|
void handleForBlock(int maxIndex);
|
||||||
|
@ -532,6 +533,7 @@ private:
|
||||||
void handleAccessibilitySpecifiers(KeywordType keywordType, int maxIndex);
|
void handleAccessibilitySpecifiers(KeywordType keywordType, int maxIndex);
|
||||||
bool handleStatement(int maxIndex);
|
bool handleStatement(int maxIndex);
|
||||||
void handleStructs(bool isTypedef, int maxIndex);
|
void handleStructs(bool isTypedef, int maxIndex);
|
||||||
|
void handleStructredBinding(const QString& sType, int maxIndex);
|
||||||
void handleUsing(int maxIndex);
|
void handleUsing(int maxIndex);
|
||||||
void handleVar(const QString& typePrefix,bool isExtern,bool isStatic, int maxIndex);
|
void handleVar(const QString& typePrefix,bool isExtern,bool isStatic, int maxIndex);
|
||||||
void handleInheritance(PStatement derivedClass, PClassInheritanceInfo pInfo);
|
void handleInheritance(PStatement derivedClass, PClassInheritanceInfo pInfo);
|
||||||
|
|
Loading…
Reference in New Issue