text: //===------ ModuleInterfaceSupport.h - swiftinterface files -----*- C++ -*-===//
  //
  // This source file is part of the Swift.org open source project
  //
  // Copyright (c) 2019 Apple Inc. and the Swift project authors
  // Licensed under Apache License v2.0 with Runtime Library Exception
  //
  // See https://swift.org/LICENSE.txt for license information
  // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
  //
  //===----------------------------------------------------------------------===//
  
  #ifndef SWIFT_FRONTEND_MODULEINTERFACESUPPORT_H
  #define SWIFT_FRONTEND_MODULEINTERFACESUPPORT_H
  
  #include "swift/Basic/LLVM.h"
  #include "swift/Basic/Version.h"
  #include "llvm/Support/Regex.h"
  
  #define SWIFT_INTERFACE_FORMAT_VERSION_KEY "swift-interface-format-version"
  #define SWIFT_COMPILER_VERSION_KEY "swift-compiler-version"
  #define SWIFT_MODULE_FLAGS_KEY "swift-module-flags"
  
  namespace swift {
  
  class ASTContext;
  class ModuleDecl;
  
  /// Options for controlling the generation of the .swiftinterface output.
  struct ModuleInterfaceOptions {
    /// Should we prefer printing TypeReprs when writing out types in a module
    /// interface, or should we fully-qualify them?
    bool PreserveTypesAsWritten = false;
  
    /// Should we emit the cType when printing @convention(c) or no?
    /// [TODO: Clang-type-plumbing] This check should go away.
    bool PrintFullConvention = false;
  
    /// Copy of all the command-line flags passed at .swiftinterface
    /// generation time, re-applied to CompilerInvocation when reading
    /// back .swiftinterface and reconstructing .swiftmodule.
    std::string Flags;
  
    // Print SPI decls and attributes.
    bool PrintSPIs = false;
  };
  
  extern version::Version InterfaceFormatVersion;
  std::string getSwiftInterfaceCompilerVersionForCurrentCompiler(ASTContext &ctx);
  
  llvm::Regex getSwiftInterfaceFormatVersionRegex();
  llvm::Regex getSwiftInterfaceCompilerVersionRegex();
  llvm::Regex getSwiftInterfaceModuleFlagsRegex();
  
  /// Emit a stable module interface for \p M, which can be used by a client
  /// source file to import this module, subject to options given by \p Opts.
  ///
  /// Unlike a serialized module, the textual format generated by
  /// emitSwiftInterface is intended to be stable across compiler versions while
  /// still describing the full ABI of the module in question.
  ///
  /// The initial plan for this format can be found at
  /// https://forums.swift.org/t/plan-for-module-stability/14551/
  ///
  /// \return true if an error occurred
  ///
  /// \sa swift::serialize
  bool emitSwiftInterface(raw_ostream &out,
                          ModuleInterfaceOptions const &Opts,
                          ModuleDecl *M);
  
  } // end namespace swift
  
  #endif
  