mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
PY-23279, PY-9963: Support quotes in commandline interface:
* GeneralCommandLine does not support "as is" command line: it should be splitted to arguments (due to ProcessBuilder interface). So, we need to support quotes in command line to use to split arguments
This commit is contained in:
@@ -18,6 +18,12 @@ public interface CommandLineElementTypes {
|
||||
IElementType LITERAL_STARTS_FROM_SYMBOL = new IElementType("LITERAL_STARTS_FROM_SYMBOL", null);
|
||||
IElementType LONG_OPTION_NAME_TOKEN = new IElementType("LONG_OPTION_NAME_TOKEN", null);
|
||||
IElementType SHORT_OPTION_NAME_TOKEN = new IElementType("SHORT_OPTION_NAME_TOKEN", null);
|
||||
IElementType SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT = new IElementType("SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT", null);
|
||||
IElementType SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER = new IElementType("SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER", null);
|
||||
IElementType SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL = new IElementType("SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL", null);
|
||||
IElementType SPACED_LITERAL_STARTS_FROM_DIGIT = new IElementType("SPACED_LITERAL_STARTS_FROM_DIGIT", null);
|
||||
IElementType SPACED_LITERAL_STARTS_FROM_LETTER = new IElementType("SPACED_LITERAL_STARTS_FROM_LETTER", null);
|
||||
IElementType SPACED_LITERAL_STARTS_FROM_SYMBOL = new IElementType("SPACED_LITERAL_STARTS_FROM_SYMBOL", null);
|
||||
|
||||
class Factory {
|
||||
public static PsiElement createElement(ASTNode node) {
|
||||
|
||||
@@ -43,7 +43,9 @@ public class CommandLineParser implements PsiParser, LightPsiParser {
|
||||
}
|
||||
|
||||
/* ********************************************************** */
|
||||
// LITERAL_STARTS_FROM_LETTER | LITERAL_STARTS_FROM_DIGIT | LITERAL_STARTS_FROM_SYMBOL
|
||||
// LITERAL_STARTS_FROM_LETTER | LITERAL_STARTS_FROM_DIGIT | LITERAL_STARTS_FROM_SYMBOL |
|
||||
// SPACED_LITERAL_STARTS_FROM_LETTER | SPACED_LITERAL_STARTS_FROM_DIGIT | SPACED_LITERAL_STARTS_FROM_SYMBOL |
|
||||
// SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER | SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT | SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL
|
||||
public static boolean argument(PsiBuilder b, int l) {
|
||||
if (!recursion_guard_(b, l, "argument")) return false;
|
||||
boolean r;
|
||||
@@ -51,6 +53,12 @@ public class CommandLineParser implements PsiParser, LightPsiParser {
|
||||
r = consumeToken(b, LITERAL_STARTS_FROM_LETTER);
|
||||
if (!r) r = consumeToken(b, LITERAL_STARTS_FROM_DIGIT);
|
||||
if (!r) r = consumeToken(b, LITERAL_STARTS_FROM_SYMBOL);
|
||||
if (!r) r = consumeToken(b, SPACED_LITERAL_STARTS_FROM_LETTER);
|
||||
if (!r) r = consumeToken(b, SPACED_LITERAL_STARTS_FROM_DIGIT);
|
||||
if (!r) r = consumeToken(b, SPACED_LITERAL_STARTS_FROM_SYMBOL);
|
||||
if (!r) r = consumeToken(b, SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER);
|
||||
if (!r) r = consumeToken(b, SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT);
|
||||
if (!r) r = consumeToken(b, SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL);
|
||||
exit_section_(b, l, m, r, false, null);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
/* The following code was generated by JFlex 1.7.0-SNAPSHOT tweaked for IntelliJ platform */
|
||||
|
||||
package com.jetbrains.commandInterface.commandLine;
|
||||
import com.intellij.lexer.*;
|
||||
|
||||
import com.intellij.lexer.FlexLexer;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import static com.intellij.psi.TokenType.*;
|
||||
|
||||
import static com.intellij.psi.TokenType.BAD_CHARACTER;
|
||||
import static com.intellij.psi.TokenType.WHITE_SPACE;
|
||||
import static com.jetbrains.commandInterface.commandLine.CommandLineElementTypes.*;
|
||||
|
||||
|
||||
@@ -109,47 +112,47 @@ public class _CommandLineLexer implements FlexLexer {
|
||||
|
||||
/* The ZZ_CMAP_A table has 3088 entries */
|
||||
static final char ZZ_CMAP_A[] = zzUnpackCMap(
|
||||
"\11\0\5\1\22\0\1\1\14\0\1\7\2\6\12\11\1\5\2\0\1\13\3\0\32\4\1\0\1\5\2\0\1"+
|
||||
"\3\13\4\3\0\1\12\6\0\1\1\12\0\1\1\11\0\1\2\12\0\1\2\4\0\1\2\5\0\27\2\1\0\12"+
|
||||
"\2\4\0\14\2\16\0\5\2\7\0\1\2\1\0\1\2\1\0\5\2\1\0\2\2\2\0\4\2\1\0\1\2\6\0\1"+
|
||||
"\2\1\0\3\2\1\0\1\2\1\0\4\2\1\0\23\2\1\0\13\2\10\0\6\2\1\0\26\2\2\0\1\2\6\0"+
|
||||
"\10\2\10\0\13\2\5\0\3\2\15\0\12\10\4\0\6\2\1\0\1\2\17\0\2\2\7\0\2\2\12\10"+
|
||||
"\3\2\2\0\2\2\1\0\16\2\15\0\11\2\13\0\1\2\16\0\12\10\6\2\4\0\2\2\4\0\1\2\5"+
|
||||
"\0\6\2\4\0\1\2\11\0\1\2\3\0\1\2\7\0\11\2\7\0\5\2\17\0\26\2\3\0\1\2\2\0\1\2"+
|
||||
"\7\0\12\2\4\0\12\10\1\2\4\0\10\2\2\0\2\2\2\0\26\2\1\0\7\2\1\0\1\2\3\0\4\2"+
|
||||
"\3\0\1\2\20\0\1\2\15\0\2\2\1\0\1\2\5\0\6\2\4\0\2\2\1\0\2\2\1\0\2\2\1\0\2\2"+
|
||||
"\17\0\4\2\1\0\1\2\7\0\12\10\2\0\3\2\20\0\11\2\1\0\2\2\1\0\2\2\1\0\5\2\3\0"+
|
||||
"\1\2\2\0\1\2\30\0\1\2\13\0\10\2\2\0\1\2\3\0\1\2\1\0\6\2\3\0\3\2\1\0\4\2\3"+
|
||||
"\0\2\2\1\0\1\2\1\0\2\2\3\0\2\2\3\0\3\2\3\0\14\2\13\0\10\2\1\0\2\2\10\0\3\2"+
|
||||
"\5\0\4\2\1\0\5\2\3\0\1\2\3\0\2\2\15\0\13\2\2\0\1\2\21\0\1\2\12\0\6\2\5\0\22"+
|
||||
"\2\3\0\10\2\1\0\11\2\1\0\1\2\2\0\7\2\11\0\1\2\1\0\2\2\14\0\12\10\7\0\2\2\1"+
|
||||
"\0\1\2\2\0\2\2\1\0\1\2\2\0\1\2\6\0\4\2\1\0\7\2\1\0\3\2\1\0\1\2\1\0\1\2\2\0"+
|
||||
"\2\2\1\0\4\2\1\0\2\2\11\0\1\2\2\0\5\2\1\0\1\2\11\0\12\10\2\0\14\2\1\0\24\2"+
|
||||
"\13\0\5\2\3\0\6\2\4\0\4\2\3\0\1\2\3\0\2\2\7\0\3\2\4\0\15\2\14\0\1\2\1\0\6"+
|
||||
"\2\1\0\1\2\5\0\1\2\2\0\13\2\1\0\15\2\1\0\4\2\2\0\7\2\1\0\1\2\1\0\4\2\2\0\1"+
|
||||
"\2\1\0\4\2\2\0\7\2\1\0\1\2\1\0\4\2\2\0\16\2\2\0\6\2\2\0\15\2\2\0\1\2\1\1\17"+
|
||||
"\2\1\0\10\2\7\0\15\2\1\0\6\2\23\0\1\2\4\0\1\2\3\0\11\2\1\0\1\2\5\0\17\2\1"+
|
||||
"\0\16\2\2\0\14\2\13\0\1\2\15\0\7\2\7\0\16\2\15\0\2\2\12\10\3\0\3\2\11\0\4"+
|
||||
"\2\1\0\4\2\3\0\2\2\11\0\10\2\1\0\1\2\1\0\1\2\1\0\1\2\1\0\6\2\1\0\7\2\1\0\1"+
|
||||
"\2\3\0\3\2\1\0\7\2\3\0\4\2\2\0\6\2\4\0\13\1\15\0\2\1\5\0\1\1\17\0\1\1\1\0"+
|
||||
"\1\2\15\0\1\2\2\0\1\2\4\0\1\2\2\0\12\2\1\0\1\2\3\0\5\2\6\0\1\2\1\0\1\2\1\0"+
|
||||
"\1\2\1\0\4\2\1\0\13\2\2\0\4\2\5\0\5\2\4\0\1\2\4\0\2\2\13\0\5\2\6\0\4\2\3\0"+
|
||||
"\2\2\14\0\10\2\7\0\10\2\1\0\7\2\1\0\1\1\4\0\2\2\12\0\5\2\5\0\2\2\3\0\7\2\6"+
|
||||
"\0\3\2\12\10\2\2\13\0\11\2\2\0\27\2\2\0\7\2\1\0\3\2\1\0\4\2\1\0\4\2\2\0\6"+
|
||||
"\2\3\0\1\2\1\0\1\2\2\0\5\2\1\0\12\2\12\10\5\2\1\0\3\2\1\0\10\2\4\0\7\2\3\0"+
|
||||
"\1\2\3\0\2\2\1\0\1\2\3\0\2\2\2\0\5\2\2\0\1\2\1\0\1\2\30\0\3\2\3\0\6\2\2\0"+
|
||||
"\6\2\2\0\6\2\11\0\7\2\4\0\5\2\3\0\5\2\5\0\1\2\1\0\10\2\1\0\5\2\1\0\1\2\1\0"+
|
||||
"\2\2\1\0\2\2\1\0\12\2\6\0\12\2\2\0\6\2\2\0\6\2\2\0\6\2\2\0\3\2\3\0\14\2\1"+
|
||||
"\0\16\2\1\0\2\2\1\0\2\2\1\0\10\2\6\0\4\2\4\0\16\2\2\0\1\2\1\0\14\2\1\0\2\2"+
|
||||
"\3\0\1\2\2\0\4\2\1\0\2\2\12\0\10\2\6\0\6\2\1\0\3\2\1\0\12\2\3\0\1\2\12\0\4"+
|
||||
"\2\13\0\12\10\1\2\1\0\1\2\3\0\7\2\1\0\1\2\1\0\4\2\1\0\17\2\1\0\2\2\14\0\3"+
|
||||
"\2\4\0\2\2\1\0\1\2\20\0\4\2\10\0\1\2\13\0\10\2\5\0\3\2\2\0\1\2\2\0\2\2\2\0"+
|
||||
"\4\2\1\0\14\2\1\0\1\2\1\0\7\2\1\0\21\2\1\0\4\2\2\0\10\2\1\0\7\2\1\0\14\2\1"+
|
||||
"\0\4\2\1\0\5\2\1\0\1\2\3\0\14\2\2\0\13\2\1\0\10\2\2\0\22\10\1\0\2\2\1\0\1"+
|
||||
"\2\2\0\1\2\1\0\12\2\1\0\4\2\1\0\1\2\1\0\1\2\6\0\1\2\4\0\1\2\1\0\1\2\1\0\1"+
|
||||
"\2\1\0\3\2\1\0\2\2\1\0\1\2\2\0\1\2\1\0\1\2\1\0\1\2\1\0\1\2\1\0\1\2\1\0\2\2"+
|
||||
"\1\0\1\2\2\0\4\2\1\0\7\2\1\0\4\2\1\0\4\2\1\0\1\2\1\0\12\2\1\0\5\2\1\0\3\2"+
|
||||
"\1\0\5\2\1\0\5\2");
|
||||
"\11\0\5\2\22\0\1\2\1\0\1\14\4\0\1\15\5\0\1\10\2\7\12\12\1\6\2\0\1\16\3\0\32"+
|
||||
"\5\1\0\1\6\2\0\1\4\13\5\3\0\1\13\6\0\1\1\12\0\1\1\11\0\1\3\12\0\1\3\4\0\1"+
|
||||
"\3\5\0\27\3\1\0\12\3\4\0\14\3\16\0\5\3\7\0\1\3\1\0\1\3\1\0\5\3\1\0\2\3\2\0"+
|
||||
"\4\3\1\0\1\3\6\0\1\3\1\0\3\3\1\0\1\3\1\0\4\3\1\0\23\3\1\0\13\3\10\0\6\3\1"+
|
||||
"\0\26\3\2\0\1\3\6\0\10\3\10\0\13\3\5\0\3\3\15\0\12\11\4\0\6\3\1\0\1\3\17\0"+
|
||||
"\2\3\7\0\2\3\12\11\3\3\2\0\2\3\1\0\16\3\15\0\11\3\13\0\1\3\16\0\12\11\6\3"+
|
||||
"\4\0\2\3\4\0\1\3\5\0\6\3\4\0\1\3\11\0\1\3\3\0\1\3\7\0\11\3\7\0\5\3\17\0\26"+
|
||||
"\3\3\0\1\3\2\0\1\3\7\0\12\3\4\0\12\11\1\3\4\0\10\3\2\0\2\3\2\0\26\3\1\0\7"+
|
||||
"\3\1\0\1\3\3\0\4\3\3\0\1\3\20\0\1\3\15\0\2\3\1\0\1\3\5\0\6\3\4\0\2\3\1\0\2"+
|
||||
"\3\1\0\2\3\1\0\2\3\17\0\4\3\1\0\1\3\7\0\12\11\2\0\3\3\20\0\11\3\1\0\2\3\1"+
|
||||
"\0\2\3\1\0\5\3\3\0\1\3\2\0\1\3\30\0\1\3\13\0\10\3\2\0\1\3\3\0\1\3\1\0\6\3"+
|
||||
"\3\0\3\3\1\0\4\3\3\0\2\3\1\0\1\3\1\0\2\3\3\0\2\3\3\0\3\3\3\0\14\3\13\0\10"+
|
||||
"\3\1\0\2\3\10\0\3\3\5\0\4\3\1\0\5\3\3\0\1\3\3\0\2\3\15\0\13\3\2\0\1\3\21\0"+
|
||||
"\1\3\12\0\6\3\5\0\22\3\3\0\10\3\1\0\11\3\1\0\1\3\2\0\7\3\11\0\1\3\1\0\2\3"+
|
||||
"\14\0\12\11\7\0\2\3\1\0\1\3\2\0\2\3\1\0\1\3\2\0\1\3\6\0\4\3\1\0\7\3\1\0\3"+
|
||||
"\3\1\0\1\3\1\0\1\3\2\0\2\3\1\0\4\3\1\0\2\3\11\0\1\3\2\0\5\3\1\0\1\3\11\0\12"+
|
||||
"\11\2\0\14\3\1\0\24\3\13\0\5\3\3\0\6\3\4\0\4\3\3\0\1\3\3\0\2\3\7\0\3\3\4\0"+
|
||||
"\15\3\14\0\1\3\1\0\6\3\1\0\1\3\5\0\1\3\2\0\13\3\1\0\15\3\1\0\4\3\2\0\7\3\1"+
|
||||
"\0\1\3\1\0\4\3\2\0\1\3\1\0\4\3\2\0\7\3\1\0\1\3\1\0\4\3\2\0\16\3\2\0\6\3\2"+
|
||||
"\0\15\3\2\0\1\3\1\1\17\3\1\0\10\3\7\0\15\3\1\0\6\3\23\0\1\3\4\0\1\3\3\0\11"+
|
||||
"\3\1\0\1\3\5\0\17\3\1\0\16\3\2\0\14\3\13\0\1\3\15\0\7\3\7\0\16\3\15\0\2\3"+
|
||||
"\12\11\3\0\3\3\11\0\4\3\1\0\4\3\3\0\2\3\11\0\10\3\1\0\1\3\1\0\1\3\1\0\1\3"+
|
||||
"\1\0\6\3\1\0\7\3\1\0\1\3\3\0\3\3\1\0\7\3\3\0\4\3\2\0\6\3\4\0\13\1\15\0\2\1"+
|
||||
"\5\0\1\1\17\0\1\1\1\0\1\3\15\0\1\3\2\0\1\3\4\0\1\3\2\0\12\3\1\0\1\3\3\0\5"+
|
||||
"\3\6\0\1\3\1\0\1\3\1\0\1\3\1\0\4\3\1\0\13\3\2\0\4\3\5\0\5\3\4\0\1\3\4\0\2"+
|
||||
"\3\13\0\5\3\6\0\4\3\3\0\2\3\14\0\10\3\7\0\10\3\1\0\7\3\1\0\1\1\4\0\2\3\12"+
|
||||
"\0\5\3\5\0\2\3\3\0\7\3\6\0\3\3\12\11\2\3\13\0\11\3\2\0\27\3\2\0\7\3\1\0\3"+
|
||||
"\3\1\0\4\3\1\0\4\3\2\0\6\3\3\0\1\3\1\0\1\3\2\0\5\3\1\0\12\3\12\11\5\3\1\0"+
|
||||
"\3\3\1\0\10\3\4\0\7\3\3\0\1\3\3\0\2\3\1\0\1\3\3\0\2\3\2\0\5\3\2\0\1\3\1\0"+
|
||||
"\1\3\30\0\3\3\3\0\6\3\2\0\6\3\2\0\6\3\11\0\7\3\4\0\5\3\3\0\5\3\5\0\1\3\1\0"+
|
||||
"\10\3\1\0\5\3\1\0\1\3\1\0\2\3\1\0\2\3\1\0\12\3\6\0\12\3\2\0\6\3\2\0\6\3\2"+
|
||||
"\0\6\3\2\0\3\3\3\0\14\3\1\0\16\3\1\0\2\3\1\0\2\3\1\0\10\3\6\0\4\3\4\0\16\3"+
|
||||
"\2\0\1\3\1\0\14\3\1\0\2\3\3\0\1\3\2\0\4\3\1\0\2\3\12\0\10\3\6\0\6\3\1\0\3"+
|
||||
"\3\1\0\12\3\3\0\1\3\12\0\4\3\13\0\12\11\1\3\1\0\1\3\3\0\7\3\1\0\1\3\1\0\4"+
|
||||
"\3\1\0\17\3\1\0\2\3\14\0\3\3\4\0\2\3\1\0\1\3\20\0\4\3\10\0\1\3\13\0\10\3\5"+
|
||||
"\0\3\3\2\0\1\3\2\0\2\3\2\0\4\3\1\0\14\3\1\0\1\3\1\0\7\3\1\0\21\3\1\0\4\3\2"+
|
||||
"\0\10\3\1\0\7\3\1\0\14\3\1\0\4\3\1\0\5\3\1\0\1\3\3\0\14\3\2\0\13\3\1\0\10"+
|
||||
"\3\2\0\22\11\1\0\2\3\1\0\1\3\2\0\1\3\1\0\12\3\1\0\4\3\1\0\1\3\1\0\1\3\6\0"+
|
||||
"\1\3\4\0\1\3\1\0\1\3\1\0\1\3\1\0\3\3\1\0\2\3\1\0\1\3\2\0\1\3\1\0\1\3\1\0\1"+
|
||||
"\3\1\0\1\3\1\0\1\3\1\0\2\3\1\0\1\3\2\0\4\3\1\0\7\3\1\0\4\3\1\0\4\3\1\0\1\3"+
|
||||
"\1\0\12\3\1\0\5\3\1\0\3\3\1\0\5\3\1\0\5\3");
|
||||
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
@@ -157,11 +160,12 @@ public class _CommandLineLexer implements FlexLexer {
|
||||
private static final int [] ZZ_ACTION = zzUnpackAction();
|
||||
|
||||
private static final String ZZ_ACTION_PACKED_0 =
|
||||
"\1\0\1\1\1\2\1\3\1\4\1\1\1\5\1\6"+
|
||||
"\1\7\1\0\1\10";
|
||||
"\1\0\1\1\1\2\1\3\1\4\1\1\1\5\2\1"+
|
||||
"\1\6\1\7\7\0\1\10\1\11\1\12\1\13\1\14"+
|
||||
"\1\15\1\16";
|
||||
|
||||
private static int [] zzUnpackAction() {
|
||||
int [] result = new int[11];
|
||||
int [] result = new int[25];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -186,11 +190,13 @@ public class _CommandLineLexer implements FlexLexer {
|
||||
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
|
||||
private static final String ZZ_ROWMAP_PACKED_0 =
|
||||
"\0\0\0\14\0\30\0\44\0\60\0\74\0\110\0\14"+
|
||||
"\0\14\0\124\0\140";
|
||||
"\0\0\0\17\0\36\0\55\0\74\0\113\0\132\0\151"+
|
||||
"\0\170\0\17\0\17\0\207\0\226\0\245\0\264\0\303"+
|
||||
"\0\322\0\341\0\360\0\17\0\17\0\17\0\17\0\17"+
|
||||
"\0\17";
|
||||
|
||||
private static int [] zzUnpackRowMap() {
|
||||
int [] result = new int[11];
|
||||
int [] result = new int[25];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -213,15 +219,23 @@ public class _CommandLineLexer implements FlexLexer {
|
||||
private static final int [] ZZ_TRANS = zzUnpackTrans();
|
||||
|
||||
private static final String ZZ_TRANS_PACKED_0 =
|
||||
"\1\2\1\3\1\4\1\2\1\4\1\2\1\5\1\6"+
|
||||
"\2\7\1\5\1\10\15\0\1\3\15\0\5\4\1\0"+
|
||||
"\1\4\5\0\5\5\1\0\1\5\4\0\1\11\1\0"+
|
||||
"\1\11\2\0\1\12\7\0\5\7\1\0\1\7\4\0"+
|
||||
"\1\13\1\0\1\13\12\0\2\13\2\0\1\13\1\0"+
|
||||
"\1\13\2\0";
|
||||
"\1\2\2\3\1\4\1\2\1\4\1\2\1\5\1\6"+
|
||||
"\2\7\1\5\1\10\1\11\1\12\20\0\2\3\20\0"+
|
||||
"\5\4\1\0\1\4\10\0\5\5\1\0\1\5\7\0"+
|
||||
"\1\13\1\0\1\13\2\0\1\14\12\0\5\7\1\0"+
|
||||
"\1\7\7\0\1\15\1\0\1\15\1\0\1\16\1\0"+
|
||||
"\2\17\1\16\6\0\1\20\1\0\1\20\1\0\1\21"+
|
||||
"\1\0\2\22\1\21\6\0\1\23\1\0\1\23\13\0"+
|
||||
"\1\15\1\0\5\15\1\0\1\15\1\0\1\24\4\0"+
|
||||
"\1\16\1\0\5\16\1\0\1\16\1\0\1\25\4\0"+
|
||||
"\1\17\1\0\5\17\1\0\1\17\1\0\1\26\4\0"+
|
||||
"\1\20\1\0\5\20\1\0\1\20\2\0\1\27\3\0"+
|
||||
"\1\21\1\0\5\21\1\0\1\21\2\0\1\30\3\0"+
|
||||
"\1\22\1\0\5\22\1\0\1\22\2\0\1\31\5\0"+
|
||||
"\2\23\2\0\1\23\1\0\1\23\4\0";
|
||||
|
||||
private static int [] zzUnpackTrans() {
|
||||
int [] result = new int[108];
|
||||
int [] result = new int[255];
|
||||
int offset = 0;
|
||||
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -259,10 +273,10 @@ public class _CommandLineLexer implements FlexLexer {
|
||||
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 =
|
||||
"\1\0\1\11\5\1\2\11\1\0\1\1";
|
||||
"\1\0\1\11\7\1\2\11\7\0\1\1\6\11";
|
||||
|
||||
private static int [] zzUnpackAttribute() {
|
||||
int [] result = new int[11];
|
||||
int [] result = new int[25];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
@@ -570,35 +584,59 @@ public class _CommandLineLexer implements FlexLexer {
|
||||
case 1:
|
||||
{ return BAD_CHARACTER;
|
||||
}
|
||||
case 9: break;
|
||||
case 15: break;
|
||||
case 2:
|
||||
{ return WHITE_SPACE;
|
||||
}
|
||||
case 10: break;
|
||||
case 16: break;
|
||||
case 3:
|
||||
{ return LITERAL_STARTS_FROM_LETTER;
|
||||
}
|
||||
case 11: break;
|
||||
case 17: break;
|
||||
case 4:
|
||||
{ return LITERAL_STARTS_FROM_SYMBOL;
|
||||
}
|
||||
case 12: break;
|
||||
case 18: break;
|
||||
case 5:
|
||||
{ return LITERAL_STARTS_FROM_DIGIT;
|
||||
}
|
||||
case 13: break;
|
||||
case 19: break;
|
||||
case 6:
|
||||
{ return EQ;
|
||||
}
|
||||
case 14: break;
|
||||
case 20: break;
|
||||
case 7:
|
||||
{ return SHORT_OPTION_NAME_TOKEN;
|
||||
}
|
||||
case 15: break;
|
||||
case 21: break;
|
||||
case 8:
|
||||
{ return LONG_OPTION_NAME_TOKEN;
|
||||
}
|
||||
case 16: break;
|
||||
case 22: break;
|
||||
case 9:
|
||||
{ return SPACED_LITERAL_STARTS_FROM_LETTER;
|
||||
}
|
||||
case 23: break;
|
||||
case 10:
|
||||
{ return SPACED_LITERAL_STARTS_FROM_SYMBOL;
|
||||
}
|
||||
case 24: break;
|
||||
case 11:
|
||||
{ return SPACED_LITERAL_STARTS_FROM_DIGIT;
|
||||
}
|
||||
case 25: break;
|
||||
case 12:
|
||||
{ return SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER;
|
||||
}
|
||||
case 26: break;
|
||||
case 13:
|
||||
{ return SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL;
|
||||
}
|
||||
case 27: break;
|
||||
case 14:
|
||||
{ return SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT;
|
||||
}
|
||||
case 28: break;
|
||||
default:
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,24 @@ public interface CommandLineArgument extends CommandLinePart {
|
||||
@Nullable
|
||||
PsiElement getLiteralStartsFromSymbol();
|
||||
|
||||
@Nullable
|
||||
PsiElement getSingleQSpacedLiteralStartsFromDigit();
|
||||
|
||||
@Nullable
|
||||
PsiElement getSingleQSpacedLiteralStartsFromLetter();
|
||||
|
||||
@Nullable
|
||||
PsiElement getSingleQSpacedLiteralStartsFromSymbol();
|
||||
|
||||
@Nullable
|
||||
PsiElement getSpacedLiteralStartsFromDigit();
|
||||
|
||||
@Nullable
|
||||
PsiElement getSpacedLiteralStartsFromLetter();
|
||||
|
||||
@Nullable
|
||||
PsiElement getSpacedLiteralStartsFromSymbol();
|
||||
|
||||
@Nullable
|
||||
Option findOptionForOptionArgument();
|
||||
|
||||
@@ -29,4 +47,7 @@ public interface CommandLineArgument extends CommandLinePart {
|
||||
@Nullable
|
||||
Help findBestHelp();
|
||||
|
||||
@NotNull
|
||||
String getValueNoQuotes();
|
||||
|
||||
}
|
||||
|
||||
@@ -24,4 +24,7 @@ public interface CommandLineOption extends CommandLinePart {
|
||||
@Nullable
|
||||
Option findRealOption();
|
||||
|
||||
@Nullable
|
||||
CommandLineArgument findArgument();
|
||||
|
||||
}
|
||||
|
||||
+41
@@ -47,6 +47,42 @@ public class CommandLineArgumentImpl extends CommandLineElement implements Comma
|
||||
return findChildByType(LITERAL_STARTS_FROM_SYMBOL);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public PsiElement getSingleQSpacedLiteralStartsFromDigit() {
|
||||
return findChildByType(SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public PsiElement getSingleQSpacedLiteralStartsFromLetter() {
|
||||
return findChildByType(SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public PsiElement getSingleQSpacedLiteralStartsFromSymbol() {
|
||||
return findChildByType(SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public PsiElement getSpacedLiteralStartsFromDigit() {
|
||||
return findChildByType(SPACED_LITERAL_STARTS_FROM_DIGIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public PsiElement getSpacedLiteralStartsFromLetter() {
|
||||
return findChildByType(SPACED_LITERAL_STARTS_FROM_LETTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public PsiElement getSpacedLiteralStartsFromSymbol() {
|
||||
return findChildByType(SPACED_LITERAL_STARTS_FROM_SYMBOL);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Option findOptionForOptionArgument() {
|
||||
return CommandLinePsiImplUtils.findOptionForOptionArgument(this);
|
||||
@@ -62,4 +98,9 @@ public class CommandLineArgumentImpl extends CommandLineElement implements Comma
|
||||
return CommandLinePsiImplUtils.findBestHelp(this);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getValueNoQuotes() {
|
||||
return CommandLinePsiImplUtils.getValueNoQuotes(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+5
@@ -54,4 +54,9 @@ public class CommandLineOptionImpl extends CommandLineElement implements Command
|
||||
return CommandLinePsiImplUtils.findRealOption(this);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public CommandLineArgument findArgument() {
|
||||
return CommandLinePsiImplUtils.findArgument(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
package com.jetbrains.commandInterface.commandLine;
|
||||
import com.intellij.lexer.*;
|
||||
|
||||
import com.intellij.lexer.FlexLexer;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import static com.intellij.psi.TokenType.*;
|
||||
|
||||
import static com.intellij.psi.TokenType.BAD_CHARACTER;
|
||||
import static com.intellij.psi.TokenType.WHITE_SPACE;
|
||||
import static com.jetbrains.commandInterface.commandLine.CommandLineElementTypes.*;
|
||||
|
||||
%%
|
||||
@@ -19,25 +22,40 @@ import static com.jetbrains.commandInterface.commandLine.CommandLineElementTypes
|
||||
%type IElementType
|
||||
%unicode
|
||||
|
||||
EOL=\R
|
||||
WHITE_SPACE=\s+
|
||||
|
||||
SPACE=[ \t\n\x0B\f\r]+
|
||||
LITERAL_STARTS_FROM_LETTER=[:letter:]([a-zA-Z_0-9]|:|\\|"/"|\.|-)*
|
||||
LITERAL_STARTS_FROM_DIGIT=[:digit:]([a-zA-Z_0-9]|:|\\|"/"|\.|-)*
|
||||
LITERAL_STARTS_FROM_SYMBOL=([/\~\.]([a-zA-Z_0-9]|:|\\|"/"|\.|-)*)
|
||||
SPACED_LITERAL_STARTS_FROM_LETTER=\"[:letter:]([a-zA-Z_0-9]|:|\\|"/"|\.|-|[ \t\n\x0B\f\r])*\"
|
||||
SPACED_LITERAL_STARTS_FROM_DIGIT=\"[:digit:]([a-zA-Z_0-9]|:|\\|"/"|\.|-|[ \t\n\x0B\f\r])*\"
|
||||
SPACED_LITERAL_STARTS_FROM_SYMBOL=\"([/\~\.]([a-zA-Z_0-9]|:|\\|"/"|\.|-|[ \t\n\x0B\f\r])*)\"
|
||||
SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER='[:letter:]([a-zA-Z_0-9]|:|\\|"/"|\.|-|[ \t\n\x0B\f\r])*'
|
||||
SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT='[:digit:]([a-zA-Z_0-9]|:|\\|"/"|\.|-|[ \t\n\x0B\f\r])*'
|
||||
SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL='([/\~\.]([a-zA-Z_0-9]|:|\\|"/"|\.|-|[ \t\n\x0B\f\r])*)'
|
||||
SHORT_OPTION_NAME_TOKEN=-[:letter:]
|
||||
LONG_OPTION_NAME_TOKEN=--[:letter:](-|[a-zA-Z_0-9])*
|
||||
|
||||
%%
|
||||
<YYINITIAL> {
|
||||
{WHITE_SPACE} { return WHITE_SPACE; }
|
||||
{WHITE_SPACE} { return WHITE_SPACE; }
|
||||
|
||||
"=" { return EQ; }
|
||||
"=" { return EQ; }
|
||||
|
||||
{LITERAL_STARTS_FROM_LETTER} { return LITERAL_STARTS_FROM_LETTER; }
|
||||
{LITERAL_STARTS_FROM_DIGIT} { return LITERAL_STARTS_FROM_DIGIT; }
|
||||
{LITERAL_STARTS_FROM_SYMBOL} { return LITERAL_STARTS_FROM_SYMBOL; }
|
||||
{SHORT_OPTION_NAME_TOKEN} { return SHORT_OPTION_NAME_TOKEN; }
|
||||
{LONG_OPTION_NAME_TOKEN} { return LONG_OPTION_NAME_TOKEN; }
|
||||
{SPACE} { return SPACE; }
|
||||
{LITERAL_STARTS_FROM_LETTER} { return LITERAL_STARTS_FROM_LETTER; }
|
||||
{LITERAL_STARTS_FROM_DIGIT} { return LITERAL_STARTS_FROM_DIGIT; }
|
||||
{LITERAL_STARTS_FROM_SYMBOL} { return LITERAL_STARTS_FROM_SYMBOL; }
|
||||
{SPACED_LITERAL_STARTS_FROM_LETTER} { return SPACED_LITERAL_STARTS_FROM_LETTER; }
|
||||
{SPACED_LITERAL_STARTS_FROM_DIGIT} { return SPACED_LITERAL_STARTS_FROM_DIGIT; }
|
||||
{SPACED_LITERAL_STARTS_FROM_SYMBOL} { return SPACED_LITERAL_STARTS_FROM_SYMBOL; }
|
||||
{SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER} { return SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER; }
|
||||
{SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT} { return SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT; }
|
||||
{SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL} { return SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL; }
|
||||
{SHORT_OPTION_NAME_TOKEN} { return SHORT_OPTION_NAME_TOKEN; }
|
||||
{LONG_OPTION_NAME_TOKEN} { return LONG_OPTION_NAME_TOKEN; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,18 @@
|
||||
LITERAL_STARTS_FROM_LETTER='regexp:\p{Alpha}(\w|:|\\|/|\.|-)*'
|
||||
LITERAL_STARTS_FROM_DIGIT='regexp:\p{Digit}(\w|:|\\|/|\.|-)*'
|
||||
LITERAL_STARTS_FROM_SYMBOL='regexp:([/\~\.](\w|:|\\|/|\.|-)*)'
|
||||
|
||||
SPACED_LITERAL_STARTS_FROM_LETTER='regexp:"\p{Alpha}(\w|:|\\|/|\.|-|\s)*"'
|
||||
SPACED_LITERAL_STARTS_FROM_DIGIT='regexp:"\p{Digit}(\w|:|\\|/|\.|-|\s)*"'
|
||||
SPACED_LITERAL_STARTS_FROM_SYMBOL='regexp:"([/\~\.](\w|:|\\|/|\.|-|\s)*)"'
|
||||
|
||||
|
||||
SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER="regexp:'\p{Alpha}(\w|:|\\|/|\.|-|\s)*'"
|
||||
SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT="regexp:'\p{Digit}(\w|:|\\|/|\.|-|\s)*'"
|
||||
SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL="regexp:'([/\~\.](\w|:|\\|/|\.|-|\s)*)'"
|
||||
|
||||
|
||||
|
||||
SHORT_OPTION_NAME_TOKEN='regexp:-\p{Alpha}'
|
||||
LONG_OPTION_NAME_TOKEN='regexp:--\p{Alpha}(-|\w)*'
|
||||
]
|
||||
@@ -37,10 +49,13 @@
|
||||
root ::= command (argument | option ) * <<eof>>
|
||||
command ::= LITERAL_STARTS_FROM_LETTER
|
||||
option ::= (short_option_name <<bound_argument>> ? | long_option_name <<bound_argument>> ?) {
|
||||
methods=[ getOptionName isLong findRealOption ]
|
||||
methods=[ getOptionName isLong findRealOption findArgument ]
|
||||
}
|
||||
private short_option_name ::= SHORT_OPTION_NAME_TOKEN
|
||||
private long_option_name ::= LONG_OPTION_NAME_TOKEN
|
||||
argument ::= LITERAL_STARTS_FROM_LETTER | LITERAL_STARTS_FROM_DIGIT | LITERAL_STARTS_FROM_SYMBOL {
|
||||
methods=[ findOptionForOptionArgument findRealArgument findBestHelp ]
|
||||
argument ::= LITERAL_STARTS_FROM_LETTER | LITERAL_STARTS_FROM_DIGIT | LITERAL_STARTS_FROM_SYMBOL |
|
||||
SPACED_LITERAL_STARTS_FROM_LETTER | SPACED_LITERAL_STARTS_FROM_DIGIT | SPACED_LITERAL_STARTS_FROM_SYMBOL |
|
||||
SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER | SINGLE_Q_SPACED_LITERAL_STARTS_FROM_DIGIT | SINGLE_Q_SPACED_LITERAL_STARTS_FROM_SYMBOL
|
||||
{
|
||||
methods=[ findOptionForOptionArgument findRealArgument findBestHelp getValueNoQuotes ]
|
||||
}
|
||||
|
||||
+25
-1
@@ -24,6 +24,7 @@ import com.jetbrains.commandInterface.commandLine.ValidationResult;
|
||||
import com.jetbrains.commandInterface.commandLine.psi.CommandLineArgument;
|
||||
import com.jetbrains.commandInterface.commandLine.psi.CommandLineFile;
|
||||
import com.jetbrains.commandInterface.commandLine.psi.CommandLineOption;
|
||||
import com.jetbrains.python.psi.PyUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -50,6 +51,18 @@ final class CommandLinePsiImplUtils {
|
||||
return o.getLongOptionNameToken() != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* For options with eq finds argument next to it.
|
||||
* For options with out of eq just use next psi
|
||||
* @return null if option does not have eq
|
||||
*/
|
||||
@Nullable
|
||||
static CommandLineArgument findArgument(@NotNull final CommandLineOption option) {
|
||||
if (option.getText().endsWith("=")) {
|
||||
return PyUtil.as(option.getNextSibling(), CommandLineArgument.class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Finds real option based on psi opton
|
||||
*
|
||||
@@ -65,7 +78,18 @@ final class CommandLinePsiImplUtils {
|
||||
return validationResult.getOption(option);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return for arg in quotes returns bare value, or simply value otherwise
|
||||
*/
|
||||
@NotNull
|
||||
static String getValueNoQuotes(@NotNull final CommandLineArgument argument) {
|
||||
final char[] chars = argument.getText().toCharArray();
|
||||
final char firstChar = chars[0];
|
||||
if (firstChar == chars[chars.length - 1] && firstChar == '"' || firstChar == '\'') {
|
||||
return argument.getText().substring(1, argument.getTextLength() - 1);
|
||||
}
|
||||
return argument.getText();
|
||||
}
|
||||
/**
|
||||
* Tries to find appropriate help for argument. It can be argument help for positional argument or option help
|
||||
* for option argument.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
fake_command "spam and eggs" chicken --with=ketchup --with='russian mustard'
|
||||
@@ -0,0 +1,21 @@
|
||||
FILE
|
||||
CommandLineCommandImpl(COMMAND)
|
||||
PsiElement(LITERAL_STARTS_FROM_LETTER)('fake_command')
|
||||
PsiWhiteSpace(' ')
|
||||
CommandLineArgumentImpl(ARGUMENT)
|
||||
PsiElement(SPACED_LITERAL_STARTS_FROM_LETTER)('"spam and eggs"')
|
||||
PsiWhiteSpace(' ')
|
||||
CommandLineArgumentImpl(ARGUMENT)
|
||||
PsiElement(LITERAL_STARTS_FROM_LETTER)('chicken')
|
||||
PsiWhiteSpace(' ')
|
||||
CommandLineOptionImpl(OPTION)
|
||||
PsiElement(LONG_OPTION_NAME_TOKEN)('--with')
|
||||
PsiElement(=)('=')
|
||||
CommandLineArgumentImpl(ARGUMENT)
|
||||
PsiElement(LITERAL_STARTS_FROM_LETTER)('ketchup')
|
||||
PsiWhiteSpace(' ')
|
||||
CommandLineOptionImpl(OPTION)
|
||||
PsiElement(LONG_OPTION_NAME_TOKEN)('--with')
|
||||
PsiElement(=)('=')
|
||||
CommandLineArgumentImpl(ARGUMENT)
|
||||
PsiElement(SINGLE_Q_SPACED_LITERAL_STARTS_FROM_LETTER)(''russian mustard'')
|
||||
@@ -17,6 +17,9 @@ package com.jetbrains.commandInterface.commandLine;
|
||||
|
||||
|
||||
import com.intellij.testFramework.ParsingTestCase;
|
||||
import com.jetbrains.commandInterface.commandLine.psi.CommandLineArgument;
|
||||
import com.jetbrains.commandInterface.commandLine.psi.CommandLineFile;
|
||||
import org.junit.Assert;
|
||||
|
||||
|
||||
/**
|
||||
@@ -34,6 +37,14 @@ public final class CommandLineParserTest extends ParsingTestCase {
|
||||
return CommandTestTools.TEST_PATH;
|
||||
}
|
||||
|
||||
public void testSpaces() throws Exception {
|
||||
doTest(true);
|
||||
final CommandLineFile commandLineFile = (CommandLineFile)myFile;
|
||||
Assert.assertEquals("Bad argument value", "spam and eggs", commandLineFile.getArguments().iterator().next().getValueNoQuotes());
|
||||
final CommandLineArgument optionArgument = commandLineFile.getOptions().iterator().next().findArgument();
|
||||
Assert.assertNotNull("No option argument found", optionArgument);
|
||||
Assert.assertEquals("Bad option argument value", "ketchup", optionArgument.getValueNoQuotes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Should be ok
|
||||
|
||||
Reference in New Issue
Block a user