IDE: use pas2js msg parser

git-svn-id: trunk@57905 -
This commit is contained in:
mattias 2018-05-12 15:36:26 +00:00
parent b1d331665f
commit f65a30ed47
8 changed files with 84 additions and 41 deletions

View File

@ -31,7 +31,7 @@ const
SubToolFPCAssembler = 'FPCAssembler';
SubToolPas2js = 'Pas2JS';
SubToolPas2jsPriority = 101;
SubToolPas2jsPriority = 99;
SubToolMake = 'make';
SubToolMakePriority = 1000; // higher than FPC

View File

@ -525,6 +525,7 @@ begin
ExternalTools:=TExternalTools.Create(Self);
EnvOptsChanged;
RegisterFPCParser;
RegisterPas2jsParser;
RegisterMakeParser;
ExternalToolList.RegisterParser(TDefaultParser);

View File

@ -334,7 +334,10 @@ begin
CompileTool:=ExternalToolList.Add(dlgCCOTestToolCompilingEmptyFile);
CompileTool.Reference(Self,ClassName);
try
CompileTool.AddParsers(SubToolFPC);
if GuessCompilerType(CompilerFilename)=pcPas2js then
CompileTool.AddParsers(SubToolPas2js)
else
CompileTool.AddParsers(SubToolFPC);
CompileTool.AddParsers(SubToolMake);
CompileTool.Process.CurrentDirectory:=TestDir;
CompileTool.Process.Executable:=CompilerFilename;

View File

@ -41,7 +41,7 @@ uses
Classes, SysUtils, LCLProc, Forms, Controls, contnrs, strutils,
IDEExternToolIntf, IDEMsgIntf, LazIDEIntf, MacroIntf, LazUTF8,
IDECmdLine, LazarusIDEStrConsts, CompilerOptions, Project,
DefineTemplates, TransferMacros, EnvironmentOpts, LazFileUtils;
DefineTemplates, LinkScanner, TransferMacros, EnvironmentOpts, LazFileUtils;
type
TOnCmdLineCreate = procedure(var CmdLine: string; var Abort:boolean) of object;
@ -274,7 +274,7 @@ var
Title: String;
TargetOS: String;
TargetCPU: String;
TargetFilename: String;
TargetFilename, SubTool: String;
begin
Result:=mrCancel;
if ConsoleVerbosity>=1 then
@ -336,7 +336,10 @@ begin
Tool.CmdLineParams:=CmdLine;
Tool.Process.CurrentDirectory:=WorkingDir;
Tool.CurrentDirectoryIsTestDir:=CurrentDirectoryIsTestDir;
FPCParser:=TFPCParser(Tool.AddParsers(SubToolFPC));
SubTool:=SubToolFPC;
if GuessCompilerType(CompilerFilename)=pcPas2js then
SubTool:=SubToolPas2js;
FPCParser:=TFPCParser(Tool.AddParsers(SubTool));
FPCParser.ShowLinesCompiled:=EnvironmentOptions.MsgViewShowFPCMsgLinesCompiled;
FPCParser.HideHintsSenderNotUsed:=not AProject.CompilerOptions.ShowHintsForSenderNotUsed;
FPCParser.HideHintsUnitNotUsedInMainSource:=not AProject.CompilerOptions.ShowHintsForUnusedUnitsInMainSrc;

View File

