1 //===--- CommentCommandTraits.cpp - Comment command properties --*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "clang/AST/CommentCommandTraits.h" 11 #include "llvm/ADT/STLExtras.h" 12 13 namespace clang { 14 namespace comments { 15 16 #include "clang/AST/CommentCommandInfo.inc" 17 18 CommandTraits::CommandTraits(llvm::BumpPtrAllocator &Allocator, 19 const CommentOptions &CommentOptions) : 20 NextID(llvm::array_lengthof(Commands)), Allocator(Allocator) { 21 registerCommentOptions(CommentOptions); 22 } 23 24 void CommandTraits::registerCommentOptions( 25 const CommentOptions &CommentOptions) { 26 for (CommentOptions::BlockCommandNamesTy::const_iterator 27 I = CommentOptions.BlockCommandNames.begin(), 28 E = CommentOptions.BlockCommandNames.end(); 29 I != E; I++) { 30 registerBlockCommand(*I); 31 } 32 } 33 34 const CommandInfo *CommandTraits::getCommandInfoOrNULL(StringRef Name) const { 35 if (const CommandInfo *Info = getBuiltinCommandInfo(Name)) 36 return Info; 37 return getRegisteredCommandInfo(Name); 38 } 39 40 const CommandInfo *CommandTraits::getCommandInfo(unsigned CommandID) const { 41 if (const CommandInfo *Info = getBuiltinCommandInfo(CommandID)) 42 return Info; 43 return getRegisteredCommandInfo(CommandID); 44 } 45 46 CommandInfo *CommandTraits::createCommandInfoWithName(StringRef CommandName) { 47 char *Name = Allocator.Allocate<char>(CommandName.size() + 1); 48 memcpy(Name, CommandName.data(), CommandName.size()); 49 Name[CommandName.size()] = '\0'; 50 51 // Value-initialize (=zero-initialize in this case) a new CommandInfo. 52 CommandInfo *Info = new (Allocator) CommandInfo(); 53 Info->Name = Name; 54 Info->ID = NextID++; 55 56 RegisteredCommands.push_back(Info); 57 58 return Info; 59 } 60 61 const CommandInfo *CommandTraits::registerUnknownCommand( 62 StringRef CommandName) { 63 CommandInfo *Info = createCommandInfoWithName(CommandName); 64 Info->IsUnknownCommand = true; 65 return Info; 66 } 67 68 const CommandInfo *CommandTraits::registerBlockCommand(StringRef CommandName) { 69 CommandInfo *Info = createCommandInfoWithName(CommandName); 70 Info->IsBlockCommand = true; 71 return Info; 72 } 73 74 const CommandInfo *CommandTraits::getBuiltinCommandInfo( 75 unsigned CommandID) { 76 if (CommandID < llvm::array_lengthof(Commands)) 77 return &Commands[CommandID]; 78 return NULL; 79 } 80 81 const CommandInfo *CommandTraits::getRegisteredCommandInfo( 82 StringRef Name) const { 83 for (unsigned i = 0, e = RegisteredCommands.size(); i != e; ++i) { 84 if (RegisteredCommands[i]->Name == Name) 85 return RegisteredCommands[i]; 86 } 87 return NULL; 88 } 89 90 const CommandInfo *CommandTraits::getRegisteredCommandInfo( 91 unsigned CommandID) const { 92 return RegisteredCommands[CommandID - llvm::array_lengthof(Commands)]; 93 } 94 95 } // end namespace comments 96 } // end namespace clang 97 98