lazc: started simple identifier completion

git-svn-id: trunk@23502 -
This commit is contained in:
mattias 2010-01-20 13:32:26 +00:00
parent 742caab46a
commit 9522bc6510
2 changed files with 165 additions and 7 deletions

View File

@ -1,8 +1,8 @@
{ This file was automatically created by Lazarus. Do not edit! { This file was automatically created by Lazarus. do not edit!
This source is only used to compile and install the package. This source is only used to compile and install the package.
} }
unit LazC; unit lazc;
interface interface

View File

@ -34,8 +34,7 @@ unit LazCUtil;
interface interface
uses uses
Classes, SysUtils, LCLProc, IDEMsgIntf, LazCStrConsts; Classes, SysUtils, LCLProc, IDEMsgIntf, LazCStrConsts, SrcEditorIntf, LCLType;
type type
@ -55,6 +54,39 @@ type
function StartScan(Lines: TIDEMessageLineList): TIDEMsgScanner; override; function StartScan(Lines: TIDEMessageLineList): TIDEMsgScanner; override;
end; end;
{ TCSrcEditCompletion }
TCSrcEditCompletion = class(TSourceEditorCompletionPlugin)
private
FEditor: TSourceEditorInterface;
FFilteredList: TStrings;
FLastPrefix: string;
FList: TStrings;
procedure SetLastPrefix(const AValue: string);
procedure RebuildFilteredList;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Cancel; override;
function Collect(List: TStrings): boolean; override;
procedure Complete(var Value: string; SourceValue: string; var SourceStart,
SourceEnd: TPoint; KeyChar: TUTF8Char; Shift: TShiftState); override;
procedure CompletePrefix(var Prefix: string); override;
procedure IndexChanged(Position: integer); override;
procedure Init(SrcEdit: TSourceEditorInterface; JumpToError: boolean;
var Handled, Abort: boolean; var Prefix: string; var BoxX, BoxY: integer
); override;
procedure PrefixChanged(const NewPrefix: string; var NewIndex: integer;
var s: TStrings); override;
property Editor: TSourceEditorInterface read FEditor;
property List: TStrings read FList;
property FilteredList: TStrings read FFilteredList;
property LastPrefix: string read FLastPrefix write SetLastPrefix;
end;
var
CSrcEditCompletion: TCSrcEditCompletion = nil;
procedure Register; procedure Register;
implementation implementation
@ -66,6 +98,8 @@ begin
Scanner:=TGCCMsgScannerType.Create(nil); Scanner:=TGCCMsgScannerType.Create(nil);
Scanner.Name:='GCC'; Scanner.Name:='GCC';
IDEMsgScanners.RegisterType(Scanner); IDEMsgScanners.RegisterType(Scanner);
CSrcEditCompletion:=TCSrcEditCompletion.Create(nil);
SourceEditorWindow.RegisterCompletionPlugin(CSrcEditCompletion);
end; end;
{ TGCCMessageScanner } { TGCCMessageScanner }
@ -95,5 +129,129 @@ begin
Result:=TGCCMessageScanner.Create(Self,Lines); Result:=TGCCMessageScanner.Create(Self,Lines);
end; end;
{ TCSrcEditCompletion }
procedure TCSrcEditCompletion.SetLastPrefix(const AValue: string);
begin
if FLastPrefix=AValue then exit;
FLastPrefix:=AValue;
RebuildFilteredList;
end;
procedure TCSrcEditCompletion.RebuildFilteredList;
var
i: Integer;
s: string;
len: Integer;
p: PChar;
begin
FFilteredList.Clear;
len:=length(LastPrefix);
p:=PChar(LastPrefix);
for i:=0 to FList.Count-1 do begin
s:=FList[i];
if length(s)<len then continue;
if (len=0) or CompareMem(PChar(s),p,len) then
FFilteredList.Add(s);
end;
end;
constructor TCSrcEditCompletion.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FList:=TStringList.Create;
FFilteredList:=TStringList.Create;
end;
destructor TCSrcEditCompletion.Destroy;
begin
FreeAndNil(FFilteredList);
FreeAndNil(FList);
inherited Destroy;
end;
procedure TCSrcEditCompletion.Cancel;
begin
//DebugLn(['TCSrcEditCompletion.Cancel ']);
FEditor:=nil;
FList.Clear;
FFilteredList.Clear;
end;
function TCSrcEditCompletion.Collect(List: TStrings): boolean;
begin
//DebugLn(['TCSrcEditCompletion.Collect ',FFilteredList.Count]);
List.Assign(FFilteredList);
Result:=true;
end;
procedure TCSrcEditCompletion.Complete(var Value: string; SourceValue: string;
var SourceStart, SourceEnd: TPoint; KeyChar: TUTF8Char; Shift: TShiftState);
begin
// remove formatting tags
//DebugLn(['TCSrcEditCompletion.Complete Value=',dbgstr(Value),' SourceValue=',dbgstr(SourceValue)]);
end;
procedure TCSrcEditCompletion.CompletePrefix(var Prefix: string);
begin
//DebugLn(['TCSrcEditCompletion.CompletePrefix Prefx=',Prefix]);
LastPrefix:=Prefix;
end;
procedure TCSrcEditCompletion.IndexChanged(Position: integer);
begin
//DebugLn(['TCSrcEditCompletion.IndexChanged ',Position]);
end;
procedure TCSrcEditCompletion.Init(SrcEdit: TSourceEditorInterface;
JumpToError: boolean; var Handled, Abort: boolean; var Prefix: string;
var BoxX, BoxY: integer);
var
Ext: String;
begin
Ext:=ExtractFileExt(SrcEdit.FileName);
if not ((Ext='.c') or (Ext='.C') or (Ext='.cc') or (Ext='.CC')
or (Ext='.cpp') or (Ext='.CPP'))
then begin
// not responsible
exit;
end;
//DebugLn(['TCSrcEditCompletion.Init ',SrcEdit.FileName,' Prefix=',Prefix]);
// provide completion for c source files
Handled:=true;
FList.Clear;
FList.Add('int');
FList.Add('int8');
FList.Add('int16');
FList.Add('int32');
FList.Add('char');
FList.Add('long');
FList.Add('bool');
FList.Add('void');
FList.Add('float');
FList.Add('double');
FList.Add('signed');
FList.Add('struct');
FList.Add('typedef');
FList.Add('unsigned');
FList.Add('public');
FList.Add('private');
FList.Add('define');
FLastPrefix:=Prefix;
RebuildFilteredList;
end;
procedure TCSrcEditCompletion.PrefixChanged(const NewPrefix: string;
var NewIndex: integer; var s: TStrings);
begin
//DebugLn(['TCSrcEditCompletion.PrefixChanged NewPrefix=',NewPrefix]);
NewIndex:=0;
LastPrefix:=NewPrefix;
s.Assign(FFilteredList);
end;
finalization
FreeAndNil(CSrcEditCompletion);
end. end.