Problems reported:

parser/extensions/static_covariant:6:19: Can't have modifier 'covariant' in an extension.
  static addChild(covariant A child) {}
                  ^^^^^^^^^

beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(A, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, A)
      handleNoType(A)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(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)
      beginClassOrMixinBody(DeclarationKind.Class, {)
      endClassOrMixinBody(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)
      beginClassOrMixinBody(DeclarationKind.Extension, {)
        beginMetadataStar(static)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, static, null, null, null, addChild)
            handleNoType(static)
            handleIdentifier(addChild, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.ExtensionStaticMethod)
              beginMetadataStar(covariant)
              endMetadataStar(0)
              handleRecoverableError(Message[ExtraneousModifierInExtension, Can't have modifier 'covariant' in an extension., Try removing 'covariant'., {token: covariant}], covariant, covariant)
              beginFormalParameter(covariant, MemberKind.ExtensionStaticMethod, null, covariant, null)
                handleIdentifier(A, typeReference)
                handleNoTypeArguments(child)
                handleType(A, null)
                handleIdentifier(child, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(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()
      endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
    endExtensionDeclaration(extension, on, })
  endTopLevelDeclaration()
endCompilationUnit(3, )
