mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-09 04:56:12 +02:00
codetools: c merge: fixed merged pos to original pos
git-svn-id: trunk@29555 -
This commit is contained in:
parent
3d9c23d3de
commit
759c3a2aa8
@ -338,6 +338,9 @@ type
|
|||||||
function MergedPosToOriginal(MergedX, MergedY: integer;
|
function MergedPosToOriginal(MergedX, MergedY: integer;
|
||||||
out Code: TCodeBuffer; out X, Y: integer): boolean;
|
out Code: TCodeBuffer; out X, Y: integer): boolean;
|
||||||
function LinkIndexOfMergedPos(MergedPos: integer): integer;
|
function LinkIndexOfMergedPos(MergedPos: integer): integer;
|
||||||
|
function GetLinkLength(Index: integer): integer;
|
||||||
|
|
||||||
|
procedure WriteDebugReport;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function CCNodeDescAsString(Desc: TCCodeNodeDesc; SubDesc: TCCodeNodeDesc = 0): string;
|
function CCNodeDescAsString(Desc: TCCodeNodeDesc; SubDesc: TCCodeNodeDesc = 0): string;
|
||||||
@ -501,6 +504,13 @@ var
|
|||||||
StrStream.Write(Code.Source[FromPos],EndPos-FromPos);
|
StrStream.Write(Code.Source[FromPos],EndPos-FromPos);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure Append(const s: string);
|
||||||
|
begin
|
||||||
|
if s='' then exit;
|
||||||
|
AddLink(StrStream.Position+1,nil,0);
|
||||||
|
StrStream.Write(s[1],length(s));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure Parse(Code: TCodeBuffer);
|
procedure Parse(Code: TCodeBuffer);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -536,11 +546,11 @@ var
|
|||||||
// include file found
|
// include file found
|
||||||
if MergedBuffers.IndexOf(IncCode)<0 then begin
|
if MergedBuffers.IndexOf(IncCode)<0 then begin
|
||||||
debugln(['TCHeaderFileMerger.Merge file '+IncFilename+' into '+Code.Filename]);
|
debugln(['TCHeaderFileMerger.Merge file '+IncFilename+' into '+Code.Filename]);
|
||||||
StrStream.WriteString('/* h2pas: merged '+IncludeParam+' into '+ExtractFileName(Code.Filename)+' */'+LineEnding);
|
Append('/* h2pas: merged '+IncludeParam+' into '+ExtractFileName(Code.Filename)+' */'+LineEnding);
|
||||||
Append(Code,MergePos,Code.GetLineStart(i));
|
Append(Code,MergePos,Code.GetLineStart(i));
|
||||||
MergePos:=Code.GetLineStart(i+1);
|
MergePos:=Code.GetLineStart(i+1);
|
||||||
Parse(IncCode);
|
Parse(IncCode);
|
||||||
StrStream.WriteString('/* h2pas: end of merged '+IncludeParam+' into '+ExtractFileName(Code.Filename)+' */'+LineEnding);
|
Append('/* h2pas: end of merged '+IncludeParam+' into '+ExtractFileName(Code.Filename)+' */'+LineEnding);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -548,7 +558,7 @@ var
|
|||||||
end;
|
end;
|
||||||
if MergePos<Code.SourceLength then
|
if MergePos<Code.SourceLength then
|
||||||
Append(Code,MergePos,Code.SourceLength);
|
Append(Code,MergePos,Code.SourceLength);
|
||||||
StrStream.WriteString(LineEnding);
|
Append(LineEnding);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -589,6 +599,7 @@ var
|
|||||||
begin
|
begin
|
||||||
Result:=false;
|
Result:=false;
|
||||||
CombinedSource.LineColToPosition(MergedY,MergedX,MergedPos);
|
CombinedSource.LineColToPosition(MergedY,MergedX,MergedPos);
|
||||||
|
//debugln(['TCHeaderFileMerger.MergedPosToOriginal MergedX=',MergedX,' MergedY=',MergedY,' MergedPos=',MergedPos,' ',dbgstr(copy(CombinedSource.Source,MergedPos-10,10)),'|',dbgstr(copy(CombinedSource.Source,MergedPos,10))]);
|
||||||
if not MergedPosToOriginal(MergedPos,Code,CodePos) then exit;
|
if not MergedPosToOriginal(MergedPos,Code,CodePos) then exit;
|
||||||
Code.AbsoluteToLineCol(CodePos,Y,X);
|
Code.AbsoluteToLineCol(CodePos,Y,X);
|
||||||
Result:=Y>=1;
|
Result:=Y>=1;
|
||||||
@ -621,6 +632,44 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TCHeaderFileMerger.GetLinkLength(Index: integer): integer;
|
||||||
|
begin
|
||||||
|
if (Index<0) or (Index>=LinkCount) then
|
||||||
|
Result:=0
|
||||||
|
else if Index=LinkCount-1 then
|
||||||
|
Result:=CombinedSource.SourceLength-Links[Index].MergedPos
|
||||||
|
else
|
||||||
|
Result:=Links[Index+1].MergedPos-Links[Index].MergedPos;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCHeaderFileMerger.WriteDebugReport;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
Link: PCHFileLink;
|
||||||
|
Line: integer;
|
||||||
|
Column: integer;
|
||||||
|
l: LongInt;
|
||||||
|
begin
|
||||||
|
debugln(['TCHeaderFileMerger.WriteDebugReport LinkCount=',LinkCount]);
|
||||||
|
for i:=0 to LinkCount-1 do begin
|
||||||
|
Link:=@Links[i];
|
||||||
|
CombinedSource.AbsoluteToLineCol(Link^.MergedPos,Line,Column);
|
||||||
|
dbgout(' Line=',dbgs(Line));
|
||||||
|
if Link^.Code<>nil then begin
|
||||||
|
Link^.Code.AbsoluteToLineCol(Link^.SrcPos,Line,Column);
|
||||||
|
DbgOut(' ',ExtractFilename(Link^.Code.Filename),' Y=',dbgs(Line),' X=',dbgs(Column));
|
||||||
|
end else begin
|
||||||
|
DbgOut(' no source');
|
||||||
|
end;
|
||||||
|
l:=GetLinkLength(i);
|
||||||
|
if l<45 then
|
||||||
|
debugln([' [ ',dbgstr(copy(CombinedSource.Source,Link^.MergedPos,l)),' ]'])
|
||||||
|
else
|
||||||
|
debugln([' [ ',dbgstr(copy(CombinedSource.Source,Link^.MergedPos,20)),' ... ',
|
||||||
|
dbgstr(copy(CombinedSource.Source,Link^.MergedPos+GetLinkLength(i)-20,20)),' ]']);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ ECCodeParserException }
|
{ ECCodeParserException }
|
||||||
|
|
||||||
constructor ECCodeParserException.Create(ASender: TCCodeParserTool;
|
constructor ECCodeParserException.Create(ASender: TCCodeParserTool;
|
||||||
|
@ -89,6 +89,7 @@ begin
|
|||||||
if MergeFiles then begin
|
if MergeFiles then begin
|
||||||
Merger:=TCHeaderFileMerger.Create;
|
Merger:=TCHeaderFileMerger.Create;
|
||||||
Merger.Merge(Filenames,CodeToolBoss.SourceCache);
|
Merger.Merge(Filenames,CodeToolBoss.SourceCache);
|
||||||
|
//Merger.WriteDebugReport;
|
||||||
Src:=Merger.CombinedSource.Source;
|
Src:=Merger.CombinedSource.Source;
|
||||||
{writeln;
|
{writeln;
|
||||||
writeln('======Combined c header files================');
|
writeln('======Combined c header files================');
|
||||||
@ -146,7 +147,7 @@ begin
|
|||||||
CCodeTool:=ECCodeParserException(E).Sender;
|
CCodeTool:=ECCodeParserException(E).Sender;
|
||||||
CCodeTool.CleanPosToCaret(CCodeTool.LastErrorReportPos,Caret);
|
CCodeTool.CleanPosToCaret(CCodeTool.LastErrorReportPos,Caret);
|
||||||
if Merger<>nil then begin
|
if Merger<>nil then begin
|
||||||
Merger.MergedPosToOriginal(Caret.Y,Caret.X,Caret.Code,Caret.X,Caret.Y);
|
Merger.MergedPosToOriginal(Caret.X,Caret.Y,Caret.Code,Caret.X,Caret.Y);
|
||||||
end;
|
end;
|
||||||
writeln(Caret.Code.Filename+'('+IntToStr(Caret.Y)+','+IntToStr(Caret.X)+')'+' Error: '+E.Message);
|
writeln(Caret.Code.Filename+'('+IntToStr(Caret.Y)+','+IntToStr(Caret.X)+')'+' Error: '+E.Message);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user