Skip to content

Commit

Permalink
Add 'procedure' and 'function' headers to the hints and also show tho…
Browse files Browse the repository at this point in the history
…se without parameters.
  • Loading branch information
martijnlaan committed Jan 19, 2025
1 parent 9f9b841 commit 2679b7f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 31 deletions.
28 changes: 18 additions & 10 deletions Projects/Src/IDE.MainForm.pas
Original file line number Diff line number Diff line change
Expand Up @@ -5394,9 +5394,10 @@ procedure TMainForm.UpdateCallTipFunctionDefinition(const Pos: Integer { = -1 })
FCallTipState.LastPosCallTip := Pos;

// Should get current api definition
var Word := FMemosStyler.GetScriptFunctionDefinition(FCallTipState.ClassOrRecordMember, FCallTipState.CurrentCallTipWord, FCallTipState.CurrentCallTip, FCallTipState.MaxCallTips);
if Word <> '' then begin
FCallTipState.FunctionDefinition := Word;
var FunctionDefinition := FMemosStyler.GetScriptFunctionDefinition(FCallTipState.ClassOrRecordMember, FCallTipState.CurrentCallTipWord, FCallTipState.CurrentCallTip, FCallTipState.MaxCallTips);
if ((FCallTipState.MaxCallTips = 1) and FunctionDefinition.HasParams) or //if there's a single definition then only show if it has a parameter
(FCallTipState.MaxCallTips > 1) then begin //if there's multiple then show always just like MemoHintShow, so even the one without parameters if it exists
FCallTipState.FunctionDefinition := FunctionDefinition.ScriptFuncWithoutHeader;
if FCallTipState.MaxCallTips > 1 then
FCallTipState.FunctionDefinition := AnsiString(Format(#1'%d of %d'#2'%s', [FCallTipState.CurrentCallTip+1, FCallTipState.MaxCallTips, FCallTipState.FunctionDefinition]));

Expand Down Expand Up @@ -5721,20 +5722,27 @@ procedure TMainForm.MemoHintShow(Sender: TObject; var Info: TScintHintInfo);
HintStr := 'Unknown error';
end;
end else begin
var Name := FActiveMemo.GetTextRange(VarOrFuncRange.StartPos, VarOrFuncRange.EndPos);
var ClassMember := False;
var Name := FActiveMemo.GetTextRange(VarOrFuncRange.StartPos, VarOrFuncRange.EndPos);
var Index := 0;
var Count: Integer;
var Definition := FMemosStyler.GetScriptFunctionDefinition(ClassMember, Name, Index, Count);
if Definition = '' then begin
var FunctionDefinition := FMemosStyler.GetScriptFunctionDefinition(ClassMember, Name, Index, Count);
if Count = 0 then begin
ClassMember := not ClassMember;
Definition := FMemosStyler.GetScriptFunctionDefinition(ClassMember, Name, Index, Count);
FunctionDefinition := FMemosStyler.GetScriptFunctionDefinition(ClassMember, Name, Index, Count);
end;
while Index < Count-1 do begin
while Index < Count do begin
if Index <> 0 then
FunctionDefinition := FMemosStyler.GetScriptFunctionDefinition(ClassMember, Name, Index);
if HintStr <> '' then
HintStr := HintStr + #13;
if FunctionDefinition.WasFunction then
HintStr := HintStr + 'function '
else
HintStr := HintStr + 'procedure ';
HintStr := HintStr + String(FunctionDefinition.ScriptFuncWithoutHeader);
Inc(Index);
Definition := Definition + #13 + FMemosStyler.GetScriptFunctionDefinition(ClassMember, Name, Index);
end;
HintStr := String(Definition);
end;

if HintStr <> '' then begin
Expand Down
51 changes: 30 additions & 21 deletions Projects/Src/IDE.ScintStylerInnoSetup.pas
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,12 @@ interface
stISPPReservedWord, stISPPString, stISPPNumber);

TWordsBySection = TObjectDictionary<TInnoSetupStylerSection, TStringList>;
TFunctionDefinitions = array of AnsiString;
TFunctionDefinition = record
ScriptFuncWithoutHeader: AnsiString;
WasFunction, HasParams: Boolean;
constructor Create(const ScriptFunc: AnsiString);
end;
TFunctionDefinitions = array of TFunctionDefinition;
TFunctionDefinitionsByName = TDictionary<String, TFunctionDefinitions>;

TInnoSetupStyler = class(TScintCustomStyler)
Expand Down Expand Up @@ -141,9 +146,9 @@ TInnoSetupStyler = class(TScintCustomStyler)
class function IsParamSection(const Section: TInnoSetupStylerSection): Boolean;
class function IsSymbolStyle(const Style: TScintStyleNumber): Boolean;
function GetScriptFunctionDefinition(const ClassMember: Boolean;
const Name: String; const Index: Integer; out Count: Integer): AnsiString; overload;
const Name: String; const Index: Integer; out Count: Integer): TFunctionDefinition; overload;
function GetScriptFunctionDefinition(const ClassMember: Boolean;
const Name: String; const Index: Integer): AnsiString; overload;
const Name: String; const Index: Integer): TFunctionDefinition; overload;
function SectionHasFlag(const Section: TInnoSetupStylerSection; const Flag: String): Boolean;
property ConstantsWordList: AnsiString read FConstantsWordList;
property EventFunctionsWordList[Procedures: Boolean]: AnsiString read GetEventFunctionsWordList;
Expand Down Expand Up @@ -567,6 +572,14 @@ function SameRawText(const S1, S2: TScintRawString): Boolean;
Result := True;
end;

