  There is a vast gap in the quality of IDE tooling between static languages
like Java and dynamic languages like Python or JavaScript. Modern frameworks
and libraries in these languages heavily use their dynamic capabilities to
achieve the best ergonomics and readability. This has a side effect of making
the current generation of IDEs blind to control flow and data flow, which often
breaks navigation, autocompletion and refactoring. In this thesis we propose an
algorithm that can bridge this gap between tooling for dynamic and static
languages by statically analyzing dynamic metaprogramming and runtime
reflection in programs. We use a technique called abstract interpretation to
partially execute programs and extract information that is usually only
available at runtime. Our algorithm has been implemented in a prototype
analyzer that can analyze programs written in a subset of JavaScript.
