For a dead callable, we identify all the possible dead roots.
A predicate to find non-trivial method implementations. (A trivial implementation is either abstract, or it just throws
Holds if the given callable has any liveness causes.
Compute a list of callables such that the liveness of any result would imply the liveness of
A class is dead if it is from source, and contains no live callables and no live fields. Nested classes make the outer class live if and only if the outer class is considered to be present for namespace purposes only, and the nested class is static.
A method is dead if it is from source, has no liveness causes, is not a compiler generated method and is not a dead method with a purpose, such as a constructor designed to suppress the default constructor.
A dead root is not live, and has no liveness causes.
A source class or interface is live if it fulfills one of the following criteria:
A namespace class is one that is used purely as a container for static classes, methods and fields.
A constructor that is only declared to override the public accessibility of the default constructor generated by the compiler.
A class which is dead, but should be considered as live.