protected TreeContext popContext() {
    final TreeContext treeContext = treeContextStack.pop();
    List<TreeContextAction> actions = treeContext.getOnPopHandlers();
    for (TreeContextAction contextAction : actions) {
      contextAction.call(treeContext);
    }
    lastContext = treeContext;
    ASTNode parentNode = treeContext.parent != null ? treeContext.parent.node : null;
    if (treeContext.node instanceof Expression && parentNode != null) {
      ClassCodeExpressionTransformer trn =
          new ClassCodeExpressionTransformer() {
            @Override
            protected SourceUnit getSourceUnit() {
              return null;
            }

            @Override
            public Expression transform(final Expression exp) {
              if (exp == treeContext.node) {
                Expression replacement = treeContext.getReplacement();
                if (replacement != null) {
                  return replacement;
                }
              }
              return super.transform(exp);
            }
          };
      // todo: reliable way to call the transformer
      // parentNode.visit(trn);
    }
    return treeContext;
  }