1207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//===--- SelectorLocationsKind.h - Kind of selector locations ---*- C++ -*-===//
2207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//
3207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
4207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//
5207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
6207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
7207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//
8207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//
10207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis// Describes whether the identifier locations for a selector are "standard"
11207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis// or not.
12207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//
13207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
14207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
15207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis#ifndef LLVM_CLANG_AST_SELECTORLOCATIONSKIND_H
16207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis#define LLVM_CLANG_AST_SELECTORLOCATIONSKIND_H
17207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
18207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis#include "clang/Basic/LLVM.h"
19207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
20207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidisnamespace clang {
21207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  class Selector;
22207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  class SourceLocation;
23207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  class Expr;
24491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis  class ParmVarDecl;
25207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
26207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis/// \brief Whether all locations of the selector identifiers are in a
27207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis/// "standard" position.
28207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidisenum SelectorLocationsKind {
29207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  /// \brief Non-standard.
30207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  SelLoc_NonStandard = 0,
31207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
32207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  /// \brief For nullary selectors, immediately before the end:
33207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  ///    "[foo release]" / "-(void)release;"
34207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  /// Or immediately before the arguments:
35207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  ///    "[foo first:1 second:2]" / "-(id)first:(int)x second:(int)y;
36207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  SelLoc_StandardNoSpace = 1,
37207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
38207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  /// \brief For nullary selectors, immediately before the end:
39207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  ///    "[foo release]" / "-(void)release;"
40207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  /// Or with a space between the arguments:
41207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  ///    "[foo first: 1 second: 2]" / "-(id)first: (int)x second: (int)y;
42207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  SelLoc_StandardWithSpace = 2
43207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis};
44207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
451824d54df85a462ada812dadda18130f951d40f3Dmitri Gribenko/// \brief Returns true if all \p SelLocs are in a "standard" location.
46207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios KyrtzidisSelectorLocationsKind hasStandardSelectorLocs(Selector Sel,
47207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                              ArrayRef<SourceLocation> SelLocs,
48207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                              ArrayRef<Expr *> Args,
49207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                              SourceLocation EndLoc);
50207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
51207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis/// \brief Get the "standard" location of a selector identifier, e.g:
52207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis/// For nullary selectors, immediately before ']': "[foo release]"
53207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis///
54207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis/// \param WithArgSpace if true the standard location is with a space apart
55207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis/// before arguments: "[foo first: 1 second: 2]"
56207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis/// If false: "[foo first:1 second:2]"
57207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios KyrtzidisSourceLocation getStandardSelectorLoc(unsigned Index,
58207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                      Selector Sel,
59207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                      bool WithArgSpace,
60207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                      ArrayRef<Expr *> Args,
61207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                      SourceLocation EndLoc);
62207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
631824d54df85a462ada812dadda18130f951d40f3Dmitri Gribenko/// \brief Returns true if all \p SelLocs are in a "standard" location.
64491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios KyrtzidisSelectorLocationsKind hasStandardSelectorLocs(Selector Sel,
65491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis                                              ArrayRef<SourceLocation> SelLocs,
66491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis                                              ArrayRef<ParmVarDecl *> Args,
67491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis                                              SourceLocation EndLoc);
68491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis
69491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis/// \brief Get the "standard" location of a selector identifier, e.g:
70491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis/// For nullary selectors, immediately before ']': "[foo release]"
71491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis///
72491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis/// \param WithArgSpace if true the standard location is with a space apart
73491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis/// before arguments: "-(id)first: (int)x second: (int)y;"
74491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis/// If false: "-(id)first:(int)x second:(int)y;"
75491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios KyrtzidisSourceLocation getStandardSelectorLoc(unsigned Index,
76491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis                                      Selector Sel,
77491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis                                      bool WithArgSpace,
78491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis                                      ArrayRef<ParmVarDecl *> Args,
79491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis                                      SourceLocation EndLoc);
80491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis
81207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis} // end namespace clang
82207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
83207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis#endif
84