I mean that now code is requesting symbol for every new caret position and uses information from symbol to determine if caret is on implemented interface in type\object expression. Symbol gives you precise answer but is quite heavy to obtain. What can be done instead is you can use results of untyped parsing to decide if caret is located on syntactic interface implementation - this will allow to throw away all negative cases and should be much cheaper because parsing is much more lightweight comparing to full typechecking,