beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(A, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, A)
      handleNoType(A)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(C, classOrMixinDeclaration)
    handleNoTypeVariables(extends)
    beginClassDeclaration(class, null, C)
      handleIdentifier(A, typeReference)
      handleNoTypeArguments({)
      handleType(A, null)
      handleClassExtends(extends, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(extension)
  beginMetadataStar(extension)
  endMetadataStar(0)
  beginExtensionDeclarationPrelude(extension)
    handleNoTypeVariables(on)
    beginExtensionDeclaration(extension, null)
      handleIdentifier(C, typeReference)
      handleNoTypeArguments({)
      handleType(C, null)
      handleExtensionShowHide(null, 0, null, 0)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
        beginMetadataStar(static)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Extension, null, static, null, null, null, addChild)
            handleNoType(static)
            handleIdentifier(addChild, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.ExtensionStaticMethod)
              beginMetadataStar(A)
              endMetadataStar(0)
              beginFormalParameter(A, MemberKind.ExtensionStaticMethod, null, null, null)
                handleIdentifier(A, typeReference)
                handleNoTypeArguments(child)
                handleType(A, null)
                handleIdentifier(child, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
            endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endExtensionMethod(null, static, (, null, })
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Extension, 1, {, })
    endExtensionDeclaration(extension, null, on, null, null, })
  endTopLevelDeclaration()
endCompilationUnit(3, )
