codetools: c merge: fixed merged pos to original pos

git-svn-id: trunk@29555 -
This commit is contained in:
mattias 2011-02-14 23:37:29 +00:00
parent 3d9c23d3de
commit 759c3a2aa8
2 changed files with 54 additions and 4 deletions

View File

@ -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;

View File

@ -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;