diff options
Diffstat (limited to 'lib/Sema/SemaCodeComplete.cpp')
| -rw-r--r-- | lib/Sema/SemaCodeComplete.cpp | 555 | 
1 files changed, 309 insertions, 246 deletions
diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index c075d161704e..d8c1a5cd7e3e 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -127,6 +127,13 @@ namespace {      explicit ResultBuilder(Sema &SemaRef, LookupFilter Filter = 0)        : SemaRef(SemaRef), Filter(Filter), AllowNestedNameSpecifiers(false) { } +    /// \brief Whether we should include code patterns in the completion +    /// results. +    bool includeCodePatterns() const { +      return SemaRef.CodeCompleter &&  +      SemaRef.CodeCompleter->includeCodePatterns(); +    } +          /// \brief Set the filter used for code-completion results.      void setFilter(LookupFilter Filter) {        this->Filter = Filter; @@ -532,8 +539,10 @@ void ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) {    // If the filter is for nested-name-specifiers, then this result starts a    // nested-name-specifier. -  if (AsNestedNameSpecifier) +  if (AsNestedNameSpecifier) {      R.StartsNestedNameSpecifier = true; +    R.Priority = CCP_NestedNameSpecifier; +  }    // If this result is supposed to have an informative qualifier, add one.    if (R.QualifierIsInformative && !R.Qualifier && @@ -581,8 +590,10 @@ void ResultBuilder::AddResult(Result R, DeclContext *CurContext,    // If the filter is for nested-name-specifiers, then this result starts a    // nested-name-specifier. -  if (AsNestedNameSpecifier) +  if (AsNestedNameSpecifier) {      R.StartsNestedNameSpecifier = true; +    R.Priority = CCP_NestedNameSpecifier; +  }    else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass &&             isa<CXXRecordDecl>(R.Declaration->getDeclContext()                                                    ->getLookupContext())) @@ -601,6 +612,10 @@ void ResultBuilder::AddResult(Result R, DeclContext *CurContext,        R.QualifierIsInformative = false;    } +  // Adjust the priority if this result comes from a base class. +  if (InBaseClass) +    R.Priority += CCD_InBaseClass; +      // Insert this result into the set of results.    Results.push_back(R);  } @@ -672,8 +687,8 @@ bool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const {      ND = ClassTemplate->getTemplatedDecl();    if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) -    return RD->getTagKind() == TagDecl::TK_class || -    RD->getTagKind() == TagDecl::TK_struct; +    return RD->getTagKind() == TTK_Class || +    RD->getTagKind() == TTK_Struct;    return false;  } @@ -685,7 +700,7 @@ bool ResultBuilder::IsUnion(NamedDecl *ND) const {      ND = ClassTemplate->getTemplatedDecl();    if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) -    return RD->getTagKind() == TagDecl::TK_union; +    return RD->getTagKind() == TTK_Union;    return false;  } @@ -744,47 +759,56 @@ namespace {  static void AddTypeSpecifierResults(const LangOptions &LangOpts,                                      ResultBuilder &Results) {    typedef CodeCompleteConsumer::Result Result; -  Results.AddResult(Result("short")); -  Results.AddResult(Result("long")); -  Results.AddResult(Result("signed")); -  Results.AddResult(Result("unsigned")); -  Results.AddResult(Result("void")); -  Results.AddResult(Result("char")); -  Results.AddResult(Result("int")); -  Results.AddResult(Result("float")); -  Results.AddResult(Result("double")); -  Results.AddResult(Result("enum")); -  Results.AddResult(Result("struct")); -  Results.AddResult(Result("union")); -  Results.AddResult(Result("const")); -  Results.AddResult(Result("volatile")); +  Results.AddResult(Result("short", CCP_Type)); +  Results.AddResult(Result("long", CCP_Type)); +  Results.AddResult(Result("signed", CCP_Type)); +  Results.AddResult(Result("unsigned", CCP_Type)); +  Results.AddResult(Result("void", CCP_Type)); +  Results.AddResult(Result("char", CCP_Type)); +  Results.AddResult(Result("int", CCP_Type)); +  Results.AddResult(Result("float", CCP_Type)); +  Results.AddResult(Result("double", CCP_Type)); +  Results.AddResult(Result("enum", CCP_Type)); +  Results.AddResult(Result("struct", CCP_Type)); +  Results.AddResult(Result("union", CCP_Type)); +  Results.AddResult(Result("const", CCP_Type)); +  Results.AddResult(Result("volatile", CCP_Type));    if (LangOpts.C99) {      // C99-specific -    Results.AddResult(Result("_Complex")); -    Results.AddResult(Result("_Imaginary")); -    Results.AddResult(Result("_Bool")); -    Results.AddResult(Result("restrict")); +    Results.AddResult(Result("_Complex", CCP_Type)); +    Results.AddResult(Result("_Imaginary", CCP_Type)); +    Results.AddResult(Result("_Bool", CCP_Type)); +    Results.AddResult(Result("restrict", CCP_Type));    }    if (LangOpts.CPlusPlus) {      // C++-specific -    Results.AddResult(Result("bool")); -    Results.AddResult(Result("class")); -    Results.AddResult(Result("wchar_t")); +    Results.AddResult(Result("bool", CCP_Type)); +    Results.AddResult(Result("class", CCP_Type)); +    Results.AddResult(Result("wchar_t", CCP_Type)); +     +    if (Results.includeCodePatterns()) { +      // typename qualified-id +      CodeCompletionString *Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("typename"); +      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +      Pattern->AddPlaceholderChunk("qualified-id"); +      Results.AddResult(Result(Pattern)); +    } -    // typename qualified-id -    CodeCompletionString *Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("typename"); -    Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -    Pattern->AddPlaceholderChunk("qualified-id"); -    Results.AddResult(Result(Pattern)); -      if (LangOpts.CPlusPlus0x) { -      Results.AddResult(Result("auto")); -      Results.AddResult(Result("char16_t")); -      Results.AddResult(Result("char32_t")); -      Results.AddResult(Result("decltype")); +      Results.AddResult(Result("auto", CCP_Type)); +      Results.AddResult(Result("char16_t", CCP_Type)); +      Results.AddResult(Result("char32_t", CCP_Type)); +      if (Results.includeCodePatterns()) { +        CodeCompletionString *Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("decltype"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +        Pattern->AddPlaceholderChunk("expression-or-type"); +        Pattern->AddChunk(CodeCompletionString::CK_RightParen); +        Results.AddResult(Result(Pattern)); +      }      }    } @@ -795,12 +819,14 @@ static void AddTypeSpecifierResults(const LangOptions &LangOpts,      //    Results.AddResult(Result("_Decimal64"));      //    Results.AddResult(Result("_Decimal128")); -    CodeCompletionString *Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("typeof"); -    Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -    Pattern->AddPlaceholderChunk("expression-or-type"); -    Pattern->AddChunk(CodeCompletionString::CK_RightParen); -    Results.AddResult(Result(Pattern)); +    if (Results.includeCodePatterns()) { +      CodeCompletionString *Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("typeof"); +      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +      Pattern->AddPlaceholderChunk("expression-or-type"); +      Pattern->AddChunk(CodeCompletionString::CK_RightParen); +      Results.AddResult(Result(Pattern)); +    }    }  } @@ -843,6 +869,7 @@ static void AddFunctionSpecifiers(Action::CodeCompletionContext CCC,    case Action::CCC_Statement:    case Action::CCC_ForInit:    case Action::CCC_Condition: +  case Action::CCC_RecoveryInFunction:      break;    }  } @@ -868,7 +895,7 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,    typedef CodeCompleteConsumer::Result Result;    switch (CCC) {    case Action::CCC_Namespace: -    if (SemaRef.getLangOptions().CPlusPlus) { +    if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) {        // namespace <identifier> { }        CodeCompletionString *Pattern = new CodeCompletionString;        Pattern->AddTypedTextChunk("namespace"); @@ -920,8 +947,10 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,      // Fall through    case Action::CCC_Class: -    Results.AddResult(Result("typedef")); -    if (SemaRef.getLangOptions().CPlusPlus) { +    if (Results.includeCodePatterns()) +      Results.AddResult(Result("typedef")); +       +    if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) {        // Using declaration        CodeCompletionString *Pattern = new CodeCompletionString;        Pattern->AddTypedTextChunk("using"); @@ -964,7 +993,7 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,    case Action::CCC_Template:    case Action::CCC_MemberTemplate: -    if (SemaRef.getLangOptions().CPlusPlus) { +    if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) {        // template < parameters >        CodeCompletionString *Pattern = new CodeCompletionString;        Pattern->AddTypedTextChunk("template"); @@ -994,11 +1023,13 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,      AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true);      break; +  case Action::CCC_RecoveryInFunction:    case Action::CCC_Statement: { -    Results.AddResult(Result("typedef")); +    if (Results.includeCodePatterns()) +      Results.AddResult(Result("typedef"));      CodeCompletionString *Pattern = 0; -    if (SemaRef.getLangOptions().CPlusPlus) { +    if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) {        Pattern = new CodeCompletionString;        Pattern->AddTypedTextChunk("try");        Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); @@ -1018,37 +1049,39 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,      if (SemaRef.getLangOptions().ObjC1)        AddObjCStatementResults(Results, true); -    // if (condition) { statements } -    Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("if"); -    Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -    if (SemaRef.getLangOptions().CPlusPlus) -      Pattern->AddPlaceholderChunk("condition"); -    else -      Pattern->AddPlaceholderChunk("expression"); -    Pattern->AddChunk(CodeCompletionString::CK_RightParen); -    Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); -    Pattern->AddPlaceholderChunk("statements"); -    Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); -    Pattern->AddChunk(CodeCompletionString::CK_RightBrace); -    Results.AddResult(Result(Pattern)); - -    // switch (condition) { } -    Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("switch"); -    Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -    if (SemaRef.getLangOptions().CPlusPlus) -      Pattern->AddPlaceholderChunk("condition"); -    else -      Pattern->AddPlaceholderChunk("expression"); -    Pattern->AddChunk(CodeCompletionString::CK_RightParen); -    Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); -    Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); -    Pattern->AddChunk(CodeCompletionString::CK_RightBrace); -    Results.AddResult(Result(Pattern)); +    if (Results.includeCodePatterns()) { +      // if (condition) { statements } +      Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("if"); +      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +      if (SemaRef.getLangOptions().CPlusPlus) +        Pattern->AddPlaceholderChunk("condition"); +      else +        Pattern->AddPlaceholderChunk("expression"); +      Pattern->AddChunk(CodeCompletionString::CK_RightParen); +      Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); +      Pattern->AddPlaceholderChunk("statements"); +      Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); +      Pattern->AddChunk(CodeCompletionString::CK_RightBrace); +      Results.AddResult(Result(Pattern)); +      // switch (condition) { } +      Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("switch"); +      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +      if (SemaRef.getLangOptions().CPlusPlus) +        Pattern->AddPlaceholderChunk("condition"); +      else +        Pattern->AddPlaceholderChunk("expression"); +      Pattern->AddChunk(CodeCompletionString::CK_RightParen); +      Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); +      Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); +      Pattern->AddChunk(CodeCompletionString::CK_RightBrace); +      Results.AddResult(Result(Pattern)); +    } +          // Switch-specific statements. -    if (!SemaRef.getSwitchStack().empty()) { +    if (!SemaRef.getSwitchStack().empty() && Results.includeCodePatterns()) {        // case expression:        Pattern = new CodeCompletionString;        Pattern->AddTypedTextChunk("case"); @@ -1063,52 +1096,54 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,        Results.AddResult(Result(Pattern));      } -    /// while (condition) { statements } -    Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("while"); -    Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -    if (SemaRef.getLangOptions().CPlusPlus) -      Pattern->AddPlaceholderChunk("condition"); -    else -      Pattern->AddPlaceholderChunk("expression"); -    Pattern->AddChunk(CodeCompletionString::CK_RightParen); -    Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); -    Pattern->AddPlaceholderChunk("statements"); -    Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); -    Pattern->AddChunk(CodeCompletionString::CK_RightBrace); -    Results.AddResult(Result(Pattern)); +    if (Results.includeCodePatterns()) { +      /// while (condition) { statements } +      Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("while"); +      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +      if (SemaRef.getLangOptions().CPlusPlus) +        Pattern->AddPlaceholderChunk("condition"); +      else +        Pattern->AddPlaceholderChunk("expression"); +      Pattern->AddChunk(CodeCompletionString::CK_RightParen); +      Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); +      Pattern->AddPlaceholderChunk("statements"); +      Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); +      Pattern->AddChunk(CodeCompletionString::CK_RightBrace); +      Results.AddResult(Result(Pattern)); -    // do { statements } while ( expression ); -    Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("do"); -    Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); -    Pattern->AddPlaceholderChunk("statements"); -    Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); -    Pattern->AddChunk(CodeCompletionString::CK_RightBrace); -    Pattern->AddTextChunk("while"); -    Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -    Pattern->AddPlaceholderChunk("expression"); -    Pattern->AddChunk(CodeCompletionString::CK_RightParen); -    Results.AddResult(Result(Pattern)); +      // do { statements } while ( expression ); +      Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("do"); +      Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); +      Pattern->AddPlaceholderChunk("statements"); +      Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); +      Pattern->AddChunk(CodeCompletionString::CK_RightBrace); +      Pattern->AddTextChunk("while"); +      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +      Pattern->AddPlaceholderChunk("expression"); +      Pattern->AddChunk(CodeCompletionString::CK_RightParen); +      Results.AddResult(Result(Pattern)); -    // for ( for-init-statement ; condition ; expression ) { statements } -    Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("for"); -    Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -    if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) -      Pattern->AddPlaceholderChunk("init-statement"); -    else -      Pattern->AddPlaceholderChunk("init-expression"); -    Pattern->AddChunk(CodeCompletionString::CK_SemiColon); -    Pattern->AddPlaceholderChunk("condition"); -    Pattern->AddChunk(CodeCompletionString::CK_SemiColon); -    Pattern->AddPlaceholderChunk("inc-expression"); -    Pattern->AddChunk(CodeCompletionString::CK_RightParen); -    Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); -    Pattern->AddPlaceholderChunk("statements"); -    Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); -    Pattern->AddChunk(CodeCompletionString::CK_RightBrace); -    Results.AddResult(Result(Pattern)); +      // for ( for-init-statement ; condition ; expression ) { statements } +      Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("for"); +      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +      if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) +        Pattern->AddPlaceholderChunk("init-statement"); +      else +        Pattern->AddPlaceholderChunk("init-expression"); +      Pattern->AddChunk(CodeCompletionString::CK_SemiColon); +      Pattern->AddPlaceholderChunk("condition"); +      Pattern->AddChunk(CodeCompletionString::CK_SemiColon); +      Pattern->AddPlaceholderChunk("inc-expression"); +      Pattern->AddChunk(CodeCompletionString::CK_RightParen); +      Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); +      Pattern->AddPlaceholderChunk("statements"); +      Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); +      Pattern->AddChunk(CodeCompletionString::CK_RightBrace); +      Results.AddResult(Result(Pattern)); +    }      if (S->getContinueParent()) {        // continue ; @@ -1143,21 +1178,23 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,      }      Results.AddResult(Result(Pattern)); -    // goto identifier ; -    Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("goto"); -    Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -    Pattern->AddPlaceholderChunk("identifier"); -    Results.AddResult(Result(Pattern));     +    if (Results.includeCodePatterns()) { +      // goto identifier ; +      Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("goto"); +      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +      Pattern->AddPlaceholderChunk("identifier"); +      Results.AddResult(Result(Pattern));     -    // Using directives -    Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("using"); -    Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -    Pattern->AddTextChunk("namespace"); -    Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -    Pattern->AddPlaceholderChunk("identifier"); -    Results.AddResult(Result(Pattern)); +      // Using directives +      Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("using"); +      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +      Pattern->AddTextChunk("namespace"); +      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +      Pattern->AddPlaceholderChunk("identifier"); +      Results.AddResult(Result(Pattern)); +    }    }    // Fall through (for statement expressions). @@ -1178,103 +1215,107 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,        Results.AddResult(Result("true"));        Results.AddResult(Result("false")); -      // dynamic_cast < type-id > ( expression ) -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("dynamic_cast"); -      Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); -      Pattern->AddPlaceholderChunk("type-id"); -      Pattern->AddChunk(CodeCompletionString::CK_RightAngle); -      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -      Pattern->AddPlaceholderChunk("expression"); -      Pattern->AddChunk(CodeCompletionString::CK_RightParen); -      Results.AddResult(Result(Pattern));       -       -      // static_cast < type-id > ( expression ) -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("static_cast"); -      Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); -      Pattern->AddPlaceholderChunk("type-id"); -      Pattern->AddChunk(CodeCompletionString::CK_RightAngle); -      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -      Pattern->AddPlaceholderChunk("expression"); -      Pattern->AddChunk(CodeCompletionString::CK_RightParen); -      Results.AddResult(Result(Pattern));       - -      // reinterpret_cast < type-id > ( expression ) -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("reinterpret_cast"); -      Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); -      Pattern->AddPlaceholderChunk("type-id"); -      Pattern->AddChunk(CodeCompletionString::CK_RightAngle); -      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -      Pattern->AddPlaceholderChunk("expression"); -      Pattern->AddChunk(CodeCompletionString::CK_RightParen); -      Results.AddResult(Result(Pattern));       +      if (Results.includeCodePatterns()) { +        // dynamic_cast < type-id > ( expression ) +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("dynamic_cast"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); +        Pattern->AddPlaceholderChunk("type-id"); +        Pattern->AddChunk(CodeCompletionString::CK_RightAngle); +        Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +        Pattern->AddPlaceholderChunk("expression"); +        Pattern->AddChunk(CodeCompletionString::CK_RightParen); +        Results.AddResult(Result(Pattern));       +         +        // static_cast < type-id > ( expression ) +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("static_cast"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); +        Pattern->AddPlaceholderChunk("type-id"); +        Pattern->AddChunk(CodeCompletionString::CK_RightAngle); +        Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +        Pattern->AddPlaceholderChunk("expression"); +        Pattern->AddChunk(CodeCompletionString::CK_RightParen); +        Results.AddResult(Result(Pattern));       -      // const_cast < type-id > ( expression ) -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("const_cast"); -      Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); -      Pattern->AddPlaceholderChunk("type-id"); -      Pattern->AddChunk(CodeCompletionString::CK_RightAngle); -      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -      Pattern->AddPlaceholderChunk("expression"); -      Pattern->AddChunk(CodeCompletionString::CK_RightParen); -      Results.AddResult(Result(Pattern));       +        // reinterpret_cast < type-id > ( expression ) +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("reinterpret_cast"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); +        Pattern->AddPlaceholderChunk("type-id"); +        Pattern->AddChunk(CodeCompletionString::CK_RightAngle); +        Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +        Pattern->AddPlaceholderChunk("expression"); +        Pattern->AddChunk(CodeCompletionString::CK_RightParen); +        Results.AddResult(Result(Pattern));       -      // typeid ( expression-or-type ) -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("typeid"); -      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -      Pattern->AddPlaceholderChunk("expression-or-type"); -      Pattern->AddChunk(CodeCompletionString::CK_RightParen); -      Results.AddResult(Result(Pattern));       +        // const_cast < type-id > ( expression ) +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("const_cast"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); +        Pattern->AddPlaceholderChunk("type-id"); +        Pattern->AddChunk(CodeCompletionString::CK_RightAngle); +        Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +        Pattern->AddPlaceholderChunk("expression"); +        Pattern->AddChunk(CodeCompletionString::CK_RightParen); +        Results.AddResult(Result(Pattern));       -      // new T ( ... ) -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("new"); -      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -      Pattern->AddPlaceholderChunk("type-id"); -      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -      Pattern->AddPlaceholderChunk("expressions"); -      Pattern->AddChunk(CodeCompletionString::CK_RightParen); -      Results.AddResult(Result(Pattern));       +        // typeid ( expression-or-type ) +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("typeid"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +        Pattern->AddPlaceholderChunk("expression-or-type"); +        Pattern->AddChunk(CodeCompletionString::CK_RightParen); +        Results.AddResult(Result(Pattern));       -      // new T [ ] ( ... ) -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("new"); -      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -      Pattern->AddPlaceholderChunk("type-id"); -      Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); -      Pattern->AddPlaceholderChunk("size"); -      Pattern->AddChunk(CodeCompletionString::CK_RightBracket); -      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -      Pattern->AddPlaceholderChunk("expressions"); -      Pattern->AddChunk(CodeCompletionString::CK_RightParen); -      Results.AddResult(Result(Pattern));       +        // new T ( ... ) +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("new"); +        Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +        Pattern->AddPlaceholderChunk("type-id"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +        Pattern->AddPlaceholderChunk("expressions"); +        Pattern->AddChunk(CodeCompletionString::CK_RightParen); +        Results.AddResult(Result(Pattern));       -      // delete expression -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("delete"); -      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -      Pattern->AddPlaceholderChunk("expression"); -      Results.AddResult(Result(Pattern));       +        // new T [ ] ( ... ) +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("new"); +        Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +        Pattern->AddPlaceholderChunk("type-id"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); +        Pattern->AddPlaceholderChunk("size"); +        Pattern->AddChunk(CodeCompletionString::CK_RightBracket); +        Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +        Pattern->AddPlaceholderChunk("expressions"); +        Pattern->AddChunk(CodeCompletionString::CK_RightParen); +        Results.AddResult(Result(Pattern));       + +        // delete expression +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("delete"); +        Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +        Pattern->AddPlaceholderChunk("expression"); +        Results.AddResult(Result(Pattern));       -      // delete [] expression -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("delete"); -      Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); -      Pattern->AddChunk(CodeCompletionString::CK_RightBracket); -      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -      Pattern->AddPlaceholderChunk("expression"); -      Results.AddResult(Result(Pattern)); +        // delete [] expression +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("delete"); +        Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); +        Pattern->AddChunk(CodeCompletionString::CK_RightBracket); +        Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +        Pattern->AddPlaceholderChunk("expression"); +        Results.AddResult(Result(Pattern)); -      // throw expression -      Pattern = new CodeCompletionString; -      Pattern->AddTypedTextChunk("throw"); -      Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); -      Pattern->AddPlaceholderChunk("expression"); -      Results.AddResult(Result(Pattern)); +        // throw expression +        Pattern = new CodeCompletionString; +        Pattern->AddTypedTextChunk("throw"); +        Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); +        Pattern->AddPlaceholderChunk("expression"); +        Results.AddResult(Result(Pattern)); +      } +       +      // FIXME: Rethrow?      }      if (SemaRef.getLangOptions().ObjC1) { @@ -1286,13 +1327,15 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,        AddObjCExpressionResults(Results, true);      } -    // sizeof expression -    Pattern = new CodeCompletionString; -    Pattern->AddTypedTextChunk("sizeof"); -    Pattern->AddChunk(CodeCompletionString::CK_LeftParen); -    Pattern->AddPlaceholderChunk("expression-or-type"); -    Pattern->AddChunk(CodeCompletionString::CK_RightParen); -    Results.AddResult(Result(Pattern)); +    if (Results.includeCodePatterns()) { +      // sizeof expression +      Pattern = new CodeCompletionString; +      Pattern->AddTypedTextChunk("sizeof"); +      Pattern->AddChunk(CodeCompletionString::CK_LeftParen); +      Pattern->AddPlaceholderChunk("expression-or-type"); +      Pattern->AddChunk(CodeCompletionString::CK_RightParen); +      Results.AddResult(Result(Pattern)); +    }      break;    }    } @@ -1543,7 +1586,7 @@ CodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S) {      return Result;    } -  assert(Kind == RK_Declaration && "Missed a macro kind?"); +  assert(Kind == RK_Declaration && "Missed a result kind?");    NamedDecl *ND = Declaration;    if (StartsNestedNameSpecifier) { @@ -1925,6 +1968,10 @@ void Sema::CodeCompleteOrdinaryName(Scope *S,    case CCC_Condition:      Results.setFilter(&ResultBuilder::IsOrdinaryName);      break; +       +  case CCC_RecoveryInFunction: +    // Unfiltered +    break;    }    CodeCompletionDeclConsumer Consumer(Results, CurContext); @@ -2047,14 +2094,14 @@ void Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE,           I != E; ++I)        AddObjCProperties(*I, true, CurContext, Results);    } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || -             (!IsArrow && BaseType->isObjCInterfaceType())) { +             (!IsArrow && BaseType->isObjCObjectType())) {      // Objective-C instance variable access.      ObjCInterfaceDecl *Class = 0;      if (const ObjCObjectPointerType *ObjCPtr                                      = BaseType->getAs<ObjCObjectPointerType>())        Class = ObjCPtr->getInterfaceDecl();      else -      Class = BaseType->getAs<ObjCInterfaceType>()->getDecl(); +      Class = BaseType->getAs<ObjCObjectType>()->getInterface();      // Add all ivars from this class and its superclasses.      if (Class) { @@ -2413,6 +2460,9 @@ void Sema::CodeCompleteOperatorName(Scope *S) {  static void AddObjCImplementationResults(const LangOptions &LangOpts,                                           ResultBuilder &Results,                                           bool NeedAt) { +  if (!Results.includeCodePatterns()) +    return; +      typedef CodeCompleteConsumer::Result Result;    // Since we have an implementation, we can end it.    Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); @@ -2438,6 +2488,9 @@ static void AddObjCImplementationResults(const LangOptions &LangOpts,  static void AddObjCInterfaceResults(const LangOptions &LangOpts,                                      ResultBuilder &Results,                                      bool NeedAt) { +  if (!Results.includeCodePatterns()) +    return; +      typedef CodeCompleteConsumer::Result Result;    // Since we have an interface or protocol, we can end it. @@ -2456,6 +2509,9 @@ static void AddObjCInterfaceResults(const LangOptions &LangOpts,  }  static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { +  if (!Results.includeCodePatterns()) +    return; +      typedef CodeCompleteConsumer::Result Result;    CodeCompletionString *Pattern = 0; @@ -2515,6 +2571,9 @@ void Sema::CodeCompleteObjCAtDirective(Scope *S, DeclPtrTy ObjCImpDecl,  }  static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { +  if (!Results.includeCodePatterns()) +    return; +      typedef CodeCompleteConsumer::Result Result;    CodeCompletionString *Pattern = 0; @@ -2544,6 +2603,9 @@ static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) {  }  static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { +  if (!Results.includeCodePatterns()) +    return; +      typedef CodeCompleteConsumer::Result Result;    CodeCompletionString *Pattern = 0; @@ -2590,6 +2652,9 @@ static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) {  static void AddObjCVisibilityResults(const LangOptions &LangOpts,                                       ResultBuilder &Results,                                       bool NeedAt) { +  if (!Results.includeCodePatterns()) +    return; +      typedef CodeCompleteConsumer::Result Result;    Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private)));    Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); @@ -2911,9 +2976,9 @@ static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {    ObjCInterfaceDecl *IFace = 0;    switch (Msg->getReceiverKind()) {    case ObjCMessageExpr::Class: -    if (const ObjCInterfaceType *IFaceType -                           = Msg->getClassReceiver()->getAs<ObjCInterfaceType>()) -      IFace = IFaceType->getDecl(); +    if (const ObjCObjectType *ObjType +                           = Msg->getClassReceiver()->getAs<ObjCObjectType>()) +      IFace = ObjType->getInterface();      break;    case ObjCMessageExpr::Instance: { @@ -2994,9 +3059,9 @@ void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,      if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {        // "super" names an interface. Use it.      } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { -      if (const ObjCInterfaceType *Iface -            = Context.getTypeDeclType(TD)->getAs<ObjCInterfaceType>()) -        CDecl = Iface->getDecl(); +      if (const ObjCObjectType *Iface +            = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) +        CDecl = Iface->getInterface();      } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {        // "super" names an unresolved type; we can't be more specific.      } else { @@ -3030,8 +3095,8 @@ void Sema::CodeCompleteObjCClassMessage(Scope *S, TypeTy *Receiver,    if (Receiver) {      QualType T = GetTypeFromParser(Receiver, 0);      if (!T.isNull())  -      if (const ObjCInterfaceType *Interface = T->getAs<ObjCInterfaceType>()) -        CDecl = Interface->getDecl(); +      if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) +        CDecl = Interface->getInterface();    }    // Add all of the factory methods in this Objective-C class, its protocols, @@ -3079,8 +3144,6 @@ void Sema::CodeCompleteObjCClassMessage(Scope *S, TypeTy *Receiver,    }    Results.ExitScope(); -   -  // This also suppresses remaining diagnostics.    HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size());  }  | 
