r275590 - [AST] Keep track of the left brace source location of a tag decl.

Vassil Vassilev via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 26 01:36:40 PDT 2016


Thanks! This is really handy interface. Would it make sense adding the 
same for NamespaceDecl for consistency?
On 15/07/16 20:11, Argyrios Kyrtzidis via cfe-commits wrote:
> Author: akirtzidis
> Date: Fri Jul 15 13:11:33 2016
> New Revision: 275590
>
> URL: http://llvm.org/viewvc/llvm-project?rev=275590&view=rev
> Log:
> [AST] Keep track of the left brace source location of a tag decl.
>
> This is useful for source modification tools. There will be a follow-up commit using it.
>
> Modified:
>      cfe/trunk/include/clang/AST/Decl.h
>      cfe/trunk/include/clang/Sema/Sema.h
>      cfe/trunk/lib/AST/Decl.cpp
>      cfe/trunk/lib/AST/DeclTemplate.cpp
>      cfe/trunk/lib/Parse/ParseDecl.cpp
>      cfe/trunk/lib/Parse/ParseDeclCXX.cpp
>      cfe/trunk/lib/Sema/SemaDecl.cpp
>      cfe/trunk/lib/Sema/SemaTemplate.cpp
>      cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
>      cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
>      cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>      cfe/trunk/lib/Serialization/ASTWriter.cpp
>      cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
>
> Modified: cfe/trunk/include/clang/AST/Decl.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Decl.h (original)
> +++ cfe/trunk/include/clang/AST/Decl.h Fri Jul 15 13:11:33 2016
> @@ -2781,7 +2781,7 @@ protected:
>     /// the TU.
>     unsigned IsCompleteDefinitionRequired : 1;
>   private:
> -  SourceLocation RBraceLoc;
> +  SourceRange BraceRange;
>   
>     // A struct representing syntactic qualifier info,
>     // to be used for the (uncommon) case of out-of-line declarations.
> @@ -2843,8 +2843,8 @@ public:
>     using redeclarable_base::getMostRecentDecl;
>     using redeclarable_base::isFirstDecl;
>   
> -  SourceLocation getRBraceLoc() const { return RBraceLoc; }
> -  void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
> +  SourceRange getBraceRange() const { return BraceRange; }
> +  void setBraceRange(SourceRange R) { BraceRange = R; }
>   
>     /// getInnerLocStart - Return SourceLocation representing start of source
>     /// range ignoring outer template declarations.
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Jul 15 13:11:33 2016
> @@ -2039,7 +2039,7 @@ public:
>     /// ActOnTagFinishDefinition - Invoked once we have finished parsing
>     /// the definition of a tag (enumeration, class, struct, or union).
>     void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl,
> -                                SourceLocation RBraceLoc);
> +                                SourceRange BraceRange);
>   
>     void ActOnTagFinishSkippedDefinition(SkippedDefinitionContext Context);
>   
> @@ -2076,8 +2076,8 @@ public:
>                             SourceLocation IdLoc, IdentifierInfo *Id,
>                             AttributeList *Attrs,
>                             SourceLocation EqualLoc, Expr *Val);
> -  void ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
> -                     SourceLocation RBraceLoc, Decl *EnumDecl,
> +  void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
> +                     Decl *EnumDecl,
>                        ArrayRef<Decl *> Elements,
>                        Scope *S, AttributeList *Attr);
>   
>
> Modified: cfe/trunk/lib/AST/Decl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Decl.cpp (original)
> +++ cfe/trunk/lib/AST/Decl.cpp Fri Jul 15 13:11:33 2016
> @@ -3525,6 +3525,7 @@ SourceLocation TagDecl::getOuterLocStart
>   }
>   
>   SourceRange TagDecl::getSourceRange() const {
> +  SourceLocation RBraceLoc = BraceRange.getEnd();
>     SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation();
>     return SourceRange(getOuterLocStart(), E);
>   }
>
> Modified: cfe/trunk/lib/AST/DeclTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclTemplate.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclTemplate.cpp (original)
> +++ cfe/trunk/lib/AST/DeclTemplate.cpp Fri Jul 15 13:11:33 2016
> @@ -778,7 +778,7 @@ ClassTemplateSpecializationDecl::getSour
>                getSpecializationKind() == TSK_ExplicitInstantiationDefinition);
>         if (getExternLoc().isValid())
>           Begin = getExternLoc();
> -      SourceLocation End = getRBraceLoc();
> +      SourceLocation End = getBraceRange().getEnd();
>         if (End.isInvalid())
>           End = getTypeAsWritten()->getTypeLoc().getEndLoc();
>         return SourceRange(Begin, End);
>
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Fri Jul 15 13:11:33 2016
> @@ -3773,8 +3773,7 @@ void Parser::ParseStructUnionBody(Source
>                         T.getOpenLocation(), T.getCloseLocation(),
>                         attrs.getList());
>     StructScope.Exit();
> -  Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl,
> -                                   T.getCloseLocation());
> +  Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, T.getRange());
>   }
>   
>   /// ParseEnumSpecifier
> @@ -4269,7 +4268,7 @@ void Parser::ParseEnumBody(SourceLocatio
>     ParsedAttributes attrs(AttrFactory);
>     MaybeParseGNUAttributes(attrs);
>   
> -  Actions.ActOnEnumBody(StartLoc, T.getOpenLocation(), T.getCloseLocation(),
> +  Actions.ActOnEnumBody(StartLoc, T.getRange(),
>                           EnumDecl, EnumConstantDecls,
>                           getCurScope(),
>                           attrs.getList());
> @@ -4283,8 +4282,7 @@ void Parser::ParseEnumBody(SourceLocatio
>     }
>   
>     EnumScope.Exit();
> -  Actions.ActOnTagFinishDefinition(getCurScope(), EnumDecl,
> -                                   T.getCloseLocation());
> +  Actions.ActOnTagFinishDefinition(getCurScope(), EnumDecl, T.getRange());
>   
>     // The next token must be valid after an enum definition. If not, a ';'
>     // was probably forgotten.
>
> Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Fri Jul 15 13:11:33 2016
> @@ -3143,8 +3143,7 @@ void Parser::ParseCXXMemberSpecification
>     }
>   
>     if (TagDecl)
> -    Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl,
> -                                     T.getCloseLocation());
> +    Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, T.getRange());
>   
>     // Leave the class scope.
>     ParsingDef.Pop();
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Jul 15 13:11:33 2016
> @@ -13176,10 +13176,10 @@ void Sema::ActOnStartCXXMemberDeclaratio
>   }
>   
>   void Sema::ActOnTagFinishDefinition(Scope *S, Decl *TagD,
> -                                    SourceLocation RBraceLoc) {
> +                                    SourceRange BraceRange) {
>     AdjustDeclIfTemplate(TagD);
>     TagDecl *Tag = cast<TagDecl>(TagD);
> -  Tag->setRBraceLoc(RBraceLoc);
> +  Tag->setBraceRange(BraceRange);
>   
>     // Make sure we "complete" the definition even it is invalid.
>     if (Tag->isBeingDefined()) {
> @@ -14775,8 +14775,8 @@ bool Sema::IsValueInFlagEnum(const EnumD
>     return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
>   }
>   
> -void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
> -                         SourceLocation RBraceLoc, Decl *EnumDeclX,
> +void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
> +                         Decl *EnumDeclX,
>                            ArrayRef<Decl *> Elements,
>                            Scope *S, AttributeList *Attr) {
>     EnumDecl *Enum = cast<EnumDecl>(EnumDeclX);
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Fri Jul 15 13:11:33 2016
> @@ -7509,7 +7509,7 @@ Sema::ActOnExplicitInstantiation(Scope *
>     // Set source locations for keywords.
>     Specialization->setExternLoc(ExternLoc);
>     Specialization->setTemplateKeywordLoc(TemplateLoc);
> -  Specialization->setRBraceLoc(SourceLocation());
> +  Specialization->setBraceRange(SourceRange());
>   
>     if (Attr)
>       ProcessDeclAttributeList(S, Specialization, Attr);
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Fri Jul 15 13:11:33 2016
> @@ -2090,7 +2090,7 @@ Sema::InstantiateClass(SourceLocation Po
>     if (TSK == TSK_ImplicitInstantiation) {
>       Instantiation->setLocation(Pattern->getLocation());
>       Instantiation->setLocStart(Pattern->getInnerLocStart());
> -    Instantiation->setRBraceLoc(Pattern->getRBraceLoc());
> +    Instantiation->setBraceRange(Pattern->getBraceRange());
>     }
>   
>     if (!Instantiation->isInvalidDecl()) {
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Fri Jul 15 13:11:33 2016
> @@ -1018,9 +1018,7 @@ void TemplateDeclInstantiator::Instantia
>       }
>     }
>   
> -  // FIXME: Fixup LBraceLoc
> -  SemaRef.ActOnEnumBody(Enum->getLocation(), SourceLocation(),
> -                        Enum->getRBraceLoc(), Enum,
> +  SemaRef.ActOnEnumBody(Enum->getLocation(), Enum->getBraceRange(), Enum,
>                           Enumerators,
>                           nullptr, nullptr);
>   }
>
> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Fri Jul 15 13:11:33 2016
> @@ -647,7 +647,7 @@ ASTDeclReader::RedeclarableResult ASTDec
>     TD->setEmbeddedInDeclarator(Record[Idx++]);
>     TD->setFreeStanding(Record[Idx++]);
>     TD->setCompleteDefinitionRequired(Record[Idx++]);
> -  TD->setRBraceLoc(ReadSourceLocation(Record, Idx));
> +  TD->setBraceRange(ReadSourceRange(Record, Idx));
>     
>     switch (Record[Idx++]) {
>     case 0:
> @@ -3846,7 +3846,7 @@ void ASTDeclReader::UpdateDecl(Decl *D,
>         RD->setTagKind((TagTypeKind)Record[Idx++]);
>         RD->setLocation(Reader.ReadSourceLocation(ModuleFile, Record, Idx));
>         RD->setLocStart(Reader.ReadSourceLocation(ModuleFile, Record, Idx));
> -      RD->setRBraceLoc(Reader.ReadSourceLocation(ModuleFile, Record, Idx));
> +      RD->setBraceRange(Reader.ReadSourceRange(ModuleFile, Record, Idx));
>   
>         if (Record[Idx++]) {
>           AttrVec Attrs;
>
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri Jul 15 13:11:33 2016
> @@ -4716,7 +4716,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(R
>           Record.push_back(RD->getTagKind());
>           Record.AddSourceLocation(RD->getLocation());
>           Record.AddSourceLocation(RD->getLocStart());
> -        Record.AddSourceLocation(RD->getRBraceLoc());
> +        Record.AddSourceRange(RD->getBraceRange());
>   
>           // Instantiation may change attributes; write them all out afresh.
>           Record.push_back(D->hasAttrs());
>
> Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=275590&r1=275589&r2=275590&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Fri Jul 15 13:11:33 2016
> @@ -399,7 +399,7 @@ void ASTDeclWriter::VisitTagDecl(TagDecl
>     Record.push_back(D->isEmbeddedInDeclarator());
>     Record.push_back(D->isFreeStanding());
>     Record.push_back(D->isCompleteDefinitionRequired());
> -  Record.AddSourceLocation(D->getRBraceLoc());
> +  Record.AddSourceRange(D->getBraceRange());
>   
>     if (D->hasExtInfo()) {
>       Record.push_back(1);
> @@ -1769,6 +1769,7 @@ void ASTWriter::WriteDeclAbbrevs() {
>     Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFreeStanding
>     Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsCompleteDefinitionRequired
>     Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SourceLocation
> +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SourceLocation
>     Abv->Add(BitCodeAbbrevOp(0));                         // ExtInfoKind
>     // EnumDecl
>     Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // AddTypeRef
> @@ -1817,6 +1818,7 @@ void ASTWriter::WriteDeclAbbrevs() {
>     Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFreeStanding
>     Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsCompleteDefinitionRequired
>     Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SourceLocation
> +  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SourceLocation
>     Abv->Add(BitCodeAbbrevOp(0));                         // ExtInfoKind
>     // RecordDecl
>     Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // FlexibleArrayMember
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list