aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/Option.cpp
blob: 46b5c41555bb74ff90333db6df33116d3c00acca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//===--- Option.cpp - Abstract Driver Options ---------------------------*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "clang/Driver/Option.h"
#include <cassert>
using namespace clang;
using namespace clang::driver;

Option::Option(OptionClass _Kind, const char *_Name,
               OptionGroup *_Group, Option *_Alias) 
  : Kind(_Kind), Name(_Name), Group(_Group), Alias(_Alias) {

  // Multi-level aliases are not supported, and alias options cannot
  // have groups. This just simplifies option tracking, it is not an
  // inherent limitation.
  assert((!Alias || (!Alias->Alias && !Group)) &&
         "Multi-level aliases and aliases with groups are unsupported.");    
}

bool Option::matches(const Option *Opt) const {
  // Aliases are never considered in matching.
  if (Opt->getAlias())
    return matches(Opt->getAlias());
  if (Alias)
    return Alias->matches(Opt);
  
  if (this == Opt)
    return true;
  
  if (Group)
    return Group->matches(Opt);
  return false;
}

OptionGroup::OptionGroup(const char *Name, OptionGroup *Group)
  : Option(Option::GroupOption, Name, Group, 0) {
}

InputOption::InputOption()
  : Option(Option::InputOption, "<input>", 0, 0) {
}

UnknownOption::UnknownOption()
  : Option(Option::UnknownOption, "<unknown>", 0, 0) {
}

FlagOption::FlagOption(const char *Name, OptionGroup *Group, Option *Alias)
  : Option(Option::FlagOption, Name, Group, Alias) {
}


JoinedOption::JoinedOption(const char *Name, OptionGroup *Group, Option *Alias)
  : Option(Option::JoinedOption, Name, Group, Alias) {
}

CommaJoinedOption::CommaJoinedOption(const char *Name, OptionGroup *Group, 
                                     Option *Alias)
  : Option(Option::CommaJoinedOption, Name, Group, Alias) {
}

SeparateOption::SeparateOption(const char *Name, OptionGroup *Group, 
                               Option *Alias)
  : Option(Option::SeparateOption, Name, Group, Alias) {
}

MultiArgOption::MultiArgOption(const char *Name, OptionGroup *Group, 
                               Option *Alias, unsigned _NumArgs)
  : Option(Option::MultiArgOption, Name, Group, Alias), NumArgs(_NumArgs) {
}

JoinedOrSeparateOption::JoinedOrSeparateOption(const char *Name, 
                                               OptionGroup *Group, 
                                               Option *Alias)
  : Option(Option::JoinedOrSeparateOption, Name, Group, Alias) {
}

JoinedAndSeparateOption::JoinedAndSeparateOption(const char *Name, 
                                                 OptionGroup *Group, 
                                                 Option *Alias)
  : Option(Option::JoinedAndSeparateOption, Name, Group, Alias) {
}