mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Currently, we do not support exporting zero-sized value types from Swift to C++. It needs some work on our end as these types are not part of the lowered signature. In the meantime, this PR makes sure that common (but not all) zero sized types are properly marked as unavailable. This is important as the proper diagnostic will give users a hint how to work around this problem. Moreover, it is really easy to hit this when someone is experimenting with interop, so it is important to not have a cryptic failure mode. rdar://138122545
129 lines
4.3 KiB
C++
129 lines
4.3 KiB
C++
//===--- SwiftNameTranslation.h - Swift Name Translation --------*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 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_NAME_TRANSLATION_H
|
|
#define SWIFT_NAME_TRANSLATION_H
|
|
|
|
#include "swift/AST/AttrKind.h"
|
|
#include "swift/AST/Decl.h"
|
|
#include "swift/AST/DiagnosticEngine.h"
|
|
#include "swift/AST/Identifier.h"
|
|
#include <optional>
|
|
|
|
namespace swift {
|
|
|
|
class EnumDecl;
|
|
class EnumElementDecl;
|
|
struct InverseRequirement;
|
|
class GenericSignature;
|
|
class ValueDecl;
|
|
|
|
namespace objc_translation {
|
|
enum CustomNamesOnly_t : bool {
|
|
Normal = false,
|
|
CustomNamesOnly = true,
|
|
};
|
|
|
|
StringRef getNameForObjC(const ValueDecl *VD,
|
|
CustomNamesOnly_t customNamesOnly = Normal);
|
|
|
|
std::string getErrorDomainStringForObjC(const EnumDecl *ED);
|
|
|
|
/// Print the ObjC name of an enum element decl to OS, also allowing the client
|
|
/// to specify a preferred name other than the decl's original name.
|
|
///
|
|
/// Returns true if the decl has a custom ObjC name (@objc); false otherwise.
|
|
bool printSwiftEnumElemNameInObjC(const EnumElementDecl *EL,
|
|
llvm::raw_ostream &OS,
|
|
Identifier PreferredName = Identifier());
|
|
|
|
/// Get the name for a value decl D if D is exported to ObjC, PreferredName is
|
|
/// specified to perform what-if analysis, shadowing D's original name during
|
|
/// computation.
|
|
///
|
|
/// Returns a pair of Identifier and ObjCSelector, only one of which is valid.
|
|
std::pair<Identifier, ObjCSelector>
|
|
getObjCNameForSwiftDecl(const ValueDecl *VD, DeclName PreferredName = DeclName());
|
|
|
|
/// Returns true if the given value decl D is visible to ObjC of its
|
|
/// own accord (i.e. without considering its context)
|
|
bool isVisibleToObjC(const ValueDecl *VD, AccessLevel minRequiredAccess,
|
|
bool checkParent = true);
|
|
|
|
} // end namespace objc_translation
|
|
|
|
namespace cxx_translation {
|
|
|
|
using objc_translation::CustomNamesOnly_t;
|
|
|
|
StringRef
|
|
getNameForCxx(const ValueDecl *VD,
|
|
CustomNamesOnly_t customNamesOnly = objc_translation::Normal);
|
|
|
|
enum RepresentationKind { Representable, ObjCxxOnly, Unsupported };
|
|
|
|
enum RepresentationError {
|
|
UnrepresentableObjC,
|
|
UnrepresentableAsync,
|
|
UnrepresentableIsolatedInActor,
|
|
UnrepresentableRequiresClientEmission,
|
|
UnrepresentableGeneric,
|
|
UnrepresentableGenericRequirements,
|
|
UnrepresentableThrows,
|
|
UnrepresentableIndirectEnum,
|
|
UnrepresentableEnumCaseType,
|
|
UnrepresentableEnumCaseTuple,
|
|
UnrepresentableProtocol,
|
|
UnrepresentableMoveOnly,
|
|
UnrepresentableNested,
|
|
UnrepresentableMacro,
|
|
UnrepresentableZeroSizedValueType,
|
|
};
|
|
|
|
/// Constructs a diagnostic that describes the given C++ representation error.
|
|
Diagnostic diagnoseRepresenationError(RepresentationError error, ValueDecl *vd);
|
|
|
|
struct DeclRepresentation {
|
|
RepresentationKind kind;
|
|
std::optional<RepresentationError> error;
|
|
|
|
/// Returns true if the given Swift node is unsupported in Clang in any
|
|
/// language mode.
|
|
bool isUnsupported() const { return kind == Unsupported; }
|
|
};
|
|
|
|
/// Returns the C++ representation info for the given declaration.
|
|
DeclRepresentation getDeclRepresentation(
|
|
const ValueDecl *VD,
|
|
std::optional<std::function<bool(const NominalTypeDecl *)>> isZeroSized);
|
|
|
|
/// Returns true if the given value decl is exposable to C++.
|
|
inline bool isExposableToCxx(
|
|
const ValueDecl *VD,
|
|
std::optional<std::function<bool(const NominalTypeDecl *)>> isZeroSized) {
|
|
return !getDeclRepresentation(VD, isZeroSized).isUnsupported();
|
|
}
|
|
|
|
/// Returns true if the given value decl D is visible to C++ of its
|
|
/// own accord (i.e. without considering its context)
|
|
bool isVisibleToCxx(const ValueDecl *VD, AccessLevel minRequiredAccess,
|
|
bool checkParent = true);
|
|
|
|
/// Determine whether the given generic signature can be exposed to C++.
|
|
bool isExposableToCxx(GenericSignature genericSig);
|
|
|
|
} // end namespace cxx_translation
|
|
|
|
} // end namespace swift
|
|
|
|
#endif
|