@ -118,7 +118,7 @@ type
procedure EnterCriticalsection;
procedure LeaveCriticalSection;
procedure GetMsgFileNames(CompilerFilename, TargetOS, TargetCPU: string;
out anEnglishFile, aTranslationFile: string); // (main thread)
out anEnglishFile, aTranslationFile: string); virtual; // (main thread)
property DefaultEnglishFile: string read FDefaultEnglishFile write SetDefaultEnglishFile;
property DefaulTranslationFile: string read FDefaultTranslationFile write SetDefaultTranslationFile;
property OnLoadFile: TETLoadFileEvent read FOnLoadFile write FOnLoadFile; // (main or workerthread)
@ -831,6 +831,7 @@ begin
Result:=nil;
GetMsgFileNames(EnvironmentOptions.GetParsedCompilerFilename,'','',
anEnglishFile,aTranslationFile);
writeln('TFPCMsgFilePool.LoadCurrentEnglishFile ',anEnglishFile);
if not FilenameIsAbsolute(anEnglishFile) then exit;
Result:=LoadFile(anEnglishFile,UpdateFromDisk,AThread);
end;
@ -1255,7 +1256,7 @@ begin
end;
MsgLine:=CreateMsgLine;
MsgLine.Urgency:=mluProgress;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Filename:=AFilename;
MsgLine.Msg:=OldP;
inherited AddMsgLine(MsgLine);
@ -1273,7 +1274,7 @@ begin
if (not Result) and (not CompStr('Assembling ',p)) then exit;
MsgLine:=CreateMsgLine;
MsgLine.Urgency:=mluProgress;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Urgency:=mluProgress;
MsgLine.Msg:=OldP;
inherited AddMsgLine(MsgLine);
@ -1390,7 +1391,7 @@ begin
end;
MsgLine:=CreateMsgLine;
MsgLine.Urgency:=MsgType;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Msg:=p;
MsgLine.TranslatedMsg:=TranslatedMsg;
AddMsgLine(MsgLine);
@ -1411,7 +1412,7 @@ begin
if not ReadNumberWithThousandSep(p) then exit;
if not ReadChar(p,' ') then exit;
MsgLine:=CreateMsgLine;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Urgency:=mluProgress;
MsgLine.Msg:=OldP;
inherited AddMsgLine(MsgLine);
@ -1433,7 +1434,7 @@ begin
end;
Result:=true;
MsgLine:=CreateMsgLine;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
if ShowLinesCompiled then
MsgLine.Urgency:=mluImportant
else
@ -1469,7 +1470,7 @@ begin
end;
Result:=true;
MsgLine:=CreateMsgLine;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Urgency:=mluProgress;
MsgLine.Msg:=OldStart;
inherited AddMsgLine(MsgLine);
@ -1595,7 +1596,7 @@ begin
if MsgType=mluNone then
MsgType:=mluVerbose;
MsgLine:=CreateMsgLine;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Urgency:=MsgType;
if (fMsgID=FPCMsgIDLogo) and ReadFPCLogo(PatternItem,aFPCVersion) then begin
if aFPCVersion<>PC_FullVersion then begin
@ -1730,7 +1731,7 @@ begin
if MsgLine.MsgID=MsgID then exit(true);
Result:=false;
if MsgLine.MsgID<>0 then exit;
if MsgLine.SubTool<>SubToolFPC then exit;
if MsgLine.SubTool<>DefaultSubTool then exit;
if Item=nil then begin
Item:=MsgFile.GetMsg(MsgID);
if Item=nil then
@ -2480,7 +2481,7 @@ begin
//debugln(['TIDEFPCParser.FindSrcViaPPU i=',i,' PPUFilename="',PPUFilename,'" Filename="',aFilename,'"']);
if (i>0) then begin
PrevMsgLine:=Tool.WorkerMessages[i-1];
if (PrevMsgLine.SubTool=SubToolFPC)
if (PrevMsgLine.SubTool=DefaultSubTool)
and (CompareFilenames(PPUFilename,PrevMsgLine.Attribute['PPU'])=0)
and FilenameIsAbsolute(PrevMsgLine.Filename)
and (CompareFilenames(ExtractFilename(PrevMsgLine.Filename),ExtractFilename(aFilename))=0)
@ -2685,7 +2686,7 @@ begin
if ShowLinesCompiled then MsgUrgency:=mluImportant;
end;
MsgLine:=CreateMsgLine;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Urgency:=MsgUrgency;
MsgLine.Msg:=Msg;
MsgLine.TranslatedMsg:=TranslatedMsg;
@ -2821,10 +2822,10 @@ begin
MsgItem:=MsgFile.GetMsg(fMsgID);
Translate(p,MsgItem,TranslatedItem,TranslatedMsg,MsgType);
if (TranslatedItem=nil) and (MsgItem=nil) then begin
if ConsoleVerbosity>=0 then
if ConsoleVerbosity>=1 then
debugln(['TFPCParser.CheckForFileLineColMessage msgid not found: ',fMsgID]);
end else if MsgType=mluNone then begin
if ConsoleVerbosity>=0 then
if ConsoleVerbosity>=1 then
debugln(['TFPCParser.CheckForFileLineColMessage msgid has no type: ',fMsgID]);
end;
end;
@ -2836,7 +2837,7 @@ begin
Column:=0;
MsgLine:=CreateMsgLine;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Urgency:=MsgType;
aFilename:=GetString(FileStartPos,FileEndPos-FileStartPos);
if PPUFileStartPos<>nil then
@ -2868,7 +2869,7 @@ begin
if not ReadString(p,') unit ') then exit;
end;
MsgLine:=CreateMsgLine;
MsgLine.SubTool:=SubToolFPC;
MsgLine.SubTool:=DefaultSubTool;
MsgLine.Urgency:=mluProgress;
MsgLine.Msg:=OldP;
AddMsgLine(MsgLine);
@ -3088,7 +3089,7 @@ begin
Y:=MsgLine.Line;
X:=MsgLine.Column;
if (Y>0) and (X>0)
and (MsgLine.SubTool=SubToolFPC) and (MsgLine.Filename<>'')
and (MsgLine.SubTool=DefaultSubTool) and (MsgLine.Filename<>'')
then begin
if mlfTestBuildFile in MsgLine.Flags then
aFilename:=MsgLine.Attribute[MsgAttrDiskFilename]
@ -3106,7 +3107,7 @@ begin
// short file name => 1. search the full file name in previous message
if i>0 then begin
PrevMsgLine:=Tool.WorkerMessages[i-1];
if (PrevMsgLine.SubTool=SubToolFPC)
if (PrevMsgLine.SubTool=DefaultSubTool)
and FilenameIsAbsolute(PrevMsgLine.Filename)
and (CompareFilenames(ExtractFilename(PrevMsgLine.Filename),ExtractFilename(aFilename))=0)
then begin

