Skip to content

Commit 2795a19

Browse files
authored
Merge pull request #40163 from rintaro/ide-completion-enumbitfield
NFC: [CodeCompletion] Use enums in bit fields as-is
2 parents 5baf0d6 + c1542bf commit 2795a19

File tree

5 files changed

+94
-83
lines changed

5 files changed

+94
-83
lines changed

include/swift/IDE/CodeCompletion.h

Lines changed: 85 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ class alignas(detail::CodeCompletionStringChunk) CodeCompletionString final :
422422
///
423423
/// This enum is ordered from the contexts that are "nearest" to the code
424424
/// completion point to "outside" contexts.
425-
enum class SemanticContextKind {
425+
enum class SemanticContextKind : uint8_t {
426426
/// Used in cases when the concept of semantic context is not applicable.
427427
None,
428428

@@ -456,6 +456,8 @@ enum class SemanticContextKind {
456456

457457
/// A declaration imported from other module.
458458
OtherModule,
459+
460+
MAX_VALUE = OtherModule
459461
};
460462

461463
enum class CodeCompletionFlairBit: uint8_t {
@@ -486,7 +488,7 @@ enum class CodeCompletionFlairBit: uint8_t {
486488
using CodeCompletionFlair = OptionSet<CodeCompletionFlairBit>;
487489

488490
/// The declaration kind of a code completion result, if it is a declaration.
489-
enum class CodeCompletionDeclKind {
491+
enum class CodeCompletionDeclKind : uint8_t {
490492
Module,
491493
Class,
492494
Struct,
@@ -512,7 +514,7 @@ enum class CodeCompletionDeclKind {
512514
PrecedenceGroup,
513515
};
514516

515-
enum class CodeCompletionLiteralKind {
517+
enum class CodeCompletionLiteralKind : uint8_t {
516518
ArrayLiteral,
517519
BooleanLiteral,
518520
ColorLiteral,
@@ -524,7 +526,7 @@ enum class CodeCompletionLiteralKind {
524526
Tuple,
525527
};
526528

527-
enum class CodeCompletionOperatorKind {
529+
enum class CodeCompletionOperatorKind : uint8_t {
528530
None,
529531
Unknown,
530532
Bang, // !
@@ -568,16 +570,18 @@ enum class CodeCompletionOperatorKind {
568570
PipeEq, // |=
569571
PipePipe, // ||
570572
TildeEq, // ~=
573+
574+
MAX_VALUE = TildeEq
571575
};
572576

573-
enum class CodeCompletionKeywordKind {
577+
enum class CodeCompletionKeywordKind : uint8_t {
574578
None,
575579
#define KEYWORD(X) kw_##X,
576580
#define POUND_KEYWORD(X) pound_##X,
577581
#include "swift/Syntax/TokenKinds.def"
578582
};
579583

580-
enum class CompletionKind {
584+
enum class CompletionKind : uint8_t {
581585
None,
582586
Import,
583587
UnresolvedMember,
@@ -616,30 +620,34 @@ enum class CompletionKind {
616620
TypeAttrBeginning,
617621
};
618622

619-
enum class CodeCompletionDiagnosticSeverity: uint8_t {
623+
enum class CodeCompletionDiagnosticSeverity : uint8_t {
620624
None,
621625
Error,
622626
Warning,
623627
Remark,
624628
Note,
629+
630+
MAX_VALUE = Note
625631
};
626632

627633
/// A single code completion result.
628634
class CodeCompletionResult {
629635
friend class CodeCompletionResultBuilder;
630636

631637
public:
632-
enum class ResultKind {
638+
enum class ResultKind : uint8_t {
633639
Declaration,
634640
Keyword,
635641
Pattern,
636642
Literal,
637643
BuiltinOperator,
644+
645+
MAX_VALUE = BuiltinOperator
638646
};
639647

640648
/// Describes the relationship between the type of the completion results and
641649
/// the expected type at the code completion position.
642-
enum class ExpectedTypeRelation {
650+
enum class ExpectedTypeRelation : uint8_t {
643651
/// The result does not have a type (e.g. keyword).
644652
NotApplicable,
645653

@@ -658,9 +666,11 @@ class CodeCompletionResult {
658666

659667
/// The result's type is identical to the type of the expected.
660668
Identical,
669+
670+
MAX_VALUE = Identical
661671
};
662672

663-
enum class NotRecommendedReason {
673+
enum class NotRecommendedReason : uint8_t {
664674
None = 0,
665675
RedundantImport,
666676
RedundantImportIndirect,
@@ -669,16 +679,18 @@ class CodeCompletionResult {
669679
InvalidAsyncContext,
670680
CrossActorReference,
671681
VariableUsedInOwnDefinition,
682+
683+
MAX_VALUE = VariableUsedInOwnDefinition
672684
};
673685

674686
private:
675-
unsigned Kind : 3;
687+
ResultKind Kind : 3;
676688
unsigned AssociatedKind : 8;
677-
unsigned KnownOperatorKind : 6;
678-
unsigned SemanticContext : 3;
679-
unsigned Flair: 8;
680-
unsigned NotRecommended : 4;
681-
unsigned IsSystem : 1;
689+
CodeCompletionOperatorKind KnownOperatorKind : 6;
690+
SemanticContextKind SemanticContext : 3;
691+
unsigned char Flair : 8;
692+
NotRecommendedReason NotRecommended : 4;
693+
bool IsSystem : 1;
682694

683695
/// The number of bytes to the left of the code completion point that
684696
/// should be erased first if this completion string is inserted in the
@@ -693,10 +705,18 @@ class CodeCompletionResult {
693705
StringRef ModuleName;
694706
StringRef BriefDocComment;
695707
ArrayRef<StringRef> AssociatedUSRs;
696-
unsigned TypeDistance : 3;
697-
unsigned DiagnosticSeverity: 3;
708+
ExpectedTypeRelation TypeDistance : 3;
709+
CodeCompletionDiagnosticSeverity DiagnosticSeverity : 3;
698710
StringRef DiagnosticMessage;
699711

712+
// Assertions for limiting max values of enums.
713+
static_assert(int(ResultKind::MAX_VALUE) < 1 << 3, "");
714+
static_assert(int(CodeCompletionOperatorKind::MAX_VALUE) < 1 << 6, "");
715+
static_assert(int(SemanticContextKind::MAX_VALUE) < 1 << 3, "");
716+
static_assert(int(NotRecommendedReason::MAX_VALUE) < 1 << 4, "");
717+
static_assert(int(ExpectedTypeRelation::MAX_VALUE) < 1 << 3, "");
718+
static_assert(int(CodeCompletionDiagnosticSeverity::MAX_VALUE) < 1 << 3, "");
719+
700720
public:
701721
/// Constructs a \c Pattern, \c Keyword or \c BuiltinOperator result.
702722
///
@@ -708,22 +728,20 @@ class CodeCompletionResult {
708728
CodeCompletionOperatorKind KnownOperatorKind =
709729
CodeCompletionOperatorKind::None,
710730
StringRef BriefDocComment = StringRef())
711-
: Kind(unsigned(Kind)), KnownOperatorKind(unsigned(KnownOperatorKind)),
712-
SemanticContext(unsigned(SemanticContext)),
713-
Flair(unsigned(Flair.toRaw())),
714-
NotRecommended(unsigned(NotRecommendedReason::None)),
731+
: Kind(Kind), KnownOperatorKind(KnownOperatorKind),
732+
SemanticContext(SemanticContext), Flair(Flair.toRaw()),
733+
NotRecommended(NotRecommendedReason::None),
715734
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
716-
BriefDocComment(BriefDocComment), TypeDistance(unsigned(TypeDistance)) {
735+
BriefDocComment(BriefDocComment), TypeDistance(TypeDistance) {
717736
assert(Kind != ResultKind::Declaration && "use the other constructor");
718737
assert(CompletionString);
719738
if (isOperator() && KnownOperatorKind == CodeCompletionOperatorKind::None)
720-
this->KnownOperatorKind =
721-
(unsigned)getCodeCompletionOperatorKind(CompletionString);
739+
this->KnownOperatorKind = getCodeCompletionOperatorKind(CompletionString);
722740
assert(!isOperator() ||
723741
getOperatorKind() != CodeCompletionOperatorKind::None);
724742
AssociatedKind = 0;
725-
IsSystem = 0;
726-
DiagnosticSeverity = 0;
743+
IsSystem = false;
744+
DiagnosticSeverity = CodeCompletionDiagnosticSeverity::None;
727745
}
728746

729747
/// Constructs a \c Keyword result.
@@ -735,16 +753,16 @@ class CodeCompletionResult {
735753
CodeCompletionString *CompletionString,
736754
ExpectedTypeRelation TypeDistance,
737755
StringRef BriefDocComment = StringRef())
738-
: Kind(unsigned(ResultKind::Keyword)), KnownOperatorKind(0),
739-
SemanticContext(unsigned(SemanticContext)),
740-
Flair(unsigned(Flair.toRaw())),
741-
NotRecommended(unsigned(NotRecommendedReason::None)),
756+
: Kind(ResultKind::Keyword),
757+
KnownOperatorKind(CodeCompletionOperatorKind::None),
758+
SemanticContext(SemanticContext), Flair(Flair.toRaw()),
759+
NotRecommended(NotRecommendedReason::None),
742760
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
743-
BriefDocComment(BriefDocComment), TypeDistance(unsigned(TypeDistance)) {
761+
BriefDocComment(BriefDocComment), TypeDistance(TypeDistance) {
744762
assert(CompletionString);
745763
AssociatedKind = static_cast<unsigned>(Kind);
746-
IsSystem = 0;
747-
DiagnosticSeverity = 0;
764+
IsSystem = false;
765+
DiagnosticSeverity = CodeCompletionDiagnosticSeverity::None;
748766
}
749767

750768
/// Constructs a \c Literal result.
@@ -755,15 +773,15 @@ class CodeCompletionResult {
755773
CodeCompletionFlair Flair, unsigned NumBytesToErase,
756774
CodeCompletionString *CompletionString,
757775
ExpectedTypeRelation TypeDistance)
758-
: Kind(unsigned(ResultKind::Literal)), KnownOperatorKind(0),
759-
SemanticContext(unsigned(SemanticContext)),
760-
Flair(unsigned(Flair.toRaw())),
761-
NotRecommended(unsigned(NotRecommendedReason::None)),
776+
: Kind(ResultKind::Literal),
777+
KnownOperatorKind(CodeCompletionOperatorKind::None),
778+
SemanticContext(SemanticContext), Flair(Flair.toRaw()),
779+
NotRecommended(NotRecommendedReason::None),
762780
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
763-
TypeDistance(unsigned(TypeDistance)) {
781+
TypeDistance(TypeDistance) {
764782
AssociatedKind = static_cast<unsigned>(LiteralKind);
765-
IsSystem = 0;
766-
DiagnosticSeverity = 0;
783+
IsSystem = false;
784+
DiagnosticSeverity = CodeCompletionDiagnosticSeverity::None;
767785
assert(CompletionString);
768786
}
769787

@@ -780,20 +798,20 @@ class CodeCompletionResult {
780798
StringRef BriefDocComment,
781799
ArrayRef<StringRef> AssociatedUSRs,
782800
ExpectedTypeRelation TypeDistance)
783-
: Kind(unsigned(ResultKind::Declaration)), KnownOperatorKind(0),
784-
SemanticContext(unsigned(SemanticContext)),
785-
Flair(unsigned(Flair.toRaw())), NotRecommended(unsigned(NotRecReason)),
786-
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
787-
ModuleName(ModuleName), BriefDocComment(BriefDocComment),
788-
AssociatedUSRs(AssociatedUSRs), TypeDistance(unsigned(TypeDistance)) {
801+
: Kind(ResultKind::Declaration),
802+
KnownOperatorKind(CodeCompletionOperatorKind::None),
803+
SemanticContext(SemanticContext), Flair(Flair.toRaw()),
804+
NotRecommended(NotRecReason), NumBytesToErase(NumBytesToErase),
805+
CompletionString(CompletionString), ModuleName(ModuleName),
806+
BriefDocComment(BriefDocComment), AssociatedUSRs(AssociatedUSRs),
807+
TypeDistance(TypeDistance) {
789808
assert(AssociatedDecl && "should have a decl");
790809
AssociatedKind = unsigned(getCodeCompletionDeclKind(AssociatedDecl));
791810
IsSystem = getDeclIsSystem(AssociatedDecl);
792-
DiagnosticSeverity = 0;
811+
DiagnosticSeverity = CodeCompletionDiagnosticSeverity::None;
793812
assert(CompletionString);
794813
if (isOperator())
795-
KnownOperatorKind =
796-
(unsigned)getCodeCompletionOperatorKind(CompletionString);
814+
KnownOperatorKind = getCodeCompletionOperatorKind(CompletionString);
797815
assert(!isOperator() ||
798816
getOperatorKind() != CodeCompletionOperatorKind::None);
799817
}
@@ -810,16 +828,13 @@ class CodeCompletionResult {
810828
ArrayRef<StringRef> AssociatedUSRs,
811829
ExpectedTypeRelation TypeDistance,
812830
CodeCompletionOperatorKind KnownOperatorKind)
813-
: Kind(unsigned(ResultKind::Declaration)),
814-
KnownOperatorKind(unsigned(KnownOperatorKind)),
815-
SemanticContext(unsigned(SemanticContext)),
816-
Flair(unsigned(Flair.toRaw())), NotRecommended(unsigned(NotRecReason)),
817-
IsSystem(IsSystem), NumBytesToErase(NumBytesToErase),
818-
CompletionString(CompletionString), ModuleName(ModuleName),
819-
BriefDocComment(BriefDocComment), AssociatedUSRs(AssociatedUSRs),
820-
TypeDistance(unsigned(TypeDistance)),
821-
DiagnosticSeverity(unsigned(diagSeverity)),
822-
DiagnosticMessage(DiagnosticMessage) {
831+
: Kind(ResultKind::Declaration), KnownOperatorKind(KnownOperatorKind),
832+
SemanticContext(SemanticContext), Flair(Flair.toRaw()),
833+
NotRecommended(NotRecReason), IsSystem(IsSystem),
834+
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
835+
ModuleName(ModuleName), BriefDocComment(BriefDocComment),
836+
AssociatedUSRs(AssociatedUSRs), TypeDistance(TypeDistance),
837+
DiagnosticSeverity(diagSeverity), DiagnosticMessage(DiagnosticMessage) {
823838
AssociatedKind = static_cast<unsigned>(DeclKind);
824839
assert(CompletionString);
825840
assert(!isOperator() ||
@@ -832,7 +847,7 @@ class CodeCompletionResult {
832847
CodeCompletionResult *withFlair(CodeCompletionFlair newFlair,
833848
CodeCompletionResultSink &Sink);
834849

835-
ResultKind getKind() const { return static_cast<ResultKind>(Kind); }
850+
ResultKind getKind() const { return Kind; }
836851

837852
CodeCompletionDeclKind getAssociatedDeclKind() const {
838853
assert(getKind() == ResultKind::Declaration);
@@ -864,33 +879,23 @@ class CodeCompletionResult {
864879

865880
CodeCompletionOperatorKind getOperatorKind() const {
866881
assert(isOperator());
867-
return static_cast<CodeCompletionOperatorKind>(KnownOperatorKind);
882+
return KnownOperatorKind;
868883
}
869884

870-
bool isSystem() const {
871-
return static_cast<bool>(IsSystem);
872-
}
885+
bool isSystem() const { return IsSystem; }
873886

874-
ExpectedTypeRelation getExpectedTypeRelation() const {
875-
return static_cast<ExpectedTypeRelation>(TypeDistance);
876-
}
887+
ExpectedTypeRelation getExpectedTypeRelation() const { return TypeDistance; }
877888

878889
NotRecommendedReason getNotRecommendedReason() const {
879-
return static_cast<NotRecommendedReason>(NotRecommended);
890+
return NotRecommended;
880891
}
881892

882-
SemanticContextKind getSemanticContext() const {
883-
return static_cast<SemanticContextKind>(SemanticContext);
884-
}
893+
SemanticContextKind getSemanticContext() const { return SemanticContext; }
885894

886-
CodeCompletionFlair getFlair() const {
887-
return static_cast<CodeCompletionFlair>(Flair);
888-
}
895+
CodeCompletionFlair getFlair() const { return CodeCompletionFlair(Flair); }
889896

890897
/// Modify "flair" of this result *in place*.
891-
void setFlair(CodeCompletionFlair flair) {
892-
Flair = unsigned(flair.toRaw());
893-
}
898+
void setFlair(CodeCompletionFlair flair) { Flair = flair.toRaw(); }
894899

895900
bool isNotRecommended() const {
896901
return getNotRecommendedReason() != NotRecommendedReason::None;
@@ -915,12 +920,12 @@ class CodeCompletionResult {
915920
}
916921

917922
void setDiagnostics(CodeCompletionDiagnosticSeverity severity, StringRef message) {
918-
DiagnosticSeverity = static_cast<unsigned>(severity);
923+
DiagnosticSeverity = severity;
919924
DiagnosticMessage = message;
920925
}
921926

922927
CodeCompletionDiagnosticSeverity getDiagnosticSeverity() const {
923-
return static_cast<CodeCompletionDiagnosticSeverity>(DiagnosticSeverity);
928+
return DiagnosticSeverity;
924929
}
925930

926931
StringRef getDiagnosticMessage() const {

lib/IDE/CodeCompletion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ void CodeCompletionResult::printPrefix(raw_ostream &OS) const {
592592
PRINT_FLAIR(ExpressionAtNonScriptOrMainFileScope, "ExprAtFileScope")
593593
Prefix.append("]");
594594
}
595-
if (NotRecommended)
595+
if (NotRecommended != NotRecommendedReason::None)
596596
Prefix.append("/NotRecommended");
597597
if (IsSystem)
598598
Prefix.append("/IsSystem");

lib/IDE/ExprContextAnalysis.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Expr;
2424
class ValueDecl;
2525

2626
namespace ide {
27-
enum class SemanticContextKind;
27+
enum class SemanticContextKind : uint8_t;
2828

2929
/// Type check parent contexts of the given decl context, and the body of the
3030
/// given context until \c Loc if the context is a function body.

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "swift/AST/DiagnosticsParse.h"
2929
#include "swift/AST/DiagnosticsFrontend.h"
3030
#include "swift/AST/DiagnosticsSIL.h"
31+
#include "swift/Basic/Compiler.h"
3132
#include "swift/Basic/SourceManager.h"
3233
#include "swift/Demangling/ManglingUtils.h"
3334
#include "swift/Frontend/Frontend.h"
@@ -612,7 +613,12 @@ struct SwiftSemanticToken {
612613
return SwiftLangSupport::getUIDForCodeCompletionDeclKind(Kind, getIsRef());
613614
}
614615
};
616+
#if !defined(_MSC_VER)
615617
static_assert(sizeof(SwiftSemanticToken) == 8, "Too big");
618+
// FIXME: MSVC doesn't pack bitfields with different underlying types.
619+
// Giving up to check this in MSVC for now, becasue static_assert is only for
620+
// keeping low memory usage.
621+
#endif
616622

617623
class SwiftDocumentSemanticInfo :
618624
public ThreadSafeRefCountedBase<SwiftDocumentSemanticInfo> {

0 commit comments

Comments
 (0)