Skip to content

[CodeCompletion] NFC: Make enums in CodeCompletionResult scoped #40141

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 29 additions & 26 deletions include/swift/IDE/CodeCompletion.h
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,7 @@ class CodeCompletionResult {
friend class CodeCompletionResultBuilder;

public:
enum ResultKind {
enum class ResultKind {
Declaration,
Keyword,
Pattern,
Expand All @@ -635,7 +635,7 @@ class CodeCompletionResult {

/// Describes the relationship between the type of the completion results and
/// the expected type at the code completion position.
enum ExpectedTypeRelation {
enum class ExpectedTypeRelation {
/// The result does not have a type (e.g. keyword).
NotApplicable,

Expand Down Expand Up @@ -704,12 +704,13 @@ class CodeCompletionResult {
CodeCompletionOperatorKind KnownOperatorKind =
CodeCompletionOperatorKind::None,
StringRef BriefDocComment = StringRef())
: Kind(Kind), KnownOperatorKind(unsigned(KnownOperatorKind)),
SemanticContext(unsigned(SemanticContext)), Flair(unsigned(Flair.toRaw())),
: Kind(unsigned(Kind)), KnownOperatorKind(unsigned(KnownOperatorKind)),
SemanticContext(unsigned(SemanticContext)),
Flair(unsigned(Flair.toRaw())),
NotRecommended(unsigned(NotRecommendedReason::None)),
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
BriefDocComment(BriefDocComment), TypeDistance(TypeDistance) {
assert(Kind != Declaration && "use the other constructor");
BriefDocComment(BriefDocComment), TypeDistance(unsigned(TypeDistance)) {
assert(Kind != ResultKind::Declaration && "use the other constructor");
assert(CompletionString);
if (isOperator() && KnownOperatorKind == CodeCompletionOperatorKind::None)
this->KnownOperatorKind =
Expand All @@ -726,16 +727,16 @@ class CodeCompletionResult {
/// \note The caller must ensure \c CodeCompletionString outlives this result.
CodeCompletionResult(CodeCompletionKeywordKind Kind,
SemanticContextKind SemanticContext,
CodeCompletionFlair Flair,
unsigned NumBytesToErase,
CodeCompletionFlair Flair, unsigned NumBytesToErase,
CodeCompletionString *CompletionString,
ExpectedTypeRelation TypeDistance,
StringRef BriefDocComment = StringRef())
: Kind(Keyword), KnownOperatorKind(0),
SemanticContext(unsigned(SemanticContext)), Flair(unsigned(Flair.toRaw())),
: Kind(unsigned(ResultKind::Keyword)), KnownOperatorKind(0),
SemanticContext(unsigned(SemanticContext)),
Flair(unsigned(Flair.toRaw())),
NotRecommended(unsigned(NotRecommendedReason::None)),
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
BriefDocComment(BriefDocComment), TypeDistance(TypeDistance) {
BriefDocComment(BriefDocComment), TypeDistance(unsigned(TypeDistance)) {
assert(CompletionString);
AssociatedKind = static_cast<unsigned>(Kind);
IsSystem = 0;
Expand All @@ -750,11 +751,12 @@ class CodeCompletionResult {
CodeCompletionFlair Flair, unsigned NumBytesToErase,
CodeCompletionString *CompletionString,
ExpectedTypeRelation TypeDistance)
: Kind(Literal), KnownOperatorKind(0),
SemanticContext(unsigned(SemanticContext)), Flair(unsigned(Flair.toRaw())),
: Kind(unsigned(ResultKind::Literal)), KnownOperatorKind(0),
SemanticContext(unsigned(SemanticContext)),
Flair(unsigned(Flair.toRaw())),
NotRecommended(unsigned(NotRecommendedReason::None)),
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
TypeDistance(TypeDistance) {
TypeDistance(unsigned(TypeDistance)) {
AssociatedKind = static_cast<unsigned>(LiteralKind);
IsSystem = 0;
DiagnosticSeverity = 0;
Expand All @@ -773,13 +775,13 @@ class CodeCompletionResult {
CodeCompletionResult::NotRecommendedReason NotRecReason,
StringRef BriefDocComment,
ArrayRef<StringRef> AssociatedUSRs,
enum ExpectedTypeRelation TypeDistance)
: Kind(ResultKind::Declaration), KnownOperatorKind(0),
SemanticContext(unsigned(SemanticContext)), Flair(unsigned(Flair.toRaw())),
NotRecommended(unsigned(NotRecReason)),
ExpectedTypeRelation TypeDistance)
: Kind(unsigned(ResultKind::Declaration)), KnownOperatorKind(0),
SemanticContext(unsigned(SemanticContext)),
Flair(unsigned(Flair.toRaw())), NotRecommended(unsigned(NotRecReason)),
NumBytesToErase(NumBytesToErase), CompletionString(CompletionString),
ModuleName(ModuleName), BriefDocComment(BriefDocComment),
AssociatedUSRs(AssociatedUSRs), TypeDistance(TypeDistance) {
AssociatedUSRs(AssociatedUSRs), TypeDistance(unsigned(TypeDistance)) {
assert(AssociatedDecl && "should have a decl");
AssociatedKind = unsigned(getCodeCompletionDeclKind(AssociatedDecl));
IsSystem = getDeclIsSystem(AssociatedDecl);
Expand All @@ -804,14 +806,15 @@ class CodeCompletionResult {
ArrayRef<StringRef> AssociatedUSRs,
ExpectedTypeRelation TypeDistance,
CodeCompletionOperatorKind KnownOperatorKind)
: Kind(ResultKind::Declaration),
: Kind(unsigned(ResultKind::Declaration)),
KnownOperatorKind(unsigned(KnownOperatorKind)),
SemanticContext(unsigned(SemanticContext)),
Flair(unsigned(Flair.toRaw())), NotRecommended(unsigned(NotRecReason)),
IsSystem(IsSystem), NumBytesToErase(NumBytesToErase),
CompletionString(CompletionString), ModuleName(ModuleName),
BriefDocComment(BriefDocComment), AssociatedUSRs(AssociatedUSRs),
TypeDistance(TypeDistance), DiagnosticSeverity(unsigned(diagSeverity)),
TypeDistance(unsigned(TypeDistance)),
DiagnosticSeverity(unsigned(diagSeverity)),
DiagnosticMessage(DiagnosticMessage) {
AssociatedKind = static_cast<unsigned>(DeclKind);
assert(CompletionString);
Expand All @@ -828,23 +831,23 @@ class CodeCompletionResult {
ResultKind getKind() const { return static_cast<ResultKind>(Kind); }

CodeCompletionDeclKind getAssociatedDeclKind() const {
assert(getKind() == Declaration);
assert(getKind() == ResultKind::Declaration);
return static_cast<CodeCompletionDeclKind>(AssociatedKind);
}

CodeCompletionLiteralKind getLiteralKind() const {
assert(getKind() == Literal);
assert(getKind() == ResultKind::Literal);
return static_cast<CodeCompletionLiteralKind>(AssociatedKind);
}

CodeCompletionKeywordKind getKeywordKind() const {
assert(getKind() == Keyword);
assert(getKind() == ResultKind::Keyword);
return static_cast<CodeCompletionKeywordKind>(AssociatedKind);
}

bool isOperator() const {
if (getKind() != Declaration)
return getKind() == BuiltinOperator;
if (getKind() != ResultKind::Declaration)
return getKind() == ResultKind::BuiltinOperator;
switch (getAssociatedDeclKind()) {
case CodeCompletionDeclKind::PrefixOperatorFunction:
case CodeCompletionDeclKind::PostfixOperatorFunction:
Expand Down
118 changes: 62 additions & 56 deletions lib/IDE/CodeCompletion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -631,7 +631,7 @@ void CodeCompletionResult::dump() const {
CodeCompletionResult *
CodeCompletionResult::withFlair(CodeCompletionFlair newFlair,
CodeCompletionResultSink &Sink) {
if (Kind == ResultKind::Declaration) {
if (getKind() == ResultKind::Declaration) {
return new (*Sink.Allocator) CodeCompletionResult(
getSemanticContext(), newFlair, getNumBytesToErase(),
getCompletionString(), getAssociatedDeclKind(), isSystem(),
Expand Down Expand Up @@ -3265,7 +3265,8 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
if (!IsImplicitlyCurriedInstanceMethod &&
expectedTypeContext.requiresNonVoid() &&
ResultType->isVoid()) {
Builder.setExpectedTypeRelation(CodeCompletionResult::Invalid);
Builder.setExpectedTypeRelation(
CodeCompletionResult::ExpectedTypeRelation::Invalid);
}
};

Expand Down Expand Up @@ -4321,13 +4322,14 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
if (!T)
continue;

auto typeRelation = CodeCompletionResult::Identical;
auto typeRelation = CodeCompletionResult::ExpectedTypeRelation::Identical;
// Convert through optional types unless we're looking for a protocol
// that Optional itself conforms to.
if (kind != CodeCompletionLiteralKind::NilLiteral) {
if (auto optionalObjT = T->getOptionalObjectType()) {
T = optionalObjT;
typeRelation = CodeCompletionResult::Convertible;
typeRelation =
CodeCompletionResult::ExpectedTypeRelation::Convertible;
}
}

Expand Down Expand Up @@ -4415,19 +4417,19 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
if (isCodeCompletionAtTopLevelOfLibraryFile(CurrDeclContext))
flair |= CodeCompletionFlairBit::ExpressionAtNonScriptOrMainFileScope;

auto addFromProto = [&](
CodeCompletionLiteralKind kind,
llvm::function_ref<void(CodeCompletionResultBuilder &)> consumer,
bool isKeyword = false) {

CodeCompletionResultBuilder builder(Sink, CodeCompletionResult::Literal,
SemanticContextKind::None, {});
builder.setLiteralKind(kind);
builder.addFlair(flair);

consumer(builder);
addTypeRelationFromProtocol(builder, kind);
};
auto addFromProto =
[&](CodeCompletionLiteralKind kind,
llvm::function_ref<void(CodeCompletionResultBuilder &)> consumer,
bool isKeyword = false) {
CodeCompletionResultBuilder builder(
Sink, CodeCompletionResult::ResultKind::Literal,
SemanticContextKind::None, {});
builder.setLiteralKind(kind);
builder.addFlair(flair);

consumer(builder);
addTypeRelationFromProtocol(builder, kind);
};

// FIXME: the pedantically correct way is to resolve Swift.*LiteralType.

Expand Down Expand Up @@ -4493,8 +4495,9 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {

// Add tuple completion (item, item).
{
CodeCompletionResultBuilder builder(Sink, CodeCompletionResult::Literal,
SemanticContextKind::None, {});
CodeCompletionResultBuilder builder(
Sink, CodeCompletionResult::ResultKind::Literal,
SemanticContextKind::None, {});
builder.setLiteralKind(LK::Tuple);
builder.addFlair(flair);

Expand All @@ -4504,7 +4507,8 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
for (auto T : expectedTypeContext.possibleTypes) {
if (T && T->is<TupleType>() && !T->isVoid()) {
addTypeAnnotation(builder, T);
builder.setExpectedTypeRelation(CodeCompletionResult::Identical);
builder.setExpectedTypeRelation(
CodeCompletionResult::ExpectedTypeRelation::Identical);
break;
}
}
Expand Down Expand Up @@ -6416,8 +6420,9 @@ static void addPoundDirectives(CodeCompletionResultSink &Sink) {
[&](StringRef name, CodeCompletionKeywordKind K,
llvm::function_ref<void(CodeCompletionResultBuilder &)> consumer =
nullptr) {
CodeCompletionResultBuilder Builder(Sink, CodeCompletionResult::Keyword,
SemanticContextKind::None, {});
CodeCompletionResultBuilder Builder(
Sink, CodeCompletionResult::ResultKind::Keyword,
SemanticContextKind::None, {});
Builder.addBaseName(name);
Builder.setKeywordKind(K);
if (consumer)
Expand Down Expand Up @@ -7460,41 +7465,42 @@ swift::ide::copyCodeCompletionResults(CodeCompletionResultSink &targetSink,
auto startSize = targetSink.Results.size();

if (onlyTypes) {
std::copy_if(sourceSink.Results.begin(), sourceSink.Results.end(),
std::back_inserter(targetSink.Results),
[](CodeCompletionResult *R) -> bool {
if (R->getKind() != CodeCompletionResult::Declaration)
return false;
switch(R->getAssociatedDeclKind()) {
case CodeCompletionDeclKind::Module:
case CodeCompletionDeclKind::Class:
case CodeCompletionDeclKind::Struct:
case CodeCompletionDeclKind::Enum:
case CodeCompletionDeclKind::Protocol:
case CodeCompletionDeclKind::TypeAlias:
case CodeCompletionDeclKind::AssociatedType:
case CodeCompletionDeclKind::GenericTypeParam:
return true;
case CodeCompletionDeclKind::PrecedenceGroup:
case CodeCompletionDeclKind::EnumElement:
case CodeCompletionDeclKind::Constructor:
case CodeCompletionDeclKind::Destructor:
case CodeCompletionDeclKind::Subscript:
case CodeCompletionDeclKind::StaticMethod:
case CodeCompletionDeclKind::InstanceMethod:
case CodeCompletionDeclKind::PrefixOperatorFunction:
case CodeCompletionDeclKind::PostfixOperatorFunction:
case CodeCompletionDeclKind::InfixOperatorFunction:
case CodeCompletionDeclKind::FreeFunction:
case CodeCompletionDeclKind::StaticVar:
case CodeCompletionDeclKind::InstanceVar:
case CodeCompletionDeclKind::LocalVar:
case CodeCompletionDeclKind::GlobalVar:
return false;
}
std::copy_if(
sourceSink.Results.begin(), sourceSink.Results.end(),
std::back_inserter(targetSink.Results),
[](CodeCompletionResult *R) -> bool {
if (R->getKind() != CodeCompletionResult::ResultKind::Declaration)
return false;
switch (R->getAssociatedDeclKind()) {
case CodeCompletionDeclKind::Module:
case CodeCompletionDeclKind::Class:
case CodeCompletionDeclKind::Struct:
case CodeCompletionDeclKind::Enum:
case CodeCompletionDeclKind::Protocol:
case CodeCompletionDeclKind::TypeAlias:
case CodeCompletionDeclKind::AssociatedType:
case CodeCompletionDeclKind::GenericTypeParam:
return true;
case CodeCompletionDeclKind::PrecedenceGroup:
case CodeCompletionDeclKind::EnumElement:
case CodeCompletionDeclKind::Constructor:
case CodeCompletionDeclKind::Destructor:
case CodeCompletionDeclKind::Subscript:
case CodeCompletionDeclKind::StaticMethod:
case CodeCompletionDeclKind::InstanceMethod:
case CodeCompletionDeclKind::PrefixOperatorFunction:
case CodeCompletionDeclKind::PostfixOperatorFunction:
case CodeCompletionDeclKind::InfixOperatorFunction:
case CodeCompletionDeclKind::FreeFunction:
case CodeCompletionDeclKind::StaticVar:
case CodeCompletionDeclKind::InstanceVar:
case CodeCompletionDeclKind::LocalVar:
case CodeCompletionDeclKind::GlobalVar:
return false;
}

llvm_unreachable("Unhandled CodeCompletionDeclKind in switch.");
});
llvm_unreachable("Unhandled CodeCompletionDeclKind in switch.");
});
} else if (onlyPrecedenceGroups) {
std::copy_if(sourceSink.Results.begin(), sourceSink.Results.end(),
std::back_inserter(targetSink.Results),
Expand Down
19 changes: 9 additions & 10 deletions lib/IDE/CodeCompletionCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,18 +224,17 @@ static bool readCachedModule(llvm::MemoryBuffer *in,
auto diagMessage = getString(diagMessageIndex);

CodeCompletionResult *result = nullptr;
if (kind == CodeCompletionResult::Declaration) {
if (kind == CodeCompletionResult::ResultKind::Declaration) {
result = new (*V.Sink.Allocator) CodeCompletionResult(
context, CodeCompletionFlair(), numBytesToErase, string,
declKind, isSystem, moduleName, notRecommended,
diagSeverity, diagMessage, briefDocComment,
context, CodeCompletionFlair(), numBytesToErase, string, declKind,
isSystem, moduleName, notRecommended, diagSeverity, diagMessage,
briefDocComment,
copyArray(*V.Sink.Allocator, ArrayRef<StringRef>(assocUSRs)),
CodeCompletionResult::Unknown, opKind);
CodeCompletionResult::ExpectedTypeRelation::Unknown, opKind);
} else {
result = new (*V.Sink.Allocator)
CodeCompletionResult(kind, context, CodeCompletionFlair(),
numBytesToErase, string,
CodeCompletionResult::NotApplicable, opKind);
result = new (*V.Sink.Allocator) CodeCompletionResult(
kind, context, CodeCompletionFlair(), numBytesToErase, string,
CodeCompletionResult::ExpectedTypeRelation::NotApplicable, opKind);
}

V.Sink.Results.push_back(result);
Expand Down Expand Up @@ -351,7 +350,7 @@ static void writeCachedModule(llvm::raw_ostream &out,

// FIXME: compress bitfield
LE.write(static_cast<uint8_t>(R->getKind()));
if (R->getKind() == CodeCompletionResult::Declaration)
if (R->getKind() == CodeCompletionResult::ResultKind::Declaration)
LE.write(static_cast<uint8_t>(R->getAssociatedDeclKind()));
else
LE.write(static_cast<uint8_t>(~0u));
Expand Down
2 changes: 1 addition & 1 deletion lib/IDE/CodeCompletionResultBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class CodeCompletionResultBuilder {
CurrentModule;
ExpectedTypeContext declTypeContext;
CodeCompletionResult::ExpectedTypeRelation ExpectedTypeRelation =
CodeCompletionResult::Unknown;
CodeCompletionResult::ExpectedTypeRelation::Unknown;
bool Cancelled = false;
CodeCompletionResult::NotRecommendedReason NotRecReason =
CodeCompletionResult::NotRecommendedReason::None;
Expand Down
2 changes: 1 addition & 1 deletion lib/IDE/REPLCodeCompletion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ static void toDisplayString(CodeCompletionResult *Result,
}
if (C.is(CodeCompletionString::Chunk::ChunkKind::TypeAnnotation) ||
C.is(CodeCompletionString::Chunk::ChunkKind::TypeAnnotationBegin)) {
if (Result->getKind() == CodeCompletionResult::Declaration) {
if (Result->getKind() == CodeCompletionResult::ResultKind::Declaration) {
switch (Result->getAssociatedDeclKind()) {
case CodeCompletionDeclKind::Module:
case CodeCompletionDeclKind::PrecedenceGroup:
Expand Down
Loading