Drush: commands/core/cli.drush.inc Source File

  1. 7.x doxygen/html/cli_8drush_8inc_source.html
  2. master doxygen/html/cli_8drush_8inc_source.html
1 <?php
2 
4 use Drupal\Component\Assertion\Handle;
8 
9 /**
10  * Implements hook_drush_command().
11  */
12 function cli_drush_command() {
13  $items['core-cli'] = array(
14  'description' => 'Open an interactive shell on a Drupal site.',
15  'remote-tty' => TRUE,
16  'aliases' => array('php'),
17  'bootstrap' => DRUSH_BOOTSTRAP_MAX,
18  'topics' => array('docs-repl'),
19  'options' => array(
20  'version-history' => 'Use command history based on Drupal version (Default is per site).',
21  ),
22  );
23  $items['docs-repl'] = array(
24  'description' => 'repl.md',
25  'hidden' => TRUE,
26  'topic' => TRUE,
27  'bootstrap' => DRUSH_BOOTSTRAP_NONE,
28  'callback' => 'drush_print_file',
29  'callback arguments' => array(drush_get_context('DOC_PREFIX', DRUSH_BASE_PATH) . '/docs/repl.md'),
30  );
31  return $items;
32 }
33 
34 /**
35  * Command callback.
36  */
37 function drush_cli_core_cli() {
38  $drupal_major_version = drush_drupal_major_version();
39  $configuration = new \Psy\Configuration();
40 
41  // Set the Drush specific history file path.
42  $configuration->setHistoryFile(drush_history_path_cli());
43 
44  $shell = new Shell($configuration);
45 
46  if ($drupal_major_version >= 8) {
47  // Register the assertion handler so exceptions are thrown instead of errors
48  // being triggered. This plays nicer with PsySH.
49  Handle::register();
50  $shell->setScopeVariables(['container' => \Drupal::getContainer()]);
51 
52  // Add Drupal 8 specific casters to the shell configuration.
53  $configuration->addCasters(_drush_core_cli_get_casters());
54  }
55 
56  // Add Drush commands to the shell.
57  $commands = [new DrushHelpCommand()];
58 
59  foreach (drush_commands_categorize(_drush_core_cli_get_commands()) as $category_data) {
60  $category_title = (string) $category_data['title'];
61  foreach ($category_data['commands'] as $command_config) {
62  $command = new DrushCommand($command_config);
63  // Set the category label on each.
64  $command->setCategory($category_title);
65  $commands[] = $command;
66  }
67  }
68 
69  $shell->addCommands($commands);
70 
71  // PsySH will never return control to us, but our shutdown handler will still
72  // run after the user presses ^D. Mark this command as completed to avoid a
73  // spurious error message.
74  drush_set_context('DRUSH_EXECUTION_COMPLETED', TRUE);
75 
76  // Run the terminate event before the shell is run. Otherwise, if the shell
77  // is forking processes (the default), any child processes will close the
78  // database connection when they are killed. So when we return back to the
79  // parent process after, there is no connection. This will be called after the
80  // command in preflight still, but the subscriber instances are already
81  // created from before. Call terminate() regardless, this is a no-op for all
82  // DrupalBoot classes except DrupalBoot8.
83  if ($bootstrap = \Drush::bootstrap()) {
84  $bootstrap->terminate();
85  }
86 
87  // To fix the above problem in Drupal 7, the connection can be closed manually.
88  // This will make sure a new connection is created again in child loops. So
89  // any shutdown functions will still run ok after the shell has exited.
90  if ($drupal_major_version == 7) {
91  Database::closeConnection();
92  }
93 
94  $shell->run();
95 }
96 
97 /**
98  * Returns a filtered list of Drush commands used for CLI commands.
99  *
100  * @return array
101  */
102 function _drush_core_cli_get_commands() {
103  $commands = drush_get_commands();
104  $ignored_commands = ['help', 'drush-psysh', 'php-eval', 'core-cli', 'php'];
105  $php_keywords = _drush_core_cli_get_php_keywords();
106 
107  foreach ($commands as $name => $config) {
108  // Ignore some commands that don't make sense inside PsySH, are PHP keywords
109  // are hidden, or are aliases.
110  if (in_array($name, $ignored_commands) || in_array($name, $php_keywords) || !empty($config['hidden']) || ($name !== $config['command'])) {
111  unset($commands[$name]);
112  }
113  else {
114  // Make sure the command aliases don't contain any PHP keywords.
115  if (!empty($config['aliases'])) {
116  $commands[$name]['aliases'] = array_diff($commands[$name]['aliases'], $php_keywords);
117  }
118  }
119  }
120 
121  return $commands;
122 }
123 
124 /**
125  * Returns a mapped array of casters for use in the shell.
126  *
127  * These are Symfony VarDumper casters.
129  * for more information.
130  *
131  * @return array.
132  * An array of caster callbacks keyed by class or interface.
133  */
134 function _drush_core_cli_get_casters() {
135  return [
136  'Drupal\Core\Entity\ContentEntityInterface' => 'Drush\Psysh\Caster::castContentEntity',
137  'Drupal\Core\Field\FieldItemListInterface' => 'Drush\Psysh\Caster::castFieldItemList',
138  'Drupal\Core\Field\FieldItemInterface' => 'Drush\Psysh\Caster::castFieldItem',
139  'Drupal\Core\Config\Entity\ConfigEntityInterface' => 'Drush\Psysh\Caster::castConfigEntity',
140  'Drupal\Core\Config\ConfigBase' => 'Drush\Psysh\Caster::castConfig',
141  'Drupal\Component\DependencyInjection\Container' => 'Drush\Psysh\Caster::castContainer',
142  'Drupal\Component\Render\MarkupInterface' => 'Drush\Psysh\Caster::castMarkup',
143  ];
144 }
145 
146 /**
147  * Returns the file path for the CLI history.
148  *
149  * This can either be site specific (default) or Drupal version specific.
150  *
151  * @return string.
152  */
153 function drush_history_path_cli() {
154  $cli_directory = drush_directory_cache('cli');
155 
156  // If only the Drupal version is being used for the history.
157  if (drush_get_option('version-history', FALSE)) {
158  $drupal_major_version = drush_drupal_major_version();
159  $file_name = "drupal-$drupal_major_version";
160  }
161  // If there is an alias, use that in the site specific name. Otherwise,
162  // use a hash of the root path.
163  else {
164  if ($alias = drush_get_context('DRUSH_TARGET_SITE_ALIAS')) {
165  $site = drush_sitealias_get_record($alias);
166  $site_suffix = $site['#name'];
167  }
168  else {
169  $site_suffix = md5(DRUPAL_ROOT);
170  }
171 
172  $file_name = "drupal-site-$site_suffix";
173  }
174 
175  $full_path = "$cli_directory/$file_name";
176 
177  // Output the history path if verbose is enabled.
178  if (drush_get_context('DRUSH_VERBOSE')) {
179  drush_log(dt('History: @full_path', ['@full_path' => $full_path]), LogLevel::INFO);
180  }
181 
182  return $full_path;
183 }
184 
185 /**
186  * Returns a list of PHP keywords.
187  *
188  * This will act as a blacklist for command and alias names.
189  *
190  * @return array
191  */
193  return [
194  '__halt_compiler',
195  'abstract',
196  'and',
197  'array',
198  'as',
199  'break',
200  'callable',
201  'case',
202  'catch',
203  'class',
204  'clone',
205  'const',
206  'continue',
207  'declare',
208  'default',
209  'die',
210  'do',
211  'echo',
212  'else',
213  'elseif',
214  'empty',
215  'enddeclare',
216  'endfor',
217  'endforeach',
218  'endif',
219  'endswitch',
220  'endwhile',
221  'eval',
222  'exit',
223  'extends',
224  'final',
225  'for',
226  'foreach',
227  'function',
228  'global',
229  'goto',
230  'if',
231  'implements',
232  'include',
233  'include_once',
234  'instanceof',
235  'insteadof',
236  'interface',
237  'isset',
238  'list',
239  'namespace',
240  'new',
241  'or',
242  'print',
243  'private',
244  'protected',
245  'public',
246  'require',
247  'require_once',
248  'return',
249  'static',
250  'switch',
251  'throw',
252  'trait',
253  'try',
254  'unset',
255  'use',
256  'var',
257  'while',
258  'xor',
259  ];
260 }

