compilers: started dcc parser

This commit is contained in:
mattias 2023-05-07 17:28:00 +02:00
parent 0c7e76c0a0
commit f6f00f6001
3 changed files with 219 additions and 0 deletions

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<Package Version="5">
<Name Value="LazDelphi"/>
<Type Value="RunAndDesignTime"/>
<CompilerOptions>
<Version Value="11"/>
<SearchPaths>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
</CompilerOptions>
<Files>
<Item>
<Filename Value="lazdelphireg.pas"/>
<HasRegisterProc Value="True"/>
<UnitName Value="lazdelphireg"/>
</Item>
</Files>
<RequiredPkgs>
<Item>
<PackageName Value="IDEIntf"/>
</Item>
<Item>
<PackageName Value="BuildIntf"/>
</Item>
<Item>
<PackageName Value="FCL"/>
</Item>
</RequiredPkgs>
<UsageOptions>
<UnitPath Value="$(PkgOutDir)"/>
</UsageOptions>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
</Package>
</CONFIG>

View File

@ -0,0 +1,22 @@
{ This file was automatically created by Lazarus. Do not edit!
This source is only used to compile and install the package.
}
unit LazDelphi;
{$warn 5023 off : no warning about unused units}
interface
uses
LazDelphiReg, LazarusPackageIntf;
implementation
procedure Register;
begin
RegisterUnit('LazDelphiReg', @LazDelphiReg.Register);
end;
initialization
RegisterPackage('LazDelphi', @Register);
end.

View File

@ -0,0 +1,159 @@
unit LazDelphiReg;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, IDEExternToolIntf, RegExpr;
const
SubToolDelphi = 'Delphi';
type
{ TDelphiCompilerParser }
TDelphiCompilerParser = class(TExtToolParser)
private
protected
FRegExprFilenameLineIDMsg: TRegExpr;
FRegExprFilenameLineUrgencyIDMsg: TRegExpr;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReadLine(Line: string; OutputIndex: integer; IsStdErr: boolean;
var Handled: boolean); override;
class function DefaultSubTool: string; override;
end;
TDelphiCompilerParserClass = class of TDelphiCompilerParser;
var
IDEDelphiCompilerParser: TDelphiCompilerParserClass = nil;
procedure Register;
implementation
procedure Register;
begin
end;
{ TDelphiCompilerParser }
constructor TDelphiCompilerParser.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FRegExprFilenameLineIDMsg:=TRegExpr.Create;
FRegExprFilenameLineIDMsg.ModifierStr:='I';
// filename(linenumber): E2003 Undeclared identifier: 'foo'
FRegExprFilenameLineIDMsg.Expression:='^(.*)\([0-9]+)\): ([HNWEF])([0-9]+) (.*)$';
// filename(linenumber): Fatal: F2613 Unit 'Unit3' not found.
FRegExprFilenameLineUrgencyIDMsg.Expression:='^(.*)\([0-9]+)\) ([a-zA-Z]+): ([HNWEF])([0-9]+) (.*)$';
end;
destructor TDelphiCompilerParser.Destroy;
begin
FreeAndNil(FRegExprFilenameLineIDMsg);
FreeAndNil(FRegExprFilenameLineUrgencyIDMsg);
inherited Destroy;
end;
procedure TDelphiCompilerParser.ReadLine(Line: string; OutputIndex: integer;
IsStdErr: boolean; var Handled: boolean);
procedure Add(const aFilename, LineNoStr, UrgencyLetter, IDStr, MsgStr: String);
var
MsgLine: TMessageLine;
begin
MsgLine:=CreateMsgLine(OutputIndex);
case UrgencyLetter of
'H': MsgLine.Urgency:=mluHint;
'N': MsgLine.Urgency:=mluNote;
'W': MsgLine.Urgency:=mluWarning;
'E': MsgLine.Urgency:=mluError;
'F': MsgLine.Urgency:=mluFatal;
else MsgLine.Urgency:=mluImportant;
end;
MsgLine.Filename:=aFilename;
MsgLine.Line:=StrToIntDef(LineNoStr,0);
MsgLine.MsgID:=StrToIntDef(IDStr,0);
MsgLine.Msg:=MsgStr;
if IsStdErr then
MsgLine.Flags:=MsgLine.Flags+[mlfStdErr];
AddMsgLine(MsgLine);
end;
procedure AddFilenameLineIDMsg;
var
RE: TRegExpr;
aFilename, LineNoStr, UrgencyLetter, IDStr, MsgStr: String;
begin
RE:=FRegExprFilenameLineIDMsg;
aFilename:=RE.Match[1];
LineNoStr:=RE.Match[2];
UrgencyLetter:=RE.Match[3];
IDStr:=RE.Match[4];
MsgStr:=RE.Match[5];
Add(aFilename,LineNoStr,UrgencyLetter,IDStr,MsgStr);
end;
procedure AddFilenameLineUrgencyIDMsg;
var
RE: TRegExpr;
aFilename, LineNoStr, UrgencyLetter, IDStr, MsgStr: String;
begin
RE:=FRegExprFilenameLineUrgencyIDMsg;
aFilename:=RE.Match[1];
LineNoStr:=RE.Match[2];
//UrgencyStr:=RE.Match[3];
UrgencyLetter:=RE.Match[4];
IDStr:=RE.Match[5];
MsgStr:=RE.Match[6];
Add(aFilename,LineNoStr,UrgencyLetter,IDStr,MsgStr);
end;
procedure AddOtherLine;
var
MsgLine: TMessageLine;
begin
MsgLine:=CreateMsgLine(OutputIndex);
MsgLine.MsgID:=0;
MsgLine.SubTool:=SubToolDelphi;
if MsgLine.Msg<>'' then
MsgLine.Urgency:=mluImportant
else
MsgLine.Urgency:=mluVerbose2;
if IsStdErr then
MsgLine.Flags:=MsgLine.Flags+[mlfStdErr];
AddMsgLine(MsgLine);
end;
begin
FRegExprFilenameLineIDMsg.InputString:=Line;
if FRegExprFilenameLineIDMsg.ExecPos(1) then
begin
AddFilenameLineIDMsg;
exit;
end;
FRegExprFilenameLineUrgencyIDMsg.InputString:=Line;
if FRegExprFilenameLineUrgencyIDMsg.ExecPos(1) then
begin
AddFilenameLineUrgencyIDMsg;
exit;
end;
AddOtherLine;
Handled:=true;
end;
class function TDelphiCompilerParser.DefaultSubTool: string;
begin
Result:='dcc';
end;
end.