TdwsSymbolDictionary служит для другой цели, главным образом зная, где (если) символ объявлен или используется, а также облегчает такие вещи, как рефакторинг переименования (см. http://delphitools.info/2011/02/19/spotlight-on-tsymboldictionary/).
TdwsSourceContextMap служит для того, чтобы узнать, где в исходном коде находятся «блоки» кода (например, где объявление класса заканчивается и заканчивается, где начинается и заканчивается реализация функции и т. Д.), И то, и другое полезно для «перехода» на позицию в коде или узнать, где находится курсор в терминах символов.
То, что вы ищете, это еще одна информация, это то, что строки соответствуют скомпилированным выражениям. Для этого вам нужно посмотреть, что скомпилировано, TExprBase.SubExpr / SubExprCount - ваши рабочие лошадки или служебная функция, которая их оборачивает RecursiveEnumerateSubExprs. С помощью этой функции вы можете просматривать все выражения в вашей программе, начиная с TdwsProgram.Expr и TdwsProgram.InitExpr (вы можете привести IdwsProgram к TdwsProgram, чтобы получить эти свойства).
Здесь вы можете иметь точки останова.
В качестве иллюстрации предположим, что у вас есть
1. function Dummy : Integer;
2. var i : Integer;
3. begin
4. while i<10 do begin
5. Inc(i);
6. if i>5 then
7. break;
8. end;
9. end;
Тогда, если я не ошибаюсь (делаю это неожиданно):
В словаре символов будет указано объявление "Dummy" в 1, a
использование «Integer» в 1 и 2, объявление «i» в 2, использование «i» в
4, 5 и 6.
В контекстной карте будет блок для функции, основной блок
и цикл while.
Строки со скомпилированными выражениями будут 2 (.InitExpr) и 4, 5,
6 & 7 (.Expr)