View File

@ -359,8 +359,8 @@ type
function GetAboutView: TLMsgWndView;
function GetViews(Index: integer): TLMsgWndView;
procedure HideSearch;
procedure ImagesGetWidthForPPI(Sender: TCustomImageList; AImageWidth,
APPI: Integer; var AResultWidth: Integer);
procedure ImagesGetWidthForPPI(Sender: TCustomImageList; {%H-}AImageWidth,
{%H-}APPI: Integer; var AResultWidth: Integer);
procedure SaveClicked(OnlyShown: boolean);
procedure CopyAllClicked(OnlyShown: boolean);
procedure CopyMsgToClipboard(OnlyFilename: boolean);

View File

@ -40,10 +40,11 @@ type
TPas2jsMsgFilePool = class(TFPCMsgFilePool)
public
destructor Destroy; override;
function LoadCurrentEnglishFile(UpdateFromDisk: boolean; AThread: TThread
): TFPCMsgFilePoolItem; override;
procedure GetMsgFileNames({%H-}CompilerFilename, {%H-}TargetOS, {%H-}TargetCPU: string;
out anEnglishFile, aTranslationFile: string);
out anEnglishFile, aTranslationFile: string); override;
end;
{ TIDEPas2jsParser }
@ -59,10 +60,24 @@ type
var
Pas2jsMsgFilePool: TFPCMsgFilePool = nil;
procedure RegisterPas2jsParser;
implementation
procedure RegisterPas2jsParser;
begin
ExternalToolList.RegisterParser(TIDEPas2jsParser);
end;
{ TPas2jsMsgFilePool }
destructor TPas2jsMsgFilePool.Destroy;
begin
inherited Destroy;
if Pas2jsMsgFilePool=Self then
Pas2jsMsgFilePool:=nil;
end;
function TPas2jsMsgFilePool.LoadCurrentEnglishFile(UpdateFromDisk: boolean;
AThread: TThread): TFPCMsgFilePoolItem;
var
@ -100,7 +115,7 @@ end;
class function TIDEPas2jsParser.MsgFilePool: TFPCMsgFilePool;
begin
Result:=inherited MsgFilePool;
Result:=Pas2jsMsgFilePool;
end;
initialization

View File

