  Automated Program Repair (APR) improves software reliability by generating
patches for a buggy program automatically. Recent APR techniques leverage deep
learning (DL) to build models to learn to generate patches from existing
patches and code corpora. While promising, DL-based APR techniques suffer from
the abundant syntactically or semantically incorrect patches in the patch
space. These patches often disobey the syntactic and semantic domain knowledge
of source code and thus cannot be the correct patches to fix a bug.
  We propose a DL-based APR approach KNOD, which incorporates domain knowledge
to guide patch generation in a direct and comprehensive way. KNOD has two major
novelties, including (1) a novel three-stage tree decoder, which directly
generates Abstract Syntax Trees of patched code according to the inherent tree
structure, and (2) a novel domain-rule distillation, which leverages syntactic
and semantic rules and teacher-student distributions to explicitly inject the
domain knowledge into the decoding procedure during both the training and
inference phases.
  We evaluate KNOD on three widely-used benchmarks. KNOD fixes 72 bugs on the
Defects4J v1.2, 25 bugs on the QuixBugs, and 50 bugs on the additional
Defects4J v2.0 benchmarks, outperforming all existing APR tools.
