mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-27 04:33:13 +01:00
codetools: FindFileAtCursor: test literal
git-svn-id: trunk@53299 -
This commit is contained in:
parent
42da67c6c4
commit
37069d7601
@ -30,7 +30,6 @@ unit BasicCodeTools;
|
|||||||
{$ifdef FPC}
|
{$ifdef FPC}
|
||||||
{$mode objfpc}
|
{$mode objfpc}
|
||||||
{$else}
|
{$else}
|
||||||
// delphi? if so then Windows is not defined but instead MSWindows is defined => define Windows in this case
|
|
||||||
{$ifdef MSWindows}
|
{$ifdef MSWindows}
|
||||||
{$define Windows}
|
{$define Windows}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|||||||
@ -79,7 +79,7 @@ uses
|
|||||||
Classes, SysUtils, CodeToolsStrConsts, CodeTree, CodeAtom, CustomCodeTool,
|
Classes, SysUtils, CodeToolsStrConsts, CodeTree, CodeAtom, CustomCodeTool,
|
||||||
SourceLog, KeywordFuncLists, BasicCodeTools, LinkScanner, CodeCache,
|
SourceLog, KeywordFuncLists, BasicCodeTools, LinkScanner, CodeCache,
|
||||||
DirectoryCacher, AVL_Tree, PascalParserTool,
|
DirectoryCacher, AVL_Tree, PascalParserTool,
|
||||||
PascalReaderTool, FileProcs, LazFileUtils, LazUtilities,
|
PascalReaderTool, FileProcs, LazFileUtils, LazUtilities, LazUTF8,
|
||||||
DefineTemplates, FindDeclarationCache;
|
DefineTemplates, FindDeclarationCache;
|
||||||
|
|
||||||
type
|
type
|
||||||
@ -3561,10 +3561,11 @@ var
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
CommentStart, CommentEnd: integer;
|
CommentStart, CommentEnd, Col, StartCol: integer;
|
||||||
Node: TCodeTreeNode;
|
Node: TCodeTreeNode;
|
||||||
aUnitName, UnitInFilename, Line: string;
|
aUnitName, UnitInFilename, Line, Literal: string;
|
||||||
NewCode: TCodeBuffer;
|
NewCode: TCodeBuffer;
|
||||||
|
p, StartP: PChar;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result:=false;
|
||||||
Found:=ffatNone;
|
Found:=ffatNone;
|
||||||
@ -3654,10 +3655,47 @@ begin
|
|||||||
|
|
||||||
// fallback: ignore parsed code and read the line at cursor directly
|
// fallback: ignore parsed code and read the line at cursor directly
|
||||||
if (CursorPos.Y<1) or (CursorPos.Y>CursorPos.Code.LineCount) then exit;
|
if (CursorPos.Y<1) or (CursorPos.Y>CursorPos.Code.LineCount) then exit;
|
||||||
Line:=CursorPos.Code.GetLine(CursorPos.Y,false);
|
Line:=CursorPos.Code.GetLine(CursorPos.Y-1,false);
|
||||||
|
{$IFDEF VerboseFindFileAtCursor}
|
||||||
|
debugln(['TFindDeclarationTool.FindFileAtCursor Line="',copy(Line,1,CursorPos.X-1),'|',copy(Line,CursorPos.X,200),'"']);
|
||||||
|
{$ENDIF}
|
||||||
if CursorPos.X>length(Line) then exit;
|
if CursorPos.X>length(Line) then exit;
|
||||||
if ffatLiteral in SearchFor then begin
|
if ffatLiteral in SearchFor then begin
|
||||||
// ToDo: check literal
|
// check literal
|
||||||
|
p:=PChar(Line);
|
||||||
|
Col:=1;
|
||||||
|
repeat
|
||||||
|
if p^=#0 then begin
|
||||||
|
break;
|
||||||
|
end else if p^='''' then begin
|
||||||
|
StartCol:=Col;
|
||||||
|
inc(Col);
|
||||||
|
inc(p);
|
||||||
|
StartP:=p;
|
||||||
|
repeat
|
||||||
|
case p^ of
|
||||||
|
#0: break;
|
||||||
|
'''': break;
|
||||||
|
#9: Col:=(Col+8) and not 7;
|
||||||
|
else inc(p,UTF8CharacterLength(p));
|
||||||
|
end;
|
||||||
|
until false;
|
||||||
|
if (CursorPos.X>=StartCol) and (CursorPos.X<=Col) then begin
|
||||||
|
Literal:=copy(Line,Col,p-StartP);
|
||||||
|
if not FilenameIsAbsolute(Literal) then
|
||||||
|
Literal:=TrimFilename(ExtractFilePath(Scanner.MainFilename)+Literal);
|
||||||
|
if FilenameIsAbsolute(Literal)
|
||||||
|
and DirectoryCache.Pool.FileExists(Literal) then begin
|
||||||
|
Found:=ffatLiteral;
|
||||||
|
FoundFilename:=Literal;
|
||||||
|
exit(true);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if p^=#0 then break;
|
||||||
|
end;
|
||||||
|
inc(p);
|
||||||
|
inc(Col);
|
||||||
|
until false;
|
||||||
end;
|
end;
|
||||||
if ffatComment in SearchFor then begin
|
if ffatComment in SearchFor then begin
|
||||||
// ToDo: check simple
|
// ToDo: check simple
|
||||||
|
|||||||
@ -327,17 +327,17 @@ begin
|
|||||||
// --- used unit ---
|
// --- used unit ---
|
||||||
// test cursor on 'unit2'
|
// test cursor on 'unit2'
|
||||||
if not CodeToolBoss.FindFileAtCursor(Code,6,1,Found,FoundFilename) then
|
if not CodeToolBoss.FindFileAtCursor(Code,6,1,Found,FoundFilename) then
|
||||||
Fail('CodeToolBoss.FindFileAtCursor at uses unit2 failed');
|
Fail('CodeToolBoss.FindFileAtCursor at uses unit2');
|
||||||
AssertEquals('FindFileAtCursor at uses unit2 Found',ord(ffatUsedUnit),ord(Found));
|
AssertEquals('FindFileAtCursor at uses unit2 Found',ord(ffatUsedUnit),ord(Found));
|
||||||
AssertEquals('FindFileAtCursor at uses unit2 FoundFilename','unit2.pas',FoundFilename);
|
AssertEquals('FindFileAtCursor at uses unit2 FoundFilename','unit2.pas',FoundFilename);
|
||||||
// test cursor on 'in'
|
// test cursor on 'in'
|
||||||
if not CodeToolBoss.FindFileAtCursor(Code,12,1,Found,FoundFilename) then
|
if not CodeToolBoss.FindFileAtCursor(Code,12,1,Found,FoundFilename) then
|
||||||
Fail('CodeToolBoss.FindFileAtCursor at uses unit2-in failed');
|
Fail('CodeToolBoss.FindFileAtCursor at uses unit2-in');
|
||||||
AssertEquals('FindFileAtCursor at uses unit2-in Found',ord(ffatUsedUnit),ord(Found));
|
AssertEquals('FindFileAtCursor at uses unit2-in Found',ord(ffatUsedUnit),ord(Found));
|
||||||
AssertEquals('FindFileAtCursor at uses unit2-in FoundFilename','unit2.pas',FoundFilename);
|
AssertEquals('FindFileAtCursor at uses unit2-in FoundFilename','unit2.pas',FoundFilename);
|
||||||
// test cursor on in-file literal
|
// test cursor on in-file literal
|
||||||
if not CodeToolBoss.FindFileAtCursor(Code,16,1,Found,FoundFilename) then
|
if not CodeToolBoss.FindFileAtCursor(Code,16,1,Found,FoundFilename) then
|
||||||
Fail('CodeToolBoss.FindFileAtCursor at uses unit2-in-literal failed');
|
Fail('CodeToolBoss.FindFileAtCursor at uses unit2-in-literal');
|
||||||
AssertEquals('FindFileAtCursor at uses unit2-in-lit Found',ord(ffatUsedUnit),ord(Found));
|
AssertEquals('FindFileAtCursor at uses unit2-in-lit Found',ord(ffatUsedUnit),ord(Found));
|
||||||
AssertEquals('FindFileAtCursor at uses unit2-in-lit FoundFilename','unit2.pas',FoundFilename);
|
AssertEquals('FindFileAtCursor at uses unit2-in-lit FoundFilename','unit2.pas',FoundFilename);
|
||||||
|
|
||||||
@ -347,13 +347,13 @@ begin
|
|||||||
+'{$i unit2.pas}'+LineEnding;
|
+'{$i unit2.pas}'+LineEnding;
|
||||||
SubUnit2Code.Source:='';
|
SubUnit2Code.Source:='';
|
||||||
if not CodeToolBoss.FindFileAtCursor(Code,1,2,Found,FoundFilename) then
|
if not CodeToolBoss.FindFileAtCursor(Code,1,2,Found,FoundFilename) then
|
||||||
Fail('CodeToolBoss.FindFileAtCursor at enabled include directive of empty inc failed');
|
Fail('CodeToolBoss.FindFileAtCursor at enabled include directive of empty inc');
|
||||||
AssertEquals('FindFileAtCursor at enabled include directive of empty Found',ord(ffatIncludeFile),ord(Found));
|
AssertEquals('FindFileAtCursor at enabled include directive of empty Found',ord(ffatIncludeFile),ord(Found));
|
||||||
AssertEquals('FindFileAtCursor at enabled include directive of empty FoundFilename','unit2.pas',FoundFilename);
|
AssertEquals('FindFileAtCursor at enabled include directive of empty FoundFilename','unit2.pas',FoundFilename);
|
||||||
|
|
||||||
SubUnit2Code.Source:='{$define a}';
|
SubUnit2Code.Source:='{$define a}';
|
||||||
if not CodeToolBoss.FindFileAtCursor(Code,1,2,Found,FoundFilename) then
|
if not CodeToolBoss.FindFileAtCursor(Code,1,2,Found,FoundFilename) then
|
||||||
Fail('CodeToolBoss.FindFileAtCursor at enabled include directive of non-empty inc failed');
|
Fail('CodeToolBoss.FindFileAtCursor at enabled include directive of non-empty inc');
|
||||||
AssertEquals('FindFileAtCursor at enabled include directive of non-empty Found',ord(ffatIncludeFile),ord(Found));
|
AssertEquals('FindFileAtCursor at enabled include directive of non-empty Found',ord(ffatIncludeFile),ord(Found));
|
||||||
AssertEquals('FindFileAtCursor at enabled include directive of non-empty FoundFilename','unit2.pas',FoundFilename);
|
AssertEquals('FindFileAtCursor at enabled include directive of non-empty FoundFilename','unit2.pas',FoundFilename);
|
||||||
|
|
||||||
@ -365,7 +365,7 @@ begin
|
|||||||
+'{$endif}'+LineEnding;
|
+'{$endif}'+LineEnding;
|
||||||
SubUnit2Code.Source:='';
|
SubUnit2Code.Source:='';
|
||||||
if not CodeToolBoss.FindFileAtCursor(Code,1,3,Found,FoundFilename) then
|
if not CodeToolBoss.FindFileAtCursor(Code,1,3,Found,FoundFilename) then
|
||||||
Fail('CodeToolBoss.FindFileAtCursor at disabled include directive failed');
|
Fail('CodeToolBoss.FindFileAtCursor at disabled include directive');
|
||||||
AssertEquals('FindFileAtCursor at disabled include directive Found',ord(ffatDisabledIncludeFile),ord(Found));
|
AssertEquals('FindFileAtCursor at disabled include directive Found',ord(ffatDisabledIncludeFile),ord(Found));
|
||||||
AssertEquals('FindFileAtCursor at disabled include directive FoundFilename','unit2.pas',FoundFilename);
|
AssertEquals('FindFileAtCursor at disabled include directive FoundFilename','unit2.pas',FoundFilename);
|
||||||
|
|
||||||
@ -373,17 +373,36 @@ begin
|
|||||||
Code.Source:='program test1;'+LineEnding
|
Code.Source:='program test1;'+LineEnding
|
||||||
+'{$R test1.lfm}'+LineEnding;
|
+'{$R test1.lfm}'+LineEnding;
|
||||||
if not CodeToolBoss.FindFileAtCursor(Code,1,2,Found,FoundFilename) then
|
if not CodeToolBoss.FindFileAtCursor(Code,1,2,Found,FoundFilename) then
|
||||||
Fail('CodeToolBoss.FindFileAtCursor at enabled resource directive failed');
|
Fail('CodeToolBoss.FindFileAtCursor at enabled resource directive');
|
||||||
AssertEquals('FindFileAtCursor at enabled resource directive Found',ord(ffatResource),ord(Found));
|
AssertEquals('FindFileAtCursor at enabled resource directive Found',ord(ffatResource),ord(Found));
|
||||||
AssertEquals('FindFileAtCursor at enabled resource directive FoundFilename','test1.lfm',FoundFilename);
|
AssertEquals('FindFileAtCursor at enabled resource directive FoundFilename','test1.lfm',FoundFilename);
|
||||||
|
|
||||||
Code.Source:='program test1;'+LineEnding
|
Code.Source:='program test1;'+LineEnding
|
||||||
+'{$R *.lfm}'+LineEnding;
|
+'{$R *.lfm}'+LineEnding;
|
||||||
if not CodeToolBoss.FindFileAtCursor(Code,1,2,Found,FoundFilename) then
|
if not CodeToolBoss.FindFileAtCursor(Code,1,2,Found,FoundFilename) then
|
||||||
Fail('CodeToolBoss.FindFileAtCursor at enabled resource directive failed');
|
Fail('CodeToolBoss.FindFileAtCursor at enabled resource directive');
|
||||||
AssertEquals('FindFileAtCursor at enabled resource directive Found',ord(ffatResource),ord(Found));
|
AssertEquals('FindFileAtCursor at enabled resource directive Found',ord(ffatResource),ord(Found));
|
||||||
AssertEquals('FindFileAtCursor at enabled resource directive FoundFilename','test1.lfm',FoundFilename);
|
AssertEquals('FindFileAtCursor at enabled resource directive FoundFilename','test1.lfm',FoundFilename);
|
||||||
|
|
||||||
|
// --- disabled resource directive ---
|
||||||
|
Code.Source:='program test1;'+LineEnding
|
||||||
|
+'{$ifdef disabled}'+LineEnding
|
||||||
|
+'{$R test1.lfm}'+LineEnding
|
||||||
|
+'{$endif}'+LineEnding;
|
||||||
|
if not CodeToolBoss.FindFileAtCursor(Code,1,3,Found,FoundFilename) then
|
||||||
|
Fail('CodeToolBoss.FindFileAtCursor at disabled resource directive');
|
||||||
|
AssertEquals('FindFileAtCursor at disabled resource directive Found',ord(ffatDisabledResource),ord(Found));
|
||||||
|
AssertEquals('FindFileAtCursor at disabled resource directive FoundFilename','test1.lfm',FoundFilename);
|
||||||
|
|
||||||
|
// --- literal ---
|
||||||
|
Code.Source:='program test1;'+LineEnding
|
||||||
|
+'const Cfg=''unit2.pas'';'+LineEnding;
|
||||||
|
if not CodeToolBoss.FindFileAtCursor(Code,11,2,Found,FoundFilename) then
|
||||||
|
Fail('CodeToolBoss.FindFileAtCursor in literal');
|
||||||
|
AssertEquals('FindFileAtCursor in literal Found',ord(ffatLiteral),ord(Found));
|
||||||
|
AssertEquals('FindFileAtCursor in literal FoundFilename','unit2.pas',FoundFilename);
|
||||||
|
|
||||||
|
|
||||||
finally
|
finally
|
||||||
Code.IsDeleted:=true;
|
Code.IsDeleted:=true;
|
||||||
SubUnit2Code.IsDeleted:=true;
|
SubUnit2Code.IsDeleted:=true;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user