When performing code completion for a case statement in a switch whose

condition is not of enumeration type, provide code-completion results
containing all values of integral or enumeral type.

llvm-svn: 109677
This commit is contained in:
Douglas Gregor
2010-07-28 21:50:18 +00:00
parent 04f5c31e98
commit 85b5063f2c
3 changed files with 44 additions and 6 deletions

View File

@@ -227,6 +227,7 @@ namespace {
//@{
bool IsOrdinaryName(NamedDecl *ND) const;
bool IsOrdinaryNonTypeName(NamedDecl *ND) const;
bool IsIntegralConstantValue(NamedDecl *ND) const;
bool IsOrdinaryNonValueName(NamedDecl *ND) const;
bool IsNestedNameSpecifier(NamedDecl *ND) const;
bool IsEnum(NamedDecl *ND) const;
@@ -821,6 +822,17 @@ bool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const {
return ND->getIdentifierNamespace() & IDNS;
}
bool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const {
if (!IsOrdinaryNonTypeName(ND))
return 0;
if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl()))
if (VD->getType()->isIntegralOrEnumerationType())
return true;
return false;
}
/// \brief Determines whether this given declaration will be found by
/// ordinary name lookup.
bool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const {
@@ -2271,11 +2283,17 @@ void Sema::CodeCompleteOrdinaryName(Scope *S,
/// \brief Perform code-completion in an expression context when we know what
/// type we're looking for.
void Sema::CodeCompleteExpression(Scope *S, QualType T) {
///
/// \param IntegralConstantExpression Only permit integral constant
/// expressions.
void Sema::CodeCompleteExpression(Scope *S, QualType T,
bool IntegralConstantExpression) {
typedef CodeCompleteConsumer::Result Result;
ResultBuilder Results(*this);
if (WantTypesInContext(CCC_Expression, getLangOptions()))
if (IntegralConstantExpression)
Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
else if (WantTypesInContext(CCC_Expression, getLangOptions()))
Results.setFilter(&ResultBuilder::IsOrdinaryName);
else
Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
@@ -2476,8 +2494,10 @@ void Sema::CodeCompleteCase(Scope *S) {
return;
SwitchStmt *Switch = getSwitchStack().back();
if (!Switch->getCond()->getType()->isEnumeralType())
if (!Switch->getCond()->getType()->isEnumeralType()) {
CodeCompleteExpression(S, Switch->getCond()->getType(), true);
return;
}
// Code-complete the cases of a switch statement over an enumeration type
// by providing the list of