diff options
author | Neil <nyamatongwe@gmail.com> | 2019-03-23 08:50:32 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2019-03-23 08:50:32 +1100 |
commit | 5344ef2aee7eaca738b0bddab8d9025bf49f1137 (patch) | |
tree | 5c0164d7456d483dbcce07d23d39ebacdd249204 /lexers/LexCPP.cxx | |
parent | aab14ccb791a798262642dbfcaad6fd3ee381873 (diff) | |
download | scintilla-mirror-5344ef2aee7eaca738b0bddab8d9025bf49f1137.tar.gz |
Fix warnings from MSVC Code Analysis.
Diffstat (limited to 'lexers/LexCPP.cxx')
-rw-r--r-- | lexers/LexCPP.cxx | 79 |
1 files changed, 44 insertions, 35 deletions
diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx index b768c9a4a..1581b6826 100644 --- a/lexers/LexCPP.cxx +++ b/lexers/LexCPP.cxx @@ -18,6 +18,7 @@ #include <vector> #include <map> #include <algorithm> +#include <iterator> #include "ILexer.h" #include "Scintilla.h" @@ -39,7 +40,7 @@ using namespace Scintilla; namespace { // Use an unnamed namespace to protect the functions and classes from name conflicts -bool IsSpaceEquiv(int state) noexcept { +constexpr bool IsSpaceEquiv(int state) noexcept { return (state <= SCE_C_COMMENTDOC) || // including SCE_C_DEFAULT, SCE_C_COMMENT, SCE_C_COMMENTLINE (state == SCE_C_COMMENTLINEDOC) || (state == SCE_C_COMMENTDOCKEYWORD) || @@ -86,7 +87,7 @@ bool followsReturnKeyword(const StyleContext &sc, LexAccessor &styler) { return !*s; } -bool IsSpaceOrTab(int ch) noexcept { +constexpr bool IsSpaceOrTab(int ch) noexcept { return ch == ' ' || ch == '\t'; } @@ -145,7 +146,7 @@ void highlightTaskMarker(StyleContext &sc, LexAccessor &styler, if ((isoperator(sc.chPrev) || IsASpace(sc.chPrev)) && markerList.Length()) { const int lengthMarker = 50; char marker[lengthMarker+1] = ""; - const Sci_Position currPos = static_cast<Sci_Position>(sc.currentPos); + const Sci_Position currPos = sc.currentPos; int i = 0; while (i < lengthMarker) { const char ch = styler.SafeGetCharAt(currPos + i); @@ -173,7 +174,7 @@ struct EscapeSequence { CharacterSet *escapeSetValid; EscapeSequence() { digitsLeft = 0; - escapeSetValid = 0; + escapeSetValid = nullptr; setHexDigits = CharacterSet(CharacterSet::setDigits, "ABCDEFabcdef"); setOctDigits = CharacterSet(CharacterSet::setNone, "01234567"); } @@ -226,7 +227,7 @@ std::string GetRestOfLine(LexAccessor &styler, Sci_Position start, bool allowSpa return restOfLine; } -bool IsStreamCommentStyle(int style) noexcept { +constexpr bool IsStreamCommentStyle(int style) noexcept { return style == SCE_C_COMMENT || style == SCE_C_COMMENTDOC || style == SCE_C_COMMENTDOCKEYWORD || @@ -259,7 +260,7 @@ class LinePPState { } } public: - LinePPState() : state(0), ifTaken(0), level(-1) { + LinePPState() noexcept : state(0), ifTaken(0), level(-1) { } bool IsInactive() const noexcept { return state != 0; @@ -369,7 +370,7 @@ const char *const cppWordLists[] = { "Global classes and typedefs", "Preprocessor definitions", "Task marker and error marker keywords", - 0, + nullptr, }; struct OptionSetCPP : public OptionSet<OptionsCPP> { @@ -478,6 +479,8 @@ LexicalClass lexicalClasses[] = { 27, "SCE_C_ESCAPESEQUENCE", "literal string escapesequence", "Escape sequence", }; +const int sizeLexicalClasses = static_cast<int>(std::size(lexicalClasses)); + } class LexerCPP : public ILexer4 { @@ -500,7 +503,8 @@ class LexerCPP : public ILexer4 { struct SymbolValue { std::string value; std::string arguments; - SymbolValue(const std::string &value_="", const std::string &arguments_="") : value(value_), arguments(arguments_) { + SymbolValue() noexcept = default; + SymbolValue(const std::string &value_, const std::string &arguments_) : value(value_), arguments(arguments_) { } SymbolValue &operator = (const std::string &value_) { value = value_; @@ -532,12 +536,17 @@ public: setLogicalOp(CharacterSet::setNone, "|&"), subStyles(styleSubable, 0x80, 0x40, activeFlag) { } + // Deleted so LexerCPP objects can not be copied. + LexerCPP(const LexerCPP &) = delete; + LexerCPP(LexerCPP &&) = delete; + void operator=(const LexerCPP &) = delete; + void operator=(LexerCPP &&) = delete; virtual ~LexerCPP() { } - void SCI_METHOD Release() override { + void SCI_METHOD Release() noexcept override { delete this; } - int SCI_METHOD Version() const override { + int SCI_METHOD Version() const noexcept override { return lvRelease4; } const char * SCI_METHOD PropertyNames() override { @@ -557,11 +566,11 @@ public: void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; - void * SCI_METHOD PrivateCall(int, void *) override { - return 0; + void * SCI_METHOD PrivateCall(int, void *) noexcept override { + return nullptr; } - int SCI_METHOD LineEndTypesSupported() override { + int SCI_METHOD LineEndTypesSupported() noexcept override { return SC_LINE_END_TYPE_UNICODE; } @@ -579,7 +588,7 @@ public: const int active = subStyle & activeFlag; return styleBase | active; } - int SCI_METHOD PrimaryStyleFromStyle(int style) override { + int SCI_METHOD PrimaryStyleFromStyle(int style) noexcept override { return MaskActive(style); } void SCI_METHOD FreeSubStyles() override { @@ -588,21 +597,21 @@ public: void SCI_METHOD SetIdentifiers(int style, const char *identifiers) override { subStyles.SetIdentifiers(style, identifiers); } - int SCI_METHOD DistanceToSecondaryStyles() override { + int SCI_METHOD DistanceToSecondaryStyles() noexcept override { return activeFlag; } - const char * SCI_METHOD GetSubStyleBases() override { + const char * SCI_METHOD GetSubStyleBases() noexcept override { return styleSubable; } int SCI_METHOD NamedStyles() override { return std::max(subStyles.LastAllocated() + 1, - static_cast<int>(ELEMENTS(lexicalClasses))) + + sizeLexicalClasses) + activeFlag; } const char * SCI_METHOD NameOfStyle(int style) override { if (style >= NamedStyles()) return ""; - if (style < static_cast<int>(ELEMENTS(lexicalClasses))) + if (style < sizeLexicalClasses) return lexicalClasses[style].name; // TODO: inactive and substyles return ""; @@ -626,12 +635,12 @@ public: return returnBuffer.c_str(); } } - if (style < static_cast<int>(ELEMENTS(lexicalClasses))) + if (style < sizeLexicalClasses) return lexicalClasses[style].tags; if (style >= activeFlag) { returnBuffer = "inactive "; const int styleActive = style - activeFlag; - if (styleActive < static_cast<int>(ELEMENTS(lexicalClasses))) + if (styleActive < sizeLexicalClasses) returnBuffer += lexicalClasses[styleActive].tags; else returnBuffer = ""; @@ -642,7 +651,7 @@ public: const char * SCI_METHOD DescriptionOfStyle(int style) override { if (style >= NamedStyles()) return ""; - if (style < static_cast<int>(ELEMENTS(lexicalClasses))) + if (style < sizeLexicalClasses) return lexicalClasses[style].description; // TODO: inactive and substyles return ""; @@ -654,7 +663,7 @@ public: static ILexer4 *LexerFactoryCPPInsensitive() { return new LexerCPP(false); } - static int MaskActive(int style) noexcept { + constexpr static int MaskActive(int style) noexcept { return style & ~activeFlag; } void EvaluateTokens(std::vector<std::string> &tokens, const SymbolTable &preprocessorDefinitions); @@ -676,7 +685,7 @@ Sci_Position SCI_METHOD LexerCPP::PropertySet(const char *key, const char *val) } Sci_Position SCI_METHOD LexerCPP::WordListSet(int n, const char *wl) { - WordList *wordListN = 0; + WordList *wordListN = nullptr; switch (n) { case 0: wordListN = &keywords; @@ -818,7 +827,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i const WordClassifier &classifierIdentifiers = subStyles.Classifier(SCE_C_IDENTIFIER); const WordClassifier &classifierDocKeyWords = subStyles.Classifier(SCE_C_COMMENTDOCKEYWORD); - Sci_Position lineEndNext = styler.LineEnd(lineCurrent); + Sci_PositionU lineEndNext = styler.LineEnd(lineCurrent); for (; sc.More();) { @@ -856,7 +865,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i // Handle line continuation generically. if (sc.ch == '\\') { - if (static_cast<Sci_Position>((sc.currentPos+1)) >= lineEndNext) { + if ((sc.currentPos+1) >= lineEndNext) { lineCurrent++; lineEndNext = styler.LineEnd(lineCurrent); vlls.Add(lineCurrent, preproc); @@ -1128,7 +1137,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i while ((sc.ch < 0x80) && islower(sc.ch)) sc.Forward(); // gobble regex flags sc.SetState(SCE_C_DEFAULT|activitySet); - } else if (sc.ch == '\\' && (static_cast<Sci_Position>(sc.currentPos+1) < lineEndNext)) { + } else if (sc.ch == '\\' && ((sc.currentPos+1) < lineEndNext)) { // Gobble up the escaped character sc.Forward(); } else if (sc.ch == '[') { @@ -1316,7 +1325,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i while ((startName < restOfLine.length()) && IsSpaceOrTab(restOfLine[startName])) startName++; size_t endName = startName; - while ((endName < restOfLine.length()) && setWord.Contains(static_cast<unsigned char>(restOfLine[endName]))) + while ((endName < restOfLine.length()) && setWord.Contains(restOfLine[endName])) endName++; std::string key = restOfLine.substr(startName, endName-startName); if ((endName < restOfLine.length()) && (restOfLine.at(endName) == '(')) { @@ -1542,7 +1551,7 @@ void LexerCPP::EvaluateTokens(std::vector<std::string> &tokens, const SymbolTabl size_t iterations = 0; // Limit number of iterations in case there is a recursive macro. for (size_t i = 0; (i<tokens.size()) && (iterations < maxIterations);) { iterations++; - if (setWordStart.Contains(static_cast<unsigned char>(tokens[i][0]))) { + if (setWordStart.Contains(tokens[i][0])) { SymbolTable::const_iterator it = preprocessorDefinitions.find(tokens[i]); if (it != preprocessorDefinitions.end()) { // Tokenize value @@ -1569,7 +1578,7 @@ void LexerCPP::EvaluateTokens(std::vector<std::string> &tokens, const SymbolTabl macroTokens.erase(std::remove_if(macroTokens.begin(), macroTokens.end(), OnlySpaceOrTab), macroTokens.end()); for (size_t iMacro = 0; iMacro < macroTokens.size();) { - if (setWordStart.Contains(static_cast<unsigned char>(macroTokens[iMacro][0]))) { + if (setWordStart.Contains(macroTokens[iMacro][0])) { std::map<std::string, std::string>::const_iterator itFind = arguments.find(macroTokens[iMacro]); if (itFind != arguments.end()) { // TODO: Possible that value will be expression so should insert tokenized form @@ -1687,9 +1696,9 @@ std::vector<std::string> LexerCPP::Tokenize(const std::string &expr) const { const char *cp = expr.c_str(); while (*cp) { std::string word; - if (setWord.Contains(static_cast<unsigned char>(*cp))) { + if (setWord.Contains(*cp)) { // Identifiers and numbers - while (setWord.Contains(static_cast<unsigned char>(*cp))) { + while (setWord.Contains(*cp)) { word += *cp; cp++; } @@ -1698,17 +1707,17 @@ std::vector<std::string> LexerCPP::Tokenize(const std::string &expr) const { word += *cp; cp++; } - } else if (setRelOp.Contains(static_cast<unsigned char>(*cp))) { + } else if (setRelOp.Contains(*cp)) { word += *cp; cp++; - if (setRelOp.Contains(static_cast<unsigned char>(*cp))) { + if (setRelOp.Contains(*cp)) { word += *cp; cp++; } - } else if (setLogicalOp.Contains(static_cast<unsigned char>(*cp))) { + } else if (setLogicalOp.Contains(*cp)) { word += *cp; cp++; - if (setLogicalOp.Contains(static_cast<unsigned char>(*cp))) { + if (setLogicalOp.Contains(*cp)) { word += *cp; cp++; } |