The methods of a final class are not marked final, because they may be shared with other classes. So to know if a method call is final, you have to check both the method and the type of the object being dispatched. Domains come in two syntaxes. The typechecker leaves them as they are. The modifiers() field on a fields Decl is the one that should be trusted after resolveClass completes (and not the flags() on the field itself). Widening/etc of xxxAssignNodes is handled via the widenSource/castResult methods. See the comments in AST.h.