diff options
Diffstat (limited to 'lib/Parse/Parser.cpp')
| -rw-r--r-- | lib/Parse/Parser.cpp | 41 | 
1 files changed, 26 insertions, 15 deletions
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index 1ed7ef9663589..72d653797c60a 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -556,10 +556,6 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {      HandlePragmaUnused();      return false; -  case tok::kw_import: -    Result = ParseModuleImport(SourceLocation()); -    return false; -    case tok::kw_export:      if (NextToken().isNot(tok::kw_module))        break; @@ -637,6 +633,9 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {  ///           ';'  ///  /// [C++0x/GNU] 'extern' 'template' declaration +/// +/// [Modules-TS] module-import-declaration +///  Parser::DeclGroupPtrTy  Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,                                   ParsingDeclSpec *DS) { @@ -753,11 +752,20 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,      SingleDecl = ParseObjCMethodDefinition();      break;    case tok::code_completion: -      Actions.CodeCompleteOrdinaryName(getCurScope(),  -                             CurParsedObjCImpl? Sema::PCC_ObjCImplementation -                                              : Sema::PCC_Namespace); +    if (CurParsedObjCImpl) { +      // Code-complete Objective-C methods even without leading '-'/'+' prefix. +      Actions.CodeCompleteObjCMethodDecl(getCurScope(), +                                         /*IsInstanceMethod=*/None, +                                         /*ReturnType=*/nullptr); +    } +    Actions.CodeCompleteOrdinaryName( +        getCurScope(), +        CurParsedObjCImpl ? Sema::PCC_ObjCImplementation : Sema::PCC_Namespace);      cutOffParsing();      return nullptr; +  case tok::kw_import: +    SingleDecl = ParseModuleImport(SourceLocation()); +    break;    case tok::kw_export:      if (getLangOpts().ModulesTS) {        SingleDecl = ParseExportDeclaration(); @@ -1073,8 +1081,9 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D,        TemplateInfo.Kind == ParsedTemplateInfo::Template &&        Actions.canDelayFunctionBody(D)) {      MultiTemplateParamsArg TemplateParameterLists(*TemplateInfo.TemplateParams); -     -    ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope); + +    ParseScope BodyScope(this, Scope::FnScope | Scope::DeclScope | +                                   Scope::CompoundStmtScope);      Scope *ParentScope = getCurScope()->getParent();      D.setFunctionDefinitionKind(FDK_Definition); @@ -1104,7 +1113,8 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D,             (Tok.is(tok::l_brace) || Tok.is(tok::kw_try) ||              Tok.is(tok::colon)) &&         Actions.CurContext->isTranslationUnit()) { -    ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope); +    ParseScope BodyScope(this, Scope::FnScope | Scope::DeclScope | +                                   Scope::CompoundStmtScope);      Scope *ParentScope = getCurScope()->getParent();      D.setFunctionDefinitionKind(FDK_Definition); @@ -1122,7 +1132,8 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D,    }    // Enter a scope for the function body. -  ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope); +  ParseScope BodyScope(this, Scope::FnScope | Scope::DeclScope | +                                 Scope::CompoundStmtScope);    // Tell the actions module that we have entered a function definition with the    // specified Declarator for the function. @@ -2045,7 +2056,7 @@ Parser::DeclGroupPtrTy Parser::ParseModuleDecl() {    SourceLocation StartLoc = Tok.getLocation();    Sema::ModuleDeclKind MDK = TryConsumeToken(tok::kw_export) -                                 ? Sema::ModuleDeclKind::Module +                                 ? Sema::ModuleDeclKind::Interface                                   : Sema::ModuleDeclKind::Implementation;    assert(Tok.is(tok::kw_module) && "not a module declaration"); @@ -2054,7 +2065,7 @@ Parser::DeclGroupPtrTy Parser::ParseModuleDecl() {    if (Tok.is(tok::identifier) && NextToken().is(tok::identifier) &&        Tok.getIdentifierInfo()->isStr("partition")) {      // If 'partition' is present, this must be a module interface unit. -    if (MDK != Sema::ModuleDeclKind::Module) +    if (MDK != Sema::ModuleDeclKind::Interface)        Diag(Tok.getLocation(), diag::err_module_implementation_partition)          << FixItHint::CreateInsertion(ModuleLoc, "export ");      MDK = Sema::ModuleDeclKind::Partition; @@ -2083,7 +2094,7 @@ Parser::DeclGroupPtrTy Parser::ParseModuleDecl() {  ///           '@' 'import' module-name ';'  /// [ModTS] module-import-declaration:  ///           'import' module-name attribute-specifier-seq[opt] ';' -Parser::DeclGroupPtrTy Parser::ParseModuleImport(SourceLocation AtLoc) { +Decl *Parser::ParseModuleImport(SourceLocation AtLoc) {    assert((AtLoc.isInvalid() ? Tok.is(tok::kw_import)                              : Tok.isObjCAtKeyword(tok::objc_import)) &&           "Improper start to module import"); @@ -2110,7 +2121,7 @@ Parser::DeclGroupPtrTy Parser::ParseModuleImport(SourceLocation AtLoc) {    if (Import.isInvalid())      return nullptr; -  return Actions.ConvertDeclToDeclGroup(Import.get()); +  return Import.get();  }  /// Parse a C++ Modules TS / Objective-C module name (both forms use the same  | 
