mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-08-31 22:58:24 +02:00
https://www.scintilla.org/scintilla534.zip Released 8 March 2023. Add multithreaded wrap to significantly improve performance of wrapping large files. More typesafe bindings of *Full APIs in ScintillaCall. Feature #1477. Fix overlapping of text with line end wrap marker. Bug #2378. Fix clipping of line end wrap symbol for SC_WRAPVISUALFLAGLOC_END_BY_TEXT. Where a multi-byte character contains multiple styles, display each byte as a representation. This makes it easier to see and fix lexers that change styles mid-character, commonly because they use fixed size buffers. Fix a potential crash with autocompletion list fill-ups where a SCN_CHARADDED handler retriggered an autocompletion list, but with no items that match the typed character. lexilla523 Released 8 March 2023. Add scripts/PromoteNew.bat script to promote .new files after checking. Makefile: Remove 1024-byte line length limit.. Ruby: Add new lexical classes for % literals SCE_RB_STRING_W (%w non-interpolable string array), SCE_RB_STRING_I (%i non-interpolable symbol array), SCE_RB_STRING_QI (%I interpolable symbol array), and SCE_RB_STRING_QS (%s symbol). Issue #124. Ruby: Disambiguate %= which may be a quote or modulo assignment. Issue #124, Bug #1255, Bug #2182. Ruby: Fix additional fold level for single character in SCE_RB_STRING_QW. Issue #132. Ruby: Set SCE_RB_HERE_QQ for unquoted and double-quoted heredocs and SCE_RB_HERE_QX for backticks-quoted heredocs. Issue #134. Ruby: Recognise #{} inside SCE_RB_HERE_QQ and SCE_RB_HERE_QX. Issue #134. Ruby: Improve regex and heredoc recognition. Issue #136. Ruby: Highlight #@, #@@ and #$ style interpolation. Issue #140. Ruby: Fix folding for multiple heredocs started on one line. Fix folding when there is a space after heredoc opening delimiter. Issue #135. YAML: Remove 1024-byte line length limit. https://www.scintilla.org/lexilla524.zip Released 13 March 2023. C++: Fix failure to recognize keywords containing upper case. Issue #149. GDScript: Support % and $ node paths. Issue #145, Pull request #146. Close #13338
144 lines
4.3 KiB
C++
144 lines
4.3 KiB
C++
// Scintilla source code edit control
|
|
/** @file LexMake.cxx
|
|
** Lexer for make files.
|
|
**/
|
|
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
// The License.txt file describes the conditions under which this software may be distributed.
|
|
|
|
#include <cstdlib>
|
|
#include <cassert>
|
|
#include <cstring>
|
|
#include <cctype>
|
|
#include <cstdio>
|
|
#include <cstdarg>
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
#include "ILexer.h"
|
|
#include "Scintilla.h"
|
|
#include "SciLexer.h"
|
|
|
|
#include "WordList.h"
|
|
#include "LexAccessor.h"
|
|
#include "Accessor.h"
|
|
#include "StyleContext.h"
|
|
#include "CharacterSet.h"
|
|
#include "LexerModule.h"
|
|
|
|
using namespace Lexilla;
|
|
|
|
static inline bool AtEOL(Accessor &styler, Sci_PositionU i) {
|
|
return (styler[i] == '\n') ||
|
|
((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n'));
|
|
}
|
|
|
|
static void ColouriseMakeLine(
|
|
const std::string &lineBuffer,
|
|
Sci_PositionU startLine,
|
|
Sci_PositionU endPos,
|
|
Accessor &styler) {
|
|
|
|
const Sci_PositionU lengthLine = lineBuffer.length();
|
|
Sci_PositionU i = 0;
|
|
Sci_Position lastNonSpace = -1;
|
|
unsigned int state = SCE_MAKE_DEFAULT;
|
|
bool bSpecial = false;
|
|
|
|
// check for a tab character in column 0 indicating a command
|
|
bool bCommand = false;
|
|
if ((lengthLine > 0) && (lineBuffer[0] == '\t'))
|
|
bCommand = true;
|
|
|
|
// Skip initial spaces
|
|
while ((i < lengthLine) && isspacechar(lineBuffer[i])) {
|
|
i++;
|
|
}
|
|
if (i < lengthLine) {
|
|
if (lineBuffer[i] == '#') { // Comment
|
|
styler.ColourTo(endPos, SCE_MAKE_COMMENT);
|
|
return;
|
|
}
|
|
if (lineBuffer[i] == '!') { // Special directive
|
|
styler.ColourTo(endPos, SCE_MAKE_PREPROCESSOR);
|
|
return;
|
|
}
|
|
}
|
|
int varCount = 0;
|
|
while (i < lengthLine) {
|
|
if (((i + 1) < lengthLine) && (lineBuffer[i] == '$' && lineBuffer[i + 1] == '(')) {
|
|
styler.ColourTo(startLine + i - 1, state);
|
|
state = SCE_MAKE_IDENTIFIER;
|
|
varCount++;
|
|
} else if (state == SCE_MAKE_IDENTIFIER && lineBuffer[i] == ')') {
|
|
if (--varCount == 0) {
|
|
styler.ColourTo(startLine + i, state);
|
|
state = SCE_MAKE_DEFAULT;
|
|
}
|
|
}
|
|
|
|
// skip identifier and target styling if this is a command line
|
|
if (!bSpecial && !bCommand) {
|
|
if (lineBuffer[i] == ':') {
|
|
if (((i + 1) < lengthLine) && (lineBuffer[i + 1] == '=')) {
|
|
// it's a ':=', so style as an identifier
|
|
if (lastNonSpace >= 0)
|
|
styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER);
|
|
styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
|
|
styler.ColourTo(startLine + i + 1, SCE_MAKE_OPERATOR);
|
|
} else {
|
|
// We should check that no colouring was made since the beginning of the line,
|
|
// to avoid colouring stuff like /OUT:file
|
|
if (lastNonSpace >= 0)
|
|
styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_TARGET);
|
|
styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
|
|
styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
|
|
}
|
|
bSpecial = true; // Only react to the first ':' of the line
|
|
state = SCE_MAKE_DEFAULT;
|
|
} else if (lineBuffer[i] == '=') {
|
|
if (lastNonSpace >= 0)
|
|
styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER);
|
|
styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
|
|
styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
|
|
bSpecial = true; // Only react to the first '=' of the line
|
|
state = SCE_MAKE_DEFAULT;
|
|
}
|
|
}
|
|
if (!isspacechar(lineBuffer[i])) {
|
|
lastNonSpace = i;
|
|
}
|
|
i++;
|
|
}
|
|
if (state == SCE_MAKE_IDENTIFIER) {
|
|
styler.ColourTo(endPos, SCE_MAKE_IDEOL); // Error, variable reference not ended
|
|
} else {
|
|
styler.ColourTo(endPos, SCE_MAKE_DEFAULT);
|
|
}
|
|
}
|
|
|
|
static void ColouriseMakeDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *[], Accessor &styler) {
|
|
std::string lineBuffer;
|
|
styler.StartAt(startPos);
|
|
styler.StartSegment(startPos);
|
|
Sci_PositionU startLine = startPos;
|
|
for (Sci_PositionU i = startPos; i < startPos + length; i++) {
|
|
lineBuffer.push_back(styler[i]);
|
|
if (AtEOL(styler, i)) {
|
|
// End of line (or of line buffer) met, colourise it
|
|
ColouriseMakeLine(lineBuffer, startLine, i, styler);
|
|
lineBuffer.clear();
|
|
startLine = i + 1;
|
|
}
|
|
}
|
|
if (!lineBuffer.empty()) { // Last line does not have ending characters
|
|
ColouriseMakeLine(lineBuffer, startLine, startPos + length - 1, styler);
|
|
}
|
|
}
|
|
|
|
static const char *const emptyWordListDesc[] = {
|
|
nullptr
|
|
};
|
|
|
|
LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", nullptr, emptyWordListDesc);
|