From 2a18f3f47a786c1456a9ad3dc6c65680406242ba Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 4 Mar 2024 16:01:23 +0800 Subject: [PATCH] Refactor: All file has a syntaxer --- RedPandaIDE/editor.cpp | 360 +++++++-------- RedPandaIDE/mainwindow.cpp | 3 +- RedPandaIDE/syntaxermanager.cpp | 7 +- libs/qsynedit/qsynedit.pro | 2 + libs/qsynedit/qsynedit/constants.h | 2 + libs/qsynedit/qsynedit/document.cpp | 2 +- libs/qsynedit/qsynedit/exporter/exporter.cpp | 2 +- .../qsynedit/formatter/cppformatter.cpp | 2 - libs/qsynedit/qsynedit/painter.cpp | 432 ++++++++---------- libs/qsynedit/qsynedit/qsynedit.cpp | 353 ++++++-------- libs/qsynedit/qsynedit/qsynedit.h | 12 +- libs/qsynedit/qsynedit/syntaxer/asm.cpp | 14 +- libs/qsynedit/qsynedit/syntaxer/cpp.cpp | 10 + libs/qsynedit/qsynedit/syntaxer/glsl.cpp | 10 + libs/qsynedit/qsynedit/syntaxer/lua.cpp | 10 + libs/qsynedit/qsynedit/syntaxer/makefile.cpp | 10 + libs/qsynedit/qsynedit/syntaxer/syntaxer.cpp | 12 - libs/qsynedit/qsynedit/syntaxer/syntaxer.h | 8 +- libs/qsynedit/qsynedit/types.h | 1 + 19 files changed, 563 insertions(+), 689 deletions(-) diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index c9a4f18c..6d841f13 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -282,13 +282,11 @@ void Editor::loadFile(QString filename) { default: mUseCppSyntax = pSettings->editor().defaultFileCpp(); } - if (syntaxer()) { - reparse(true); - if (pSettings->editor().syntaxCheckWhenLineChanged()) { - checkSyntaxInBack(); - } - reparseTodo(); + reparse(true); + if (pSettings->editor().syntaxCheckWhenLineChanged()) { + checkSyntaxInBack(); } + reparseTodo(); saveAutoBackup(); } @@ -607,8 +605,6 @@ void Editor::undoSymbolCompletion(int pos) QString token; QSynedit::SyntaxState syntaxState; - if (!syntaxer()) - return; if (!pSettings->editor().removeSymbolPairs()) return; if (!getTokenAttriAtRowCol(caretXY(), token, attr, syntaxState)) @@ -736,82 +732,80 @@ void Editor::keyPressEvent(QKeyEvent *event) clearUserCodeInTabStops(); } else { QString s = lineText().mid(0,caretX()-1).trimmed(); - if (syntaxer()) { - if (caretY()==1) { - syntaxer()->resetState(); - } else { - syntaxer()->setState(document()->getSyntaxState(caretY()-2)); - } - syntaxer()->setLine(s,caretY()); - syntaxer()->nextToEol(); - int state = syntaxer()->getState().state; - if (syntaxer()->isCommentNotFinished(state)) { - if (s=="/**") { //javadoc style docstring - s = lineText().mid(caretX()-1).trimmed(); - if (s=="*/") { - QSynedit::BufferCoord p = caretXY(); - setBlockBegin(p); - p.ch = lineText().length()+1; - setBlockEnd(p); - setSelText(""); + if (caretY()==1) { + syntaxer()->resetState(); + } else { + syntaxer()->setState(document()->getSyntaxState(caretY()-2)); + } + syntaxer()->setLine(s,caretY()); + syntaxer()->nextToEol(); + int state = syntaxer()->getState().state; + if (syntaxer()->isCommentNotFinished(state)) { + if (s=="/**") { //javadoc style docstring + s = lineText().mid(caretX()-1).trimmed(); + if (s=="*/") { + QSynedit::BufferCoord p = caretXY(); + setBlockBegin(p); + p.ch = lineText().length()+1; + setBlockEnd(p); + setSelText(""); + } + handled = true; + QStringList insertString; + insertString.append(""); + PStatement function; + if (mParser) + function = mParser->findFunctionAt(mFilename,caretY()+1); + if (function) { + QStringList params; + QString funcName = function->command; + bool isVoid = (function->type == "void"); + foreach (const PStatement& child, function->children) { + if (child->kind == StatementKind::skParameter) + params.append(child->command); } - handled = true; - QStringList insertString; - insertString.append(""); - PStatement function; - if (mParser) - function = mParser->findFunctionAt(mFilename,caretY()+1); - if (function) { - QStringList params; - QString funcName = function->command; - bool isVoid = (function->type == "void"); - foreach (const PStatement& child, function->children) { - if (child->kind == StatementKind::skParameter) - params.append(child->command); - } - insertString.append(QString(" * @brief ")+USER_CODE_IN_INSERT_POS); - if (!params.isEmpty()) - insertString.append(" * "); - foreach (const QString& param, params) { - insertString.append(QString(" * @param %1 %2") - .arg(param, USER_CODE_IN_INSERT_POS)); - } - if (!isVoid) { - insertString.append(" * "); - insertString.append(QString(" * @return ")+USER_CODE_IN_INSERT_POS); - } - insertString.append(" */"); - // } else if (caretY()==1) { /* file header */ - // insertString.append(QString(" * @file %1%2") - // .arg(USER_CODE_IN_REPL_POS_BEGIN) - // .arg(USER_CODE_IN_REPL_POS_END)); - // insertString.append(QString(" * @brief: ")+ USER_CODE_IN_INSERT_POS); - // insertString.append(QString(" * @version: ")+ USER_CODE_IN_INSERT_POS); - // insertString.append(QString(" * @copyright: ")+ USER_CODE_IN_INSERT_POS); - // insertString.append(QString(" * @author: ")+ USER_CODE_IN_INSERT_POS); - // insertString.append(" * @date: "); - // insertString.append(" * "); - // insertString.append(" **/"); - } else { - insertString.append(QString(" * ")+USER_CODE_IN_INSERT_POS); - insertString.append(" */"); + insertString.append(QString(" * @brief ")+USER_CODE_IN_INSERT_POS); + if (!params.isEmpty()) + insertString.append(" * "); + foreach (const QString& param, params) { + insertString.append(QString(" * @param %1 %2") + .arg(param, USER_CODE_IN_INSERT_POS)); } - insertCodeSnippet(linesToText(insertString)); + if (!isVoid) { + insertString.append(" * "); + insertString.append(QString(" * @return ")+USER_CODE_IN_INSERT_POS); + } + insertString.append(" */"); + // } else if (caretY()==1) { /* file header */ + // insertString.append(QString(" * @file %1%2") + // .arg(USER_CODE_IN_REPL_POS_BEGIN) + // .arg(USER_CODE_IN_REPL_POS_END)); + // insertString.append(QString(" * @brief: ")+ USER_CODE_IN_INSERT_POS); + // insertString.append(QString(" * @version: ")+ USER_CODE_IN_INSERT_POS); + // insertString.append(QString(" * @copyright: ")+ USER_CODE_IN_INSERT_POS); + // insertString.append(QString(" * @author: ")+ USER_CODE_IN_INSERT_POS); + // insertString.append(" * @date: "); + // insertString.append(" * "); + // insertString.append(" **/"); } else { - s=trimLeft(lineText()); - if (s.startsWith("* ")) { - handled = true; - int right = document()->getLine(caretY()-1).length()-caretX(); - s=lineBreak()+"* "; - insertString(s,false); - QSynedit::BufferCoord p = caretXY(); - p.line++; - p.ch = document()->getLine(p.line-1).length()+1; - if (right>0) { - p.ch -=right+1; - } - setCaretXY(p); + insertString.append(QString(" * ")+USER_CODE_IN_INSERT_POS); + insertString.append(" */"); + } + insertCodeSnippet(linesToText(insertString)); + } else { + s=trimLeft(lineText()); + if (s.startsWith("* ")) { + handled = true; + int right = document()->getLine(caretY()-1).length()-caretX(); + s=lineBreak()+"* "; + insertString(s,false); + QSynedit::BufferCoord p = caretXY(); + p.line++; + p.ch = document()->getLine(p.line-1).length()+1; + if (right>0) { + p.ch -=right+1; } + setCaretXY(p); } } } @@ -976,7 +970,7 @@ void Editor::keyPressEvent(QKeyEvent *event) handled=true; return; } - } else if (syntaxer()) { + } else { //show keywords processCommand(QSynedit::EditCommand::Char,ch,nullptr); showCompletion("",false,CodeCompletionType::KeywordsOnly); @@ -994,7 +988,7 @@ void Editor::keyPressEvent(QKeyEvent *event) showHeaderCompletion(false); handled=true; return; - } else if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::CPP) { + } else if (syntaxer()->language()==QSynedit::ProgrammingLanguage::CPP) { //preprocessor ? if ((idCharPressed==0) && (ch=='#') && lineText().isEmpty()) { processCommand(QSynedit::EditCommand::Char,ch,nullptr); @@ -1010,14 +1004,14 @@ void Editor::keyPressEvent(QKeyEvent *event) handled=true; return; } - } else if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::LUA) { + } else if (syntaxer()->language()==QSynedit::ProgrammingLanguage::LUA) { if (ch=='.') { processCommand(QSynedit::EditCommand::Char,ch,nullptr); showCompletion("",false,CodeCompletionType::KeywordsOnly); handled=true; return; } - } else if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) { + } else if (syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) { if ((idCharPressed==0) && (ch=='.')) { processCommand(QSynedit::EditCommand::Char,ch,nullptr); showCompletion("",false,CodeCompletionType::KeywordsOnly); @@ -1234,7 +1228,7 @@ void Editor::onPreparePaintHighlightToken(int line, int aChar, const QString &to if (token.isEmpty()) return; - if (mParser && syntaxer()) { + if (mParser) { // ifdef lines if (!mParser->isLineVisible(mFilename, line)) { foreground = syntaxer()->commentAttribute()->foreground(); @@ -1303,7 +1297,7 @@ void Editor::onPreparePaintHighlightToken(int line, int aChar, const QString &to } } - if (syntaxer() && attr) { + if (attr) { if (attr->tokenType() == QSynedit::TokenType::Keyword) { //C++ type keywords if (CppTypeKeywords.contains(token) @@ -1825,7 +1819,7 @@ void Editor::onStatusChanged(QSynedit::StatusChanges changes) clearUserCodeInTabStops(); } } - } else if (!selAvail() && syntaxer() && pSettings->editor().highlightMathingBraces()){ + } else if (!selAvail() && pSettings->editor().highlightMathingBraces()){ invalidateLine(mHighlightCharPos1.line); invalidateLine(mHighlightCharPos2.line); mHighlightCharPos1 = QSynedit::BufferCoord{0,0}; @@ -2006,8 +2000,7 @@ void Editor::onTooltipTimer() } } if (reason == TipType::Number) { - if (!syntaxer() || - (syntaxer()->language() != QSynedit::ProgrammingLanguage::Assembly + if ((syntaxer()->language() != QSynedit::ProgrammingLanguage::Assembly && syntaxer()->language() != QSynedit::ProgrammingLanguage::ATTAssembly ) ) { @@ -2043,9 +2036,8 @@ void Editor::onTooltipTimer() } break; case TipType::Keyword: - if (syntaxer() && - (syntaxer()->language() == QSynedit::ProgrammingLanguage::Assembly - || syntaxer()->language() == QSynedit::ProgrammingLanguage::ATTAssembly) + if ((syntaxer()->language() == QSynedit::ProgrammingLanguage::Assembly + || syntaxer()->language() == QSynedit::ProgrammingLanguage::ATTAssembly) ) { if (!mCompletionPopup->isVisible() && !mHeaderCompletionPopup->isVisible()) { @@ -2114,9 +2106,8 @@ void Editor::onTooltipTimer() } break; case TipType::Number: - if (syntaxer() && - (syntaxer()->language() == QSynedit::ProgrammingLanguage::Assembly - || syntaxer()->language() == QSynedit::ProgrammingLanguage::ATTAssembly) + if ((syntaxer()->language() == QSynedit::ProgrammingLanguage::Assembly + || syntaxer()->language() == QSynedit::ProgrammingLanguage::ATTAssembly) ) { bool neg=false; qlonglong val; @@ -2141,9 +2132,8 @@ void Editor::onTooltipTimer() break; case TipType::Keyword: if (pSettings->editor().enableIdentifierToolTips()) { - if (syntaxer() && - (syntaxer()->language() == QSynedit::ProgrammingLanguage::Assembly - || syntaxer()->language() == QSynedit::ProgrammingLanguage::ATTAssembly) + if ((syntaxer()->language() == QSynedit::ProgrammingLanguage::Assembly + || syntaxer()->language() == QSynedit::ProgrammingLanguage::ATTAssembly) ) { hint = QSynedit::ASMSyntaxer::Instructions.value(s.toLower(),""); } @@ -2300,7 +2290,7 @@ QStringList Editor::getExpressionAtPosition( const QSynedit::BufferCoord &pos) { QStringList result; - if (!syntaxer() || !parser()) + if (!parser()) return result; int line = pos.line-1; int ch = pos.ch-1; @@ -2571,32 +2561,30 @@ bool Editor::handleSymbolCompletion(QChar key) return false; //todo: better methods to detect current caret type - if (syntaxer()) { - if (caretX() <= 1) { - if (caretY()>1) { - if (syntaxer()->isCommentNotFinished(document()->getSyntaxState(caretY() - 2).state)) - return false; - if (syntaxer()->isStringNotFinished(document()->getSyntaxState(caretY() - 2).state) - && (key!='\"') && (key!='\'')) - return false; - } - } else { - QSynedit::BufferCoord HighlightPos = QSynedit::BufferCoord{caretX()-1, caretY()}; - // Check if that line is highlighted as comment - QSynedit::PTokenAttribute attr; - QString token; - QSynedit::SyntaxState syntaxState; - if (getTokenAttriAtRowCol(HighlightPos, token, attr, syntaxState)) { - if (syntaxer()->isCommentNotFinished(syntaxState.state)) - return false; - if (syntaxer()->isStringNotFinished(syntaxState.state) - && (key!='\'') && (key!='\"') && (key!='(') && (key!=')')) - return false; - if (( key=='<' || key =='>') && (mParser && !mParser->isIncludeLine(lineText()))) - return false; - if ((key == '\'') && (attr->name() == "SYNS_AttrNumber")) - return false; - } + if (caretX() <= 1) { + if (caretY()>1) { + if (syntaxer()->isCommentNotFinished(document()->getSyntaxState(caretY() - 2).state)) + return false; + if (syntaxer()->isStringNotFinished(document()->getSyntaxState(caretY() - 2).state) + && (key!='\"') && (key!='\'')) + return false; + } + } else { + QSynedit::BufferCoord HighlightPos = QSynedit::BufferCoord{caretX()-1, caretY()}; + // Check if that line is highlighted as comment + QSynedit::PTokenAttribute attr; + QString token; + QSynedit::SyntaxState syntaxState; + if (getTokenAttriAtRowCol(HighlightPos, token, attr, syntaxState)) { + if (syntaxer()->isCommentNotFinished(syntaxState.state)) + return false; + if (syntaxer()->isStringNotFinished(syntaxState.state) + && (key!='\'') && (key!='\"') && (key!='(') && (key!=')')) + return false; + if (( key=='<' || key =='>') && (mParser && !mParser->isIncludeLine(lineText()))) + return false; + if ((key == '\'') && (attr->name() == "SYNS_AttrNumber")) + return false; } } @@ -2726,7 +2714,7 @@ bool Editor::handleParentheseSkip() if (document()->count()==0) return false; - if (syntaxer() && syntaxer()->supportBraceLevel()) { + if (syntaxer()->supportBraceLevel()) { QSynedit::SyntaxState lastLineState = document()->getSyntaxState(document()->count()-1); if (lastLineState.parenthesisLevel==0) { setCaretXY( QSynedit::BufferCoord{caretX() + 1, caretY()}); // skip over @@ -2773,7 +2761,7 @@ bool Editor::handleBracketSkip() if (document()->count()==0) return false; - if (syntaxer() && syntaxer()->supportBraceLevel()) { + if (syntaxer()->supportBraceLevel()) { QSynedit::SyntaxState lastLineState = document()->getSyntaxState(document()->count()-1); if (lastLineState.bracketLevel==0) { setCaretXY( QSynedit::BufferCoord{caretX() + 1, caretY()}); // skip over @@ -2887,7 +2875,7 @@ bool Editor::handleBraceSkip() if (document()->count()==0) return false; - if (syntaxer() && syntaxer()->supportBraceLevel()) { + if (syntaxer()->supportBraceLevel()) { QSynedit::SyntaxState lastLineState = document()->getSyntaxState(document()->count()-1); if (lastLineState.braceLevel==0) { bool oldInsertMode = insertMode(); @@ -2989,7 +2977,6 @@ bool Editor::handleDoubleQuoteCompletion() return true; } if ((ch == 0) - || !syntaxer() || ( syntaxer()->isWordBreakChar(ch) || syntaxer()->isSpaceChar(ch))) { // insert "" @@ -3090,7 +3077,7 @@ void Editor::initParser() resetCppParser(mParser); mParser->setEnabled( pSettings->codeCompletion().enabled() && - (syntaxer() && syntaxer()->language() == QSynedit::ProgrammingLanguage::CPP)); + (syntaxer()->language() == QSynedit::ProgrammingLanguage::CPP)); } } else { mParser = nullptr; @@ -3112,8 +3099,6 @@ ParserLanguage Editor::calcParserLanguage() Editor::QuoteStatus Editor::getQuoteStatus() { QuoteStatus Result = QuoteStatus::NotQuote; - if (!syntaxer()) - return Result; if ((caretY()>1) && syntaxer()->isStringNotFinished(document()->getSyntaxState(caretY() - 2).state)) Result = QuoteStatus::DoubleQuote; @@ -3238,8 +3223,6 @@ void Editor::reparse(bool resetParser) return; if (!pSettings->codeCompletion().enabled()) return; - if (!syntaxer()) - return; if (syntaxer()->language() != QSynedit::ProgrammingLanguage::CPP && syntaxer()->language() != QSynedit::ProgrammingLanguage::GLSL) return; @@ -3274,8 +3257,6 @@ void Editor::reparseTodo() return; if (!mParentPageControl) return; - if (!syntaxer()) - return; if (pSettings->editor().parseTodos()) pMainWindow->todoParser()->parseFile(mFilename, inProject()); } @@ -3487,14 +3468,9 @@ void Editor::showCompletion(const QString& preWord,bool autoComplete, CodeComple if (!pSettings->codeCompletion().enabled()) return; if (type==CodeCompletionType::KeywordsOnly) { - if (!syntaxer()) - return; } else { if (!mParser || !mParser->enabled()) return; - - if (!syntaxer()) - return; } if (mCompletionPopup->isVisible()) // already in search, don't do it again @@ -3522,7 +3498,7 @@ void Editor::showCompletion(const QString& preWord,bool autoComplete, CodeComple (attr->tokenType() == QSynedit::TokenType::String) && (attr->tokenType() != QSynedit::TokenType::Character)) { return; - } else if (type==CodeCompletionType::KeywordsOnly && syntaxer() ) { + } else if (type==CodeCompletionType::KeywordsOnly ) { if (syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) word = getWordAtPosition(this,caretXY(),pBeginPos,pEndPos, WordPurpose::wpATTASMKeywords); else @@ -3592,53 +3568,53 @@ void Editor::showCompletion(const QString& preWord,bool autoComplete, CodeComple mCompletionPopup->show(); // Scan the current function body QSet keywords; - if (syntaxer()) { - if (syntaxer()->language() != QSynedit::ProgrammingLanguage::CPP ) { - if (syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) { - if (word.startsWith(".")) - keywords = QSynedit::ASMSyntaxer::ATTDirectives; - else if (word.startsWith("%")) - keywords = QSynedit::ASMSyntaxer::ATTRegisters; - else { - keywords = QSynedit::ASMSyntaxer::InstructionNames; - } - } else { - int pos = word.lastIndexOf("."); - if (pos>=0) { - QString scopeWord=word.left(pos); - word = word.mid(pos+1); - QMap > scopedKeywords = syntaxer()->scopedKeywords(); - keywords = scopedKeywords.value(scopeWord, QSet()); - } else - keywords = syntaxer()->keywords(); + + if (syntaxer()->language() != QSynedit::ProgrammingLanguage::CPP ) { + if (syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) { + if (word.startsWith(".")) + keywords = QSynedit::ASMSyntaxer::ATTDirectives; + else if (word.startsWith("%")) + keywords = QSynedit::ASMSyntaxer::ATTRegisters; + else { + keywords = QSynedit::ASMSyntaxer::InstructionNames; } } else { - switch(calcParserLanguage()) { - case ParserLanguage::CPlusPlus: - foreach (const QString& keyword, CppKeywords.keys()) { - keywords.insert(keyword); - } - break; - case ParserLanguage::C: - keywords = CKeywords; - break; -#ifdef ENABLE_SDCC - case ParserLanguage::SDCC: - keywords = CKeywords; - foreach (const QString& keyword, SDCCKeywords.keys()) { - keywords.insert(keyword); - } - break; -#endif + int pos = word.lastIndexOf("."); + if (pos>=0) { + QString scopeWord=word.left(pos); + word = word.mid(pos+1); + QMap > scopedKeywords = syntaxer()->scopedKeywords(); + keywords = scopedKeywords.value(scopeWord, QSet()); + } else + keywords = syntaxer()->keywords(); + } + } else { + switch(calcParserLanguage()) { + case ParserLanguage::CPlusPlus: + foreach (const QString& keyword, CppKeywords.keys()) { + keywords.insert(keyword); } - if (pSettings->editor().enableCustomCTypeKeywords()) { - foreach (const QString& keyword, pSettings->editor().customCTypeKeywords()) { - keywords.insert(keyword); - } + break; + case ParserLanguage::C: + keywords = CKeywords; + break; +#ifdef ENABLE_SDCC + case ParserLanguage::SDCC: + keywords = CKeywords; + foreach (const QString& keyword, SDCCKeywords.keys()) { + keywords.insert(keyword); + } + break; +#endif + } + if (pSettings->editor().enableCustomCTypeKeywords()) { + foreach (const QString& keyword, pSettings->editor().customCTypeKeywords()) { + keywords.insert(keyword); } } } + if (word.isEmpty()) { //word=getWordAtPosition(this,caretXY(),pBeginPos,pEndPos, WordPurpose::wpCompletion); QString memberOperator; @@ -3788,7 +3764,7 @@ bool Editor::testInFunc(const QSynedit::BufferCoord& pos) { int y=pos.line-1; int x=pos.ch; - if (!syntaxer() || syntaxer()->language()!=QSynedit::ProgrammingLanguage::CPP) + if (syntaxer()->language()!=QSynedit::ProgrammingLanguage::CPP) return false; if (y==0) syntaxer()->resetState(); @@ -3869,7 +3845,7 @@ void Editor::completionInsert(bool appendFunc) // delete the part of the word that's already been typed ... QSynedit::BufferCoord p = wordEnd(); QSynedit::BufferCoord pStart = wordStart(); - if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) { + if (syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) { if (statement->command.startsWith(".") || statement->command.startsWith("%")) pStart.ch--; @@ -3978,7 +3954,7 @@ bool Editor::onCompletionKeyPressed(QKeyEvent *event) return false; QString oldPhrase = mCompletionPopup->memberPhrase(); WordPurpose purpose = WordPurpose::wpCompletion; - if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) { + if (syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) { purpose = WordPurpose::wpATTASMKeywords; } else if (oldPhrase.startsWith('#')) { purpose = WordPurpose::wpDirective; @@ -4118,7 +4094,7 @@ bool Editor::onCompletionInputMethod(QInputMethodEvent *event) Editor::TipType Editor::getTipType(QPoint point, QSynedit::BufferCoord& pos) { // Only allow in the text area... - if (pointToCharLine(point, pos) && syntaxer()) { + if (pointToCharLine(point, pos)) { //qDebug()<debugger()->executing() && getSyntaxIssueAtPosition(pos)) { @@ -4264,8 +4240,6 @@ void Editor::updateFunctionTip(bool showTip) pMainWindow->functionTip()->hide(); return; } - if (!syntaxer()) - return; if (!mParser || !mParser->enabled()) return; @@ -4682,7 +4656,7 @@ void Editor::setProject(Project *pProject) return; mProject = pProject; if (mProject) { - if (syntaxer() && syntaxer()->language() == QSynedit::ProgrammingLanguage::CPP) { + if (syntaxer()->language() == QSynedit::ProgrammingLanguage::CPP) { mParser = mProject->cppParser(); if (isVisible()) { if (mParser && mParser->parsing()) { @@ -5188,8 +5162,6 @@ void Editor::checkSyntaxInBack() return; if (readOnly()) return; - if (!syntaxer()) - return; pMainWindow->checkSyntaxInBack(this); } @@ -5348,7 +5320,7 @@ void Editor::applySettings() options.setFlag(QSynedit::eoHalfPageScroll,pSettings->editor().halfPageScroll()); options.setFlag(QSynedit::eoShowRainbowColor, pSettings->editor().rainbowParenthesis() - && syntaxer() && syntaxer()->supportBraceLevel()); + && syntaxer()->supportBraceLevel()); options.setFlag(QSynedit::eoForceMonospace, pSettings->editor().forceFixedFontWidth()); options.setFlag(QSynedit::eoLigatureSupport, @@ -5414,7 +5386,7 @@ void Editor::applySettings() setRightEdge(0); } - if (syntaxer() && syntaxer()->language() == QSynedit::ProgrammingLanguage::CPP) { + if (syntaxer()->language() == QSynedit::ProgrammingLanguage::CPP) { QSet set; if (pSettings->editor().enableCustomCTypeKeywords()) { foreach(const QString& s, pSettings->editor().customCTypeKeywords()) @@ -5457,7 +5429,7 @@ void Editor::applyColorScheme(const QString& schemeName) QSynedit::EditorOptions options = getOptions(); options.setFlag(QSynedit::EditorOption::eoShowRainbowColor, pSettings->editor().rainbowParenthesis() - && syntaxer() && syntaxer()->supportBraceLevel()); + && syntaxer()->supportBraceLevel()); setOptions(options); syntaxerManager.applyColorScheme(syntaxer(),schemeName); if (pSettings->editor().rainbowParenthesis()) { diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 35904f7b..16c504d2 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -1755,8 +1755,7 @@ void MainWindow::updateCompilerSet(const Editor *e) if (mProject) { if ( !e || e->inProject()) { index = mProject->options().compilerSet; - } else if (e->syntaxer() - && e->syntaxer()->language()==QSynedit::ProgrammingLanguage::Makefile + } else if (e->syntaxer()->language()==QSynedit::ProgrammingLanguage::Makefile && mProject->directory() == extractFileDir(e->filename())) { index = mProject->options().compilerSet; } diff --git a/RedPandaIDE/syntaxermanager.cpp b/RedPandaIDE/syntaxermanager.cpp index 9c2a5c91..f8553908 100644 --- a/RedPandaIDE/syntaxermanager.cpp +++ b/RedPandaIDE/syntaxermanager.cpp @@ -17,15 +17,14 @@ #include "syntaxermanager.h" #include #include -#include "qsynedit/constants.h" #include "qsynedit/syntaxer/cpp.h" #include "qsynedit/syntaxer/asm.h" #include "qsynedit/syntaxer/glsl.h" #include "qsynedit/syntaxer/lua.h" #include "qsynedit/syntaxer/makefile.h" +#include "qsynedit/syntaxer/textfile.h" #include "qsynedit/formatter/cppformatter.h" -#include "qsynedit/constants.h" #include "colorscheme.h" SyntaxerManager syntaxerManager; @@ -57,7 +56,7 @@ QSynedit::PSyntaxer SyntaxerManager::getSyntaxer(QSynedit::ProgrammingLanguage l return syntaxer; } default: - return QSynedit::PSyntaxer(); + return std::make_shared(); } } @@ -108,7 +107,7 @@ QSynedit::ProgrammingLanguage SyntaxerManager::getLanguage(const QString &filena } else if (suffix.isEmpty()) { return QSynedit::ProgrammingLanguage::CPP; } - return QSynedit::ProgrammingLanguage::Unknown; + return QSynedit::ProgrammingLanguage::Textfile; } QSynedit::PSyntaxer SyntaxerManager::copy(QSynedit::PSyntaxer syntaxer) const diff --git a/libs/qsynedit/qsynedit.pro b/libs/qsynedit/qsynedit.pro index 8e5b2fe3..2bea26ff 100644 --- a/libs/qsynedit/qsynedit.pro +++ b/libs/qsynedit/qsynedit.pro @@ -51,6 +51,7 @@ SOURCES += qsynedit/codefolding.cpp \ qsynedit/syntaxer/lua.cpp \ qsynedit/types.cpp \ qsynedit/syntaxer/makefile.cpp \ + qsynedit/syntaxer/textfile.cpp \ qsynedit/syntaxer/syntaxer.cpp HEADERS += \ @@ -77,6 +78,7 @@ HEADERS += \ qsynedit/syntaxer/glsl.h \ qsynedit/syntaxer/lua.h \ qsynedit/syntaxer/makefile.h \ + qsynedit/syntaxer/textfile.h \ qsynedit/syntaxer/syntaxer.h INCLUDEPATH += ../redpanda_qt_utils diff --git a/libs/qsynedit/qsynedit/constants.h b/libs/qsynedit/qsynedit/constants.h index c9bbf4f9..37643883 100644 --- a/libs/qsynedit/qsynedit/constants.h +++ b/libs/qsynedit/qsynedit/constants.h @@ -50,6 +50,8 @@ extern const QChar SoftBreakGlyph; #define SYNS_AttrSymbol "Symbol" #define SYNS_AttrVariable "Variable" #define SYNS_AttrSpace "Space" +#define SYNS_AttrText "Text" + // names of exporter output formats #define SYNS_ExporterFormatHTML "HTML" diff --git a/libs/qsynedit/qsynedit/document.cpp b/libs/qsynedit/qsynedit/document.cpp index a9443d05..84ba96eb 100644 --- a/libs/qsynedit/qsynedit/document.cpp +++ b/libs/qsynedit/qsynedit/document.cpp @@ -477,7 +477,7 @@ void Document::putLine(int index, const QString &s, bool notify) { && mLines[index]->width() > mLines[mIndexOfLongestLine]->width()) mIndexOfLongestLine = index; if (notify) - emit putted(index,1); + emit putted(index); endUpdate(); } } diff --git a/libs/qsynedit/qsynedit/exporter/exporter.cpp b/libs/qsynedit/qsynedit/exporter/exporter.cpp index 80ed1370..63b66b9b 100644 --- a/libs/qsynedit/qsynedit/exporter/exporter.cpp +++ b/libs/qsynedit/qsynedit/exporter/exporter.cpp @@ -53,7 +53,7 @@ void Exporter::exportAll(const PDocument& doc) void Exporter::exportRange(const PDocument& doc, BufferCoord start, BufferCoord stop) { // abort if not all necessary conditions are met - if (!doc || !mSyntaxer || (doc->count() == 0)) + if (!doc || (doc->count() == 0)) return; stop.line = std::max(1, std::min(stop.line, doc->count())); stop.ch = std::max(1, std::min(stop.ch, doc->getLine(stop.line - 1).length() + 1)); diff --git a/libs/qsynedit/qsynedit/formatter/cppformatter.cpp b/libs/qsynedit/qsynedit/formatter/cppformatter.cpp index 4336d079..a9cad608 100644 --- a/libs/qsynedit/qsynedit/formatter/cppformatter.cpp +++ b/libs/qsynedit/qsynedit/formatter/cppformatter.cpp @@ -18,8 +18,6 @@ namespace QSynedit { QSynEdit *editor) { Q_ASSERT(editor!=nullptr); - if (!editor->syntaxer()) - return 0; line = std::min(line, editor->document()->count()+1); if (line<=1) return 0; diff --git a/libs/qsynedit/qsynedit/painter.cpp b/libs/qsynedit/qsynedit/painter.cpp index 3f2ff1bc..62e4e017 100644 --- a/libs/qsynedit/qsynedit/painter.cpp +++ b/libs/qsynedit/qsynedit/painter.cpp @@ -159,7 +159,7 @@ void QSynEditPainter::paintGutter(const QRect& clip) } // Draw the folding lines and squares - if (mEdit->mUseCodeFolding) { + if (mEdit->useCodeFolding()) { for (int row = mLastRow; row>= mFirstRow; row--) { int line = mEdit->rowToLine(row); if ((line > mEdit->mDocument->count()) && (mEdit->mDocument->count() != 0)) @@ -780,20 +780,18 @@ void QSynEditPainter::paintFoldAttributes() X = tabSteps * mEdit->mDocument->spaceWidth() + mEdit->textOffset() - 1; tabSteps+=mEdit->tabSize(); indentLevel++ ; - if (mEdit->mSyntaxer) { - if (mEdit->mCodeFolding.indentGuides) { - PTokenAttribute attr = mEdit->mSyntaxer->symbolAttribute(); - getBraceColorAttr(indentLevel,attr); - paintColor = attr->foreground(); - } - if (mEdit->mCodeFolding.fillIndents) { - PTokenAttribute attr = mEdit->mSyntaxer->symbolAttribute(); - getBraceColorAttr(indentLevel,attr); - gradientStart=attr->foreground(); - attr = mEdit->mSyntaxer->symbolAttribute(); - getBraceColorAttr(indentLevel+1,attr); - gradientStart=attr->foreground(); - } + if (mEdit->mCodeFolding.indentGuides) { + PTokenAttribute attr = mEdit->mSyntaxer->symbolAttribute(); + getBraceColorAttr(indentLevel,attr); + paintColor = attr->foreground(); + } + if (mEdit->mCodeFolding.fillIndents) { + PTokenAttribute attr = mEdit->mSyntaxer->symbolAttribute(); + getBraceColorAttr(indentLevel,attr); + gradientStart=attr->foreground(); + attr = mEdit->mSyntaxer->symbolAttribute(); + getBraceColorAttr(indentLevel+1,attr); + gradientStart=attr->foreground(); } if (mEdit->mCodeFolding.fillIndents) { int X1; @@ -821,7 +819,7 @@ void QSynEditPainter::paintFoldAttributes() mPainter->setPen(oldPen); } - if (!mEdit->mUseCodeFolding) + if (!mEdit->useCodeFolding()) return; // Paint collapsed lines using changed pen @@ -972,250 +970,184 @@ void QSynEditPainter::paintLines() int lineWidth; QList glyphStartCharList = mEdit->mDocument->getGlyphStartCharList(vLine-1,sLine); QList glyphStartPositionsList = mEdit->mDocument->getGlyphStartPositionList(vLine-1,sLine, lineWidth); - - if (!mEdit->mSyntaxer || !mEdit->mSyntaxer->enabled()) { - sToken = sLine; - tokenWidth = lineWidth; - if (mEdit->mOptions.testFlag(eoShowLineBreaks) && (!mIsLineSelected) && (!mIsSpecialLine) && (tokenWidth <= mLeft)) { - expandGlyphStartCharList(LineBreakGlyph, sLine.length(), glyphStartCharList); - int width = mEdit->document()->glyphWidth(LineBreakGlyph,0); - glyphStartPositionsList.append(tokenWidth); - sLine+=LineBreakGlyph; - tokenWidth += width; - } - if (mIsComplexLine) { - setDrawingColors(true); - mRcToken.setLeft(std::max(mRcLine.left(), fixXValue(mLineSelStart))); - mRcToken.setRight(std::min(mRcLine.right(), fixXValue(mLineSelEnd))); - paintToken( - sLine, - glyphStartCharList, - glyphStartPositionsList, - 0, - glyphStartCharList.length(), - tokenWidth, 0, mLineSelStart, mLineSelEnd, - mEdit->font(),false); - setDrawingColors(false); - mRcToken.setLeft(std::max(mRcLine.left(), fixXValue(mLeft))); - mRcToken.setRight(std::min(mRcLine.right(), fixXValue(mLineSelStart))); - paintToken( - sLine, - glyphStartCharList, - glyphStartPositionsList, - 0, - glyphStartCharList.length(), - tokenWidth, 0, mLeft, mLineSelStart, - mEdit->font(), false); - mRcToken.setLeft(std::max(mRcLine.left(), fixXValue(mLineSelEnd))); - mRcToken.setRight(std::min(mRcLine.right(), fixXValue(mRight))); - paintToken( - sLine, - glyphStartCharList, - glyphStartPositionsList, - 0, - glyphStartCharList.length(), - tokenWidth, 0, mLineSelEnd, mRight, - mEdit->font(), false); - } else { - setDrawingColors(mIsLineSelected); - paintToken( - sLine, - glyphStartCharList, - glyphStartPositionsList, - 0, - glyphStartCharList.length(), - tokenWidth, 0, mLeft, mRight, - mEdit->font(),false); - } - //Paint editingAreaBorders - if (mIsCurrentLine && mEdit->mInputPreeditString.length()>0) { - PEditingArea area = std::make_shared(); - area->beginX = mEdit->charToGlyphLeft(vLine, sLine, mEdit->mCaretX); - area->endX = mEdit->charToGlyphLeft(vLine, sLine,mEdit->mCaretX + mEdit->mInputPreeditString.length()); - area->type = EditingAreaType::eatUnderLine; - area->color = colFG; - areaList.append(area); - paintEditAreas(areaList); - } + { + // Initialize highlighter with line text and range info. It is + // necessary because we probably did not scan to the end of the last + // line - the internal highlighter range might be wrong. + if (vLine == 1) { + mEdit->mSyntaxer->resetState(); } else { - // Initialize highlighter with line text and range info. It is - // necessary because we probably did not scan to the end of the last - // line - the internal highlighter range might be wrong. - if (vLine == 1) { - mEdit->mSyntaxer->resetState(); - } else { - mEdit->mSyntaxer->setState( - mEdit->mDocument->getSyntaxState(vLine-2)); + mEdit->mSyntaxer->setState( + mEdit->mDocument->getSyntaxState(vLine-2)); + } + mEdit->mSyntaxer->setLine(sLine, vLine - 1); + // Try to concatenate as many tokens as possible to minimize the count + // of ExtTextOut calls necessary. This depends on the selection state + // or the line having special colors. For spaces the foreground color + // is ignored as well. + mTokenAccu.width = 0; + tokenLeft = 0; + // Test first whether anything of this token is visible. + while (!mEdit->mSyntaxer->eol()) { + sToken = mEdit->mSyntaxer->getToken(); + if (sToken.isEmpty()) { + continue; + // mEdit->mSyntaxer->next(); + // if (mEdit->mSyntaxer->eol()) + // break; + // sToken = mEdit->mSyntaxer->getToken(); + // // Maybe should also test whether GetTokenPos changed... + // if (sToken.isEmpty()) { + // //qDebug()<mSyntaxer->setLine(sLine, vLine - 1); - // Try to concatenate as many tokens as possible to minimize the count - // of ExtTextOut calls necessary. This depends on the selection state - // or the line having special colors. For spaces the foreground color - // is ignored as well. - mTokenAccu.width = 0; - tokenLeft = 0; - // Test first whether anything of this token is visible. - while (!mEdit->mSyntaxer->eol()) { - sToken = mEdit->mSyntaxer->getToken(); - if (sToken.isEmpty()) { - continue; - // mEdit->mSyntaxer->next(); - // if (mEdit->mSyntaxer->eol()) - // break; - // sToken = mEdit->mSyntaxer->getToken(); - // // Maybe should also test whether GetTokenPos changed... - // if (sToken.isEmpty()) { - // //qDebug()<mSyntaxer->getTokenPos(); - int tokenEndChar = tokenStartChar + sToken.length(); + int tokenStartChar = mEdit->mSyntaxer->getTokenPos(); + int tokenEndChar = tokenStartChar + sToken.length(); - // It's at least partially visible. Get the token attributes now. - attr = mEdit->mSyntaxer->getTokenAttribute(); + // It's at least partially visible. Get the token attributes now. + attr = mEdit->mSyntaxer->getTokenAttribute(); - //rainbow parenthesis - if (sToken == "[" - || sToken == "(" - || sToken == "{" - ) { - SyntaxState rangeState = mEdit->mSyntaxer->getState(); - getBraceColorAttr(rangeState.bracketLevel - +rangeState.braceLevel - +rangeState.parenthesisLevel - ,attr); - } else if (sToken == "]" - || sToken == ")" - || sToken == "}" - ){ - SyntaxState rangeState = mEdit->mSyntaxer->getState(); - getBraceColorAttr(rangeState.bracketLevel - +rangeState.braceLevel - +rangeState.parenthesisLevel+1, - attr); - } - //input method - if (mIsCurrentLine && mEdit->mInputPreeditString.length()>0) { - int startPos = mEdit->mSyntaxer->getTokenPos()+1; - int endPos = mEdit->mSyntaxer->getTokenPos() + sToken.length(); - //qDebug()<mCaretX<<":"<mCaretX+edit->mInputPreeditString.length(); - if (!(endPos < mEdit->mCaretX - || startPos >= mEdit->mCaretX+mEdit->mInputPreeditString.length())) { - if (!preeditAttr) { - preeditAttr = attr; - } else { - attr = preeditAttr; - } - } - } - bool showGlyph=false; - if (attr && attr->tokenType() == TokenType::Space) { - int pos = mEdit->mSyntaxer->getTokenPos(); - if (pos==0) { - showGlyph = mEdit->mOptions.testFlag(eoShowLeadingSpaces); - } else if (pos+sToken.length()==sLine.length()) { - showGlyph = mEdit->mOptions.testFlag(eoShowTrailingSpaces); - } else { - showGlyph = mEdit->mOptions.testFlag(eoShowInnerSpaces); - } - } - addHighlightToken( - sLine, - sToken, - tokenLeft, - vLine, attr,showGlyph, - glyphStartCharList, - tokenStartChar, - tokenEndChar, - glyphStartPositionsList, - tokenWidth); - tokenLeft+=tokenWidth; - // Let the highlighter scan the next token. - mEdit->mSyntaxer->next(); - } - mEdit->mDocument->setLineWidth(vLine-1, sLine, tokenLeft, glyphStartPositionsList); - if (tokenLeftfoldStartAtLine(vLine); - if ((foldRange) && foldRange->collapsed) { - addOnStr = mEdit->syntaxer()->foldString(sLine); - attr = mEdit->mSyntaxer->symbolAttribute(); - getBraceColorAttr(mEdit->mSyntaxer->getState().braceLevel,attr); - } else { - // Draw LineBreak glyph. - if (mEdit->mOptions.testFlag(eoShowLineBreaks) - && (mEdit->mDocument->lineWidth(vLine-1) < mRight)) { - addOnStr = LineBreakGlyph; - attr = mEdit->mSyntaxer->whitespaceAttribute(); - } - } - if (!addOnStr.isEmpty()) { - expandGlyphStartCharList(addOnStr, sLine.length(), glyphStartCharList); - int len=glyphStartCharList.length()-glyphStartPositionsList.length(); - for (int i=0;imInputPreeditString.length()>0) { - if (area->beginX > mEdit->mCaretX) { - area->beginX += mEdit->mInputPreeditString.length(); - } - if (area->endX > mEdit->mCaretX) { - area->endX += mEdit->mInputPreeditString.length(); - } - } - int glyphIdx; - glyphIdx = searchForSegmentIdx(glyphStartCharList, 0, sLine.length(), area->beginX-1); - area->beginX = segmentIntervalStart(glyphStartPositionsList, 0, tokenLeft, glyphIdx); - glyphIdx = searchForSegmentIdx(glyphStartCharList, 0, sLine.length(), area->endX-1); - area->endX = segmentIntervalStart(glyphStartPositionsList, 0, tokenLeft, glyphIdx); + //rainbow parenthesis + if (sToken == "[" + || sToken == "(" + || sToken == "{" + ) { + SyntaxState rangeState = mEdit->mSyntaxer->getState(); + getBraceColorAttr(rangeState.bracketLevel + +rangeState.braceLevel + +rangeState.parenthesisLevel + ,attr); + } else if (sToken == "]" + || sToken == ")" + || sToken == "}" + ){ + SyntaxState rangeState = mEdit->mSyntaxer->getState(); + getBraceColorAttr(rangeState.bracketLevel + +rangeState.braceLevel + +rangeState.parenthesisLevel+1, + attr); } //input method if (mIsCurrentLine && mEdit->mInputPreeditString.length()>0) { - PEditingArea area = std::make_shared(); - int glyphIdx; - glyphIdx = searchForSegmentIdx(glyphStartCharList, 0, sLine.length(), mEdit->mCaretX-1); - area->beginX = segmentIntervalStart(glyphStartPositionsList, 0, tokenLeft, glyphIdx); - glyphIdx = searchForSegmentIdx(glyphStartCharList, 0, sLine.length(), mEdit->mCaretX+mEdit->mInputPreeditString.length()-1); - area->endX = segmentIntervalStart(glyphStartPositionsList, 0, tokenLeft, glyphIdx); - area->type = EditingAreaType::eatUnderLine; - if (preeditAttr) { - area->color = preeditAttr->foreground(); - } else { - area->color = colFG; + int startPos = mEdit->mSyntaxer->getTokenPos()+1; + int endPos = mEdit->mSyntaxer->getTokenPos() + sToken.length(); + //qDebug()<mCaretX<<":"<mCaretX+edit->mInputPreeditString.length(); + if (!(endPos < mEdit->mCaretX + || startPos >= mEdit->mCaretX+mEdit->mInputPreeditString.length())) { + if (!preeditAttr) { + preeditAttr = attr; + } else { + attr = preeditAttr; + } } - areaList.append(area); - - mEdit->mGlyphPostionCacheForInputMethod.str = sLine; - mEdit->mGlyphPostionCacheForInputMethod.glyphCharList = glyphStartCharList; - mEdit->mGlyphPostionCacheForInputMethod.glyphPositionList = glyphStartPositionsList; - mEdit->mGlyphPostionCacheForInputMethod.strWidth = tokenLeft; } - paintEditAreas(areaList); + bool showGlyph=false; + if (attr && attr->tokenType() == TokenType::Space) { + int pos = mEdit->mSyntaxer->getTokenPos(); + if (pos==0) { + showGlyph = mEdit->mOptions.testFlag(eoShowLeadingSpaces); + } else if (pos+sToken.length()==sLine.length()) { + showGlyph = mEdit->mOptions.testFlag(eoShowTrailingSpaces); + } else { + showGlyph = mEdit->mOptions.testFlag(eoShowInnerSpaces); + } + } + addHighlightToken( + sLine, + sToken, + tokenLeft, + vLine, attr,showGlyph, + glyphStartCharList, + tokenStartChar, + tokenEndChar, + glyphStartPositionsList, + tokenWidth); + tokenLeft+=tokenWidth; + // Let the highlighter scan the next token. + mEdit->mSyntaxer->next(); } + mEdit->mDocument->setLineWidth(vLine-1, sLine, tokenLeft, glyphStartPositionsList); + if (tokenLeftfoldStartAtLine(vLine); + if ((foldRange) && foldRange->collapsed) { + addOnStr = mEdit->mSyntaxer->foldString(sLine); + attr = mEdit->mSyntaxer->symbolAttribute(); + getBraceColorAttr(mEdit->mSyntaxer->getState().braceLevel,attr); + } else { + // Draw LineBreak glyph. + if (mEdit->mOptions.testFlag(eoShowLineBreaks) + && (mEdit->mDocument->lineWidth(vLine-1) < mRight)) { + addOnStr = LineBreakGlyph; + attr = mEdit->mSyntaxer->whitespaceAttribute(); + } + } + if (!addOnStr.isEmpty()) { + expandGlyphStartCharList(addOnStr, sLine.length(), glyphStartCharList); + int len=glyphStartCharList.length()-glyphStartPositionsList.length(); + for (int i=0;imInputPreeditString.length()>0) { + if (area->beginX > mEdit->mCaretX) { + area->beginX += mEdit->mInputPreeditString.length(); + } + if (area->endX > mEdit->mCaretX) { + area->endX += mEdit->mInputPreeditString.length(); + } + } + int glyphIdx; + glyphIdx = searchForSegmentIdx(glyphStartCharList, 0, sLine.length(), area->beginX-1); + area->beginX = segmentIntervalStart(glyphStartPositionsList, 0, tokenLeft, glyphIdx); + glyphIdx = searchForSegmentIdx(glyphStartCharList, 0, sLine.length(), area->endX-1); + area->endX = segmentIntervalStart(glyphStartPositionsList, 0, tokenLeft, glyphIdx); + } + //input method + if (mIsCurrentLine && mEdit->mInputPreeditString.length()>0) { + PEditingArea area = std::make_shared(); + int glyphIdx; + glyphIdx = searchForSegmentIdx(glyphStartCharList, 0, sLine.length(), mEdit->mCaretX-1); + area->beginX = segmentIntervalStart(glyphStartPositionsList, 0, tokenLeft, glyphIdx); + glyphIdx = searchForSegmentIdx(glyphStartCharList, 0, sLine.length(), mEdit->mCaretX+mEdit->mInputPreeditString.length()-1); + area->endX = segmentIntervalStart(glyphStartPositionsList, 0, tokenLeft, glyphIdx); + area->type = EditingAreaType::eatUnderLine; + if (preeditAttr) { + area->color = preeditAttr->foreground(); + } else { + area->color = colFG; + } + areaList.append(area); + + mEdit->mGlyphPostionCacheForInputMethod.str = sLine; + mEdit->mGlyphPostionCacheForInputMethod.glyphCharList = glyphStartCharList; + mEdit->mGlyphPostionCacheForInputMethod.glyphPositionList = glyphStartPositionsList; + mEdit->mGlyphPostionCacheForInputMethod.strWidth = tokenLeft; + } + paintEditAreas(areaList); // Now paint the right edge if necessary. We do it line by line to reduce // the flicker. Should not cost very much anyway, compared to the many diff --git a/libs/qsynedit/qsynedit/qsynedit.cpp b/libs/qsynedit/qsynedit/qsynedit.cpp index 908c7c4e..70c3f7b2 100644 --- a/libs/qsynedit/qsynedit/qsynedit.cpp +++ b/libs/qsynedit/qsynedit/qsynedit.cpp @@ -25,7 +25,7 @@ #include #include #include "syntaxer/syntaxer.h" -#include "constants.h" +#include "syntaxer/textfile.h" #include "painter.h" #include #include @@ -48,6 +48,7 @@ QSynEdit::QSynEdit(QWidget *parent) : QAbstractScrollArea(parent), mWheelAccumulatedDeltaX{0}, mWheelAccumulatedDeltaY{0} { + mSyntaxer = std::make_shared(); mCharWidth=1; mTextHeight = 1; mLastKey = 0; @@ -327,7 +328,7 @@ bool QSynEdit::canRedo() const int QSynEdit::maxScrollWidth() const { int maxWidth = mDocument->longestLineWidth(); - if (syntaxer()) + if (mSyntaxer->supportFolding()) maxWidth += stringWidth(syntaxer()->foldString(""),maxWidth); if (mOptions.testFlag(eoScrollPastEol)) return std::max(maxWidth ,1); @@ -348,7 +349,7 @@ bool QSynEdit::getTokenAttriAtRowCol( int posX, posY, endPos, start; QString line; posY = pos.line - 1; - if (mSyntaxer && (posY >= 0) && (posY < mDocument->count())) { + if ((posY >= 0) && (posY < mDocument->count())) { line = mDocument->getLine(posY); if (posY == 0) { mSyntaxer->resetState(); @@ -381,7 +382,7 @@ bool QSynEdit::getTokenAttriAtRowColEx(const BufferCoord &pos, QString &token, i int posX, posY, endPos; QString line; posY = pos.line - 1; - if (mSyntaxer && (posY >= 0) && (posY < mDocument->count())) { + if ((posY >= 0) && (posY < mDocument->count())) { line = mDocument->getLine(posY); if (posY == 0) { mSyntaxer->resetState(); @@ -442,55 +443,29 @@ void QSynEdit::doTrimTrailingSpaces() auto action=finally([this](){ endEditing(); }); - if (mSyntaxer) { - for (int i=0;icount();i++) { - if (mDocument->getSyntaxState(i).hasTrailingSpaces) { - int line = i+1; - QString oldLine = mDocument->getLine(i); - QString newLine = trimRight(oldLine); - if (newLine.isEmpty()) - continue; - properSetLine(i,newLine); - mUndoList->addChange( - ChangeReason::Delete, - BufferCoord{1,line}, - BufferCoord{oldLine.length()+1, line}, - QStringList(oldLine), - SelectionMode::Normal - ); - mUndoList->addChange( - ChangeReason::Insert, - BufferCoord{1, line}, - BufferCoord{newLine.length()+1, line}, - QStringList(), - SelectionMode::Normal - ); - } + for (int i=0;icount();i++) { + if (mDocument->getSyntaxState(i).hasTrailingSpaces) { + int line = i+1; + QString oldLine = mDocument->getLine(i); + QString newLine = trimRight(oldLine); + if (newLine.isEmpty()) + continue; + properSetLine(i,newLine); + mUndoList->addChange( + ChangeReason::Delete, + BufferCoord{1,line}, + BufferCoord{oldLine.length()+1, line}, + QStringList(oldLine), + SelectionMode::Normal + ); + mUndoList->addChange( + ChangeReason::Insert, + BufferCoord{1, line}, + BufferCoord{newLine.length()+1, line}, + QStringList(), + SelectionMode::Normal + ); } - } else { - for (int i=0;icount();i++) { - int line = i+1; - QString oldLine = mDocument->getLine(i); - QString newLine = trimRight(oldLine); - if (newLine.isEmpty()) - continue; - properSetLine(i,newLine); - mUndoList->addChange( - ChangeReason::Delete, - BufferCoord{1,line}, - BufferCoord{oldLine.length()+1, line}, - QStringList(oldLine), - SelectionMode::Normal - ); - mUndoList->addChange( - ChangeReason::Insert, - BufferCoord{1, line}, - BufferCoord{newLine.length()+1, line}, - QStringList(), - SelectionMode::Normal - ); - } - } mUndoList->endBlock(); } @@ -685,7 +660,7 @@ void QSynEdit::invalidateGutterLines(int firstLine, int lastLine) // find the visible lines first if (lastLine < firstLine) std::swap(lastLine, firstLine); - if (mUseCodeFolding) { + if (useCodeFolding()) { firstLine = lineToRow(firstLine); if (lastLine <= mDocument->count()) lastLine = lineToRow(lastLine); @@ -775,7 +750,7 @@ DisplayCoord QSynEdit::bufferToDisplayPos(const BufferCoord &p) const if (p.line-1 count()) result.x = charToGlyphLeft(p.line,p.ch); // Account for code folding - if (mUseCodeFolding) + if (useCodeFolding()) result.row = foldLineToRow(result.row); return result; } @@ -791,7 +766,7 @@ BufferCoord QSynEdit::displayToBufferPos(const DisplayCoord &p) const if (p.row<1) return result; // Account for code folding - if (mUseCodeFolding) + if (useCodeFolding()) result.line = foldRowToLine(p.row); // Account for tabs if (result.line <= mDocument->count() ) { @@ -928,7 +903,7 @@ int QSynEdit::getLineIndent(const QString &line) const int QSynEdit::rowToLine(int aRow) const { - if (mUseCodeFolding) + if (useCodeFolding()) return foldRowToLine(aRow); else return aRow; @@ -989,7 +964,7 @@ void QSynEdit::invalidateLine(int line) return; // invalidate text area of this line - if (mUseCodeFolding) + if (useCodeFolding()) line = foldLineToRow(line); if (line >= mTopLine && line <= mTopLine + mLinesInWindow) { rcInval = { mGutterWidth, @@ -1029,7 +1004,7 @@ void QSynEdit::invalidateLines(int firstLine, int lastLine) if (lastLine >= mDocument->count()) lastLine = INT_MAX; // paint empty space beyond last line - if (mUseCodeFolding) { + if (useCodeFolding()) { firstLine = lineToRow(firstLine); // Could avoid this conversion if (First = Last) and // (Length < CharsInWindow) but the dependency isn't worth IMO. @@ -1247,7 +1222,7 @@ void QSynEdit::processGutterClick(QMouseEvent *event) int line = rowToLine(row); // Check if we clicked on a folding thing - if (mUseCodeFolding) { + if (useCodeFolding()) { PCodeFoldingRange foldRange = foldStartAtLine(line); if (foldRange) { // See if we actually clicked on the rectangle... @@ -1595,7 +1570,7 @@ void QSynEdit::doComment() int endLine; if (mReadOnly) return; - if (!syntaxer() || syntaxer()->commentSymbol().isEmpty()) + if (mSyntaxer->commentSymbol().isEmpty()) return; beginEditing(); auto action = finally([this]{ @@ -1609,7 +1584,7 @@ void QSynEdit::doComment() endLine = std::max(origBlockBegin.line - 1, origBlockEnd.line - 2); else endLine = origBlockEnd.line - 1; - QString commentSymbol = syntaxer()->commentSymbol(); + QString commentSymbol = mSyntaxer->commentSymbol(); int symbolLen = commentSymbol.length(); for (int i = origBlockBegin.line - 1; i<=endLine; i++) { mDocument->putLine(i, commentSymbol + mDocument->getLine(i)); @@ -1640,9 +1615,9 @@ void QSynEdit::doUncomment() QStringList changeText; if (mReadOnly) return; - if (!syntaxer() || syntaxer()->commentSymbol().isEmpty()) + if (mSyntaxer->commentSymbol().isEmpty()) return; - QString commentSymbol=syntaxer()->commentSymbol(); + QString commentSymbol=mSyntaxer->commentSymbol(); int symbolLen = commentSymbol.length(); changeText.append(commentSymbol); beginEditing(); @@ -1695,9 +1670,9 @@ void QSynEdit::doToggleComment() bool allCommented = true; if (mReadOnly) return; - if (!syntaxer() || syntaxer()->commentSymbol().isEmpty()) + if (mSyntaxer->commentSymbol().isEmpty()) return; - QString commentSymbol=syntaxer()->commentSymbol(); + QString commentSymbol=mSyntaxer->commentSymbol(); beginEditing(); auto action = finally([this]{ @@ -1729,10 +1704,10 @@ void QSynEdit::doToggleBlockComment() QString s; if (mReadOnly) return; - if (!syntaxer() || syntaxer()->blockCommentBeginSymbol().isEmpty()) + if (mSyntaxer->blockCommentBeginSymbol().isEmpty()) return; - QString beginSymbol=syntaxer()->blockCommentBeginSymbol(); - QString endSymbol=syntaxer()->blockCommentEndSymbol(); + QString beginSymbol=mSyntaxer->blockCommentBeginSymbol(); + QString endSymbol=mSyntaxer->blockCommentEndSymbol(); int beginLen = beginSymbol.length(); int endLen = endSymbol.length(); @@ -1849,7 +1824,7 @@ QString QSynEdit::getDisplayStringAtLine(int line) const QString s = mDocument->getLine(line-1); PCodeFoldingRange foldRange = foldStartAtLine(line); if ((foldRange) && foldRange->collapsed) { - return s+syntaxer()->foldString(s); + return s+mSyntaxer->foldString(s); } return s; } @@ -2279,7 +2254,7 @@ void QSynEdit::insertLine(bool moveCaret) if (mCaretX>lineText().length()+1) { PCodeFoldingRange foldRange = foldStartAtLine(mCaretY); if ((foldRange) && foldRange->collapsed) { - QString s = temp+syntaxer()->foldString(temp); + QString s = temp+mSyntaxer->foldString(temp); if (mCaretX > s.length()) { if (!mUndoing) { addCaretToUndo(); @@ -2310,20 +2285,19 @@ void QSynEdit::insertLine(bool moveCaret) bool notInComment=true; properSetLine(mCaretY-1,leftLineText); //update range stated for line mCaretY - if (mSyntaxer) { - if (mCaretY==1) { - mSyntaxer->resetState(); - } else { - mSyntaxer->setState(mDocument->getSyntaxState(mCaretY-2)); - } - mSyntaxer->setLine(leftLineText, mCaretY-1); - mSyntaxer->nextToEol(); - mDocument->setSyntaxState(mCaretY-1,mSyntaxer->getState()); - notInComment = !mSyntaxer->isCommentNotFinished( - mSyntaxer->getState().state) - && !mSyntaxer->isStringNotFinished( - mSyntaxer->getState().state); + if (mCaretY==1) { + mSyntaxer->resetState(); + } else { + mSyntaxer->setState(mDocument->getSyntaxState(mCaretY-2)); } + mSyntaxer->setLine(leftLineText, mCaretY-1); + mSyntaxer->nextToEol(); + mDocument->setSyntaxState(mCaretY-1,mSyntaxer->getState()); + notInComment = !mSyntaxer->isCommentNotFinished( + mSyntaxer->getState().state) + && !mSyntaxer->isStringNotFinished( + mSyntaxer->getState().state); + int indentSpaces = 0; if (mOptions.testFlag(eoAutoIndent)) { rightLineText=trimLeft(rightLineText); @@ -2818,7 +2792,6 @@ void QSynEdit::doAddChar(const QChar& ch) // auto if (mActiveSelectionMode==SelectionMode::Normal && mOptions.testFlag(eoAutoIndent) - && mSyntaxer && mSyntaxer->language() == ProgrammingLanguage::CPP && (oldCaretY<=mDocument->count()) ) { @@ -3180,18 +3153,13 @@ void QSynEdit::recalcCharExtent() FontStyle styles[] = {FontStyle::fsBold, FontStyle::fsItalic, FontStyle::fsStrikeOut, FontStyle::fsUnderline}; bool hasStyles[] = {false,false,false,false}; int size = 4; - if (mSyntaxer && mSyntaxer->attributes().count()>0) { + if (mSyntaxer->attributes().count()>0) { for (const PTokenAttribute& attribute: mSyntaxer->attributes()) { for (int i=0;istyles().testFlag(styles[i])) hasStyles[i] = true; } } - } else { - hasStyles[0] = font().bold(); - hasStyles[1] = font().italic(); - hasStyles[2] = font().strikeOut(); - hasStyles[3] = font().underline(); } mTextHeight = 0; @@ -3291,56 +3259,59 @@ void QSynEdit::updateModifiedStatus() emit statusChanged(StatusChange::scModifyChanged); } -void QSynEdit::scanFrom(int index) +void QSynEdit::reparseLines(int startLine, int endLine) { if (mEditingCount>0) return; SyntaxState state; - int idx = std::max(0,index); - if (idx >= mDocument->count()) + startLine = std::max(0,startLine); + endLine = std::min(endLine, mDocument->count()); + + if (startLine >= endLine) return; - if (idx == 0) { + if (startLine == 0) { mSyntaxer->resetState(); } else { - mSyntaxer->setState(mDocument->getSyntaxState(idx-1)); + mSyntaxer->setState(mDocument->getSyntaxState(startLine-1)); } + int line = startLine; do { - mSyntaxer->setLine(mDocument->getLine(idx), idx); + mSyntaxer->setLine(mDocument->getLine(line), line); mSyntaxer->nextToEol(); state = mSyntaxer->getState(); - mDocument->setSyntaxState(idx,state); - idx ++ ; - } while (idx < mDocument->count()); - if (mUseCodeFolding) + mDocument->setSyntaxState(line,state); + line ++ ; + } while (line < endLine); + if (useCodeFolding()) rescanFolds(); return ; } -void QSynEdit::reparseLine(int line) -{ - if (!mSyntaxer) - return; - line--; - line = std::max(0,line); - if (line >= mDocument->count()) - return; +// void QSynEdit::reparseLine(int line) +// { +// if (!mSyntaxer) +// return; +// line--; +// line = std::max(0,line); +// if (line >= mDocument->count()) +// return; - if (line == 0) { - mSyntaxer->resetState(); - } else { - mSyntaxer->setState(mDocument->getSyntaxState(line-1)); - } - mSyntaxer->setLine(mDocument->getLine(line), line); - mSyntaxer->nextToEol(); - SyntaxState iRange = mSyntaxer->getState(); - mDocument->setSyntaxState(line,iRange); -} +// if (line == 0) { +// mSyntaxer->resetState(); +// } else { +// mSyntaxer->setState(mDocument->getSyntaxState(line-1)); +// } +// mSyntaxer->setLine(mDocument->getLine(line), line); +// mSyntaxer->nextToEol(); +// SyntaxState iRange = mSyntaxer->getState(); +// mDocument->setSyntaxState(line,iRange); +// } void QSynEdit::reparseDocument() { - if (mSyntaxer && !mDocument->empty()) { + if (!mDocument->empty()) { // qint64 begin=QDateTime::currentMSecsSinceEpoch(); mSyntaxer->resetState(); for (int i =0;icount();i++) { @@ -3352,7 +3323,7 @@ void QSynEdit::reparseDocument() // qDebug()<count(); } - if (mUseCodeFolding) + if (useCodeFolding()) rescanFolds(); } @@ -3389,7 +3360,7 @@ void QSynEdit::collapse(PCodeFoldingRange FoldRange) updateScrollbars(); } -void QSynEdit::foldOnListInserted(int Line, int Count) +void QSynEdit::foldOnLinesInserted(int Line, int Count) { // Delete collapsed inside selection for (int i = mAllFoldRanges->count()-1;i>=0;i--) { @@ -3402,7 +3373,7 @@ void QSynEdit::foldOnListInserted(int Line, int Count) } } -void QSynEdit::foldOnListDeleted(int Line, int Count) +void QSynEdit::foldOnLinesDeleted(int Line, int Count) { // Delete collapsed inside selection for (int i = mAllFoldRanges->count()-1;i>=0;i--) { @@ -3427,7 +3398,7 @@ void QSynEdit::foldOnListCleared() void QSynEdit::rescanFolds() { //qDebug()<getLine(Line); - if (!mSyntaxer){ - for (int i=startChar; isetState(mLines->ranges(Line), - mLines->braceLevel(Line), - mLines->bracketLevel(Line), - mLines->parenthesisLevel(Line)); - mHighlighter->setLine(CurLine,Line); - */ - QString token; - while (!mSyntaxer->eol()) { - token = mSyntaxer->getToken(); - PTokenAttribute attr = mSyntaxer->getTokenAttribute(); - if (token == character && attr->name()==tokenAttrName) - return mSyntaxer->getTokenPos(); - mSyntaxer->next(); - } + QString token; + while (!mSyntaxer->eol()) { + token = mSyntaxer->getToken(); + PTokenAttribute attr = mSyntaxer->getTokenAttribute(); + if (token == character && attr->name()==tokenAttrName) + return mSyntaxer->getTokenPos(); + mSyntaxer->next(); } return -1; } @@ -3523,7 +3478,7 @@ void QSynEdit::findSubFoldRange(PCodeFoldingRanges topFoldRanges, PCodeFoldingRa PCodeFoldingRange collapsedFold; int line = 0; QString curLine; - if (!mSyntaxer) + if (mSyntaxer->supportFolding()) return; while (line < mDocument->count()) { // index is valid for LinesToScan and fLines @@ -4528,7 +4483,7 @@ QString QSynEdit::selText() const PCodeFoldingRange foldRange = foldStartAtLine(blockEnd().line); QString s = mDocument->getLine(lastLine); if ((foldRange) && foldRange->collapsed && charTo>s.length()) { - s=s+syntaxer()->foldString(s); + s=s+mSyntaxer->foldString(s); if (charTo>s.length()) { lastLine = foldRange->toLine-1; charTo = mDocument->getLine(lastLine).length()+1; @@ -4607,7 +4562,7 @@ QStringList QSynEdit::getContent(BufferCoord startPos, BufferCoord endPos, Selec PCodeFoldingRange foldRange = foldStartAtLine(endPos.line); QString s = mDocument->getLine(lastLine); if ((foldRange) && foldRange->collapsed && chTo>s.length()) { - s=s+syntaxer()->foldString(s); + s=s+mSyntaxer->foldString(s); if (chTo>s.length()) { lastLine = foldRange->toLine-1; chTo = mDocument->getLine(lastLine).length()+1; @@ -4663,7 +4618,7 @@ QString QSynEdit::lineBreak() const bool QSynEdit::useCodeFolding() const { - return mUseCodeFolding; + return mUseCodeFolding && mSyntaxer->supportFolding(); } void QSynEdit::setUseCodeFolding(bool value) @@ -4684,7 +4639,7 @@ QString QSynEdit::displayLineText() QString s= mDocument->getLine(mCaretY - 1); PCodeFoldingRange foldRange = foldStartAtLine(mCaretY); if ((foldRange) && foldRange->collapsed) { - return s+syntaxer()->foldString(s); + return s+mSyntaxer->foldString(s); } return s; } @@ -4712,11 +4667,10 @@ PSyntaxer QSynEdit::syntaxer() const void QSynEdit::setSyntaxer(const PSyntaxer &syntaxer) { + Q_ASSERT(syntaxer!=nullptr); PSyntaxer oldSyntaxer = mSyntaxer; mSyntaxer = syntaxer; - if (oldSyntaxer && mSyntaxer && - oldSyntaxer ->language() == syntaxer->language()) { - } else { + if (oldSyntaxer ->language() != syntaxer->language()) { recalcCharExtent(); mDocument->beginUpdate(); auto action=finally([this]{ @@ -5285,7 +5239,7 @@ void QSynEdit::doDeleteText(BufferCoord startPos, BufferCoord endPos, SelectionM PCodeFoldingRange foldRange = foldStartAtLine(endPos.line); QString s = mDocument->getLine(endPos.line-1); if ((foldRange) && foldRange->collapsed && endPos.ch>s.length()) { - QString newS=s+syntaxer()->foldString(s); + QString newS=s+mSyntaxer->foldString(s); if ((startPos.ch<=s.length() || startPos.linenewS.length() ) { //selection has whole block @@ -5444,7 +5398,7 @@ int QSynEdit::doInsertTextByNormalMode(const BufferCoord& pos, const QStringList int caretY=pos.line; // step1: insert the first line of Value into current line if (text.length()>1) { - if (!mUndoing && mSyntaxer && mSyntaxer->language()==ProgrammingLanguage::CPP && mOptions.testFlag(eoAutoIndent)) { + if (!mUndoing && mSyntaxer->language()==ProgrammingLanguage::CPP && mOptions.testFlag(eoAutoIndent)) { QString s = trimLeft(text[0]); if (sLeftSide.isEmpty()) { sLeftSide = GetLeftSpacing(calcIndentSpaces(caretY,s,true),true); @@ -5458,7 +5412,7 @@ int QSynEdit::doInsertTextByNormalMode(const BufferCoord& pos, const QStringList str = sLeftSide + text[0] + sRightSide; properSetLine(caretY - 1, str); } - reparseLine(caretY); + reparseLines(caretY,caretY+1); // step2: insert remaining lines of Value for (int i=1;ilanguage()==ProgrammingLanguage::CPP && mOptions.testFlag(eoAutoIndent) && notInComment) { + if (!mUndoing && mSyntaxer->language()==ProgrammingLanguage::CPP && mOptions.testFlag(eoAutoIndent) && notInComment) { int indentSpaces = calcIndentSpaces(caretY,str,true); str = GetLeftSpacing(indentSpaces,true)+trimLeft(str); } properSetLine(caretY - 1, str,false); - reparseLine(caretY); + reparseLines(caretY, caretY+1); result++; } bChangeScroll = !mOptions.testFlag(eoScrollPastEol); @@ -5942,41 +5896,12 @@ void QSynEdit::endEditingWithoutUndo() bool QSynEdit::isIdentChar(const QChar &ch) { - if (mSyntaxer) { - return mSyntaxer->isIdentChar(ch); - } else { - if (ch == '_') { - return true; - } - if ((ch>='0') && (ch <= '9')) { - return true; - } - if ((ch>='a') && (ch <= 'z')) { - return true; - } - if ((ch>='A') && (ch <= 'Z')) { - return true; - } - return false; - } + return mSyntaxer->isIdentChar(ch); } bool QSynEdit::isIdentStartChar(const QChar &ch) { - if (mSyntaxer) { - return mSyntaxer->isIdentStartChar(ch); - } else { - if (ch == '_') { - return true; - } - if ((ch>='a') && (ch <= 'z')) { - return true; - } - if ((ch>='A') && (ch <= 'Z')) { - return true; - } - return false; - } + return mSyntaxer->isIdentStartChar(ch); } void QSynEdit::setRainbowAttrs(const PTokenAttribute &attr0, const PTokenAttribute &attr1, const PTokenAttribute &attr2, const PTokenAttribute &attr3) @@ -6655,7 +6580,7 @@ void QSynEdit::onLinesChanging() void QSynEdit::onLinesCleared() { - if (mUseCodeFolding) + if (useCodeFolding()) foldOnListCleared(); clearUndo(); // invalidate the *whole* client area @@ -6669,34 +6594,40 @@ void QSynEdit::onLinesCleared() mStatusChanges.setFlag(StatusChange::scAll); } -void QSynEdit::onLinesDeleted(int index, int count) +void QSynEdit::onLinesDeleted(int line, int count) { if (mUseCodeFolding) - foldOnListDeleted(index + 1, count); - if (mSyntaxer && mDocument->count() > 0) { - scanFrom(index); + foldOnLinesDeleted(line + 1, count); + if (mSyntaxer->needsLineState()) { + reparseLines(line, mDocument->count()); } - invalidateLines(index + 1, INT_MAX); - invalidateGutterLines(index + 1, INT_MAX); + invalidateLines(line + 1, INT_MAX); +// invalidateGutterLines(index + 1, INT_MAX); } -void QSynEdit::onLinesInserted(int index, int count) +void QSynEdit::onLinesInserted(int line, int count) { if (mUseCodeFolding) - foldOnListInserted(index + 1, count); - if (mSyntaxer && mDocument->count() > 0) { - scanFrom(index); + foldOnLinesInserted(line + 1, count); + if (mSyntaxer->needsLineState()) { + reparseLines(line, mDocument->count()); + } else { + // new lines should be parsed + reparseLines(line, line + count); } - invalidateLines(index + 1, INT_MAX); - invalidateGutterLines(index + 1, INT_MAX); + invalidateLines(line + 1, INT_MAX); +// invalidateGutterLines(index + 1, INT_MAX); } -void QSynEdit::onLinesPutted(int index, int /*count*/) +void QSynEdit::onLinesPutted(int line) { - if (mSyntaxer) { - scanFrom(index); + if (mSyntaxer->needsLineState()) { + reparseLines(line, mDocument->count()); + invalidateLines(line + 1, INT_MAX); + } else { + reparseLines(line, line+1); + invalidateLine( line + 1 ); } - invalidateLines(index + 1, INT_MAX); } void QSynEdit::onUndoAdded() @@ -6780,8 +6711,8 @@ void QSynEdit::setBlockEnd(BufferCoord value) value.ch = 1; } else { int maxLen = mDocument->longestLineWidth(); - if (syntaxer()) - maxLen += stringWidth(syntaxer()->foldString(""),maxLen); + if (mSyntaxer->supportFolding()) + maxLen += stringWidth(mSyntaxer->foldString(""),maxLen); value.ch = minMax(value.ch, 1, maxLen+1); } if (value.ch != mBlockEnd.ch || value.line != mBlockEnd.line) { @@ -6887,8 +6818,8 @@ void QSynEdit::setBlockBegin(BufferCoord value) value.ch = 1; } else { int maxLen = mDocument->longestLineWidth(); - if (syntaxer()) - maxLen += stringWidth(syntaxer()->foldString(""),maxLen); + if (mSyntaxer->supportFolding()) + maxLen += stringWidth(mSyntaxer->foldString(""),maxLen); value.ch = minMax(value.ch, 1, maxLen+1); } if (selAvail()) { diff --git a/libs/qsynedit/qsynedit/qsynedit.h b/libs/qsynedit/qsynedit/qsynedit.h index a9b70e12..7337b9f0 100644 --- a/libs/qsynedit/qsynedit/qsynedit.h +++ b/libs/qsynedit/qsynedit/qsynedit.h @@ -532,14 +532,14 @@ private: void recalcCharExtent(); QString expandAtWideGlyphs(const QString& S); void updateModifiedStatus(); - void scanFrom(int index); + void reparseLines(int startLine, int endLine); void reparseLine(int line); void reparseDocument(); void uncollapse(PCodeFoldingRange FoldRange); void collapse(PCodeFoldingRange FoldRange); - void foldOnListInserted(int Line, int Count); - void foldOnListDeleted(int Line, int Count); + void foldOnLinesInserted(int Line, int Count); + void foldOnLinesDeleted(int Line, int Count); void foldOnListCleared(); void rescanFolds(); // rescan for folds void rescanForFoldRanges(); @@ -655,9 +655,9 @@ private slots: void onLinesChanged(); void onLinesChanging(); void onLinesCleared(); - void onLinesDeleted(int index, int count); - void onLinesInserted(int index, int count); - void onLinesPutted(int index, int count); + void onLinesDeleted(int line, int count); + void onLinesInserted(int line, int count); + void onLinesPutted(int line, int count); //void onRedoAdded(); void onScrollTimeout(); void onDraggingScrollTimeout(); diff --git a/libs/qsynedit/qsynedit/syntaxer/asm.cpp b/libs/qsynedit/qsynedit/syntaxer/asm.cpp index d4b8dda5..65e0676d 100644 --- a/libs/qsynedit/qsynedit/syntaxer/asm.cpp +++ b/libs/qsynedit/qsynedit/syntaxer/asm.cpp @@ -1720,12 +1720,12 @@ void ASMSyntaxer::setLine(const QString &newLine, int lineNumber) bool ASMSyntaxer::isCommentNotFinished(int /*state*/) const { - return true; + return false; } bool ASMSyntaxer::isStringNotFinished(int /*state*/) const { - return true; + return false; } SyntaxState ASMSyntaxer::getState() const @@ -1745,6 +1745,16 @@ void ASMSyntaxer::resetState() mHasTrailingSpaces = false; } +bool ASMSyntaxer::supportFolding() +{ + return false; +} + +bool ASMSyntaxer::needsLineState() +{ + return true; +} + QSet ASMSyntaxer::keywords() { if (mKeywordsCache.isEmpty()) { diff --git a/libs/qsynedit/qsynedit/syntaxer/cpp.cpp b/libs/qsynedit/qsynedit/syntaxer/cpp.cpp index 67336a63..41d759ab 100644 --- a/libs/qsynedit/qsynedit/syntaxer/cpp.cpp +++ b/libs/qsynedit/qsynedit/syntaxer/cpp.cpp @@ -1505,6 +1505,16 @@ QString CppSyntaxer::blockCommentEndSymbol() return "*/"; } +bool CppSyntaxer::supportFolding() +{ + return true; +} + +bool CppSyntaxer::needsLineState() +{ + return true; +} + bool CppSyntaxer::isCommentNotFinished(int state) const { return (state == RangeState::rsAnsiC || diff --git a/libs/qsynedit/qsynedit/syntaxer/glsl.cpp b/libs/qsynedit/qsynedit/syntaxer/glsl.cpp index 65a460f8..ea7a291c 100644 --- a/libs/qsynedit/qsynedit/syntaxer/glsl.cpp +++ b/libs/qsynedit/qsynedit/syntaxer/glsl.cpp @@ -1438,4 +1438,14 @@ QString GLSLSyntaxer::blockCommentEndSymbol() { return "*/"; } + +bool GLSLSyntaxer::supportFolding() +{ + return true; +} + +bool GLSLSyntaxer::needsLineState() +{ + +} } diff --git a/libs/qsynedit/qsynedit/syntaxer/lua.cpp b/libs/qsynedit/qsynedit/syntaxer/lua.cpp index ccbf2d61..53fa7827 100644 --- a/libs/qsynedit/qsynedit/syntaxer/lua.cpp +++ b/libs/qsynedit/qsynedit/syntaxer/lua.cpp @@ -984,6 +984,16 @@ QString LuaSyntaxer::blockCommentEndSymbol() return "]"; } +bool LuaSyntaxer::supportFolding() +{ + return true; +} + +bool LuaSyntaxer::needsLineState() +{ + return false; +} + const QSet &LuaSyntaxer::customTypeKeywords() const { return mCustomTypeKeywords; diff --git a/libs/qsynedit/qsynedit/syntaxer/makefile.cpp b/libs/qsynedit/qsynedit/syntaxer/makefile.cpp index 476f12f4..c7b4e389 100644 --- a/libs/qsynedit/qsynedit/syntaxer/makefile.cpp +++ b/libs/qsynedit/qsynedit/syntaxer/makefile.cpp @@ -691,4 +691,14 @@ QString MakefileSyntaxer::commentSymbol() return "#"; } +bool MakefileSyntaxer::supportFolding() +{ + return false; +} + +bool MakefileSyntaxer::needsLineState() +{ + return true; +} + } diff --git a/libs/qsynedit/qsynedit/syntaxer/syntaxer.cpp b/libs/qsynedit/qsynedit/syntaxer/syntaxer.cpp index 92efe0a6..e48072ab 100644 --- a/libs/qsynedit/qsynedit/syntaxer/syntaxer.cpp +++ b/libs/qsynedit/qsynedit/syntaxer/syntaxer.cpp @@ -218,18 +218,6 @@ QString Syntaxer::blockCommentEndSymbol() return QString(); } -bool Syntaxer::enabled() const -{ - return mEnabled; -} - -void Syntaxer::setEnabled(bool value) -{ - if (value != mEnabled) { - mEnabled = value; - } -} - FontStyles TokenAttribute::styles() const { return mStyles; diff --git a/libs/qsynedit/qsynedit/syntaxer/syntaxer.h b/libs/qsynedit/qsynedit/syntaxer/syntaxer.h index 203ea449..4ad887ef 100644 --- a/libs/qsynedit/qsynedit/syntaxer/syntaxer.h +++ b/libs/qsynedit/qsynedit/syntaxer/syntaxer.h @@ -122,7 +122,7 @@ public: Syntaxer(const Syntaxer&)=delete; Syntaxer& operator=(const Syntaxer&)=delete; - const QMap& attributes() const; + virtual const QMap& attributes() const; const QSet& wordBreakChars() const; @@ -166,13 +166,14 @@ public: virtual bool supportBraceLevel(); virtual bool isSpaceChar(const QChar& ch); virtual bool isWordBreakChar(const QChar& ch); - bool enabled() const; - void setEnabled(bool value); virtual PTokenAttribute getAttribute(const QString& name) const; virtual QString commentSymbol(); virtual QString blockCommentBeginSymbol(); virtual QString blockCommentEndSymbol(); + virtual bool supportFolding() = 0; + virtual bool needsLineState() = 0; + protected: PTokenAttribute mCommentAttribute; @@ -188,7 +189,6 @@ protected: private: QMap mAttributes; - bool mEnabled; QSet mWordBreakChars; }; diff --git a/libs/qsynedit/qsynedit/types.h b/libs/qsynedit/qsynedit/types.h index a403659b..b43dc628 100644 --- a/libs/qsynedit/qsynedit/types.h +++ b/libs/qsynedit/qsynedit/types.h @@ -37,6 +37,7 @@ enum class ProgrammingLanguage { LUA, XMAKE, Custom, + Textfile, Unknown };