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