]> granicus.if.org Git - clang/commitdiff
Give a slight edge to the context-sensitive keyword 'super' over
authorDouglas Gregor <dgregor@apple.com>
Tue, 18 May 2010 16:30:22 +0000 (16:30 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 18 May 2010 16:30:22 +0000 (16:30 +0000)
non-function-local declarations with names similar to what the user
typed. For example, this allows us to correct 'supper' to 'super' in
an Objective-C message send, even though the C function 'isupper' has
the same edit distance.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104023 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaLookup.cpp
test/FixIt/typo.m

index 62b0ea149b796f5239381e7f42cb6f54fda13972..774a82b7c74188631316921b6909023be0153187 100644 (file)
@@ -2684,7 +2684,7 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
       Consumer.addKeywordResult(Context, "typeof");
   }
   
-  if (WantCXXNamedCasts) {
+  if (WantCXXNamedCasts && getLangOptions().CPlusPlus) {
     Consumer.addKeywordResult(Context, "const_cast");
     Consumer.addKeywordResult(Context, "dynamic_cast");
     Consumer.addKeywordResult(Context, "reinterpret_cast");
@@ -2814,6 +2814,25 @@ DeclarationName Sema::CorrectTypo(LookupResult &Res, Scope *S, CXXScopeSpec *SS,
         BestIvarOrPropertyDecl = 0;
         FoundIvarOrPropertyDecl = false;
         Consumer.clear_decls();
+      } else if (CTC == CTC_ObjCMessageReceiver &&
+                 (*Consumer.keyword_begin())->isStr("super")) {
+        // In an Objective-C message send, give the "super" keyword a slight
+        // edge over entities not in function or method scope.
+        for (TypoCorrectionConsumer::iterator I = Consumer.begin(), 
+                                           IEnd = Consumer.end();
+             I != IEnd; ++I) {
+          if ((*I)->getDeclName() == BestName) {
+            if ((*I)->getDeclContext()->isFunctionOrMethod())
+              return DeclarationName();
+          }
+        }
+        
+        // Everything found was outside a function or method; the 'super'
+        // keyword takes precedence.
+        BestIvarOrPropertyDecl = 0;
+        FoundIvarOrPropertyDecl = false;
+        Consumer.clear_decls();        
+        BestName = *Consumer.keyword_begin();
       } else {
         // Name collision; we will not correct typos.
         return DeclarationName();
index 3b73a2a33b612f2741e082016c0ed0e0b8e72f19..11447620deb3442c44a03d023c5e13a66d538876 100644 (file)
@@ -111,7 +111,6 @@ void test2(Collide *a) {
   
 @end
 
-#ifdef NON_FIXITS
 double *isupper(int);
 
 @interface Sub2 : Super
@@ -120,10 +119,9 @@ double *isupper(int);
 
 @implementation Sub2
 - (int)method2 {
-  return [supper method2]; // expected-error{{use of undeclared identifier 'supper'}}
+  return [supper method2]; // expected-error{{unknown receiver 'supper'; did you mean 'super'?}}
 }
 @end
-#endif
 
 @interface Ivar
 @end
@@ -138,7 +136,7 @@ double *isupper(int);
 @end
 
 @implementation User
-@synthesize ivar;
+@synthesize ivar; // expected-error{{synthesized property 'ivar' must either be named the same as a compatible ivar or must explicitly name an ivar}}
 
 - (void)method {
   // Test that we don't correct 'ivar' to 'Ivar'  e