fcl-passrc: fixed scanner row, col in macro

git-svn-id: trunk@39344 -
This commit is contained in:
Mattias Gaertner 2018-06-29 15:48:21 +00:00
parent e813a11e85
commit 7e64102b74
2 changed files with 35 additions and 9 deletions

View File

@ -54,6 +54,7 @@ const
nLogMacroUnDefined = 1027; // FPC=3102
nWarnIllegalCompilerDirectiveX = 1028;
nIllegalStateForWarnDirective = 1027;
nErrIncludeLimitReached = 1028;
// resourcestring patterns of messages
resourcestring
@ -86,6 +87,7 @@ resourcestring
SLogMacroUnDefined = 'Macro undefined: %s';
SWarnIllegalCompilerDirectiveX = 'Illegal compiler directive "%s"';
SIllegalStateForWarnDirective = 'Illegal state "%s" for $WARN directive';
SErrIncludeLimitReached = 'Include file limit reached';
type
TMessageType = (
@ -355,6 +357,7 @@ type
const
vsAllValueSwitches = [low(TValueSwitch)..high(TValueSwitch)];
DefaultVSInterfaces = 'com';
DefaultMaxIncludeStackDepth = 20;
type
TWarnMsgState = (
@ -636,9 +639,11 @@ type
FCurSourceFile: TLineReader;
FCurFilename: string;
FCurRow: Integer;
FCurColumnOffset: integer;
FCurToken: TToken;
FCurTokenString: string;
FCurLine: string;
FMaxIncludeStackDepth: integer;
FModuleRow: Integer;
FMacros, FDefines: TStrings;
FNonTokens: TTokens;
@ -786,6 +791,7 @@ type
property Options : TPOptions read FOptions write SetOptions;
Property SkipWhiteSpace : Boolean Read FSkipWhiteSpace Write FSkipWhiteSpace;
Property SkipComments : Boolean Read FSkipComments Write FSkipComments;
property MaxIncludeStackDepth: integer read FMaxIncludeStackDepth write FMaxIncludeStackDepth default DefaultMaxIncludeStackDepth;
property ForceCaret : Boolean read GetForceCaret;
property LogEvents : TPScannerLogEvents read FLogEvents write FLogEvents;
@ -1233,6 +1239,7 @@ type
TokenString: string;
Line: string;
Row: Integer;
ColumnOffset: integer;
TokenStr: PChar;
end;
@ -2374,6 +2381,7 @@ begin
FIncludeStack := TFPList.Create;
FDefines := CS;
FMacros:=CS;
FMaxIncludeStackDepth:=DefaultMaxIncludeStackDepth;
FAllowedModes:=AllLanguageModes;
FCurrentModeSwitches:=FPCModeSwitches;
@ -2509,6 +2517,7 @@ begin
FCurTokenString := IncludeStackItem.TokenString;
FCurLine := IncludeStackItem.Line;
FCurRow := IncludeStackItem.Row;
FCurColumnOffset := IncludeStackItem.ColumnOffset;
FTokenStr := IncludeStackItem.TokenStr;
IncludeStackItem.Free;
Result := FCurToken;
@ -2727,6 +2736,8 @@ Var
SI: TIncludeStackItem;
begin
if FIncludeStack.Count>=MaxIncludeStackDepth then
Error(nErrIncludeLimitReached,SErrIncludeLimitReached);
SI := TIncludeStackItem.Create;
SI.SourceFile := CurSourceFile;
SI.Filename := CurFilename;
@ -2734,10 +2745,12 @@ begin
SI.TokenString := CurTokenString;
SI.Line := CurLine;
SI.Row := CurRow;
SI.ColumnOffset := FCurColumnOffset;
SI.TokenStr := FTokenStr;
FIncludeStack.Add(SI);
FTokenStr:=Nil;
FCurRow := 0;
FCurColumnOffset := 1;
end;
procedure TPascalScanner.HandleIncludeFile(Param: String);
@ -2765,15 +2778,18 @@ function TPascalScanner.HandleMacro(AIndex : integer) : TToken;
Var
M : TMacroDef;
ML : TMacroReader;
OldRow, OldCol: Integer;
begin
OldRow:=CurRow;
OldCol:=CurColumn;
PushStackItem;
M:=FMacros.Objects[AIndex] as TMacroDef;
ML:=TMacroReader.Create(FCurFileName,M.Value);
ML.CurRow:=FCurRow;
ML.CurCol:=CurColumn;
ML.CurRow:=OldRow;
ML.CurCol:=OldCol-length(M.Name);
FCurSourceFile:=ML;
Result:=DofetchToken;
Result:=DoFetchToken;
// Writeln(Result,Curtoken);
end;
@ -3806,7 +3822,7 @@ begin
FCurToken := Result;
if MacrosOn then
begin
Index:=FMacros.IndexOf(CurtokenString);
Index:=FMacros.IndexOf(CurTokenString);
if Index>=0 then
Result:=HandleMacro(Index);
end;
@ -3829,9 +3845,9 @@ end;
function TPascalScanner.GetCurColumn: Integer;
begin
If (FTokenStr<>Nil) then
Result := FTokenStr - PChar(CurLine) + 1
Result := FTokenStr - PChar(CurLine) + FCurColumnOffset
else
Result := 1;
Result := FCurColumnOffset;
end;
function TPascalScanner.GetCurrentValueSwitch(V: TValueSwitch): string;
@ -4189,6 +4205,7 @@ begin
FTokenStr := nil;
inc(FCurRow); // set CurRow to last line+1
inc(FModuleRow);
FCurColumnOffset:=1;
end;
Result := false;
end else
@ -4198,10 +4215,16 @@ begin
Result := true;
Inc(FCurRow);
inc(FModuleRow);
FCurColumnOffset:=1;
if (FCurSourceFile is TMacroReader) and (FCurRow=1) then
begin
FCurRow:=TMacroReader(FCurSourceFile).CurRow;
FCurColumnOffset:=TMacroReader(FCurSourceFile).CurCol;
end;
if LogEvent(sleLineNumber)
and (((FCurRow Mod 100) = 0)
or CurSourceFile.IsEOF) then
DoLog(mtInfo,nLogLineNumber,SLogLineNumber,[FCurRow],True);
DoLog(mtInfo,nLogLineNumber,SLogLineNumber,[FCurRow],True); // log last line
end;
end;

View File

@ -2815,9 +2815,12 @@ End.
<li>SYMBOL_DEPRECATED: Deprecated symbol.</li>
<li>SYMBOL_EXPERIMENTAL: Experimental symbol</li>
<li>SYMBOL_LIBRARY</li>
<li>SYMBOL_PLATFORM: Platform-dependent symbol.</li>
<li>SYMBOL_UNIMPLEMENTED: Unimplemented symbol.</li>
<li>SYMBOL_PLATFORM: Platform-dependent symbol.</li>
<li>SYMBOL_UNIMPLEMENTED: Unimplemented symbol.</li>
<li>HIDDEN_VIRTUAL: method hides virtual method of ancestor</li>
<li>GARBAGE: text after final end.</li>
<li>BOUNDS_ERROR: range check errors</li>
<li>MESSAGE_DIRECTIVE: user defined $message</li>
</ul>
</li>
<li>{$M+}, {$TypeInfo on}: switches default visibility for class members from public to published</li>