mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 14:31:59 +02:00
94 lines
3.9 KiB
ObjectPascal
94 lines
3.9 KiB
ObjectPascal
program crash_2_7_1;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
//uses
|
|
|
|
type
|
|
TSynCommentType = (sctAnsi, sctBor, sctSlash);
|
|
TSynCommentIndentFlag = (
|
|
// * For Matching lines (FCommentMode)
|
|
// By default indent is the same as for none comment lines (none overrides sciAlignOpen)
|
|
sciNone, // Does not Indent comment lines (Prefix may contain a fixed indent)
|
|
sciAlignOpen, // Indent to real opening pos on first line, if comment does not start at BOL "Foo(); (*"
|
|
sciAddTokenLen, // add 1 or 2 spaces to indent (for the length of the token)
|
|
sciAddPastTokenIndent, // Adds any indent found past the opening token "(*", "{" or "//".
|
|
sciMatchOnlyTokenLen, // Apply the Above only if first line matches. (Only if sciAddTokenLen is specified)
|
|
sciMatchOnlyPastTokenIndent,
|
|
sciAlignOnlyTokenLen, // Apply the Above only if sciAlignOpen was used (include via max)
|
|
sciAlignOnlyPastTokenIndent,
|
|
sciApplyIndentForNoMatch // Apply above rules For NONE Matching lines (FCommentMode),
|
|
// includes FIndentFirstLineExtra
|
|
);
|
|
TSynCommentIndentFlags = set of TSynCommentIndentFlag;
|
|
TSynCommentContineMode = (
|
|
sccNoPrefix, // May still do indent, if matched
|
|
sccPrefixAlways, // If the pattern did not match all will be done, except the indent AFTER the prefix (can not be detected)
|
|
sccPrefixMatch
|
|
);
|
|
TSynCommentMatchMode = (
|
|
scmMatchAfterOpening, // will not include (*,{,//. The ^ will match the first char after
|
|
scmMatchOpening, // will include (*,{,//. The ^ will match the ({/
|
|
scmMatchWholeLine, // Match the entire line
|
|
scmMatchAtAsterisk // AnsiComment only, will match the * of (*, but not the (
|
|
);
|
|
TSynCommentMatchLine = (
|
|
sclMatchFirst, // Match the first line of the comment to get substitutes for Prefix ($1)
|
|
sclMatchPrev // Match the previous line of the comment to get substitutes for Prefix ($1)
|
|
);
|
|
TSynBeautifierIndentType = (sbitSpace, sbitCopySpaceTab, sbitPositionCaret);
|
|
TSynCommentExtendMode = (
|
|
sceNever, // Never Extend
|
|
sceAlways, // Always
|
|
sceSplitLine, // If the line was split (caret was not at EOL, when enter was pressed
|
|
sceMatching, // If the line matched (even if sccPrefixAlways or sccNoPrefix
|
|
sceMatchingSplitLine
|
|
);
|
|
|
|
|
|
function dbgs(AIndentFlag: TSynCommentIndentFlag): String;
|
|
begin
|
|
Result := ''; WriteStr(Result, AIndentFlag);
|
|
end;
|
|
|
|
function dbgs(AIndentFlags: TSynCommentIndentFlags): String;
|
|
var
|
|
i: TSynCommentIndentFlag;
|
|
begin
|
|
Result := '';
|
|
for i := low(TSynCommentIndentFlag) to high(TSynCommentIndentFlag) do
|
|
if i in AIndentFlags then
|
|
if Result = ''
|
|
then Result := dbgs(i)
|
|
else Result := Result + ',' + dbgs(i);
|
|
if Result <> '' then
|
|
Result := '[' + Result + ']';
|
|
end;
|
|
|
|
|
|
procedure Foo(Atype: TSynCommentType;
|
|
AIndentMode: TSynCommentIndentFlags;
|
|
AIndentFirstLineMax: Integer; AIndentFirstLineExtra: String;
|
|
ACommentMode: TSynCommentContineMode; AMatchMode: TSynCommentMatchMode;
|
|
AMatchLine: TSynCommentMatchLine; ACommentIndent: TSynBeautifierIndentType;
|
|
AMatch: String; APrefix: String;
|
|
AExtenbSlash: TSynCommentExtendMode = sceNever);
|
|
var
|
|
s: String;
|
|
begin
|
|
writestr(s, AType,':',
|
|
' IMode=', dbgs(AIndentMode), ' IMax=', AIndentFirstLineMax, ' IExtra=', AIndentFirstLineExtra,
|
|
' CMode=', ACommentMode, ' CMatch=', AMatchMode, ' CLine=', AMatchLine,
|
|
' M=''', AMatch, ''' R=''', APrefix, ''' CIndent=', ACommentIndent
|
|
);
|
|
if s<>'sctAnsi: IMode=[sciAddTokenLen] IMax=5 IExtra= CMode=sccPrefixMatch CMatch=scmMatchOpening CLine=sclMatchPrev M=''.'' R=''+'' CIndent=sbitCopySpaceTab' then
|
|
halt(1);
|
|
end;
|
|
|
|
begin
|
|
Foo(sctAnsi, [sciAddTokenLen], 5, ' ', sccPrefixMatch, scmMatchOpening,
|
|
sclMatchPrev, sbitCopySpaceTab, '.', '+');
|
|
|
|
end.
|
|
|