static bool canSynthesizeRawRepresentable(TypeChecker &tc, Decl *parentDecl, EnumDecl *enumDecl) { // Validate the enum and its raw type. tc.validateDecl(enumDecl); // It must have a valid raw type. Type rawType = enumDecl->getRawType(); if (!rawType) return false; auto parentDC = cast<DeclContext>(parentDecl); rawType = parentDC->mapTypeIntoContext(rawType); auto inherited = enumDecl->getInherited(); if (!inherited.empty() && inherited.front().wasValidated() && inherited.front().isError()) return false; // The raw type must be Equatable, so that we have a suitable ~= for // synthesized switch statements. auto equatableProto = tc.getProtocol(enumDecl->getLoc(), KnownProtocolKind::Equatable); if (!equatableProto) return false; if (!tc.conformsToProtocol(rawType, equatableProto, enumDecl, None)) return false; // There must be enum elements. if (enumDecl->getAllElements().empty()) return false; // Have the type-checker validate that: // - the enum elements all have the same type // - they all match the enum type for (auto elt : enumDecl->getAllElements()) { tc.validateDecl(elt); if (elt->isInvalid()) { return false; } } // If it meets all of those requirements, we can synthesize RawRepresentable conformance. return true; }
static bool canSynthesizeRawRepresentable(TypeChecker &tc, Decl *parentDecl, EnumDecl *enumDecl) { // It must have a valid raw type. Type rawType = enumDecl->getRawType(); if (!rawType) return false; auto parentDC = cast<DeclContext>(parentDecl); rawType = ArchetypeBuilder::mapTypeIntoContext(parentDC, rawType); if (!enumDecl->getInherited().empty() && enumDecl->getInherited().front().isError()) return false; // The raw type must be Equatable, so that we have a suitable ~= for synthesized switch statements. auto equatableProto = tc.getProtocol(enumDecl->getLoc(), KnownProtocolKind::Equatable); if (!equatableProto) return false; if (!tc.conformsToProtocol(rawType, equatableProto, enumDecl, None)) { SourceLoc loc = enumDecl->getInherited()[0].getSourceRange().Start; tc.diagnose(loc, diag::enum_raw_type_not_equatable, rawType); return false; } // There must be enum elements. if (enumDecl->getAllElements().empty()) return false; // Have the type-checker validate that: // - the enum elements all have the same type // - they all match the enum type for (auto elt : enumDecl->getAllElements()) { tc.validateDecl(elt); if (elt->isInvalid()) { return false; } } // If it meets all of those requirements, we can synthesize RawRepresentable conformance. return true; }