Allow shebang/hashbang (#!) as first line in Hack files
A shebang allow a script to be run as an executable on UNIX systems. PHP allows shebangs, but Hack does not. This changeset allows Hack to have shebangs like in PHP.
Esse commit está contido em:
@@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env hhvm
|
||||
<?php
|
||||
echo "Hashbang/shebang allowed before <?php\n";
|
||||
@@ -0,0 +1 @@
|
||||
Hashbang/shebang allowed before <?php
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env hhvm
|
||||
|
||||
<?php
|
||||
echo "Hashbang/shebang and whitespace allowed before <?php\n";
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
Hashbang/shebang and whitespace allowed before <?php
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env hhvm
|
||||
|
||||
<?hh
|
||||
echo "Hashbang/shebang and whitespace disallowed before <?hh\n";
|
||||
@@ -0,0 +1 @@
|
||||
HipHop Fatal error: syntax error, unexpected T_HACK_ERROR, expecting $end in %s on line 2
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env hhvm
|
||||
<?hh
|
||||
echo "Hashbang/shebang allowed before <?hh\n";
|
||||
@@ -0,0 +1 @@
|
||||
Hashbang/shebang allowed before <?hh
|
||||
+21
-10
@@ -153,6 +153,7 @@ static int getNextTokenType(int t) {
|
||||
|
||||
%x ST_IN_HTML
|
||||
%x ST_IN_SCRIPTING
|
||||
%x ST_AFTER_HASHBANG
|
||||
%x ST_DOUBLE_QUOTES
|
||||
%x ST_BACKQUOTE
|
||||
%x ST_HEREDOC
|
||||
@@ -593,7 +594,7 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
|
||||
<INITIAL>"#"[^\n]*"\n" {
|
||||
_scanner->setHashBang(yytext, yyleng);
|
||||
BEGIN(ST_IN_SCRIPTING);
|
||||
yy_push_state(ST_IN_HTML, yyscanner);
|
||||
yy_push_state(ST_AFTER_HASHBANG, yyscanner);
|
||||
return T_INLINE_HTML;
|
||||
}
|
||||
|
||||
@@ -604,12 +605,13 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
|
||||
return T_INLINE_HTML;
|
||||
}
|
||||
|
||||
<ST_IN_HTML>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" {
|
||||
<ST_IN_HTML,ST_AFTER_HASHBANG>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" {
|
||||
SETTOKEN;
|
||||
BEGIN(ST_IN_HTML);
|
||||
return T_INLINE_HTML;
|
||||
}
|
||||
|
||||
<INITIAL,ST_IN_HTML>"<?"|("<?php"([ \t]|{NEWLINE}))|"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"\'php\'"){WHITESPACE}*">" {
|
||||
<INITIAL,ST_IN_HTML,ST_AFTER_HASHBANG>"<?"|("<?php"([ \t]|{NEWLINE}))|"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"\'php\'"){WHITESPACE}*">" {
|
||||
SETTOKEN;
|
||||
if (_scanner->shortTags() || yyleng > 2) {
|
||||
if (YY_START == INITIAL) {
|
||||
@@ -622,12 +624,14 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
|
||||
if (YY_START == INITIAL) {
|
||||
BEGIN(ST_IN_SCRIPTING);
|
||||
yy_push_state(ST_IN_HTML, yyscanner);
|
||||
} else if (YY_START == ST_AFTER_HASHBANG) {
|
||||
BEGIN(ST_IN_HTML);
|
||||
}
|
||||
return T_INLINE_HTML;
|
||||
}
|
||||
}
|
||||
|
||||
<INITIAL,ST_IN_HTML>"<%="|"<?=" {
|
||||
<INITIAL,ST_IN_HTML,ST_AFTER_HASHBANG>"<%="|"<?=" {
|
||||
SETTOKEN;
|
||||
if ((yytext[1]=='%' && _scanner->aspTags()) ||
|
||||
(yytext[1]=='?' && _scanner->shortTags())) {
|
||||
@@ -641,12 +645,14 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
|
||||
if (YY_START == INITIAL) {
|
||||
BEGIN(ST_IN_SCRIPTING);
|
||||
yy_push_state(ST_IN_HTML, yyscanner);
|
||||
} else if (YY_START == ST_AFTER_HASHBANG) {
|
||||
BEGIN(ST_IN_HTML);
|
||||
}
|
||||
return T_INLINE_HTML;
|
||||
}
|
||||
}
|
||||
|
||||
<INITIAL,ST_IN_HTML>"<%" {
|
||||
<INITIAL,ST_IN_HTML,ST_AFTER_HASHBANG>"<%" {
|
||||
SETTOKEN;
|
||||
if (_scanner->aspTags()) {
|
||||
if (YY_START == INITIAL) {
|
||||
@@ -659,18 +665,23 @@ BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
|
||||
if (YY_START == INITIAL) {
|
||||
BEGIN(ST_IN_SCRIPTING);
|
||||
yy_push_state(ST_IN_HTML, yyscanner);
|
||||
} else if (YY_START == ST_AFTER_HASHBANG) {
|
||||
BEGIN(ST_IN_HTML);
|
||||
}
|
||||
return T_INLINE_HTML;
|
||||
}
|
||||
}
|
||||
|
||||
<INITIAL,ST_IN_HTML>"<?hh"([ \t]|{NEWLINE}) {
|
||||
if (YY_START != INITIAL) {
|
||||
_scanner->error("Hack mode: content before <?hh");
|
||||
return T_HACK_ERROR;
|
||||
<INITIAL,ST_IN_HTML,ST_AFTER_HASHBANG>"<?hh"([ \t]|{NEWLINE}) {
|
||||
if (YY_START == INITIAL) {
|
||||
BEGIN(ST_IN_SCRIPTING);
|
||||
} else if (YY_START == ST_AFTER_HASHBANG) {
|
||||
yy_pop_state(yyscanner);
|
||||
} else {
|
||||
_scanner->error("Hack mode: content before <?hh");
|
||||
return T_HACK_ERROR;
|
||||
}
|
||||
STEPPOS;
|
||||
BEGIN(ST_IN_SCRIPTING);
|
||||
_scanner->setHackMode();
|
||||
return T_OPEN_TAG;
|
||||
}
|
||||
|
||||
+21357
-21281
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
Referência em uma Nova Issue
Bloquear um usuário