File

doxygen/html/cli_8drush_8inc_source.html
View source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>Drush: commands/core/cli.drush.inc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Drush
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.1.2 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_afac61274991793aa7e9133a8f4f291e.html">commands</a></li><li class="navelem"><a class="el" href="dir_5762b63965e3a68a35f77c23b4dd4668.html">core</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">cli.drush.inc</div>  </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;&lt;?php</div>
<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;</div>
<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;use <a class="code" href="classDrush_1_1Log_1_1LogLevel.html">Drush\Log\LogLevel</a>;</div>
<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;use Drupal\Component\Assertion\Handle;</div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;use <a class="code" href="classDrush_1_1Psysh_1_1DrushHelpCommand.html">Drush\Psysh\DrushHelpCommand</a>;</div>
<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;use <a class="code" href="classDrush_1_1Psysh_1_1DrushCommand.html">Drush\Psysh\DrushCommand</a>;</div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;use <a class="code" href="classDrush_1_1Psysh_1_1Shell.html">Drush\Psysh\Shell</a>;</div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> * Implements hook_drush_command().</span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="keyword">function</span> cli_drush_command() {</div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;  $items[<span class="stringliteral">&#39;core-cli&#39;</span>] = array(</div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Open an interactive shell on a Drupal site.&#39;</span>,</div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;    <span class="stringliteral">&#39;remote-tty&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;php&#39;</span>),</div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; DRUSH_BOOTSTRAP_MAX,</div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;    <span class="stringliteral">&#39;topics&#39;</span> =&gt; array(<span class="stringliteral">&#39;docs-repl&#39;</span>),</div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;      <span class="stringliteral">&#39;version-history&#39;</span> =&gt; <span class="stringliteral">&#39;Use command history based on Drupal version (Default is per site).&#39;</span>,</div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;    ),</div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;  );</div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;  $items[<span class="stringliteral">&#39;docs-repl&#39;</span>] = array(</div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;repl.md&#39;</span>,</div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;    <span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;    <span class="stringliteral">&#39;topic&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; DRUSH_BOOTSTRAP_NONE,</div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;    <span class="stringliteral">&#39;callback&#39;</span> =&gt; <span class="stringliteral">&#39;drush_print_file&#39;</span>,</div>
<div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;    <span class="stringliteral">&#39;callback arguments&#39;</span> =&gt; array(<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DOC_PREFIX&#39;</span>, DRUSH_BASE_PATH) . <span class="stringliteral">&#39;/docs/repl.md&#39;</span>),</div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;  );</div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;  <span class="keywordflow">return</span> $items;</div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;}</div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="comment"> * Command callback.</span></div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="keyword">function</span> drush_cli_core_cli() {</div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;  $drupal_major_version = <a class="code" href="drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>();</div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;  $configuration = new \Psy\Configuration();</div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;  <span class="comment">// Set the Drush specific history file path.</span></div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;  $configuration-&gt;setHistoryFile(drush_history_path_cli());</div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;  $shell = <span class="keyword">new</span> <a class="code" href="classDrush_1_1Psysh_1_1Shell.html">Shell</a>($configuration);</div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;  <span class="keywordflow">if</span> ($drupal_major_version &gt;= 8) {</div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <span class="comment">// Register the assertion handler so exceptions are thrown instead of errors</span></div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    <span class="comment">// being triggered. This plays nicer with PsySH.</span></div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    Handle::register();</div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    $shell-&gt;setScopeVariables([<span class="stringliteral">&#39;container&#39;</span> =&gt; \Drupal::getContainer()]);</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;    <span class="comment">// Add Drupal 8 specific casters to the shell configuration.</span></div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    $configuration-&gt;addCasters(_drush_core_cli_get_casters());</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;  }</div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;</div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;  <span class="comment">// Add Drush commands to the shell.</span></div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;  $commands = [<span class="keyword">new</span> <a class="code" href="classDrush_1_1Psysh_1_1DrushHelpCommand.html">DrushHelpCommand</a>()];</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;</div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;  <span class="keywordflow">foreach</span> (<a class="code" href="command_8inc.html#a5481c5ad60bef8dd11a851fcc35770ae">drush_commands_categorize</a>(_drush_core_cli_get_commands()) as $category_data) {</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    $category_title = (string) $category_data[<span class="stringliteral">&#39;title&#39;</span>];</div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    <span class="keywordflow">foreach</span> ($category_data[<span class="stringliteral">&#39;commands&#39;</span>] as $command_config) {</div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;      $command = <span class="keyword">new</span> <a class="code" href="classDrush_1_1Psysh_1_1DrushCommand.html">DrushCommand</a>($command_config);</div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;      <span class="comment">// Set the category label on each.</span></div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;      $command-&gt;setCategory($category_title);</div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;      $commands[] = $command;</div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    }</div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;  }</div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;</div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;  $shell-&gt;addCommands($commands);</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;</div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;  <span class="comment">// PsySH will never return control to us, but our shutdown handler will still</span></div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;  <span class="comment">// run after the user presses ^D.  Mark this command as completed to avoid a</span></div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;  <span class="comment">// spurious error message.</span></div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_EXECUTION_COMPLETED&#39;</span>, TRUE);</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;  <span class="comment">// Run the terminate event before the shell is run. Otherwise, if the shell</span></div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;  <span class="comment">// is forking processes (the default), any child processes will close the</span></div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;  <span class="comment">// database connection when they are killed. So when we return back to the</span></div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;  <span class="comment">// parent process after, there is no connection. This will be called after the</span></div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;  <span class="comment">// command in preflight still, but the subscriber instances are already</span></div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;  <span class="comment">// created from before. Call terminate() regardless, this is a no-op for all</span></div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;  <span class="comment">// DrupalBoot classes except DrupalBoot8.</span></div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;  <span class="keywordflow">if</span> ($bootstrap = \<a class="code" href="classDrush.html#aa0028a6c4611724e20f33169dd5147a6">Drush::bootstrap</a>()) {</div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    $bootstrap-&gt;terminate();</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;  }</div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;</div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;  <span class="comment">// To fix the above problem in Drupal 7, the connection can be closed manually.</span></div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;  <span class="comment">// This will make sure a new connection is created again in child loops. So</span></div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;  <span class="comment">// any shutdown functions will still run ok after the shell has exited.</span></div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;  <span class="keywordflow">if</span> ($drupal_major_version == 7) {</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;    Database::closeConnection();</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;  }</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;  $shell-&gt;run();</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;}</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="comment"> * Returns a filtered list of Drush commands used for CLI commands.</span></div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<span class="keyword">function</span> _drush_core_cli_get_commands() {</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;  $commands = <a class="code" href="command_8inc.html#af0c377881e5c9c772f0cad80ea016452">drush_get_commands</a>();</div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;  $ignored_commands = [<span class="stringliteral">&#39;help&#39;</span>, <span class="stringliteral">&#39;drush-psysh&#39;</span>, <span class="stringliteral">&#39;php-eval&#39;</span>, <span class="stringliteral">&#39;core-cli&#39;</span>, <span class="stringliteral">&#39;php&#39;</span>];</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;  $php_keywords = _drush_core_cli_get_php_keywords();</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;</div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;  <span class="keywordflow">foreach</span> ($commands as $name =&gt; $config) {</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    <span class="comment">// Ignore some commands that don&#39;t make sense inside PsySH, are PHP keywords</span></div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="comment">// are hidden, or are aliases.</span></div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    <span class="keywordflow">if</span> (in_array($name, $ignored_commands) || in_array($name, $php_keywords) || !empty($config[<span class="stringliteral">&#39;hidden&#39;</span>]) || ($name !== $config[<span class="stringliteral">&#39;command&#39;</span>])) {</div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;      unset($commands[$name]);</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;    }</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;      <span class="comment">// Make sure the command aliases don&#39;t contain any PHP keywords.</span></div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;      <span class="keywordflow">if</span> (!empty($config[<span class="stringliteral">&#39;aliases&#39;</span>])) {</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;        $commands[$name][<span class="stringliteral">&#39;aliases&#39;</span>] = array_diff($commands[$name][<span class="stringliteral">&#39;aliases&#39;</span>], $php_keywords);</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;      }</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;    }</div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;  }</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;  <span class="keywordflow">return</span> $commands;</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;}</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="comment"> * Returns a mapped array of casters for use in the shell.</span></div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<span class="comment"> * These are Symfony VarDumper casters.</span></div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;<span class="comment"> * See http://symfony.com/doc/current/components/var_dumper/advanced.html#casters</span></div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;<span class="comment"> * for more information.</span></div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;<span class="comment"> * @return array.</span></div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;<span class="comment"> *   An array of caster callbacks keyed by class or interface.</span></div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;<span class="keyword">function</span> _drush_core_cli_get_casters() {</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;  <span class="keywordflow">return</span> [</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;    <span class="stringliteral">&#39;Drupal\Core\Entity\ContentEntityInterface&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\Psysh\Caster::castContentEntity&#39;</span>,</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    <span class="stringliteral">&#39;Drupal\Core\Field\FieldItemListInterface&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\Psysh\Caster::castFieldItemList&#39;</span>,</div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    <span class="stringliteral">&#39;Drupal\Core\Field\FieldItemInterface&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\Psysh\Caster::castFieldItem&#39;</span>,</div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    <span class="stringliteral">&#39;Drupal\Core\Config\Entity\ConfigEntityInterface&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\Psysh\Caster::castConfigEntity&#39;</span>,</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="stringliteral">&#39;Drupal\Core\Config\ConfigBase&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\Psysh\Caster::castConfig&#39;</span>,</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    <span class="stringliteral">&#39;Drupal\Component\DependencyInjection\Container&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\Psysh\Caster::castContainer&#39;</span>,</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;    <span class="stringliteral">&#39;Drupal\Component\Render\MarkupInterface&#39;</span> =&gt; <span class="stringliteral">&#39;Drush\Psysh\Caster::castMarkup&#39;</span>,</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;  ];</div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;}</div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="comment"> * Returns the file path for the CLI history.</span></div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;<span class="comment"> * This can either be site specific (default) or Drupal version specific.</span></div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="comment"> * @return string.</span></div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="keyword">function</span> drush_history_path_cli() {</div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;  $cli_directory = <a class="code" href="includes_2environment_8inc.html#a92afdf9afda25ac6d226ba45f6f1fbe0">drush_directory_cache</a>(<span class="stringliteral">&#39;cli&#39;</span>);</div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;</div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;  <span class="comment">// If only the Drupal version is being used for the history.</span></div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;version-history&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;    $drupal_major_version = <a class="code" href="drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>();</div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;    $file_name = <span class="stringliteral">&quot;drupal-$drupal_major_version&quot;</span>;</div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;  }</div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;  <span class="comment">// If there is an alias, use that in the site specific name. Otherwise,</span></div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;  <span class="comment">// use a hash of the root path.</span></div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    <span class="keywordflow">if</span> ($alias = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_TARGET_SITE_ALIAS&#39;</span>)) {</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;      $site = <a class="code" href="sitealias_8inc.html#ac2f57b80441374522c4e4cdc3b7e0c2b">drush_sitealias_get_record</a>($alias);</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;      $site_suffix = $site[<span class="stringliteral">&#39;#name&#39;</span>];</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;    }</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;      $site_suffix = md5(DRUPAL_ROOT);</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    }</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;</div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;    $file_name = <span class="stringliteral">&quot;drupal-site-$site_suffix&quot;</span>;</div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;  }</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;  $full_path = <span class="stringliteral">&quot;$cli_directory/$file_name&quot;</span>;</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;  <span class="comment">// Output the history path if verbose is enabled.</span></div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_VERBOSE&#39;</span>)) {</div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;History: @full_path&#39;</span>, [<span class="stringliteral">&#39;@full_path&#39;</span> =&gt; $full_path]), LogLevel::INFO);</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;  }</div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;  <span class="keywordflow">return</span> $full_path;</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;}</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;<span class="comment"> * Returns a list of PHP keywords.</span></div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="comment"> * This will act as a blacklist for command and alias names.</span></div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;<span class="keyword">function</span> _drush_core_cli_get_php_keywords() {</div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;  <span class="keywordflow">return</span> [</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;    <span class="stringliteral">&#39;__halt_compiler&#39;</span>,</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    <span class="stringliteral">&#39;abstract&#39;</span>,</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;    <span class="stringliteral">&#39;and&#39;</span>,</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    <span class="stringliteral">&#39;array&#39;</span>,</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    <span class="stringliteral">&#39;as&#39;</span>,</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;    <span class="stringliteral">&#39;break&#39;</span>,</div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    <span class="stringliteral">&#39;callable&#39;</span>,</div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;    <span class="stringliteral">&#39;case&#39;</span>,</div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;    <span class="stringliteral">&#39;catch&#39;</span>,</div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    <span class="stringliteral">&#39;class&#39;</span>,</div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    <span class="stringliteral">&#39;clone&#39;</span>,</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    <span class="stringliteral">&#39;const&#39;</span>,</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    <span class="stringliteral">&#39;continue&#39;</span>,</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    <span class="stringliteral">&#39;declare&#39;</span>,</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;    <span class="stringliteral">&#39;default&#39;</span>,</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;    <span class="stringliteral">&#39;die&#39;</span>,</div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    <span class="stringliteral">&#39;do&#39;</span>,</div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <span class="stringliteral">&#39;echo&#39;</span>,</div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;    <span class="stringliteral">&#39;else&#39;</span>,</div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;    <span class="stringliteral">&#39;elseif&#39;</span>,</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    <span class="stringliteral">&#39;empty&#39;</span>,</div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    <span class="stringliteral">&#39;enddeclare&#39;</span>,</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;    <span class="stringliteral">&#39;endfor&#39;</span>,</div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    <span class="stringliteral">&#39;endforeach&#39;</span>,</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;    <span class="stringliteral">&#39;endif&#39;</span>,</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;    <span class="stringliteral">&#39;endswitch&#39;</span>,</div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    <span class="stringliteral">&#39;endwhile&#39;</span>,</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;    <span class="stringliteral">&#39;eval&#39;</span>,</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="stringliteral">&#39;exit&#39;</span>,</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <span class="stringliteral">&#39;extends&#39;</span>,</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <span class="stringliteral">&#39;final&#39;</span>,</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;    <span class="stringliteral">&#39;for&#39;</span>,</div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;    <span class="stringliteral">&#39;foreach&#39;</span>,</div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    <span class="stringliteral">&#39;function&#39;</span>,</div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    <span class="stringliteral">&#39;global&#39;</span>,</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    <span class="stringliteral">&#39;goto&#39;</span>,</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    <span class="stringliteral">&#39;if&#39;</span>,</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    <span class="stringliteral">&#39;implements&#39;</span>,</div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    <span class="stringliteral">&#39;include&#39;</span>,</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    <span class="stringliteral">&#39;include_once&#39;</span>,</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    <span class="stringliteral">&#39;instanceof&#39;</span>,</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    <span class="stringliteral">&#39;insteadof&#39;</span>,</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    <span class="stringliteral">&#39;interface&#39;</span>,</div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    <span class="stringliteral">&#39;isset&#39;</span>,</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;    <span class="stringliteral">&#39;list&#39;</span>,</div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;    <span class="stringliteral">&#39;namespace&#39;</span>,</div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;    <span class="stringliteral">&#39;new&#39;</span>,</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;    <span class="stringliteral">&#39;or&#39;</span>,</div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;    <span class="stringliteral">&#39;print&#39;</span>,</div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;    <span class="stringliteral">&#39;private&#39;</span>,</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;    <span class="stringliteral">&#39;protected&#39;</span>,</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    <span class="stringliteral">&#39;public&#39;</span>,</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    <span class="stringliteral">&#39;require&#39;</span>,</div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;    <span class="stringliteral">&#39;require_once&#39;</span>,</div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    <span class="stringliteral">&#39;return&#39;</span>,</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    <span class="stringliteral">&#39;static&#39;</span>,</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    <span class="stringliteral">&#39;switch&#39;</span>,</div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;    <span class="stringliteral">&#39;throw&#39;</span>,</div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;    <span class="stringliteral">&#39;trait&#39;</span>,</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;    <span class="stringliteral">&#39;try&#39;</span>,</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;    <span class="stringliteral">&#39;unset&#39;</span>,</div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;    <span class="stringliteral">&#39;use&#39;</span>,</div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;    <span class="stringliteral">&#39;var&#39;</span>,</div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    <span class="stringliteral">&#39;while&#39;</span>,</div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;    <span class="stringliteral">&#39;xor&#39;</span>,</div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;  ];</div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Nov 2 2016 07:28:50 for Drush by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.1.2
</small></address>
</body>
</html>