From 9c00649ede8cf9a42410d6116ba53d5fb982c9ac Mon Sep 17 00:00:00 2001 From: Basile Burg <basile.b@gmx.com> Date: Wed, 1 Jul 2020 17:29:47 +0200 Subject: [PATCH] fix #51 - calltips highlights, wrong position indicated when entering an array literal --- src/u_dlang.pas | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/u_dlang.pas b/src/u_dlang.pas index 72d460e9..81e56daa 100644 --- a/src/u_dlang.pas +++ b/src/u_dlang.pas @@ -1095,14 +1095,16 @@ function getCurrentParameterIndex(tokens: TLexTokenList; caretPos: TPoint): inte var t: PLexToken; i: integer; + j: integer; p: integer = 0; s: integer = 0; begin - result := -1; + result := 0; + // got right after the call left paren i := getIndexOfTokenAt(tokens, caretPos) + 1; + j := i; while i > 0 do begin - // skip nested ParenExp i -= 1; t := tokens[i]; if t^.kind <> TLexTokenKind.ltkSymbol then @@ -1110,17 +1112,34 @@ begin p += byte(t^.Data = ')'); p -= byte(t^.Data = '('); if p = -1 then - begin - result += 1; break; - end; - if p > 0 then + end; + p := 0; + // count params from left to right + while (i <> j) and (i < tokens.Count -1) do + begin + i += 1; + t := tokens[i]; + if t^.kind <> TLexTokenKind.ltkSymbol then continue; - // detect IndexExp, SliceExp, etc. - s += byte(t^.Data = ']'); - s -= byte(t^.Data = '['); - // add a param if not in opIndex, opSlice, ParenExp - result += Byte((t^.Data = ',') and (s = 0) and (p = 0)); + // skip parens pairs, if not already skipping square bracket pairs + if (s = 0) then + begin + p += byte(t^.Data = '('); + p -= byte(t^.Data = ')'); + if p > 0 then + continue; + end; + // skip square bracket pairs, if not already skipping paren pairs + if (p = 0) then + begin + s += byte(t^.Data = '['); + s -= byte(t^.Data = ']'); + if s > 0 then + continue; + end; + if (s = 0) and (p = 0) and (t^.Data = ',') then + result += 1; end; end;