[cfe-commits] r122765 - in /cfe/trunk: include/clang/Lex/Preprocessor.h include/clang/Parse/Parser.h lib/Parse/ParseStmt.cpp lib/Parse/Parser.cpp test/Index/code-complete-errors.c test/Index/remap-complete.c

Douglas Gregor dgregor at apple.com
Mon Jan 3 12:32:59 PST 2011


On Jan 3, 2011, at 11:44 AM, Argyrios Kyrtzidis wrote:

> Author: akirtzidis
> Date: Mon Jan  3 13:44:02 2011
> New Revision: 122765
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=122765&view=rev
> Log:
> Speed up code-completion by skipping function bodies.
> 
> When we are in code-completion mode, skip parsing of all function bodies except the one where the
> code-completion point resides.
> 
> For big .cpp files like 'SemaExpr.cpp' the improvement makes a huge difference, in some cases cutting down
> code-completion time -62% !
> 
> We don't get diagnostics for the bodies though, so modify the code-completion tests that check for errors.
> 
> See rdar://8814203.

Very nice. Shall we do the same in Parser::ParseObjCMethodDefinition?

	- Doug

> Removed:
>    cfe/trunk/test/Index/code-complete-errors.c
> Modified:
>    cfe/trunk/include/clang/Lex/Preprocessor.h
>    cfe/trunk/include/clang/Parse/Parser.h
>    cfe/trunk/lib/Parse/ParseStmt.cpp
>    cfe/trunk/lib/Parse/Parser.cpp
>    cfe/trunk/test/Index/remap-complete.c
> 
> Modified: cfe/trunk/include/clang/Lex/Preprocessor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=122765&r1=122764&r2=122765&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/Preprocessor.h (original)
> +++ cfe/trunk/include/clang/Lex/Preprocessor.h Mon Jan  3 13:44:02 2011
> @@ -618,6 +618,9 @@
>   /// for which we are performing code completion.
>   bool isCodeCompletionFile(SourceLocation FileLoc) const;
> 
> +  /// \brief Determine if we are performing code completion.
> +  bool isCodeCompletionEnabled() const { return CodeCompletionFile != 0; }
> +
>   /// \brief Instruct the preprocessor to skip part of the main
>   /// the main source file.
>   ///
> 
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=122765&r1=122764&r2=122765&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Mon Jan  3 13:44:02 2011
> @@ -553,16 +553,17 @@
>   /// If SkipUntil finds the specified token, it returns true, otherwise it
>   /// returns false.
>   bool SkipUntil(tok::TokenKind T, bool StopAtSemi = true,
> -                 bool DontConsume = false) {
> -    return SkipUntil(&T, 1, StopAtSemi, DontConsume);
> +                 bool DontConsume = false, bool StopAtCodeCompletion = false) {
> +    return SkipUntil(&T, 1, StopAtSemi, DontConsume, StopAtCodeCompletion);
>   }
>   bool SkipUntil(tok::TokenKind T1, tok::TokenKind T2, bool StopAtSemi = true,
> -                 bool DontConsume = false) {
> +                 bool DontConsume = false, bool StopAtCodeCompletion = false) {
>     tok::TokenKind TokArray[] = {T1, T2};
> -    return SkipUntil(TokArray, 2, StopAtSemi, DontConsume);
> +    return SkipUntil(TokArray, 2, StopAtSemi, DontConsume,StopAtCodeCompletion);
>   }
>   bool SkipUntil(const tok::TokenKind *Toks, unsigned NumToks,
> -                 bool StopAtSemi = true, bool DontConsume = false);
> +                 bool StopAtSemi = true, bool DontConsume = false,
> +                 bool StopAtCodeCompletion = false);
> 
>   //===--------------------------------------------------------------------===//
>   // Lexing and parsing of C++ inline methods.
> 
> Modified: cfe/trunk/lib/Parse/ParseStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=122765&r1=122764&r2=122765&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseStmt.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseStmt.cpp Mon Jan  3 13:44:02 2011
> @@ -1466,6 +1466,19 @@
>   assert(Tok.is(tok::l_brace));
>   SourceLocation LBraceLoc = Tok.getLocation();
> 
> +  // When in code-completion, skip parsing for all function bodies unless
> +  // the body contains the code-completion point.
> +  if (PP.isCodeCompletionEnabled()) {
> +    TentativeParsingAction PA(*this);
> +    ConsumeBrace();
> +    if (SkipUntil(tok::r_brace, /*StopAtSemi=*/false, /*DontConsume=*/false,
> +                  /*StopAtCodeCompletion=*/true)) {
> +      PA.Commit();
> +      return Actions.ActOnFinishFunctionBody(Decl, 0);
> +    }
> +    PA.Revert();
> +  }
> +
>   PrettyDeclStackTraceEntry CrashInfo(Actions, Decl, LBraceLoc,
>                                       "parsing function body");
> 
> 
> Modified: cfe/trunk/lib/Parse/Parser.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=122765&r1=122764&r2=122765&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/Parser.cpp (original)
> +++ cfe/trunk/lib/Parse/Parser.cpp Mon Jan  3 13:44:02 2011
> @@ -214,7 +214,8 @@
> /// If SkipUntil finds the specified token, it returns true, otherwise it
> /// returns false.
> bool Parser::SkipUntil(const tok::TokenKind *Toks, unsigned NumToks,
> -                       bool StopAtSemi, bool DontConsume) {
> +                       bool StopAtSemi, bool DontConsume,
> +                       bool StopAtCodeCompletion) {
>   // We always want this function to skip at least one token if the first token
>   // isn't T and if not at EOF.
>   bool isFirstTokenSkipped = true;
> @@ -237,23 +238,24 @@
>       return false;
> 
>     case tok::code_completion:
> -      ConsumeToken();
> +      if (!StopAtCodeCompletion)
> +        ConsumeToken();
>       return false;
> 
>     case tok::l_paren:
>       // Recursively skip properly-nested parens.
>       ConsumeParen();
> -      SkipUntil(tok::r_paren, false);
> +      SkipUntil(tok::r_paren, false, false, StopAtCodeCompletion);
>       break;
>     case tok::l_square:
>       // Recursively skip properly-nested square brackets.
>       ConsumeBracket();
> -      SkipUntil(tok::r_square, false);
> +      SkipUntil(tok::r_square, false, false, StopAtCodeCompletion);
>       break;
>     case tok::l_brace:
>       // Recursively skip properly-nested braces.
>       ConsumeBrace();
> -      SkipUntil(tok::r_brace, false);
> +      SkipUntil(tok::r_brace, false, false, StopAtCodeCompletion);
>       break;
> 
>     // Okay, we found a ']' or '}' or ')', which we think should be balanced.
> 
> Removed: cfe/trunk/test/Index/code-complete-errors.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/code-complete-errors.c?rev=122764&view=auto
> ==============================================================================
> --- cfe/trunk/test/Index/code-complete-errors.c (original)
> +++ cfe/trunk/test/Index/code-complete-errors.c (removed)
> @@ -1,25 +0,0 @@
> -_Complex cd; // CHECK: code-complete-errors.c:1:1: warning: plain '_Complex' requires a type specifier; assuming '_Complex double'
> -// CHECK: FIX-IT: Insert " double" at 1:9
> -struct s {
> -  int x, y;; // CHECK: code-complete-errors.c:4:12: warning: extra ';' inside a struct
> -}; // CHECK: FIX-IT: Remove [4:12 - 4:13]
> -
> -struct s s0 = { y: 5 }; // CHECK: code-complete-errors.c:7:20: warning: use of GNU old-style field designator extension
> -// CHECK: FIX-IT: Replace [7:17 - 7:19] with ".y = "
> -int f(int *ptr1, float *ptr2) {
> -  return ptr1 != ptr2; // CHECK: code-complete-errors.c:10:15:{10:10-10:14}{10:18-10:22}: warning: comparison of distinct pointer types ('int *' and 'float *')
> -}
> -
> -#define expand_to_binary_function(ret, name, parm1, parm2, code) ret name(parm1, parm2) code
> -
> -expand_to_binary_function(int, g, int *ip, float *fp, {
> - // CHECK: code-complete-errors.c:17:12:{17:9-17:24}: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
> -    if (ip = (float*)fp) ;
> -// CHECK: code-complete-errors.c:19:15:{19:12-19:14}{19:18-19:20}: warning: comparison of distinct pointer types ('int *' and 'float *')
> -    return ip == fp;
> -  })
> -
> -void g() {  }
> -
> -// RUN: c-index-test -code-completion-at=%s:21:12 -pedantic %s 2> %t
> -// RUN: FileCheck -check-prefix=CHECK %s < %t
> 
> Modified: cfe/trunk/test/Index/remap-complete.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/remap-complete.c?rev=122765&r1=122764&r2=122765&view=diff
> ==============================================================================
> --- cfe/trunk/test/Index/remap-complete.c (original)
> +++ cfe/trunk/test/Index/remap-complete.c Mon Jan  3 13:44:02 2011
> @@ -1,7 +1,4 @@
> -// RUN: c-index-test -code-completion-at=%s:6:2 -remap-file="%s;%S/Inputs/remap-complete-to.c" %s 2> %t.err | FileCheck %s
> -// RUN: FileCheck -check-prefix=CHECK-DIAGS %s < %t.err
> +// RUN: c-index-test -code-completion-at=%s:6:2 -remap-file="%s;%S/Inputs/remap-complete-to.c" %s | FileCheck %s
> 
> // CHECK: FunctionDecl:{ResultType int}{TypedText f0}{LeftParen (}
> void f() { }
> -
> -// CHECK-DIAGS: remap-complete.c:2:19
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list