skip shebang in the first line

Something like this works now:

===
% PATH="./bin:$PATH" ./sum.ktscript 31 21
31 + 21 = 52

% cat sum.ktscript
#!/usr/bin/env kotlin -script

val a = Integer.parseInt(args[0])
val b = Integer.parseInt(args[1])
println("$a + $b = ${a + b}")
===
This commit is contained in:
Stepan Koltsov
2012-05-28 22:59:03 +04:00
parent 7f53b2f111
commit 25f71bcd3a
10 changed files with 623 additions and 481 deletions
+3
View File
@@ -24,7 +24,10 @@
jvmargs="-Xmx512M"
fork="true"
failonerror="true">
<arg value="-charat"/>
<!-- generates invalid code when %line option is on
<arg value="-sliceandcharat"/>
-->
<arg value="-skel"/>
<arg value="@{skeleton}"/>
<arg value="-d"/>
@@ -55,7 +55,8 @@ public class SemanticWhitespaceAwarePsiBuilderImpl extends PsiBuilderAdapter imp
if (previousToken == JetTokens.BLOCK_COMMENT
|| previousToken == JetTokens.DOC_COMMENT
|| previousToken == JetTokens.EOL_COMMENT) {
|| previousToken == JetTokens.EOL_COMMENT
|| previousToken == SHEBANG_COMMENT) {
continue;
}
@@ -12,6 +12,8 @@ import org.jetbrains.jet.lexer.JetTokens;
%unicode
%class _JetLexer
%implements FlexLexer
%column
%line
%{
private static final class State {
@@ -31,6 +33,9 @@ import org.jetbrains.jet.lexer.JetTokens;
private final Stack<State> states = new Stack<State>();
private int lBraceCount;
private int yyline;
private int yycolumn;
private int commentStart;
private int commentDepth;
@@ -84,6 +89,7 @@ FIELD_IDENTIFIER = \${IDENTIFIER}
LABEL_IDENTIFIER = \@{IDENTIFIER}
EOL_COMMENT="/""/"[^\n]*
SHEBANG_COMMENT="#!"[^\n]*
INTEGER_LITERAL={DECIMAL_INTEGER_LITERAL}|{HEX_INTEGER_LITERAL}|{BIN_INTEGER_LITERAL}
DECIMAL_INTEGER_LITERAL=(0|([1-9]({DIGIT})*))
@@ -212,6 +218,15 @@ LONG_TEMPLATE_ENTRY_END=\}
({WHITE_SPACE_CHAR})+ { return JetTokens.WHITE_SPACE; }
{EOL_COMMENT} { return JetTokens.EOL_COMMENT; }
{SHEBANG_COMMENT} {
if (yyline == 0 && yycolumn == 0) {
return JetTokens.SHEBANG_COMMENT;
}
else {
yypushback(yylength() - 1);
return JetTokens.HASH;
}
}
{INTEGER_LITERAL}\.\. { yypushback(2); return JetTokens.INTEGER_LITERAL; }
{INTEGER_LITERAL} { return JetTokens.INTEGER_LITERAL; }
@@ -29,6 +29,7 @@ public interface JetTokens {
JetToken BLOCK_COMMENT = new JetToken("BLOCK_COMMENT");
JetToken DOC_COMMENT = new JetToken("DOC_COMMENT");
JetToken EOL_COMMENT = new JetToken("EOL_COMMENT");
JetToken SHEBANG_COMMENT = new JetToken("SHEBANG_COMMENT");
IElementType WHITE_SPACE = TokenType.WHITE_SPACE;
@@ -180,9 +181,9 @@ public interface JetTokens {
OPEN_KEYWORD, ANNOTATION_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD,
PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, INLINE_KEYWORD, ERASED_KEYWORD
);
TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT);
TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT, SHEBANG_COMMENT);
TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE);
TokenSet COMMENTS = TokenSet.create(EOL_COMMENT, BLOCK_COMMENT, DOC_COMMENT);
TokenSet COMMENTS = TokenSet.create(EOL_COMMENT, BLOCK_COMMENT, DOC_COMMENT, SHEBANG_COMMENT);
TokenSet STRINGS = TokenSet.create(CHARACTER_LITERAL, REGULAR_STRING_PART);
TokenSet OPERATIONS = TokenSet.create(AS_KEYWORD, AS_SAFE, IS_KEYWORD, IN_KEYWORD, DOT, PLUSPLUS, MINUSMINUS, EXCLEXCL, MUL, PLUS,
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,3 @@
#!/usr/bin/env kotlin
println(args)
+14
View File
@@ -0,0 +1,14 @@
JetFile: Shebang.ktscript
PsiComment(SHEBANG_COMMENT)('#!/usr/bin/env kotlin')
PsiWhiteSpace('\n\n')
SCRIPT
BLOCK
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('println')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
VALUE_ARGUMENT
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('args')
PsiElement(RPAR)(')')
@@ -0,0 +1,3 @@
println(1); #!/usr
#!/hi
@@ -0,0 +1,35 @@
JetFile: ShebangIncorrect.ktscript
SCRIPT
BLOCK
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('println')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
VALUE_ARGUMENT
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace(' ')
BINARY_EXPRESSION
TUPLE
PsiElement(HASH)('#')
PsiElement(EXCL)('!')
PsiErrorElement:Expecting an expression
<empty list>
OPERATION_REFERENCE
PsiElement(DIV)('/')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('usr')
PsiWhiteSpace('\n\n')
BINARY_EXPRESSION
TUPLE
PsiElement(HASH)('#')
PsiElement(EXCL)('!')
PsiErrorElement:Expecting an expression
<empty list>
OPERATION_REFERENCE
PsiElement(DIV)('/')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('hi')
@@ -82,6 +82,7 @@ public class JetHighlighter extends SyntaxHighlighterBase {
keys.put(JetTokens.CHARACTER_LITERAL, JetHighlightingColors.STRING);
keys.put(JetTokens.EOL_COMMENT, JetHighlightingColors.LINE_COMMENT);
keys.put(JetTokens.SHEBANG_COMMENT, JetHighlightingColors.LINE_COMMENT);
keys.put(JetTokens.BLOCK_COMMENT, JetHighlightingColors.BLOCK_COMMENT);
keys.put(JetTokens.DOC_COMMENT, JetHighlightingColors.DOC_COMMENT);