{ TFunctionDefinition }

constructor TFunctionDefinition.Create(const ScriptFunc: AnsiString);
begin
ScriptFuncWithoutHeader := RemoveScriptFuncHeader(ScriptFunc, WasFunction);
HasParams := ScriptFuncHasParameters(ScriptFunc);
end;

{ TInnoSetupStyler }

constructor TInnoSetupStyler.Create(AOwner: TComponent);
Expand Down Expand Up @@ -796,20 +809,18 @@ procedure TInnoSetupStyler.BuildScriptFunctionsLists(
const SL: TStringList);
begin
for var ScriptFunc in ScriptFuncTable do begin
var ScriptFuncWithoutHeader := RemoveScriptFuncHeader(ScriptFunc);
var ScriptFuncName := ExtractScriptFuncWithoutHeaderName(ScriptFuncWithoutHeader);
var FunctionDefinition := TFunctionDefinition.Create(ScriptFunc);
var ScriptFuncName := ExtractScriptFuncWithoutHeaderName(FunctionDefinition.ScriptFuncWithoutHeader);
var DoAddWordToList := True;
if ScriptFuncHasParameters(ScriptFunc) then begin
var Key := String(ScriptFuncName);
if not FScriptFunctionsByName[ClassMembers].TryAdd(Key, [ScriptFuncWithoutHeader]) then begin
{ Function has multiple prototypes }
var ScriptFunctions := FScriptFunctionsByName[ClassMembers][Key];
var N := Length(ScriptFunctions);
SetLength(ScriptFunctions, N+1);
ScriptFunctions[N] := ScriptFuncWithoutHeader;
FScriptFunctionsByName[ClassMembers][Key] := ScriptFunctions;
DoAddWordToList := False; { Already added it when the first prototype was found }
end;
var Key := String(ScriptFuncName);
if not FScriptFunctionsByName[ClassMembers].TryAdd(Key, [FunctionDefinition]) then begin
{ Function has multiple prototypes }
var ScriptFunctions := FScriptFunctionsByName[ClassMembers][Key];
var N := Length(ScriptFunctions);
SetLength(ScriptFunctions, N+1);
ScriptFunctions[N] := FunctionDefinition;
FScriptFunctionsByName[ClassMembers][Key] := ScriptFunctions;
DoAddWordToList := False; { Already added it when the first prototype was found }
end;
if DoAddWordToList then
AddWordToList(SL, ScriptFuncName, awtScriptFunction);
Expand Down Expand Up @@ -925,7 +936,7 @@ function TInnoSetupStyler.GetKeywordsWordList(Section: TInnoSetupStylerSection):
end;

function TInnoSetupStyler.GetScriptFunctionDefinition(const ClassMember: Boolean;
const Name: String; const Index: Integer; out Count: Integer): AnsiString;
const Name: String; const Index: Integer; out Count: Integer): TFunctionDefinition;
begin
var ScriptFunctions: TFunctionDefinitions;
if FScriptFunctionsByName[ClassMember].TryGetValue(Name, ScriptFunctions) then begin
Expand All @@ -934,15 +945,13 @@ function TInnoSetupStyler.GetScriptFunctionDefinition(const ClassMember: Boolean
if ResultIndex >= Count then
ResultIndex := Count-1;
Result := ScriptFunctions[ResultIndex]
end else begin
end else
Count := 0;
Result := '';
end;
end;

function TInnoSetupStyler.GetScriptFunctionDefinition(
const ClassMember: Boolean; const Name: String;
const Index: Integer): AnsiString;
const Index: Integer): TFunctionDefinition;
begin
var Count: Integer;
Result := GetScriptFunctionDefinition(ClassMember, Name, Index, Count);
Expand Down

0 comments on commit 2679b7f

Please sign in to comment.