bool CppAutoCompleter::isInCommentHelper(const QTextCursor &cursor, Token *retToken) const { SimpleLexer tokenize; tokenize.setQtMocRunEnabled(false); tokenize.setObjCEnabled(false); tokenize.setCxx0xEnabled(true); const int prevState = BackwardsScanner::previousBlockState(cursor.block()) & 0xFF; const QList<Token> tokens = tokenize(cursor.block().text(), prevState); const unsigned pos = cursor.selectionEnd() - cursor.block().position(); if (tokens.isEmpty() || pos < tokens.first().begin()) return prevState > 0; if (pos >= tokens.last().end()) { const Token tk = tokens.last(); if (tk.is(T_CPP_COMMENT) || tk.is(T_CPP_DOXY_COMMENT)) return true; return tk.isComment() && (cursor.block().userState() & 0xFF); } Token tk = tokenAtPosition(tokens, pos); if (retToken) *retToken = tk; return tk.isComment(); }
QFuture<TextEditor::HighlightingResult> CppHighlightingSupportInternal::highlightingFuture( const Document::Ptr &doc, const Snapshot &snapshot) const { typedef TextEditor::HighlightingResult Result; QList<Result> macroUses; // Get macro definitions foreach (const CPlusPlus::Macro& macro, doc->definedMacros()) { int line, column; editor()->convertPosition(macro.offset(), &line, &column); ++column; //Highlighting starts at (column-1) --> compensate here Result use(line, column, macro.name().size(), MacroUse); macroUses.append(use); } // Get macro uses foreach (const Document::MacroUse ¯o, doc->macroUses()) { const QString name = QString::fromUtf8(macro.macro().name()); //Filter out QtKeywords if (isQtKeyword(QStringRef(&name))) continue; //Filter out C++ keywords SimpleLexer tokenize; tokenize.setQtMocRunEnabled(false); tokenize.setObjCEnabled(false); tokenize.setCxx0xEnabled(true); const QList<Token> tokens = tokenize(name); if (tokens.length() && (tokens.at(0).isKeyword() || tokens.at(0).isObjCAtKeyword())) continue; int line, column; editor()->convertPosition(macro.begin(), &line, &column); ++column; //Highlighting starts at (column-1) --> compensate here Result use(line, column, name.size(), MacroUse); macroUses.append(use); } LookupContext context(doc, snapshot); return CheckSymbols::go(doc, context, macroUses); }
SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *b) { SimpleLexer tokenize; tokenize.setObjCEnabled(true); tokenize.setSkipComments(false); QTextBlock block = cursor.block(); int column = cursor.position() - cursor.block().position(); _text = block.text(); _tokens = tokenize(_text, BackwardsScanner::previousBlockState(block)); for (int index = _tokens.size() - 1; index != -1; --index) { const SimpleToken &tk = _tokens.at(index); if (tk.position() < column) { if (b) *b = block; return tk; } } return SimpleToken(); }