From 4748f5611d4542f83b0fc87766eeee8033479cc8 Mon Sep 17 00:00:00 2001 From: Raymond Date: Tue, 30 Mar 2010 19:58:41 +0200 Subject: [PATCH] Fixed small bug in Code Insight + made a start with code hints. --- Projects/SAMufasaGUI/framescript.pas | 200 +++++++++++++++++---------- Projects/SAMufasaGUI/testunit.pas | 13 +- Units/Misc/v_ideCodeParser.pas | 9 +- 3 files changed, 135 insertions(+), 87 deletions(-) diff --git a/Projects/SAMufasaGUI/framescript.pas b/Projects/SAMufasaGUI/framescript.pas index 969756b..06ade76 100644 --- a/Projects/SAMufasaGUI/framescript.pas +++ b/Projects/SAMufasaGUI/framescript.pas @@ -32,6 +32,7 @@ uses v_ideCodeInsight, v_ideCodeParser, CastaliaPasLexTypes, CastaliaSimplePasPar, SynEditHighlighter; const ecCodeCompletion = ecUserFirst; + ecCodeHints = ecUserFirst + 1; type TScriptState = (ss_None,ss_Running,ss_Paused,ss_Stopping); { @@ -256,89 +257,145 @@ var mp: TCodeInsight; ms: TMemoryStream; ItemList, InsertList: TStringList; - sp, ep: Integer; + sp, ep,bcc,cc,bck: Integer; p: TPoint; s, Filter: string; Attri: TSynHighlighterAttributes; + d: TDeclaration; + dd: TDeclaration; begin - if (Command = ecCodeCompletion) and ((not SynEdit.GetHighlighterAttriAtRowCol(SynEdit.CaretXY, s, Attri)) or (Attri.Name = 'Identifier')) then + if ((not SynEdit.GetHighlighterAttriAtRowCol(SynEdit.CaretXY, s, Attri)) or (Attri.Name = 'Identifier')) then begin - {form1.FunctionListShown(True); - with form1.frmFunctionList do - if editSearchList.CanFocus then - begin; - editSearchList.SetFocus; - LineText := SynEdit.LineText; - Caret:=SynEdit.LogicalCaretXY; - i := Caret.X - 1; - endi := caret.x; - if (i > length(LineText)) or ((i = 0) and (length(lineText) = 0)) then + if (Command = ecCodeCompletion) then + begin; + {form1.FunctionListShown(True); + with form1.frmFunctionList do + if editSearchList.CanFocus then + begin; + editSearchList.SetFocus; + LineText := SynEdit.LineText; + Caret:=SynEdit.LogicalCaretXY; + i := Caret.X - 1; + endi := caret.x; + if (i > length(LineText)) or ((i = 0) and (length(lineText) = 0)) then + begin + SearchText:= ''; + CompletionLine := PadRight(linetext,caret.x); + end + else begin + while (i > 0) and (LineText[i] in ['a'..'z','A'..'Z','0'..'9','_']) do + dec(i); + while LineText[endi] in ['a'..'z','A'..'Z','0'..'9','_'] do + inc(endi); + SearchText := Trim(copy(LineText, i + 1, Caret.X - i - 1)); + CompletionLine := LineText; + end; + CompletionStart:= LineText; + Delete(CompletionLine,i+1,endi - i - 1); + Insert('%s',CompletionLine,i+1); + CompletionCaret := Point(endi,Caret.y); + StartWordCompletion:= Point(i+1,caret.y); + mDebugLn(CompletionLine); + mDebugLn(CompletionStart); + InCodeCompletion := true; + editSearchList.Text:= SearchText; + editSearchList.SelStart:= Length(searchText); + SynEdit.SelectedColor.Style:= [fsUnderline]; + SynEdit.SelectedColor.Foreground:= clBlack; + SynEdit.SelectedColor.Background:= clWhite; + Synedit.MarkupByClass[TSynEditMarkupHighlightAllCaret].TempDisable; + end;} + mp := TCodeInsight.Create; + mp.FileName := ScriptFile; + mp.OnMessage := @Form1.OnCCMessage; + mp.OnFindInclude := @Form1.OnCCFindInclude; + + ms := TMemoryStream.Create; + ItemList := TStringList.Create; + InsertList := TStringList.Create; + InsertList.Sorted := True; + + Synedit.Lines.SaveToStream(ms); + + try + Filter := WordAtCaret(Synedit, sp, ep); + Form1.CodeCompletionStart := Point(sp, Synedit.CaretY); + mp.Run(ms, nil, Synedit.SelStart + (ep - Synedit.CaretX) - 1); + + s := mp.GetExpressionAtPos; + if (s <> '') then begin - SearchText:= ''; - CompletionLine := PadRight(linetext,caret.x); - end - else begin - while (i > 0) and (LineText[i] in ['a'..'z','A'..'Z','0'..'9','_']) do - dec(i); - while LineText[endi] in ['a'..'z','A'..'Z','0'..'9','_'] do - inc(endi); - SearchText := Trim(copy(LineText, i + 1, Caret.X - i - 1)); - CompletionLine := LineText; + sp := LastDelimiter('.', s); + if (sp > 0) then + Delete(s, sp, Length(s) - sp + 1) + else + s := ''; end; - CompletionStart:= LineText; - Delete(CompletionLine,i+1,endi - i - 1); - Insert('%s',CompletionLine,i+1); - CompletionCaret := Point(endi,Caret.y); - StartWordCompletion:= Point(i+1,caret.y); - mDebugLn(CompletionLine); - mDebugLn(CompletionStart); - InCodeCompletion := true; - editSearchList.Text:= SearchText; - editSearchList.SelStart:= Length(searchText); - SynEdit.SelectedColor.Style:= [fsUnderline]; - SynEdit.SelectedColor.Foreground:= clBlack; - SynEdit.SelectedColor.Background:= clWhite; - Synedit.MarkupByClass[TSynEditMarkupHighlightAllCaret].TempDisable; - end;} - mp := TCodeInsight.Create; - mp.FileName := ScriptFile; - mp.OnMessage := @Form1.OnCCMessage; - mp.OnFindInclude := @Form1.OnCCFindInclude; - ms := TMemoryStream.Create; - ItemList := TStringList.Create; - InsertList := TStringList.Create; - InsertList.Sorted := True; - - Synedit.Lines.SaveToStream(ms); - - try - Filter := WordAtCaret(Synedit, sp, ep); - Form1.CodeCompletionStart := Point(sp, Synedit.CaretY); - mp.Run(ms, nil, Synedit.SelStart + (ep - Synedit.CaretX) - 1); - - s := mp.GetExpressionAtPos; - if (s <> '') then - begin - sp := LastDelimiter('.', s); - if (sp > 0) then - Delete(s, sp, Length(s) - sp + 1) - else - s := ''; + mp.FillSynCompletionProposal(ItemList, InsertList, s); + p := SynEdit.ClientToScreen(SynEdit.RowColumnToPixels(Point(ep, SynEdit.CaretY))); + p.y := p.y + SynEdit.LineHeight; + Form1.CodeCompletionForm.Show(p, ItemList, InsertList, Filter, SynEdit); + finally + FreeAndNil(ms); + FreeAndNil(mp); + ItemList.Free; + InsertList.Free; end; + end else + if command = ecCodeHints then + begin + mp := TCodeInsight.Create; + mp.OnMessage := @form1.OnCCMessage; + mp.OnFindInclude := @form1.OnCCFindInclude; - mp.FillSynCompletionProposal(ItemList, InsertList, s); - p := SynEdit.ClientToScreen(SynEdit.RowColumnToPixels(Point(ep, SynEdit.CaretY))); - p.y := p.y + SynEdit.LineHeight; - Form1.CodeCompletionForm.Show(p, ItemList, InsertList, Filter, SynEdit); - finally - FreeAndNil(ms); - FreeAndNil(mp); - ItemList.Free; - InsertList.Free; + ms := TMemoryStream.Create; + synedit.Lines.SaveToStream(ms); + + try + Synedit.GetWordBoundsAtRowCol(Synedit.CaretXY, sp, ep); + mp.Run(ms, nil, Synedit.SelStart + (ep - Synedit.CaretX) - 1); + //mp.Position := Synedit.SelStart + (ep - Synedit.CaretX) - 1; + + bcc := 1; + bck := 0; + cc := 0; + s := mp.GetExpressionAtPos(bcc, bck, cc, True); + if (s <> '') then + Delete(s, Length(s), 1); + + d := mp.FindVarBase(s); + dd := nil; + while (d <> nil) and (d <> dd) and (d.Owner <> nil) and (not ((d is TciProcedureDeclaration) or (d.Owner is TciProcedureDeclaration))) do + begin + dd := d; + d := d.Owner.Items.GetFirstItemOfClass(TciTypeKind); + if (d <> nil) then + begin + d := TciTypeKind(d).GetRealType; + if (d is TciReturnType) then + d := d.Owner; + end; + if (d <> nil) and (d.Owner <> nil) and (not ((d is TciProcedureDeclaration) or (d.Owner is TciProcedureDeclaration))) then + d := mp.FindVarBase(d.CleanText) + else + Break; + end; + if (d <> nil) and (d <> dd) and (d.Owner <> nil) and ((d is TciProcedureDeclaration) or (d.Owner is TciProcedureDeclaration)) then + begin + if (not (d is TciProcedureDeclaration)) and (d.Owner is TciProcedureDeclaration) then + d := d.Owner; + if (TciProcedureDeclaration(d).SynParams <> '') then + formWriteln(TciProcedureDeclaration(d).SynParams) + else + FormWriteln(''); + end; + finally + FreeAndNil(ms); + FreeAndNil(mp); + end; end; end; - if Form1.CodeCompletionForm.Visible then case Command of ecDeleteChar, ecDeleteWord, ecDeleteEOL: @@ -522,6 +579,7 @@ begin MarkCaret.IgnoreKeywords := true; end; AddKey(SynEdit,ecCodeCompletion,VK_SPACE,[ssCtrl]); + AddKey(SynEdit,ecCodeHints,VK_SPACE,[ssCtrl,ssShift]); // TSynPasSyn(SynEdit.Highlighter).NestedComments:= false; Does not work :( end; diff --git a/Projects/SAMufasaGUI/testunit.pas b/Projects/SAMufasaGUI/testunit.pas index 1efe285..2d6c2fc 100644 --- a/Projects/SAMufasaGUI/testunit.pas +++ b/Projects/SAMufasaGUI/testunit.pas @@ -40,7 +40,7 @@ uses colourpicker, framescript, windowselector, lcltype, ActnList, SynExportHTML, SynEditKeyCmds, SynEditHighlighter, SynEditMarkupHighAll, LMessages, Buttons,mmisc, - stringutil,mufasatypesutil,mufasabase, + stringutil,mufasatypesutil,mufasabase, v_ideCodeParser, about, framefunctionlist, ocr, updateform, simbasettings, psextension, virtualextension, extensionmanager, settingssandbox, v_ideCodeInsight, CastaliaPasLexTypes, CastaliaSimplePasPar, v_AutoCompleteForm, PSDump; @@ -2213,17 +2213,8 @@ begin end; procedure TForm1.ButtonTrayClick(Sender: TObject); -{var - ms : TMemoryStream; - fs : TFileStream;} begin -{ - fs := TFileStream.Create('c:\remake\fonts.tar.bz2',fmOpenRead); - ms := DecompressBZip2(fs); - fs.free; - UnTar(ms,'c:\remake\fonttest\',true); - ms.free;} - Form1.Hide; + self.hide; end; procedure TForm1.PageControl1Changing(Sender: TObject; var AllowChange: Boolean diff --git a/Units/Misc/v_ideCodeParser.pas b/Units/Misc/v_ideCodeParser.pas index 52f3af4..4a5224b 100644 --- a/Units/Misc/v_ideCodeParser.pas +++ b/Units/Misc/v_ideCodeParser.pas @@ -864,17 +864,16 @@ begin a := GetParamDeclarations; for i := Low(a) to High(a) do begin - if (fItems[i] is TciConstParameter) then + if (a[i] is TciConstParameter) then s := 'const ' - else if (fItems[i] is TciOutParameter) then + else if (a[i] is TciOutParameter) then s := 'out ' - else if (fItems[i] is TciInParameter) then + else if (a[i] is TciInParameter) then s := 'in ' - else if (fItems[i] is TciVarParameter) then + else if (a[i] is TciVarParameter) then s := 'var ' else s := ''; - d := a[i].Items.GetFirstItemOfClass(TciParameterType); if (d <> nil) then t := ': ' + d.ShortText