@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3/**
4 * @phutil-external-symbol class PhpParser\Error
5 */
6final class PhorgePHPASTViewRunController
7 extends PhabricatorXHPASTViewController {
8
9 public function handleRequest(AphrontRequest $request) {
10 $viewer = $this->getViewer();
11
12 if ($request->isFormPost()) {
13 $source = $request->getStr('source');
14
15 $storage_tree = id(new PhorgePHPASTParseTree())
16 ->setInput($source)
17 ->setAuthorPHID($viewer->getPHID());
18
19 $parser = PhutilPHPParserLibrary::getParser();
20 $exposes_token_stream = version_compare(
21 PhutilPHPParserLibrary::getVersion(),
22 PhutilPHPParserLibrary::EXPECTED_VERSION,
23 '>=');
24
25 try {
26 $storage_tree->setTree($parser->parse($source));
27 if ($exposes_token_stream) {
28 $storage_tree->setTokenStream($parser->getTokens());
29 }
30 } catch (PhpParser\Error $ex) {
31 $storage_tree->setError($ex->getMessageWithColumnInfo($source));
32 }
33
34 $storage_tree->save();
35
36 return id(new AphrontRedirectResponse())
37 ->setURI('/phpast/view/'.$storage_tree->getID().'/');
38 }
39
40 $form = id(new AphrontFormView())
41 ->setViewer($viewer)
42 ->appendChild(
43 id(new AphrontFormTextAreaControl())
44 ->setLabel(pht('Source'))
45 ->setName('source')
46 ->setValue("<?php\n\n")
47 ->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_TALL))
48 ->appendChild(
49 id(new AphrontFormSubmitControl())
50 ->setValue(pht('Parse')));
51
52 $form_box = id(new PHUIObjectBoxView())
53 ->setHeaderText(pht('Generate PHP AST'))
54 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
55 ->setForm($form);
56
57 $title = pht('PHPAST View');
58 $header = id(new PHUIHeaderView())
59 ->setHeader($title)
60 ->setHeaderIcon('fa-ambulance');
61
62 $view = id(new PHUITwoColumnView())
63 ->setHeader($header)
64 ->setFooter(array(
65 $form_box,
66 ));
67
68 return $this->newPage()
69 ->setTitle($title)
70 ->setCrumbs(
71 id(new PHUICrumbsView())
72 ->addAction(
73 id(new PHUIListItemView())
74 ->setName(pht('Use XHPAST'))
75 ->setHref('/xhpast/')
76 ->setIcon('fa-random')))
77 ->appendChild($view);
78
79 }
80
81}