CommentCommandTraits.cpp revision 6ebf09130479bc7605aa09a3e6c4dc2ba3513495
1aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko//===--- CommentCommandTraits.cpp - Comment command properties --*- C++ -*-===// 2aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 3aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// The LLVM Compiler Infrastructure 4aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 5aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// This file is distributed under the University of Illinois Open Source 6aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// License. See LICENSE.TXT for details. 7aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 8aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko//===----------------------------------------------------------------------===// 9aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 10aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#include "clang/AST/CommentCommandTraits.h" 11e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko#include "llvm/ADT/STLExtras.h" 12aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 13aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkonamespace clang { 14aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkonamespace comments { 15aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 16e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko#include "clang/AST/CommentCommandInfo.inc" 17aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 186ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri GribenkoCommandTraits::CommandTraits(llvm::BumpPtrAllocator &Allocator, 196ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko const CommentOptions &CommentOptions) : 206ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko NextID(llvm::array_lengthof(Commands)), Allocator(Allocator) { 216ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko registerCommentOptions(CommentOptions); 226ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko} 236ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 246ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenkovoid CommandTraits::registerCommentOptions( 256ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko const CommentOptions &CommentOptions) { 266ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko for (CommentOptions::BlockCommandNamesTy::const_iterator 276ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko I = CommentOptions.BlockCommandNames.begin(), 286ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko E = CommentOptions.BlockCommandNames.end(); 296ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko I != E; I++) { 306ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko registerBlockCommand(*I); 316ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko } 326ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko} 33aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 34e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getCommandInfoOrNULL(StringRef Name) const { 35e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (const CommandInfo *Info = getBuiltinCommandInfo(Name)) 36e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Info; 37e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return getRegisteredCommandInfo(Name); 38aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} 39aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 40e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getCommandInfo(unsigned CommandID) const { 41e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (const CommandInfo *Info = getBuiltinCommandInfo(CommandID)) 42e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Info; 43e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return getRegisteredCommandInfo(CommandID); 44e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko} 45aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 466ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri GribenkoCommandInfo *CommandTraits::createCommandInfoWithName(StringRef CommandName) { 47116bb09882bc1c9281cd84dd07496201feb18d18Eli Friedman char *Name = Allocator.Allocate<char>(CommandName.size() + 1); 48e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko memcpy(Name, CommandName.data(), CommandName.size()); 49116bb09882bc1c9281cd84dd07496201feb18d18Eli Friedman Name[CommandName.size()] = '\0'; 50aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 51e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko // Value-initialize (=zero-initialize in this case) a new CommandInfo. 52e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko CommandInfo *Info = new (Allocator) CommandInfo(); 53e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko Info->Name = Name; 54e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko Info->ID = NextID++; 55aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 56e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko RegisteredCommands.push_back(Info); 57aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 58e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Info; 59aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} 60aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 616ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenkoconst CommandInfo *CommandTraits::registerUnknownCommand( 626ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko StringRef CommandName) { 636ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko CommandInfo *Info = createCommandInfoWithName(CommandName); 646ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko Info->IsUnknownCommand = true; 656ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko return Info; 666ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko} 676ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 686ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenkoconst CommandInfo *CommandTraits::registerBlockCommand(StringRef CommandName) { 696ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko CommandInfo *Info = createCommandInfoWithName(CommandName); 706ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko Info->IsBlockCommand = true; 716ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko return Info; 726ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko} 736ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 74e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getBuiltinCommandInfo( 75e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) { 76e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (CommandID < llvm::array_lengthof(Commands)) 77e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return &Commands[CommandID]; 78e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return NULL; 7962290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko} 8062290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko 81e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getRegisteredCommandInfo( 82e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko StringRef Name) const { 83e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko for (unsigned i = 0, e = RegisteredCommands.size(); i != e; ++i) { 84e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (RegisteredCommands[i]->Name == Name) 85e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return RegisteredCommands[i]; 86e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 87e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return NULL; 88aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} 89aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 90e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getRegisteredCommandInfo( 91e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) const { 92e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return RegisteredCommands[CommandID - llvm::array_lengthof(Commands)]; 93aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} 94aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 95aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} // end namespace comments 96aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} // end namespace clang 97aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 98