@ -295,7 +295,7 @@ begin
MsgID:=0;
Tool:=nil;
if (Msg.Urgency>=mluError)
or (Msg.SubTool<>SubToolFPC)
or ((Msg.SubTool<>SubToolFPC) and (Msg.SubTool<>SubToolPas2js))
or (Msg.MsgID=0)
then exit;
MsgID:=Msg.MsgID;
@ -371,7 +371,8 @@ var
Code: TCodeBuffer;
begin
Result:=false;
if (Msg=nil) or (Msg.SubTool<>SubToolFPC) or (Msg.MsgID<1)
if (Msg=nil) or (Msg.MsgID<1)
or ((Msg.SubTool<>SubToolFPC) and (Msg.SubTool<>SubToolPas2js))
or (not Msg.HasSourcePosition) then exit;
// Check: Local variable "$1" does not seem to be initialized
@ -512,7 +513,7 @@ begin
ToolData:=nil;
IDETool:=nil;
if (Msg.Urgency>=mluError)
or (Msg.SubTool<>SubToolFPC)
or ((Msg.SubTool<>SubToolFPC) and (Msg.SubTool<>SubToolPas2js))
or (Msg.MsgID=0)
then exit;
ToolData:=Msg.GetToolData;
@ -578,7 +579,7 @@ begin
CurMsg:=Msg.Lines[i];
if (CurMsg.MsgID<>Msg.MsgID)
or (CurMsg.Urgency>=mluError)
or (CurMsg.SubTool<>SubToolFPC)
or ((CurMsg.SubTool<>SubToolFPC) and (CurMsg.SubTool<>SubToolPas2js))
then continue;
CurMsg.MarkFixed;
end;
@ -597,7 +598,10 @@ var
begin
Result:=false;
// Check: Local variable "$1" not used
if not TIDEFPCParser.MsgLineIsId(Msg,5025,Identifier,Dummy) then
if IDEFPCParser.MsgLineIsId(Msg,5025,Identifier,Dummy)
or IDEPas2jsParser.MsgLineIsId(Msg,5025,Identifier,Dummy) then
// ok
else
exit;
if not Msg.HasSourcePosition or not IsValidIdent(Identifier) then exit;
@ -676,10 +680,12 @@ var
begin
Result:=false;
if (not Msg.HasSourcePosition) then exit;
if IDEFPCParser.MsgLineIsId(Msg,4046,aClassname,Dummy) then begin
if IDEFPCParser.MsgLineIsId(Msg,4046,aClassname,Dummy)
or IDEPas2jsParser.MsgLineIsId(Msg,4046,aClassname,Dummy) then begin
// Constructing a class "$1" with abstract method "$2"
Result:=true;
end else if IDEFPCParser.MsgLineIsId(Msg,5042,MissingMethod,Dummy) then begin
end else if IDEFPCParser.MsgLineIsId(Msg,5042,MissingMethod,Dummy)
or IDEFPCParser.MsgLineIsId(Msg,5042,MissingMethod,Dummy) then begin
// No matching implementation for interface method "$1" found
// The position is on the 'class' keyword
// The MissingMethod is 'interfacename.procname'
@ -765,12 +771,23 @@ function TQuickFixUnitNotFound_Remove.IsApplicable(Msg: TMessageLine; out
begin
Result:=false;
if Msg=nil then exit;
if (Msg.SubTool<>SubToolFPC)
or (not Msg.HasSourcePosition)
or ((Msg.MsgID<>5023) // Unit "$1" not used in $2
and (Msg.MsgID<>FPCMsgIDCantFindUnitUsedBy) // Can't find unit $1 used by $2
and (Msg.MsgID<>10023)) // Unit $1 was not found but $2 exists
then exit;
if (Msg.SubTool=SubToolFPC) then begin
if Msg.HasSourcePosition
and ((Msg.MsgID=5023) // Unit "$1" not used in $2
or (Msg.MsgID=FPCMsgIDCantFindUnitUsedBy) // Can't find unit $1 used by $2
or (Msg.MsgID=10023)) // Unit $1 was not found but $2 exists
then
// ok
else exit;
end else if (Msg.SubTool=SubToolPas2js) then begin
if Msg.HasSourcePosition
and ((Msg.MsgID=5023) // Unit "$1" not used in $2
or (Msg.MsgID=3073)) // Can't find unit $1
then
// ok
else exit;
end else
exit;
MissingUnitName:=Msg.Attribute[FPCMsgAttrMissingUnit];
UsedByUnit:=Msg.Attribute[FPCMsgAttrUsedByUnit];
@ -849,7 +866,10 @@ begin
Result:=false;
Identifier:='';
// check: identifier not found "$1"
if not IDEFPCParser.MsgLineIsId(Msg,5000,Identifier,Dummy) then
if IDEFPCParser.MsgLineIsId(Msg,5000,Identifier,Dummy)
or IDEPas2jsParser.MsgLineIsId(Msg,3001,Identifier,Dummy) then
// ok
else
exit;
if not Msg.HasSourcePosition or not IsValidIdent(Identifier) then exit;
@ -997,7 +1017,7 @@ function TQuickFix_HideWithIDEDirective.IsApplicable(Msg: TMessageLine): boolean
begin
Result:=false;
if (Msg.Urgency>=mluError)
or (Msg.SubTool<>SubToolFPC)
or ((Msg.SubTool<>SubToolFPC) and (Msg.SubTool<>SubToolPas2js))
or (not Msg.HasSourcePosition)
or (mlfHiddenByIDEDirective in Msg.Flags)
then exit;