diff --git a/ide/packages/idedebugger/idedebuggerutils.pas b/ide/packages/idedebugger/idedebuggerutils.pas index 0012225b3a..c22a6ea233 100644 --- a/ide/packages/idedebugger/idedebuggerutils.pas +++ b/ide/packages/idedebugger/idedebuggerutils.pas @@ -289,9 +289,16 @@ begin if InString then Continue; - if p^ in ['@', '^', '.', '+', '-', '*', '/', '(', ',', '=', '<', '>', '#', '$', '%', '&', '!'] then + if p^ in ['@', '.', '+', '-', '*', '/', '(', ',', '=', '<', '>', '#', '$', '%', '&', '!'] then MaybeBeforeRange := False // after operator. A [1..5] would be a set of byte + else + if (p - s >= 2) and + (p[-2] in [#1..#32]) and (p[-1] in ['i', 'I']) and + (p^ in ['n', 'N']) and (p[1] in [#1..#32]) + then + MaybeBeforeRange := False // after IN operator. A [1..5] would be a set of byte + else if p^ in ['a'..'z', 'A'..'Z', '_', ')', ']'] then MaybeBeforeRange := True // after identifier, or after ")" or "]" diff --git a/ide/packages/idedebugger/test/TestIdeDebugger.lpi b/ide/packages/idedebugger/test/TestIdeDebugger.lpi index 70833d27c3..921b4bc76a 100644 --- a/ide/packages/idedebugger/test/TestIdeDebugger.lpi +++ b/ide/packages/idedebugger/test/TestIdeDebugger.lpi @@ -154,6 +154,11 @@ + + + + + diff --git a/ide/packages/idedebugger/test/TestIdeDebugger.lpr b/ide/packages/idedebugger/test/TestIdeDebugger.lpr index 171768a6de..b325db1d72 100644 --- a/ide/packages/idedebugger/test/TestIdeDebugger.lpr +++ b/ide/packages/idedebugger/test/TestIdeDebugger.lpr @@ -3,7 +3,7 @@ program TestIdeDebugger; {$mode objfpc}{$H+} uses - Interfaces, Forms, GuiTestRunner, TestWatchResult, TestXmlOpts; + Interfaces, Forms, GuiTestRunner, TestWatchResult, TestXmlOpts, TestVarious; {$R *.res} diff --git a/ide/packages/idedebugger/test/testvarious.pas b/ide/packages/idedebugger/test/testvarious.pas new file mode 100644 index 0000000000..7fbc0c8346 --- /dev/null +++ b/ide/packages/idedebugger/test/testvarious.pas @@ -0,0 +1,54 @@ +unit TestVarious; + +{$mode objfpc}{$H+} +{$INLINE off} + +interface + +uses + Classes, SysUtils, fpcunit, testutils, testregistry, + IdeDebuggerUtils, + LazLogger; + +type + + { TTestIdeDebuggerVarious } + + TTestIdeDebuggerVarious = class(TTestCase) + published + procedure TestExpressionForArrayElement; + end; + +implementation + + +{ TTestIdeDebuggerVarious } + +procedure TTestIdeDebuggerVarious.TestExpressionForArrayElement; +begin + AssertEquals('a', 'a[11]', GetExpressionForArrayElement('a', 11)); + AssertEquals('(a)', '(a)[11]', GetExpressionForArrayElement('(a)', 11)); + AssertEquals('a[2]', 'a[2][11]', GetExpressionForArrayElement('a[2]', 11)); + + AssertEquals('(a * [1..22]) * b[3..33]', '(a * [1..22]) * b[11]', GetExpressionForArrayElement('(a * [1..22]) * b[3..33]', 11)); + AssertEquals('(a in [1..22]) * b[3..33]', '(a in [1..22]) * b[11]', GetExpressionForArrayElement('(a in [1..22]) * b[3..33]', 11)); + AssertEquals('( an [1..22]) * b[3..33]', '( an [11]) * b[3..33]', GetExpressionForArrayElement('( an [1..22]) * b[3..33]', 11)); + + AssertEquals('a[2..22]', 'a[11]', GetExpressionForArrayElement('a[2..22]', 11)); + AssertEquals('a[-2..22]', 'a[11]', GetExpressionForArrayElement('a[-2..22]', 11)); + AssertEquals('a[-22..-2]', 'a[-11]', GetExpressionForArrayElement('a[-22..-2]', -11)); + AssertEquals('a[2..22][3..33]', 'a[11][3..33]', GetExpressionForArrayElement('a[2..22][3..33]', 11)); + AssertEquals('a[2..22]*b[3..33]', 'a[11]*b[3..33]', GetExpressionForArrayElement('a[2..22]*b[3..33]', 11)); + AssertEquals('Foo(a[2..22])', 'Foo(a[11])', GetExpressionForArrayElement('Foo(a[2..22])', 11)); + + AssertEquals('PCellProps((TFpList((StringGrid1.FGrid.FCellArr.FCols.FList)^[0..3]).FList)^[0..3])^', + 'PCellProps((TFpList((StringGrid1.FGrid.FCellArr.FCols.FList)^[2]).FList)^[0..3])^', + GetExpressionForArrayElement('PCellProps((TFpList((StringGrid1.FGrid.FCellArr.FCols.FList)^[0..3]).FList)^[0..3])^', 2) + ); +end; + +initialization + + RegisterTest(TTestIdeDebuggerVarious); +end. +