Merge remote-tracking branch 'origin/master'

This commit is contained in:
Roman Shevchenko
2016-12-05 18:16:13 +01:00
61 changed files with 1090 additions and 921 deletions
@@ -29,19 +29,20 @@ class _RegExLexer implements FlexLexer {
public static final int YYINITIAL = 0;
public static final int QUOTED = 2;
public static final int EMBRACED = 4;
public static final int CLASS1 = 6;
public static final int NEGATE_CLASS1 = 8;
public static final int CLASS2 = 10;
public static final int NEGATE_CLASS2 = 12;
public static final int PROP = 14;
public static final int NAMED = 16;
public static final int OPTIONS = 18;
public static final int COMMENT = 20;
public static final int NAMED_GROUP = 22;
public static final int QUOTED_NAMED_GROUP = 24;
public static final int PY_NAMED_GROUP_REF = 26;
public static final int PY_COND_REF = 28;
public static final int BRACKET_EXPRESSION = 30;
public static final int QUANTIFIER = 6;
public static final int CLASS1 = 8;
public static final int NEGATE_CLASS1 = 10;
public static final int CLASS2 = 12;
public static final int NEGATE_CLASS2 = 14;
public static final int PROP = 16;
public static final int NAMED = 18;
public static final int OPTIONS = 20;
public static final int COMMENT = 22;
public static final int NAMED_GROUP = 24;
public static final int QUOTED_NAMED_GROUP = 26;
public static final int PY_NAMED_GROUP_REF = 28;
public static final int PY_COND_REF = 30;
public static final int BRACKET_EXPRESSION = 32;
/**
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
@@ -51,7 +52,8 @@ class _RegExLexer implements FlexLexer {
*/
private static final int ZZ_LEXSTATE[] = {
0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15
8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15,
16, 16
};
/**
@@ -186,24 +188,25 @@ class _RegExLexer implements FlexLexer {
private static final int [] ZZ_ACTION = zzUnpackAction();
private static final String ZZ_ACTION_PACKED_0 =
"\12\0\1\1\5\0\1\2\1\3\1\4\1\5\1\6"+
"\13\0\1\1\5\0\1\2\1\3\1\4\1\5\1\6"+
"\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16"+
"\1\17\1\20\1\21\1\22\1\2\1\23\1\24\1\25"+
"\1\26\1\27\1\30\1\31\1\30\1\32\1\33\1\34"+
"\1\10\1\35\1\2\1\36\1\37\1\23\1\40\1\41"+
"\1\42\1\43\1\44\1\45\1\1\1\26\1\46\1\47"+
"\2\50\1\51\1\52\1\0\1\53\1\54\1\55\1\56"+
"\1\57\1\60\1\10\1\61\1\62\1\63\1\64\1\10"+
"\1\64\1\65\2\66\1\67\1\70\1\71\1\72\1\73"+
"\1\74\1\75\1\10\1\76\1\77\1\100\1\0\1\101"+
"\1\102\1\103\1\104\1\0\1\105\1\106\1\107\1\110"+
"\1\111\1\0\1\112\1\0\1\113\1\0\1\114\1\115"+
"\1\116\2\72\1\117\1\120\1\121\1\122\1\123\1\124"+
"\1\125\1\126\1\0\1\113\1\0\1\127\2\72\1\117"+
"\1\130\1\113\1\72\1\117\1\72\1\131\4\72";
"\1\42\1\43\1\44\1\45\1\1\1\25\1\46\1\47"+
"\2\50\1\51\1\0\1\52\1\0\1\53\1\54\1\55"+
"\1\56\1\57\1\60\1\10\1\61\1\62\1\63\1\64"+
"\1\10\1\64\1\65\2\66\1\67\1\70\1\71\1\72"+
"\1\73\1\74\1\75\1\10\1\76\1\77\1\100\1\0"+
"\1\101\1\102\1\103\1\104\1\0\1\105\1\106\1\107"+
"\1\110\1\111\1\0\1\112\1\0\1\113\1\0\1\114"+
"\1\0\1\115\1\116\1\117\2\72\1\120\1\121\1\122"+
"\1\123\1\124\1\125\1\126\1\127\2\0\1\114\1\0"+
"\1\130\2\72\1\120\1\131\1\114\1\72\1\120\1\72"+
"\1\132\4\72";
private static int [] zzUnpackAction() {
int [] result = new int[139];
int [] result = new int[144];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
@@ -230,25 +233,25 @@ class _RegExLexer implements FlexLexer {
private static final String ZZ_ROWMAP_PACKED_0 =
"\0\0\0\76\0\174\0\272\0\370\0\u0136\0\u0174\0\u01b2"+
"\0\u01f0\0\u022e\0\u026c\0\u02aa\0\u02e8\0\u0326\0\u0364\0\u03a2"+
"\0\u03e0\0\u03e0\0\u041e\0\u03e0\0\u03e0\0\u045c\0\u049a\0\u03e0"+
"\0\u03e0\0\u03e0\0\u03e0\0\u03e0\0\u03e0\0\u03e0\0\u03e0\0\u03e0"+
"\0\u03e0\0\u04d8\0\u03e0\0\u0516\0\u03e0\0\u0554\0\u03e0\0\u03e0"+
"\0\u03e0\0\u0592\0\u03e0\0\u05d0\0\u03e0\0\u060e\0\u03e0\0\u064c"+
"\0\u03e0\0\u03e0\0\u045c\0\u03e0\0\u03e0\0\u03e0\0\u068a\0\u06c8"+
"\0\u03e0\0\u03e0\0\u0706\0\u03e0\0\u03e0\0\u03e0\0\u0744\0\u0782"+
"\0\u03e0\0\u07c0\0\u07fe\0\u03e0\0\u083c\0\u087a\0\u03e0\0\u03e0"+
"\0\u03e0\0\u03e0\0\u03e0\0\u03e0\0\u08b8\0\u08f6\0\u03e0\0\u03e0"+
"\0\u0934\0\u03e0\0\u03e0\0\u03e0\0\u03e0\0\u0972\0\u09b0\0\u03e0"+
"\0\u03e0\0\u09ee\0\u03e0\0\u03e0\0\u03e0\0\u0a2c\0\u03e0\0\u03e0"+
"\0\u03e0\0\u03e0\0\u0a6a\0\u0aa8\0\u03e0\0\u03e0\0\u03e0\0\u03e0"+
"\0\u0ae6\0\u03e0\0\u0b24\0\u0b62\0\u0ba0\0\u03e0\0\u03e0\0\u03e0"+
"\0\u0bde\0\u0c1c\0\u0c5a\0\u03e0\0\u03e0\0\u03e0\0\u03e0\0\u03e0"+
"\0\u03e0\0\u03e0\0\u0c98\0\u0cd6\0\u0d14\0\u03e0\0\u0d52\0\u03e0"+
"\0\u0d90\0\u03e0\0\u03e0\0\u0dce\0\u0e0c\0\u0e4a\0\u03e0\0\u0e88"+
"\0\u0ec6\0\u0f04\0\u0f42";
"\0\u03e0\0\u041e\0\u041e\0\u045c\0\u041e\0\u049a\0\u04d8\0\u0516"+
"\0\u041e\0\u041e\0\u041e\0\u041e\0\u041e\0\u041e\0\u041e\0\u041e"+
"\0\u041e\0\u041e\0\u0554\0\u041e\0\u041e\0\u0592\0\u05d0\0\u041e"+
"\0\u041e\0\u041e\0\u060e\0\u041e\0\u064c\0\u041e\0\u068a\0\u041e"+
"\0\u06c8\0\u041e\0\u049a\0\u04d8\0\u041e\0\u041e\0\u041e\0\u0706"+
"\0\u0744\0\u041e\0\u041e\0\u0782\0\u041e\0\u041e\0\u041e\0\u07c0"+
"\0\u07fe\0\u083c\0\u041e\0\u087a\0\u08b8\0\u041e\0\u08f6\0\u0934"+
"\0\u041e\0\u041e\0\u041e\0\u041e\0\u041e\0\u041e\0\u0972\0\u09b0"+
"\0\u041e\0\u041e\0\u09ee\0\u041e\0\u041e\0\u041e\0\u041e\0\u0a2c"+
"\0\u0a6a\0\u041e\0\u041e\0\u0aa8\0\u041e\0\u041e\0\u041e\0\u0ae6"+
"\0\u041e\0\u041e\0\u041e\0\u041e\0\u0b24\0\u0b62\0\u041e\0\u041e"+
"\0\u041e\0\u041e\0\u0ba0\0\u041e\0\u0bde\0\u041e\0\u0c1c\0\u0c5a"+
"\0\u0c98\0\u041e\0\u041e\0\u041e\0\u0cd6\0\u0d14\0\u0d52\0\u041e"+
"\0\u041e\0\u041e\0\u041e\0\u041e\0\u041e\0\u041e\0\u0d90\0\u0dce"+
"\0\u0e0c\0\u0e4a\0\u041e\0\u0e88\0\u041e\0\u0ec6\0\u041e\0\u041e"+
"\0\u0f04\0\u0f42\0\u0f80\0\u041e\0\u0fbe\0\u0ffc\0\u103a\0\u1078";
private static int [] zzUnpackRowMap() {
int [] result = new int[139];
int [] result = new int[144];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
@@ -271,83 +274,88 @@ class _RegExLexer implements FlexLexer {
private static final int [] ZZ_TRANS = zzUnpackTrans();
private static final String ZZ_TRANS_PACKED_0 =
"\3\21\1\22\1\23\1\24\1\25\1\21\1\26\1\21"+
"\1\27\2\21\1\30\1\31\1\21\1\32\1\33\1\34"+
"\1\35\1\36\1\37\34\21\1\40\2\21\1\40\1\21"+
"\1\40\5\21\1\41\12\21\1\42\63\21\1\43\2\44"+
"\4\43\1\45\3\43\1\46\3\43\1\44\1\32\5\43"+
"\26\46\1\44\3\46\3\43\1\46\1\47\11\43\11\50"+
"\1\51\1\52\52\50\3\0\26\50\1\53\44\50\3\0"+
"\6\50\6\21\1\25\1\21\1\54\1\55\1\56\2\21"+
"\1\30\44\21\1\57\2\21\1\57\1\21\1\57\1\21"+
"\1\60\4\21\6\50\1\25\1\50\1\26\1\50\1\27"+
"\2\50\1\30\2\50\1\61\44\50\1\40\1\21\1\40"+
"\6\50\6\43\1\62\1\43\1\63\1\43\1\27\21\43"+
"\1\64\1\43\1\64\2\43\1\64\2\43\1\64\1\43"+
"\1\64\7\43\1\64\4\43\1\64\20\43\1\62\1\43"+
"\1\63\1\43\1\27\63\43\5\65\1\66\5\65\1\67"+
"\1\65\1\70\10\65\26\67\1\65\3\67\3\65\1\67"+
"\4\65\1\71\5\65\65\13\1\72\10\13\13\65\1\73"+
"\12\65\26\73\1\65\3\73\3\65\1\73\6\65\1\74"+
"\16\65\1\73\12\65\26\73\1\65\3\73\1\65\1\75"+
"\1\65\1\73\17\65\1\66\5\65\1\73\12\65\26\73"+
"\1\65\3\73\3\65\1\73\13\65\2\44\2\65\1\66"+
"\5\65\1\73\3\65\1\44\6\65\26\73\1\44\3\73"+
"\3\65\1\73\12\65\13\76\1\46\4\76\1\32\5\76"+
"\26\46\1\76\3\46\3\76\1\46\4\76\1\77\5\76"+
"\120\0\1\100\64\0\1\101\1\102\5\0\1\103\55\0"+
"\1\104\1\105\1\106\4\107\1\104\1\110\1\104\1\110"+
"\1\111\1\104\1\112\1\113\1\104\1\110\5\107\2\114"+
"\1\115\1\116\3\117\3\120\1\121\2\122\2\123\3\124"+
"\1\111\1\125\1\126\1\127\1\105\1\130\1\131\1\132"+
"\2\104\1\113\1\111\1\104\1\113\1\104\1\113\6\104"+
"\47\0\1\133\27\0\2\44\14\0\1\44\34\0\1\44"+
"\22\0\2\46\1\0\2\46\5\0\5\46\6\0\32\46"+
"\3\0\1\46\23\0\1\134\75\0\1\135\1\136\5\0"+
"\1\103\47\0\1\137\5\0\1\104\1\105\1\106\4\107"+
"\1\104\3\110\1\111\1\104\1\112\1\113\1\104\1\110"+
"\5\107\2\114\1\115\1\116\3\117\3\120\1\121\2\122"+
"\2\123\3\124\1\111\1\125\1\126\1\127\1\105\1\130"+
"\1\131\1\132\2\104\1\113\1\111\1\104\1\113\1\104"+
"\1\113\6\104\71\0\1\140\17\0\1\67\12\0\26\67"+
"\1\0\3\67\3\0\1\67\25\0\1\70\12\0\26\70"+
"\1\0\3\70\3\0\1\70\13\0\2\73\10\0\5\73"+
"\6\0\32\73\3\0\1\73\23\0\1\141\70\0\1\142"+
"\37\0\1\143\13\0\1\144\1\145\6\0\1\146\1\0"+
"\1\146\1\147\1\150\1\151\11\0\1\101\75\0\1\152"+
"\1\153\64\0\2\105\51\0\1\105\23\0\1\154\51\0"+
"\1\154\27\0\1\155\147\0\1\156\1\157\14\0\76\160"+
"\1\0\2\161\3\0\1\162\20\0\2\161\1\0\1\161"+
"\4\0\3\161\5\0\2\161\3\0\1\161\22\0\2\163"+
"\24\0\2\163\1\0\1\163\4\0\3\163\5\0\2\163"+
"\3\0\1\163\101\0\1\164\1\165\25\0\1\166\144\0"+
"\1\167\12\0\1\170\75\0\1\171\1\172\1\0\5\173"+
"\1\0\70\173\11\0\1\152\66\0\1\174\51\0\1\174"+
"\52\0\1\175\45\0\2\176\24\0\2\176\1\0\1\176"+
"\4\0\3\176\5\0\2\176\3\0\1\176\22\0\2\177"+
"\4\0\1\200\17\0\2\177\1\0\1\177\4\0\3\177"+
"\5\0\2\177\3\0\1\177\22\0\2\201\24\0\2\201"+
"\1\0\1\201\4\0\3\201\5\0\2\201\3\0\1\201"+
"\21\0\5\173\1\202\70\173\2\0\1\203\51\0\1\203"+
"\30\0\1\117\67\0\2\204\4\0\1\176\17\0\2\204"+
"\3\22\1\23\1\24\1\25\1\26\1\22\1\27\1\22"+
"\1\30\2\22\1\31\1\32\1\22\1\33\1\34\1\35"+
"\1\36\1\37\1\40\34\22\1\41\2\22\1\41\1\22"+
"\1\41\5\22\1\42\12\22\1\43\63\22\7\44\1\45"+
"\3\44\1\46\4\44\1\33\5\44\26\46\1\44\3\46"+
"\3\44\1\46\13\44\2\47\4\44\1\45\7\44\1\47"+
"\34\44\1\47\7\44\1\50\11\44\11\51\1\52\1\53"+
"\52\51\3\0\26\51\1\54\44\51\3\0\6\51\6\22"+
"\1\26\1\22\1\55\1\56\1\57\2\22\1\31\44\22"+
"\1\60\2\22\1\60\1\22\1\60\1\22\1\61\4\22"+
"\6\51\1\26\1\51\1\27\1\51\1\30\2\51\1\31"+
"\2\51\1\62\44\51\1\41\1\22\1\41\6\51\6\44"+
"\1\63\1\44\1\64\1\44\1\30\21\44\1\65\1\44"+
"\1\65\2\44\1\65\2\44\1\65\1\44\1\65\7\44"+
"\1\65\4\44\1\65\20\44\1\63\1\44\1\64\1\44"+
"\1\30\63\44\5\66\1\67\5\66\1\70\1\66\1\71"+
"\10\66\26\70\1\66\3\70\3\66\1\70\4\66\1\72"+
"\5\66\65\14\1\73\10\14\13\66\1\74\12\66\26\74"+
"\1\66\3\74\3\66\1\74\6\66\1\75\16\66\1\74"+
"\12\66\26\74\1\66\3\74\1\66\1\76\1\66\1\74"+
"\17\66\1\67\5\66\1\74\12\66\26\74\1\66\3\74"+
"\3\66\1\74\13\66\2\47\2\66\1\67\5\66\1\74"+
"\3\66\1\47\6\66\26\74\1\47\3\74\3\66\1\74"+
"\12\66\13\77\1\46\4\77\1\33\5\77\26\46\1\77"+
"\3\46\3\77\1\46\4\77\1\100\5\77\120\0\1\101"+
"\54\0\2\102\14\0\1\102\34\0\1\102\32\0\1\103"+
"\1\104\5\0\1\105\55\0\1\106\1\107\1\110\4\111"+
"\1\106\1\112\1\106\1\112\1\113\1\106\1\114\1\115"+
"\1\106\1\112\5\111\2\116\1\117\1\120\3\121\3\122"+
"\1\123\2\124\2\125\3\126\1\113\1\127\1\130\1\131"+
"\1\107\1\132\1\133\1\134\2\106\1\115\1\113\1\106"+
"\1\115\1\106\1\115\6\106\47\0\1\135\27\0\2\46"+
"\1\0\2\46\5\0\5\46\6\0\32\46\3\0\1\46"+
"\13\0\2\47\14\0\1\47\34\0\1\47\32\0\1\136"+
"\75\0\1\137\1\140\5\0\1\105\47\0\1\141\5\0"+
"\1\106\1\107\1\110\4\111\1\106\3\112\1\113\1\106"+
"\1\114\1\115\1\106\1\112\5\111\2\116\1\117\1\120"+
"\3\121\3\122\1\123\2\124\2\125\3\126\1\113\1\127"+
"\1\130\1\131\1\107\1\132\1\133\1\134\2\106\1\115"+
"\1\113\1\106\1\115\1\106\1\115\6\106\71\0\1\142"+
"\17\0\1\70\12\0\26\70\1\0\3\70\3\0\1\70"+
"\25\0\1\71\12\0\26\71\1\0\3\71\3\0\1\71"+
"\13\0\2\74\10\0\5\74\6\0\32\74\3\0\1\74"+
"\23\0\1\143\70\0\1\144\37\0\1\145\13\0\1\146"+
"\1\147\6\0\1\150\1\0\1\150\1\151\1\152\1\153"+
"\1\0\2\102\4\0\1\154\7\0\1\102\34\0\1\102"+
"\7\0\1\155\22\0\1\103\75\0\1\156\1\157\64\0"+
"\2\107\51\0\1\107\23\0\1\160\51\0\1\160\27\0"+
"\1\161\147\0\1\162\1\163\14\0\76\164\1\0\2\165"+
"\3\0\1\166\20\0\2\165\1\0\1\165\4\0\3\165"+
"\5\0\2\165\3\0\1\165\22\0\2\167\24\0\2\167"+
"\1\0\1\167\4\0\3\167\5\0\2\167\3\0\1\167"+
"\101\0\1\170\1\171\25\0\1\172\144\0\1\173\12\0"+
"\1\174\75\0\1\175\1\176\1\0\5\177\1\0\70\177"+
"\1\0\2\200\14\0\1\200\34\0\1\200\32\0\1\156"+
"\66\0\1\201\51\0\1\201\52\0\1\202\45\0\2\203"+
"\24\0\2\203\1\0\1\203\4\0\3\203\5\0\2\203"+
"\3\0\1\203\22\0\2\204\4\0\1\205\17\0\2\204"+
"\1\0\1\204\4\0\3\204\5\0\2\204\3\0\1\204"+
"\22\0\2\205\24\0\2\205\1\0\1\205\4\0\3\205"+
"\5\0\2\205\3\0\1\205\22\0\2\206\4\0\1\176"+
"\17\0\2\206\1\0\1\206\4\0\3\206\5\0\2\206"+
"\3\0\1\206\22\0\2\207\24\0\2\207\1\0\1\207"+
"\4\0\3\207\5\0\2\207\3\0\1\207\22\0\2\210"+
"\4\0\1\176\17\0\2\210\1\0\1\210\4\0\3\210"+
"\5\0\2\210\3\0\1\210\22\0\2\211\4\0\1\176"+
"\17\0\2\211\1\0\1\211\4\0\3\211\5\0\2\211"+
"\3\0\1\211\22\0\2\212\4\0\1\176\17\0\2\212"+
"\22\0\2\206\24\0\2\206\1\0\1\206\4\0\3\206"+
"\5\0\2\206\3\0\1\206\21\0\5\177\1\207\70\177"+
"\1\0\2\200\4\0\1\154\7\0\1\200\34\0\1\200"+
"\23\0\1\210\51\0\1\210\30\0\1\121\67\0\2\211"+
"\4\0\1\203\17\0\2\211\1\0\1\211\4\0\3\211"+
"\5\0\2\211\3\0\1\211\22\0\2\212\24\0\2\212"+
"\1\0\1\212\4\0\3\212\5\0\2\212\3\0\1\212"+
"\22\0\2\213\4\0\1\176\17\0\2\213\1\0\1\213"+
"\4\0\3\213\5\0\2\213\3\0\1\213\22\0\2\213"+
"\4\0\1\200\17\0\2\213\1\0\1\213\4\0\3\213"+
"\5\0\2\213\3\0\1\213\21\0";
"\22\0\2\213\4\0\1\203\17\0\2\213\1\0\1\213"+
"\4\0\3\213\5\0\2\213\3\0\1\213\22\0\2\214"+
"\24\0\2\214\1\0\1\214\4\0\3\214\5\0\2\214"+
"\3\0\1\214\22\0\2\215\4\0\1\203\17\0\2\215"+
"\1\0\1\215\4\0\3\215\5\0\2\215\3\0\1\215"+
"\22\0\2\216\4\0\1\203\17\0\2\216\1\0\1\216"+
"\4\0\3\216\5\0\2\216\3\0\1\216\22\0\2\217"+
"\4\0\1\203\17\0\2\217\1\0\1\217\4\0\3\217"+
"\5\0\2\217\3\0\1\217\22\0\2\220\4\0\1\203"+
"\17\0\2\220\1\0\1\220\4\0\3\220\5\0\2\220"+
"\3\0\1\220\22\0\2\220\4\0\1\205\17\0\2\220"+
"\1\0\1\220\4\0\3\220\5\0\2\220\3\0\1\220"+
"\21\0";
private static int [] zzUnpackTrans() {
int [] result = new int[3968];
int [] result = new int[4278];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
@@ -385,18 +393,18 @@ class _RegExLexer implements FlexLexer {
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 =
"\12\0\1\1\5\0\2\11\1\1\2\11\2\1\12\11"+
"\1\1\1\11\1\1\1\11\1\1\3\11\1\1\1\11"+
"\1\1\1\11\1\1\1\11\1\1\2\11\1\1\3\11"+
"\2\1\2\11\1\1\3\11\2\1\1\11\1\0\1\1"+
"\1\11\2\1\6\11\2\1\2\11\1\1\4\11\2\1"+
"\2\11\1\1\3\11\1\0\4\11\1\0\1\1\4\11"+
"\1\0\1\11\1\0\1\1\1\0\3\11\3\1\7\11"+
"\1\0\1\1\1\0\1\11\1\1\1\11\1\1\2\11"+
"\3\1\1\11\4\1";
"\13\0\1\1\5\0\2\11\1\1\1\11\3\1\12\11"+
"\1\1\2\11\2\1\3\11\1\1\1\11\1\1\1\11"+
"\1\1\1\11\1\1\1\11\2\1\3\11\2\1\2\11"+
"\1\1\3\11\2\1\1\0\1\11\1\0\1\1\1\11"+
"\2\1\6\11\2\1\2\11\1\1\4\11\2\1\2\11"+
"\1\1\3\11\1\0\4\11\1\0\1\1\4\11\1\0"+
"\1\11\1\0\1\11\1\0\1\1\1\0\3\11\3\1"+
"\7\11\2\0\1\1\1\0\1\11\1\1\1\11\1\1"+
"\2\11\3\1\1\11\4\1";
private static int [] zzUnpackAttribute() {
int [] result = new int[139];
int [] result = new int[144];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
@@ -753,107 +761,107 @@ class _RegExLexer implements FlexLexer {
case 1:
{ yypopstate(); return RegExpTT.COMMENT;
}
case 90: break;
case 91: break;
case 2:
{ return RegExpTT.CHARACTER;
}
case 91: break;
case 92: break;
case 3:
{ return RegExpTT.DOT;
}
case 92: break;
case 93: break;
case 4:
{ capturingGroupCount++; return RegExpTT.GROUP_BEGIN;
}
case 93: break;
case 94: break;
case 5:
{ return RegExpTT.GROUP_END;
}
case 94: break;
case 6:
{ if (yystate() != CLASS2) { yypushstate(EMBRACED); return RegExpTT.LBRACE; } return RegExpTT.CHARACTER;
}
case 95: break;
case 6:
{ if (yystate() != CLASS2 && !allowDanglingMetacharacters) { yypushstate(QUANTIFIER); return RegExpTT.LBRACE; } return RegExpTT.CHARACTER;
}
case 96: break;
case 7:
{ yypushstate(CLASS2); return RegExpTT.CLASS_BEGIN;
}
case 96: break;
case 97: break;
case 8:
{ return StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN;
}
case 97: break;
case 98: break;
case 9:
{ return RegExpTT.MINUS;
}
case 98: break;
case 99: break;
case 10:
{ return commentMode ? com.intellij.psi.TokenType.WHITE_SPACE : RegExpTT.CHARACTER;
}
case 99: break;
case 100: break;
case 11:
{ return RegExpTT.CARET;
}
case 100: break;
case 101: break;
case 12:
{ return RegExpTT.DOLLAR;
}
case 101: break;
case 102: break;
case 13:
{ return RegExpTT.QUEST;
}
case 102: break;
case 103: break;
case 14:
{ return RegExpTT.STAR;
}
case 103: break;
case 104: break;
case 15:
{ return RegExpTT.PLUS;
}
case 104: break;
case 105: break;
case 16:
{ return RegExpTT.UNION;
}
case 105: break;
case 106: break;
case 17:
{ return commentMode ? com.intellij.psi.TokenType.WHITE_SPACE : RegExpTT.CTRL_CHARACTER;
}
case 106: break;
case 107: break;
case 18:
{ if (commentMode) { yypushstate(COMMENT); return RegExpTT.COMMENT; } else return RegExpTT.CHARACTER;
}
case 107: break;
case 108: break;
case 19:
{ yypopstate(); yypushback(1);
}
case 108: break;
case 20:
{ return RegExpTT.NUMBER;
}
case 109: break;
case 21:
case 20:
{ yypopstate(); return RegExpTT.RBRACE;
}
case 110: break;
case 22:
case 21:
{ return RegExpTT.NAME;
}
case 111: break;
case 22:
{ return RegExpTT.NUMBER;
}
case 112: break;
case 23:
{ return RegExpTT.COMMA;
}
case 112: break;
case 113: break;
case 24:
{ assert false : yytext();
}
case 113: break;
case 114: break;
case 25:
{ yybegin(CLASS2); return RegExpTT.CHARACTER;
}
case 114: break;
case 115: break;
case 26:
{ yybegin(CLASS1); return RegExpTT.CARET;
}
case 115: break;
case 116: break;
case 27:
{ if (allowNestedCharacterClasses) {
yypushstate(CLASS2);
@@ -861,81 +869,81 @@ class _RegExLexer implements FlexLexer {
}
return RegExpTT.CHARACTER;
}
case 116: break;
case 117: break;
case 28:
{ yypopstate(); return RegExpTT.CLASS_END;
}
case 117: break;
case 118: break;
case 29:
{ return commentMode ? com.intellij.psi.TokenType.WHITE_SPACE : RegExpTT.ESC_CHARACTER;
}
case 118: break;
case 119: break;
case 30:
{ yybegin(CLASS2); return RegExpTT.CARET;
}
case 119: break;
case 120: break;
case 31:
{ yypopstate(); yypushstate(EMBRACED); return RegExpTT.LBRACE;
}
case 120: break;
case 121: break;
case 32:
{ yypopstate(); return RegExpTT.CATEGORY_SHORT_HAND;
}
case 121: break;
case 122: break;
case 33:
{ yybegin(YYINITIAL); return RegExpTT.BAD_CHARACTER;
}
case 122: break;
case 123: break;
case 34:
{ yybegin(YYINITIAL); return RegExpTT.GROUP_END;
}
case 123: break;
case 124: break;
case 35:
{ handleOptions(); return RegExpTT.OPTIONS_ON;
}
case 124: break;
case 125: break;
case 36:
{ handleOptions(); return RegExpTT.OPTIONS_OFF;
}
case 125: break;
case 126: break;
case 37:
{ yybegin(YYINITIAL); return RegExpTT.COLON;
}
case 126: break;
case 127: break;
case 38:
{ yybegin(YYINITIAL); return RegExpTT.GT;
}
case 127: break;
case 128: break;
case 39:
{ yybegin(YYINITIAL); return RegExpTT.QUOTE;
}
case 128: break;
case 129: break;
case 40:
{ return RegExpTT.BAD_CHARACTER;
}
case 129: break;
case 130: break;
case 41:
{ yybegin(OPTIONS); return RegExpTT.SET_OPTIONS;
}
case 130: break;
case 131: break;
case 42:
// lookahead expression with fixed base length
zzMarkedPos = Character.offsetByCodePoints
(zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1);
{ if (allowEmptyCharacterClass) yypushstate(CLASS2); else yypushstate(CLASS1); return RegExpTT.CLASS_BEGIN;
}
case 131: break;
case 132: break;
case 43:
// lookahead expression with fixed base length
zzMarkedPos = Character.offsetByCodePoints
(zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1);
{ yypushstate(NEGATE_CLASS2); return RegExpTT.CLASS_BEGIN;
}
case 132: break;
case 133: break;
case 44:
{ return RegExpTT.REDUNDANT_ESCAPE;
}
case 133: break;
case 134: break;
case 45:
{ if (allowOctalNoLeadingZero) {
CharSequence s = yytext();
@@ -957,79 +965,79 @@ class _RegExLexer implements FlexLexer {
}
return RegExpTT.BACKREF;
}
case 134: break;
case 135: break;
case 46:
{ return (allowOctalNoLeadingZero ? RegExpTT.OCT_CHAR : RegExpTT.BAD_OCT_VALUE);
}
case 135: break;
case 136: break;
case 47:
{ return (yystate() == CLASS2) ? RegExpTT.REDUNDANT_ESCAPE : RegExpTT.ESC_CHARACTER;
}
case 136: break;
case 137: break;
case 48:
{ return RegExpTT.ESC_CHARACTER;
}
case 137: break;
case 138: break;
case 49:
{ return (yystate() == CLASS2) ? RegExpTT.ESC_CHARACTER : RegExpTT.REDUNDANT_ESCAPE;
}
case 138: break;
case 139: break;
case 50:
{ return commentMode ? RegExpTT.CHARACTER : RegExpTT.REDUNDANT_ESCAPE;
}
case 139: break;
case 140: break;
case 51:
{ return RegExpTT.ESC_CTRL_CHARACTER;
}
case 140: break;
case 141: break;
case 52:
{ return yystate() != CLASS2 ? RegExpTT.BOUNDARY : RegExpTT.ESC_CHARACTER;
}
case 141: break;
case 142: break;
case 53:
{ return RegExpTT.CHAR_CLASS;
}
case 142: break;
case 143: break;
case 54:
{ if (xmlSchemaMode) return RegExpTT.CHAR_CLASS; else return StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN;
}
case 143: break;
case 144: break;
case 55:
{ yypushstate(PROP); return RegExpTT.PROPERTY;
}
case 144: break;
case 145: break;
case 56:
{ return allowTransformationEscapes ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN;
}
case 145: break;
case 146: break;
case 57:
{ yypushstate(QUOTED); return RegExpTT.QUOTE_BEGIN;
}
case 146: break;
case 147: break;
case 58:
{ return RegExpTT.BAD_HEX_VALUE;
}
case 147: break;
case 148: break;
case 59:
{ return allowTransformationEscapes ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN;
}
case 148: break;
case 149: break;
case 60:
{ return (allowHexDigitClass || allowHorizontalWhitespaceClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN);
}
case 149: break;
case 150: break;
case 61:
{ yypushstate(NAMED); return RegExpTT.NAMED_CHARACTER;
}
case 150: break;
case 151: break;
case 62:
{ yypopstate(); return RegExpTT.QUOTE_END;
}
case 151: break;
case 152: break;
case 63:
{ yybegin(CLASS2); return RegExpTT.REDUNDANT_ESCAPE;
}
case 152: break;
case 153: break;
case 64:
// lookahead expression with fixed base length
zzMarkedPos = Character.offsetByCodePoints
@@ -1040,7 +1048,7 @@ class _RegExLexer implements FlexLexer {
}
return RegExpTT.CHARACTER;
}
case 153: break;
case 154: break;
case 65:
{ if (allowPosixBracketExpressions) {
yybegin(BRACKET_EXPRESSION);
@@ -1050,75 +1058,82 @@ class _RegExLexer implements FlexLexer {
return RegExpTT.CHARACTER;
}
}
case 154: break;
case 155: break;
case 66:
{ if (allowNestedCharacterClasses) return RegExpTT.ANDAND; else yypushback(1); return RegExpTT.CHARACTER;
}
case 155: break;
case 156: break;
case 67:
{ yybegin(CLASS2); return RegExpTT.BRACKET_EXPRESSION_END;
}
case 156: break;
case 157: break;
case 68:
{ yybegin(PY_COND_REF); return RegExpTT.PYTHON_COND_REF;
}
case 157: break;
case 158: break;
case 69:
{ yybegin(NAMED_GROUP); capturingGroupCount++; return RegExpTT.RUBY_NAMED_GROUP;
}
case 158: break;
case 159: break;
case 70:
{ yybegin(QUOTED_NAMED_GROUP); capturingGroupCount++; return RegExpTT.RUBY_QUOTED_NAMED_GROUP;
}
case 159: break;
case 160: break;
case 71:
{ return RegExpTT.NON_CAPT_GROUP;
}
case 160: break;
case 161: break;
case 72:
{ return RegExpTT.POS_LOOKAHEAD;
}
case 161: break;
case 162: break;
case 73:
{ return RegExpTT.NEG_LOOKAHEAD;
}
case 162: break;
case 163: break;
case 74:
// lookahead expression with fixed base length
zzMarkedPos = Character.offsetByCodePoints
(zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1);
{ yypushstate(QUANTIFIER); return RegExpTT.LBRACE;
}
case 164: break;
case 75:
// lookahead expression with fixed base length
zzMarkedPos = Character.offsetByCodePoints
(zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1);
{ if (allowEmptyCharacterClass) yypushstate(CLASS2); else yypushstate(NEGATE_CLASS1); return RegExpTT.CLASS_BEGIN;
}
case 163: break;
case 75:
case 165: break;
case 76:
{ return RegExpTT.OCT_CHAR;
}
case 164: break;
case 76:
case 166: break;
case 77:
{ yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP_CALL;
}
case 165: break;
case 77:
case 167: break;
case 78:
{ yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP_CALL;
}
case 166: break;
case 78:
case 168: break;
case 79:
{ if (xmlSchemaMode) { yypushback(1); return RegExpTT.CHAR_CLASS; } else return RegExpTT.CTRL;
}
case 167: break;
case 79:
case 169: break;
case 80:
{ return StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN;
}
case 168: break;
case 80:
case 170: break;
case 81:
{ yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP_REF;
}
case 169: break;
case 81:
case 171: break;
case 82:
{ yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP_REF;
}
case 170: break;
case 82:
case 172: break;
case 83:
// lookahead expression with fixed base length
zzMarkedPos = Character.offsetByCodePoints
(zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1);
@@ -1128,35 +1143,35 @@ class _RegExLexer implements FlexLexer {
}
return RegExpTT.CHARACTER;
}
case 171: break;
case 83:
case 173: break;
case 84:
{ yybegin(NAMED_GROUP); capturingGroupCount++; return RegExpTT.PYTHON_NAMED_GROUP;
}
case 172: break;
case 84:
case 174: break;
case 85:
{ yybegin(PY_NAMED_GROUP_REF); return RegExpTT.PYTHON_NAMED_GROUP_REF;
}
case 173: break;
case 85:
case 175: break;
case 86:
{ return RegExpTT.POS_LOOKBEHIND;
}
case 174: break;
case 86:
case 176: break;
case 87:
{ return RegExpTT.NEG_LOOKBEHIND;
}
case 175: break;
case 87:
case 177: break;
case 88:
{ return RegExpTT.HEX_CHAR;
}
case 176: break;
case 88:
case 178: break;
case 89:
{ return RegExpTT.COMMENT;
}
case 177: break;
case 89:
case 179: break;
case 90:
{ return RegExpTT.UNICODE_CHAR;
}
case 178: break;
case 180: break;
default:
zzScanError(ZZ_NO_MATCH);
}
@@ -94,7 +94,6 @@ public class RegExpHighlighter extends SyntaxHighlighterBase {
ourMap.put(RegExpTT.ESC_CTRL_CHARACTER, CHAR_CLASS);
ourMap.put(RegExpTT.NAMED_CHARACTER, CHAR_CLASS);
ourMap.put(RegExpTT.CATEGORY_SHORT_HAND, CHAR_CLASS);
ourMap.put(RegExpTT.CATEGORY_SHORT_HAND, CHAR_CLASS);
ourMap.put(RegExpTT.RUBY_NAMED_GROUP_REF, CHAR_CLASS);
ourMap.put(RegExpTT.RUBY_NAMED_GROUP_CALL, CHAR_CLASS);
ourMap.put(RegExpTT.RUBY_QUOTED_NAMED_GROUP_REF, CHAR_CLASS);
@@ -30,10 +30,6 @@ public class RegExpParser implements PsiParser {
private static final TokenSet PROPERTY_TOKENS = TokenSet.create(RegExpTT.NUMBER, RegExpTT.COMMA, RegExpTT.NAME, RegExpTT.RBRACE);
private final EnumSet<RegExpCapability> myCapabilities;
public RegExpParser() {
myCapabilities = EnumSet.noneOf(RegExpCapability.class);
}
public RegExpParser(EnumSet<RegExpCapability> capabilities) {
myCapabilities = capabilities;
}
@@ -82,7 +78,6 @@ public class RegExpParser implements PsiParser {
/**
* BRANCH ::= ATOM BRANCH | ""
*/
@SuppressWarnings({"StatementWithEmptyBody"})
private boolean parseBranch(PsiBuilder builder) {
final PsiBuilder.Marker marker = builder.mark();
@@ -97,7 +92,8 @@ public class RegExpParser implements PsiParser {
return false;
}
while (parseAtom(builder)) ;
//noinspection StatementWithEmptyBody
while (parseAtom(builder)) {}
marker.done(RegExpElementTypes.BRANCH);
return true;
@@ -141,10 +137,6 @@ public class RegExpParser implements PsiParser {
if (minOmitted) {
builder.advanceLexer();
}
else if (builder.getTokenType() != RegExpTT.NUMBER && myCapabilities.contains(RegExpCapability.DANGLING_METACHARACTERS)) {
marker.done(RegExpTT.CHARACTER);
return true;
}
else {
checkMatches(builder, RegExpTT.NUMBER, "Number expected");
}
@@ -214,37 +206,26 @@ public class RegExpParser implements PsiParser {
if (builder.getTokenType() == RegExpTT.CARET) {
builder.advanceLexer();
}
// DEFLIST
if (parseClassIntersection(builder)) {
while (RegExpTT.CHARACTERS.contains(builder.getTokenType()) ||
builder.getTokenType() == RegExpTT.CHAR_CLASS ||
builder.getTokenType() == RegExpTT.CLASS_BEGIN ||
builder.getTokenType() == RegExpTT.PROPERTY ||
builder.getTokenType() == RegExpTT.BRACKET_EXPRESSION_BEGIN) {
parseClassIntersection(builder);
}
}
parseClassIntersection(builder);
checkMatches(builder, RegExpTT.CLASS_END, "Unclosed character class");
marker.done(RegExpElementTypes.CLASS);
return marker;
}
private boolean parseClassIntersection(PsiBuilder builder) {
private void parseClassIntersection(PsiBuilder builder) {
final PsiBuilder.Marker marker = builder.mark();
parseClassdef(builder);
if (RegExpTT.ANDAND != builder.getTokenType()) {
marker.drop();
return true;
return;
}
while (RegExpTT.ANDAND == builder.getTokenType()) {
builder.advanceLexer();
parseClassdef(builder);
}
marker.done(RegExpElementTypes.INTERSECTION);
return true;
}
private boolean parseClassdef(PsiBuilder builder) {
@@ -463,10 +444,6 @@ public class RegExpParser implements PsiParser {
marker.drop();
return parseClass(builder);
}
else if (type == RegExpTT.LBRACE && myCapabilities.contains(RegExpCapability.DANGLING_METACHARACTERS)) {
builder.advanceLexer();
marker.done(RegExpElementTypes.CHAR);
}
else {
marker.drop();
return null;
@@ -49,6 +49,10 @@ public class RegExpParserDefinition implements ParserDefinition {
CAPABILITIES.add(capability);
Disposer.register(parentDisposable, () -> CAPABILITIES.remove(capability));
}
else {
CAPABILITIES.remove(capability);
Disposer.register(parentDisposable, () -> CAPABILITIES.add(capability));
}
}
@NotNull
@@ -25,35 +25,46 @@ public interface RegExpTT {
IElementType NAME = new RegExpElementType("NAME");
IElementType COMMA = new RegExpElementType("COMMA");
// "\\Q"
/** "\\Q" */
IElementType QUOTE_BEGIN = new RegExpElementType("QUOTE_BEGIN");
// <QUOTE> "\\E"
/** <QUOTE> "\\E" */
IElementType QUOTE_END = new RegExpElementType("QUOTE_END");
// "\\" 0-9
/** "\\" 0-9 */
IElementType BACKREF = new RegExpElementType("BACKREF");
/** "{" */
IElementType LBRACE = new RegExpElementType("LBRACE");
/** "}" */
IElementType RBRACE = new RegExpElementType("RBRACE");
// "["
/** "[" */
IElementType CLASS_BEGIN = new RegExpElementType("CLASS_BEGIN");
// "]"
/** "]" */
IElementType CLASS_END = new RegExpElementType("CLASS_END");
/** "&&" */
IElementType ANDAND = new RegExpElementType("ANDAND");
// "[:"
/** "[:" */
IElementType BRACKET_EXPRESSION_BEGIN = new RegExpElementType("BRACKET_EXPRESSION_BEGIN");
// ":]"
/** ":]" */
IElementType BRACKET_EXPRESSION_END = new RegExpElementType("BRACKET_EXPRESSION_END");
/** "(" */
IElementType GROUP_BEGIN = new RegExpElementType("GROUP_BEGIN");
/** ")" */
IElementType GROUP_END = new RegExpElementType("GROUP_END");
/** "(?:" or "(?>" */
IElementType NON_CAPT_GROUP = new RegExpElementType("NON_CAPT_GROUP");
/** "(?<=" */
IElementType POS_LOOKBEHIND = new RegExpElementType("POS_LOOKBEHIND");
/** "(?<!" */
IElementType NEG_LOOKBEHIND = new RegExpElementType("NEG_LOOKBEHIND");
/** "(?=" */
IElementType POS_LOOKAHEAD = new RegExpElementType("POS_LOOKAHEAD");
/** "(?!" */
IElementType NEG_LOOKAHEAD = new RegExpElementType("NEG_LOOKAHEAD");
/** "(?" */
IElementType SET_OPTIONS = new RegExpElementType("SET_OPTIONS");
IElementType QUEST = new RegExpElementType("QUEST");
@@ -61,45 +72,46 @@ public interface RegExpTT {
IElementType PLUS = new RegExpElementType("PLUS");
IElementType COLON = new RegExpElementType("COLON");
// "\\" ("b" | "B" | "A" | "z" | "Z" | "G")
/** "\\" ("b" | "B" | "A" | "z" | "Z" | "G") */
IElementType BOUNDARY = new RegExpElementType("BOUNDARY");
// "^"
/** "^" */
IElementType CARET = new RegExpElementType("CARET");
// "$"
/** "$" */
IElementType DOLLAR = new RegExpElementType("DOLLAR");
IElementType DOT = new RegExpElementType("DOT");
/** "|" */
IElementType UNION = new RegExpElementType("UNION");
// > in Python/Ruby named group
/** ">" in Python/Ruby named group */
IElementType GT = new RegExpElementType("GT");
// ' in Ruby quoted named group
/* "'" in Ruby quoted named group */
IElementType QUOTE = new RegExpElementType("QUOTE");
// "\b" | "\t" | "\f" | "\r" | "\n"
/** "\b" | "\t" | "\f" | "\r" | "\n" */
IElementType CTRL_CHARACTER = new RegExpElementType("CTRL_CHARACTER");
// "\\" ("t" | "n" | "r" | "f" | "a" | "e")
/** "\\" ("t" | "n" | "r" | "f" | "a" | "e") */
IElementType ESC_CTRL_CHARACTER = new RegExpElementType("ESC_CTRL_CHARACTER");
// "\\" ("." | "|" | "$" | "^" | "?" | "*" | "+" | "[" | "{" | "(" | ")")
/** "\\" ("." | "|" | "$" | "^" | "?" | "*" | "+" | "[" | "{" | "(" | ")") */
IElementType ESC_CHARACTER = new RegExpElementType("ESC_CHARACTER");
// "\\" ("w" | "W" | "s" | "S" | "d" | "D" | "v" | "V" | "h" | "H" | "X" | "R")
/** "\\" ("w" | "W" | "s" | "S" | "d" | "D" | "v" | "V" | "h" | "H" | "X" | "R") */
IElementType CHAR_CLASS = new RegExpElementType("CHAR_CLASS");
// "\\u" XXXX
/** "\\u" XXXX */
IElementType UNICODE_CHAR = new RegExpElementType("UNICODE_CHAR");
// "\\x" XX
/** "\\x" XX */
IElementType HEX_CHAR = new RegExpElementType("HEX_CHAR");
// "\\0" OOO
/** "\\0" OOO */
IElementType OCT_CHAR = new RegExpElementType("OCT_CHAR");
// "\\c" x
/** "\\c" x */
IElementType CTRL = new RegExpElementType("CTRL");
// "\\p" | "\\P"
/** "\\p" | "\\P" */
IElementType PROPERTY = new RegExpElementType("PROPERTY");
// "\\N
/** "\\N */
IElementType NAMED_CHARACTER = new RegExpElementType("NAMED_CHARACTER");
// "L" | "M" | "Z" | "S" | "N" | "P" | "C" after a property escape
/** "L" | "M" | "Z" | "S" | "N" | "P" | "C" after a property escape */
IElementType CATEGORY_SHORT_HAND = new RegExpElementType("CATEGORY_SHORT_HAND");
// e.g. "\\#" but also "\\q" which is not a valid escape actually
/** e.g. "\\#" but also "\\q" which is not a valid escape actually */
IElementType REDUNDANT_ESCAPE = new RegExpElementType("REDUNDANT_ESCAPE");
IElementType MINUS = new RegExpElementType("MINUS");
@@ -113,25 +125,25 @@ public interface RegExpTT {
IElementType OPTIONS_ON = new RegExpElementType("OPTIONS_ON");
IElementType OPTIONS_OFF = new RegExpElementType("OPTIONS_OFF");
// (?P<name>...
/** (?P<name>... */
IElementType PYTHON_NAMED_GROUP = new RegExpElementType("PYTHON_NAMED_GROUP");
// (?P=name)
/** (?P=name) */
IElementType PYTHON_NAMED_GROUP_REF = new RegExpElementType("PYTHON_NAMED_GROUP_REF");
// (?(id/name)yes-pattern|no-pattern)
/** (?(id/name)yes-pattern|no-pattern) */
IElementType PYTHON_COND_REF = new RegExpElementType("PYTHON_COND_REF");
// (?<name>...
/** (?<name>... */
IElementType RUBY_NAMED_GROUP = new RegExpElementType("RUBY_NAMED_GROUP");
// \k<name>
/** \k<name> */
IElementType RUBY_NAMED_GROUP_REF = new RegExpElementType("RUBY_NAMED_GROUP_REF");
// \g<name>
/** \g<name> */
IElementType RUBY_NAMED_GROUP_CALL = new RegExpElementType("RUBY_NAMED_GROUP_CALL");
// (?'name'...
/** (?'name'... */
IElementType RUBY_QUOTED_NAMED_GROUP = new RegExpElementType("RUBY_QUOTED_NAMED_GROUP");
// \k'name'
/** \k'name' */
IElementType RUBY_QUOTED_NAMED_GROUP_REF = new RegExpElementType("RUBY_QUOTED_NAMED_GROUP_REF");
// \g'name'
/** \g'name' */
IElementType RUBY_QUOTED_NAMED_GROUP_CALL = new RegExpElementType("RUBY_QUOTED_NAMED_GROUP_CALL");
TokenSet CHARACTERS = TokenSet.create(CHARACTER,
@@ -74,6 +74,7 @@ import java.util.EnumSet;
%xstate QUOTED
%xstate EMBRACED
%xstate QUANTIFIER
%xstate CLASS1
%xstate NEGATE_CLASS1
%state CLASS2
@@ -217,14 +218,19 @@ HEX_CHAR=[0-9a-fA-F]
/* "{" \d+(,\d*)? "}" */
/* "}" outside counted closure is treated as regular character */
{LBRACE} { if (yystate() != CLASS2) { yypushstate(EMBRACED); return RegExpTT.LBRACE; } return RegExpTT.CHARACTER; }
{LBRACE} / [:digit:]+ {RBRACE} { yypushstate(QUANTIFIER); return RegExpTT.LBRACE; }
{LBRACE} / [:digit:]+ "," [:digit:]+ {RBRACE} { yypushstate(QUANTIFIER); return RegExpTT.LBRACE; }
{LBRACE} { if (yystate() != CLASS2 && !allowDanglingMetacharacters) { yypushstate(QUANTIFIER); return RegExpTT.LBRACE; } return RegExpTT.CHARACTER; }
<QUANTIFIER> {
[:digit:]+ { return RegExpTT.NUMBER; }
"," { return RegExpTT.COMMA; }
{RBRACE} { yypopstate(); return RegExpTT.RBRACE; }
{ANY} { yypopstate(); yypushback(1); }
}
<EMBRACED> {
"^" { return RegExpTT.CARET; }
{NAME} { return RegExpTT.NAME; }
[:digit:]+ { return RegExpTT.NUMBER; }
"," { return RegExpTT.COMMA; }
{RBRACE} { yypopstate(); return RegExpTT.RBRACE; }
{ANY} { yypopstate(); yypushback(1); }
}
@@ -60,7 +60,7 @@ public class RegExpCompletionTest extends CodeInsightFixtureTestCase {
}
public void testNamedCharacter() {
myFixture.configureByText(RegExpFileType.INSTANCE, "\\\\N{SMILE<caret>}");
myFixture.configureByText(RegExpFileType.INSTANCE, "\\N{SMILE<caret>}");
final LookupElement[] elements = myFixture.completeBasic();
final List<String> strings = ContainerUtil.map(elements, LookupElement::getLookupString);
assertEquals(Arrays.asList("SMILE", "SMILING FACE WITH SMILING EYES", "SMILING FACE WITH HEART-SHAPED EYES",
@@ -89,7 +89,9 @@ public class RegExpCompletionTest extends CodeInsightFixtureTestCase {
}
public void testPropertyAlpha() throws Throwable {
doTest();
myFixture.configureByText(RegExpFileType.INSTANCE, "\\P{Alp<caret>}");
myFixture.completeBasic();
myFixture.checkResult("\\P{Alpha<caret>}");
}
public void doTest() throws Throwable {
@@ -188,6 +188,7 @@ public class RegExpParsingTest extends ParsingTestCase {
public void testGroups37() throws IOException { doCodeTest("(?P=name)"); }
public void testGroups38() throws IOException { doCodeTest("\\g'name'"); }
public void testGroups39() throws IOException { doCodeTest("(?(name)yes-pattern|no-pattern)"); }
public void testGroups40() throws IOException { doCodeTest("(?(name)yes-pattern|{"); }
public void testEscapes1() throws IOException { doCodeTest("\\q"); }
public void testEscapes2() throws IOException { doCodeTest("\\#"); }
@@ -243,6 +244,7 @@ public class RegExpParsingTest extends ParsingTestCase {
public void testNamedchars11() throws IOException { doCodeTest("[:^xdigit:]+"); }
public void testNamedchars12() throws IOException { doCodeTest("\\p{InArabic Extended-A}"); }
public void testNamedchars13() throws IOException { doCodeTest("\\N{Mahjong Tile Winter}"); }
public void testNamedchars14() throws IOException { doCodeTest("[\\N{Mahjong Tile Winter}]"); }
public void testBackrefs1() throws IOException { doCodeTest("(ac*)c*d[ac]*\\1"); }
public void testBackrefs2() throws IOException { doCodeTest("(.)=\\1"); }
@@ -335,4 +337,43 @@ public class RegExpParsingTest extends ParsingTestCase {
public void testParse1() throws IOException { doCodeTest("123 | 456"); }
public void testParse2() throws IOException { doCodeTest("1**"); }
public void testParse3() throws IOException { doCodeTest("(([hH][tT]{2}[pP]|[fF][tT][pP])://)?[a-zA-Z0-9\\-]+(\\.[a-zA-Z0-9\\-]+)*"); }
public void testPosixBracketExpression1() throws IOException {
RegExpParserDefinition.setTestCapability(RegExpCapability.POSIX_BRACKET_EXPRESSIONS, getTestRootDisposable());
doCodeTest("[[:alpha:]]");
}
public void testPosixBracketExpression2() throws IOException {
RegExpParserDefinition.setTestCapability(RegExpCapability.POSIX_BRACKET_EXPRESSIONS, getTestRootDisposable());
doCodeTest("[[:^alpha:]]");
}
public void testCategoryShorthand1() throws IOException {
doCodeTest("\\pL");
}
public void testCategoryShorthand2() throws IOException {
RegExpParserDefinition.setTestCapability(RegExpCapability.UNICODE_CATEGORY_SHORTHAND, getTestRootDisposable());
doCodeTest("\\pL");
}
public void testOmitNumberInQuantifier() throws IOException {
RegExpParserDefinition.setTestCapability(RegExpCapability.OMIT_NUMBERS_IN_QUANTIFIERS, getTestRootDisposable());
doCodeTest("a{,3}");
}
public void testDanglingMetaCharacter1() throws IOException {
RegExpParserDefinition.setTestCapability(RegExpCapability.DANGLING_METACHARACTERS, getTestRootDisposable());
doCodeTest("{");
}
public void testDanglingMetaCharacter2() throws IOException {
RegExpParserDefinition.setTestCapability(RegExpCapability.DANGLING_METACHARACTERS, getTestRootDisposable());
doCodeTest("a{a");
}
public void testDanglingMetaCharacters3() throws IOException {
RegExpParserDefinition.setTestCapability(RegExpCapability.DANGLING_METACHARACTERS, getTestRootDisposable());
doCodeTest("{{E1:\\s*(?P<ref>([^\\n]+\\+)?[0-9]+)( *\\|[^\\n]*)?}}");
}
}
@@ -1 +0,0 @@
\\p{Alp<caret>}
@@ -1 +0,0 @@
\\p{Alpha}
@@ -0,0 +1,6 @@
REGEXP_FILE
RegExpPatternImpl: <\pL>
RegExpBranchImpl: <\pL>
RegExpPropertyImpl: <\pL>
PsiElement(PROPERTY)('\p')
PsiElement(CATEGORY_SHORT_HAND)('L')
@@ -0,0 +1,8 @@
REGEXP_FILE
RegExpPatternImpl: <\pL>
RegExpBranchImpl: <\pL>
RegExpPropertyImpl: <\pL>
PsiElement(PROPERTY)('\p')
PsiErrorElement:Category shorthand not allowed in this regular expression dialect
<empty list>
PsiElement(CATEGORY_SHORT_HAND)('L')
@@ -0,0 +1,5 @@
REGEXP_FILE
RegExpPatternImpl: <{>
RegExpBranchImpl: <{>
RegExpCharImpl: <{>
PsiElement(CHARACTER)('{')
@@ -0,0 +1,9 @@
REGEXP_FILE
RegExpPatternImpl: <a{a>
RegExpBranchImpl: <a{a>
RegExpCharImpl: <a>
PsiElement(CHARACTER)('a')
RegExpCharImpl: <{>
PsiElement(CHARACTER)('{')
RegExpCharImpl: <a>
PsiElement(CHARACTER)('a')
@@ -0,0 +1,84 @@
REGEXP_FILE
RegExpPatternImpl: <{{E1:\s*(?P<ref>([^\n]+\+)?[0-9]+)( *\|[^\n]*)?}}>
RegExpBranchImpl: <{{E1:\s*(?P<ref>([^\n]+\+)?[0-9]+)( *\|[^\n]*)?}}>
RegExpCharImpl: <{>
PsiElement(CHARACTER)('{')
RegExpCharImpl: <{>
PsiElement(CHARACTER)('{')
RegExpCharImpl: <E>
PsiElement(CHARACTER)('E')
RegExpCharImpl: <1>
PsiElement(CHARACTER)('1')
RegExpCharImpl: <:>
PsiElement(CHARACTER)(':')
RegExpClosureImpl: <\s*>
RegExpSimpleClassImpl: <\s>
PsiElement(CHAR_CLASS)('\s')
RegExpQuantifierImpl: <*>
PsiElement(STAR)('*')
RegExpGroupImpl: <(?P<ref>([^\n]+\+)?[0-9]+)>
PsiElement(PYTHON_NAMED_GROUP)('(?P<')
PsiElement(NAME)('ref')
PsiElement(GT)('>')
RegExpPatternImpl: <([^\n]+\+)?[0-9]+>
RegExpBranchImpl: <([^\n]+\+)?[0-9]+>
RegExpClosureImpl: <([^\n]+\+)?>
RegExpGroupImpl: <([^\n]+\+)>
PsiElement(GROUP_BEGIN)('(')
RegExpPatternImpl: <[^\n]+\+>
RegExpBranchImpl: <[^\n]+\+>
RegExpClosureImpl: <[^\n]+>
RegExpClassImpl: <[^\n]>
PsiElement(CLASS_BEGIN)('[')
PsiElement(CARET)('^')
RegExpCharImpl: <\n>
PsiElement(ESC_CTRL_CHARACTER)('\n')
PsiElement(CLASS_END)(']')
RegExpQuantifierImpl: <+>
PsiElement(PLUS)('+')
RegExpCharImpl: <\+>
PsiElement(ESC_CHARACTER)('\+')
PsiElement(GROUP_END)(')')
RegExpQuantifierImpl: <?>
PsiElement(QUEST)('?')
RegExpClosureImpl: <[0-9]+>
RegExpClassImpl: <[0-9]>
PsiElement(CLASS_BEGIN)('[')
RegExpCharRangeImpl: <0-9>
RegExpCharImpl: <0>
PsiElement(CHARACTER)('0')
PsiElement(MINUS)('-')
RegExpCharImpl: <9>
PsiElement(CHARACTER)('9')
PsiElement(CLASS_END)(']')
RegExpQuantifierImpl: <+>
PsiElement(PLUS)('+')
PsiElement(GROUP_END)(')')
RegExpClosureImpl: <( *\|[^\n]*)?>
RegExpGroupImpl: <( *\|[^\n]*)>
PsiElement(GROUP_BEGIN)('(')
RegExpPatternImpl: < *\|[^\n]*>
RegExpBranchImpl: < *\|[^\n]*>
RegExpClosureImpl: < *>
RegExpCharImpl: < >
PsiElement(CHARACTER)(' ')
RegExpQuantifierImpl: <*>
PsiElement(STAR)('*')
RegExpCharImpl: <\|>
PsiElement(ESC_CHARACTER)('\|')
RegExpClosureImpl: <[^\n]*>
RegExpClassImpl: <[^\n]>
PsiElement(CLASS_BEGIN)('[')
PsiElement(CARET)('^')
RegExpCharImpl: <\n>
PsiElement(ESC_CTRL_CHARACTER)('\n')
PsiElement(CLASS_END)(']')
RegExpQuantifierImpl: <*>
PsiElement(STAR)('*')
PsiElement(GROUP_END)(')')
RegExpQuantifierImpl: <?>
PsiElement(QUEST)('?')
RegExpCharImpl: <}>
PsiElement(CHARACTER)('}')
RegExpCharImpl: <}>
PsiElement(CHARACTER)('}')
+38
View File
@@ -0,0 +1,38 @@
REGEXP_FILE
RegExpPatternImpl: <(?(name)yes-pattern|{>
RegExpBranchImpl: <(?(name)yes-pattern|{>
RegExpClosureImpl: <(?(name)yes-pattern|{>
RegExpPyCondRefImpl: <(?(name)yes-pattern|>
PsiElement(PYTHON_COND_REF)('(?(')
PsiElement(NAME)('name')
PsiElement(GROUP_END)(')')
RegExpBranchImpl: <yes-pattern>
RegExpCharImpl: <y>
PsiElement(CHARACTER)('y')
RegExpCharImpl: <e>
PsiElement(CHARACTER)('e')
RegExpCharImpl: <s>
PsiElement(CHARACTER)('s')
RegExpCharImpl: <->
PsiElement(MINUS)('-')
RegExpCharImpl: <p>
PsiElement(CHARACTER)('p')
RegExpCharImpl: <a>
PsiElement(CHARACTER)('a')
RegExpCharImpl: <t>
PsiElement(CHARACTER)('t')
RegExpCharImpl: <t>
PsiElement(CHARACTER)('t')
RegExpCharImpl: <e>
PsiElement(CHARACTER)('e')
RegExpCharImpl: <r>
PsiElement(CHARACTER)('r')
RegExpCharImpl: <n>
PsiElement(CHARACTER)('n')
PsiElement(UNION)('|')
PsiErrorElement:Dangling metacharacter
<empty list>
RegExpQuantifierImpl: <{>
PsiElement(LBRACE)('{')
PsiErrorElement:Number expected
<empty list>
@@ -0,0 +1,11 @@
REGEXP_FILE
RegExpPatternImpl: <[\N{Mahjong Tile Winter}]>
RegExpBranchImpl: <[\N{Mahjong Tile Winter}]>
RegExpClassImpl: <[\N{Mahjong Tile Winter}]>
PsiElement(CLASS_BEGIN)('[')
RegExpNamedCharacterImpl: <\N{Mahjong Tile Winter}>
PsiElement(NAMED_CHARACTER)('\N')
PsiElement(LBRACE)('{')
PsiElement(NAME)('Mahjong Tile Winter')
PsiElement(RBRACE)('}')
PsiElement(CLASS_END)(']')
@@ -0,0 +1,11 @@
REGEXP_FILE
RegExpPatternImpl: <a{,3}>
RegExpBranchImpl: <a{,3}>
RegExpClosureImpl: <a{,3}>
RegExpCharImpl: <a>
PsiElement(CHARACTER)('a')
RegExpQuantifierImpl: <{,3}>
PsiElement(LBRACE)('{')
PsiElement(COMMA)(',')
PsiElement(NUMBER)('3')
PsiElement(RBRACE)('}')
@@ -0,0 +1,10 @@
REGEXP_FILE
RegExpPatternImpl: <[[:alpha:]]>
RegExpBranchImpl: <[[:alpha:]]>
RegExpClassImpl: <[[:alpha:]]>
PsiElement(CLASS_BEGIN)('[')
RegExpPosixBracketExpressionImpl: <[:alpha:]>
PsiElement(BRACKET_EXPRESSION_BEGIN)('[:')
PsiElement(NAME)('alpha')
PsiElement(BRACKET_EXPRESSION_END)(':]')
PsiElement(CLASS_END)(']')
@@ -0,0 +1,11 @@
REGEXP_FILE
RegExpPatternImpl: <[[:^alpha:]]>
RegExpBranchImpl: <[[:^alpha:]]>
RegExpClassImpl: <[[:^alpha:]]>
PsiElement(CLASS_BEGIN)('[')
RegExpPosixBracketExpressionImpl: <[:^alpha:]>
PsiElement(BRACKET_EXPRESSION_BEGIN)('[:')
PsiElement(CARET)('^')
PsiElement(NAME)('alpha')
PsiElement(BRACKET_EXPRESSION_END)(':]')
PsiElement(CLASS_END)(']')
+10 -6
View File
@@ -1,6 +1,6 @@
REGEXP_FILE
RegExpPatternImpl: <a{1,>
RegExpBranchImpl: <a{1,>
RegExpPatternImpl: <a{1,foo}>
RegExpBranchImpl: <a{1,foo}>
RegExpClosureImpl: <a{1,>
RegExpCharImpl: <a>
PsiElement(CHARACTER)('a')
@@ -10,7 +10,11 @@ REGEXP_FILE
PsiElement(COMMA)(',')
PsiErrorElement:'}' or number expected
<empty list>
PsiElement(NAME)('foo')
PsiErrorElement:Pattern expected
<empty list>
PsiElement(RBRACE)('}')
RegExpCharImpl: <f>
PsiElement(CHARACTER)('f')
RegExpCharImpl: <o>
PsiElement(CHARACTER)('o')
RegExpCharImpl: <o>
PsiElement(CHARACTER)('o')
RegExpCharImpl: <}>
PsiElement(CHARACTER)('}')
@@ -59,6 +59,14 @@ public class TestOnlyInspection extends BaseJavaBatchLocalInspectionTool {
validate(e, e.resolveMethod(), h);
}
@Override
public void visitMethodReferenceExpression(PsiMethodReferenceExpression expression) {
PsiElement resolve = expression.resolve();
if (resolve instanceof PsiMethod) {
validate(expression, (PsiMethod)resolve, h);
}
}
@Override
public void visitReferenceExpression(PsiReferenceExpression reference) {
PsiElement resolve = reference.resolve();
@@ -193,7 +193,9 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase {
private static List<? extends GenerationInfo> filterOutAlreadyInsertedConstructors(PsiClass aClass, List<? extends GenerationInfo> constructors) {
boolean alreadyExist = true;
for (GenerationInfo constructor : constructors) {
alreadyExist &= aClass.findMethodBySignature((PsiMethod)constructor.getPsiMember(), false) != null;
PsiMethod existingMethod = aClass.findMethodBySignature((PsiMethod)constructor.getPsiMember(), false);
alreadyExist &= existingMethod != null && existingMethod.isPhysical();
}
if (alreadyExist) {
return Collections.emptyList();
@@ -57,8 +57,8 @@ public class GenerateEqualsHandler extends GenerateMembersHandlerBase {
final PsiMethod equalsMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getEqualsSignature(project, scope));
final PsiMethod hashCodeMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getHashCodeSignature());
boolean needEquals = equalsMethod == null;
boolean needHashCode = hashCodeMethod == null;
boolean needEquals = needToGenerateMethod(equalsMethod);
boolean needHashCode = needToGenerateMethod(hashCodeMethod);
if (!needEquals && !needHashCode) {
String text = aClass instanceof PsiAnonymousClass
? CodeInsightBundle.message("generate.equals.and.hashcode.already.defined.warning.anonymous")
@@ -107,6 +107,10 @@ public class GenerateEqualsHandler extends GenerateMembersHandlerBase {
return DUMMY_RESULT;
}
static boolean needToGenerateMethod(PsiMethod equalsMethod) {
return equalsMethod == null || !equalsMethod.isPhysical();
}
private static boolean hasNonStaticFields(PsiClass aClass) {
for (PsiField field : aClass.getFields()) {
if (!field.hasModifierProperty(PsiModifier.STATIC)) {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@ package com.intellij.codeInsight.generation;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.*;
import com.intellij.psi.search.GlobalSearchScope;
@@ -113,12 +112,12 @@ public class GenerateEqualsHelper implements Runnable {
public Collection<PsiMethod> generateMembers() throws IncorrectOperationException {
PsiMethod equals = null;
if (myEqualsFields != null && findMethod(myClass, getEqualsSignature(myProject, myClass.getResolveScope())) == null) {
if (myEqualsFields != null && GenerateEqualsHandler.needToGenerateMethod(findMethod(myClass, getEqualsSignature(myProject, myClass.getResolveScope())))) {
equals = createEquals();
}
PsiMethod hashCode = null;
if (myHashCodeFields != null && findMethod(myClass, getHashCodeSignature()) == null) {
if (myHashCodeFields != null && GenerateEqualsHandler.needToGenerateMethod(findMethod(myClass, getHashCodeSignature()))) {
if (myHashCodeFields.length > 0) {
hashCode = createHashCode();
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -86,6 +86,6 @@ public class PsiFieldMember extends PsiElementClassMember<PsiField> implements P
@Nullable
private static PsiMethod createMethodIfNotExists(PsiClass aClass, final PsiMethod template) {
PsiMethod existing = aClass.findMethodBySignature(template, false);
return existing == null ? template : null;
return existing == null || !existing.isPhysical() ? template : null;
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -57,7 +57,7 @@ public class PsiGenerationInfo<T extends PsiMember> extends GenerationInfoBase i
else {
existingMember = null;
}
if (existingMember == null || !myMergeIfExists) {
if (existingMember == null || !existingMember.isPhysical() || !myMergeIfExists) {
PsiElement newMember = GenerateMembersUtil.insert(aClass, myMember, anchor, before);
myMember = (T)JavaCodeStyleManager.getInstance(aClass.getProject()).shortenClassReferences(newMember);
LOG.assertTrue(myMember.isValid(), myMember);
@@ -22,6 +22,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.LightCodeInsightTestCase;
import org.jetbrains.java.generate.GenerateToStringWorker;
import org.jetbrains.java.generate.config.ReplacePolicy;
import org.jetbrains.java.generate.template.TemplateResource;
import java.util.Collections;
@@ -44,7 +45,8 @@ public class GenerateToStringTest extends LightCodeInsightTestCase {
final PsiClass clazz = PsiTreeUtil.getParentOfType(elementAt, PsiClass.class);
assertNotNull(clazz);
WriteAction.run(() -> {
new GenerateToStringWorker(clazz, editor, false).execute(Collections.emptyList(), templateResource);
final GenerateToStringWorker worker = new GenerateToStringWorker(clazz, editor, false);
worker.execute(Collections.emptyList(), templateResource, ReplacePolicy.getInstance());
});
checkResultByFile("/codeInsight/generateToString/after" + getTestName(false) + ".java");
}
@@ -81,6 +81,13 @@ public abstract class DefaultSchemeActions<T extends Scheme> {
public void actionPerformed(AnActionEvent e) {
doReset();
}
@Override
public void update(AnActionEvent e) {
Presentation p = e.getPresentation();
T currentScheme = getCurrentScheme();
p.setEnabled(currentScheme != null && isResetAvailable(currentScheme));
}
}
@@ -188,6 +195,10 @@ public abstract class DefaultSchemeActions<T extends Scheme> {
protected abstract boolean isDeleteAvailable(@NotNull T scheme);
protected boolean isResetAvailable(@NotNull T scheme) {
return true;
}
protected abstract void doExport(@NotNull T scheme, @NotNull String exporterName);
@Nullable
@@ -0,0 +1,128 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.application.options.colors;
import com.intellij.application.options.DefaultSchemeActions;
import com.intellij.application.options.SaveSchemeDialog;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.colors.impl.AbstractColorsScheme;
import com.intellij.openapi.editor.colors.impl.EditorColorsSchemeImpl;
import com.intellij.openapi.editor.colors.impl.EmptyColorScheme;
import com.intellij.openapi.editor.colors.impl.ReadOnlyColorsScheme;
import com.intellij.openapi.options.*;
import com.intellij.openapi.project.DefaultProjectFactory;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
public abstract class ColorSchemeActions extends DefaultSchemeActions<EditorColorsScheme> {
private final ColorAndFontOptions myOptions;
private JComponent myParentComponent;
public ColorSchemeActions(@NotNull JComponent parentComponent, @NotNull ColorAndFontOptions options) {
myOptions = options;
myParentComponent = parentComponent;
}
@Override
protected void doImport(@NotNull String importerName) {
final SchemeImporter<EditorColorsScheme> importer = SchemeImporterEP.getImporter(importerName, EditorColorsScheme.class);
if (importer != null) {
VirtualFile importSource = SchemeImportUtil.selectImportSource(importer.getSourceExtensions(), myParentComponent, null);
if (importSource != null) {
try {
EditorColorsScheme imported =
importer.importScheme(DefaultProjectFactory.getInstance().getDefaultProject(), importSource, myOptions.getSelectedScheme(),
name -> {
String newName = myOptions.getUniqueName(name != null ? name : "Unnamed");
AbstractColorsScheme newScheme = new EditorColorsSchemeImpl(EmptyColorScheme.INSTANCE);
newScheme.setName(newName);
newScheme.setDefaultMetaInfo(EmptyColorScheme.INSTANCE);
return newScheme;
});
if (imported != null) {
myOptions.addImportedScheme(imported);
}
}
catch (SchemeImportException e) {
SchemeImportUtil.showStatus(myParentComponent, "Import failed: " + e.getMessage(), MessageType.ERROR);
}
}
}
}
@Override
protected void doReset() {
EditorColorsScheme currentScheme = getCurrentScheme();
if (currentScheme != null) {
if (Messages
.showOkCancelDialog(ApplicationBundle.message("color.scheme.reset.message"),
ApplicationBundle.message("color.scheme.reset.title"), Messages.getQuestionIcon()) == Messages.OK) {
myOptions.resetSchemeToOriginal(currentScheme.getName());
}
}
}
@Override
protected void doSaveAs() {
List<String> names = ContainerUtil.newArrayList(myOptions.getSchemeNames());
String selectedName = AbstractColorsScheme.getDisplayName(myOptions.getSelectedScheme());
SaveSchemeDialog dialog =
new SaveSchemeDialog(myParentComponent, ApplicationBundle.message("title.save.color.scheme.as"), names, selectedName);
if (dialog.showAndGet()) {
myOptions.saveSchemeAs(dialog.getSchemeName());
}
}
@Override
protected void doDelete() {
EditorColorsScheme currentScheme = getCurrentScheme();
if (currentScheme != null) {
myOptions.removeScheme(currentScheme.getName());
}
}
@Override
protected boolean isDeleteAvailable(@NotNull EditorColorsScheme scheme) {
return !ColorAndFontOptions.isReadOnly(scheme) && ColorAndFontOptions.canBeDeleted(scheme);
}
@Override
protected boolean isResetAvailable(@NotNull EditorColorsScheme scheme) {
AbstractColorsScheme originalScheme =
scheme instanceof AbstractColorsScheme ? ((AbstractColorsScheme)scheme).getOriginal() : null;
return
!ColorAndFontOptions.isReadOnly(scheme) &&
scheme.getName().startsWith(SchemeManager.EDITABLE_COPY_PREFIX) &&
originalScheme instanceof ReadOnlyColorsScheme;
}
@Override
protected void doExport(@NotNull EditorColorsScheme scheme, @NotNull String exporterName) {
// Unsupported for now.
}
@Override
protected Class<EditorColorsScheme> getSchemeType() {
return EditorColorsScheme.class;
}
}
@@ -16,24 +16,14 @@
package com.intellij.application.options.colors;
import com.intellij.application.options.ImportSourceChooserDialog;
import com.intellij.application.options.SaveSchemeDialog;
import com.intellij.application.options.SkipSelfSearchComponent;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.colors.impl.AbstractColorsScheme;
import com.intellij.openapi.editor.colors.impl.EditorColorsSchemeImpl;
import com.intellij.openapi.editor.colors.impl.EmptyColorScheme;
import com.intellij.openapi.editor.colors.impl.ReadOnlyColorsScheme;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.options.*;
import com.intellij.openapi.project.DefaultProjectFactory;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.ManageSchemesComboAction;
import com.intellij.util.EventDispatcher;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.JBInsets;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -42,16 +32,12 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
private final ColorAndFontOptions myOptions;
private ComboBox<MySchemeItem> mySchemeComboBox;
private JButton myDeleteButton;
private JButton myResetButton;
private JButton myImportButton;
private JLabel myHintLabel;
private final EventDispatcher<ColorAndFontSettingsListener> myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class);
@@ -73,18 +59,10 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
String selectedName = getSelectedSchemeName();
if (selectedName != null) {
EditorColorsScheme selected = myOptions.selectScheme(selectedName);
final boolean readOnly = ColorAndFontOptions.isReadOnly(selected);
myDeleteButton.setEnabled(!readOnly && ColorAndFontOptions.canBeDeleted(selected));
myHintLabel.setVisible(readOnly);
myHintLabel.setVisible(ColorAndFontOptions.isReadOnly(selected));
if (areSchemesLoaded()) {
myDispatcher.getMulticaster().schemeChanged(SchemesPanel.this);
}
AbstractColorsScheme originalScheme =
selected instanceof AbstractColorsScheme ? ((AbstractColorsScheme)selected).getOriginal() : null;
myResetButton.setEnabled(
!readOnly &&
selectedName.startsWith(SchemeManager.EDITABLE_COPY_PREFIX) &&
originalScheme instanceof ReadOnlyColorsScheme);
}
}
});
@@ -107,61 +85,20 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
mySchemeComboBox = new ComboBox<>();
panel.add(mySchemeComboBox,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 10),
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new JBInsets(0, 0, 5, 10),
0, 0));
JButton saveAsButton = new JButton(ApplicationBundle.message("button.save.as"));
saveAsButton.addActionListener(new ActionListener() {
ManageSchemesComboAction schemesComboAction = new ManageSchemesComboAction(new ColorSchemeActions(this, myOptions) {
@Nullable
@Override
public void actionPerformed(@NotNull ActionEvent e) {
showSaveAsDialog();
protected EditorColorsScheme getCurrentScheme() {
return myOptions.getScheme(getSelectedSchemeName());
}
});
panel.add(saveAsButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 5),
JButton manageButton = schemesComboAction.createCombo();
panel.add(manageButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new JBInsets(0, 0, 5, 5),
0, 0));
myDeleteButton = new JButton(ApplicationBundle.message("button.delete"));
myDeleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
String selectedName = getSelectedSchemeName();
if (selectedName != null) {
myOptions.removeScheme(selectedName);
}
}
});
panel.add(myDeleteButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 5), 0,
0));
myResetButton = new JButton(ApplicationBundle.message("color.scheme.reset"));
myResetButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
String selectedName = getSelectedSchemeName();
if (selectedName != null) {
if (Messages
.showOkCancelDialog(ApplicationBundle.message("color.scheme.reset.message"),
ApplicationBundle.message("color.scheme.reset.title"), Messages.getQuestionIcon()) == Messages.OK) {
myOptions.resetSchemeToOriginal(selectedName);
}
}
}
});
panel.add(myResetButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 5), 0,
0));
myImportButton = new JButton("Import...");
myImportButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
chooseAndImport();
}
});
myImportButton.setVisible(isImportAvailable());
panel.add(myImportButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 5), 0,
0));
myHintLabel = new JLabel(ApplicationBundle.message("hint.readonly.scheme.cannot.be.modified"));
myHintLabel.setEnabled(false);
panel.add(myHintLabel,
@@ -189,15 +126,6 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
return panel;
}
private void showSaveAsDialog() {
List<String> names = ContainerUtil.newArrayList(myOptions.getSchemeNames());
String selectedName = AbstractColorsScheme.getDisplayName(myOptions.getSelectedScheme());
SaveSchemeDialog dialog = new SaveSchemeDialog(this, ApplicationBundle.message("title.save.color.scheme.as"), names, selectedName);
if (dialog.showAndGet()) {
myOptions.saveSchemeAs(dialog.getSchemeName());
}
}
@Deprecated
public boolean updateDescription(boolean modified) {
EditorColorsScheme scheme = myOptions.getSelectedScheme();
@@ -245,44 +173,6 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
myDispatcher.addListener(listener);
}
private void chooseAndImport() {
ImportSourceChooserDialog<EditorColorsScheme> importSourceChooserDialog =
new ImportSourceChooserDialog<>(this, EditorColorsScheme.class);
if (importSourceChooserDialog.showAndGet()) {
final String selectedImporterName = importSourceChooserDialog.getSelectedSourceName();
if (selectedImporterName != null) {
final SchemeImporter<EditorColorsScheme> importer = SchemeImporterEP.getImporter(selectedImporterName, EditorColorsScheme.class);
if (importer != null) {
VirtualFile importSource = SchemeImportUtil.selectImportSource(importer.getSourceExtensions(), this, null);
if (importSource != null) {
try {
EditorColorsScheme imported =
importer.importScheme(DefaultProjectFactory.getInstance().getDefaultProject(), importSource, myOptions.getSelectedScheme(),
name -> {
String newName = myOptions.getUniqueName(name);
AbstractColorsScheme newScheme = new EditorColorsSchemeImpl(EmptyColorScheme.INSTANCE);
newScheme.setName(newName);
newScheme.setDefaultMetaInfo(EmptyColorScheme.INSTANCE);
return newScheme;
});
if (imported != null) {
myOptions.addImportedScheme(imported);
}
}
catch (SchemeImportException e) {
SchemeImportUtil.showStatus(myImportButton, "Import failed: " + e.getMessage(), MessageType.ERROR);
}
}
}
}
}
}
private static boolean isImportAvailable() {
return !SchemeImporterEP.getExtensions(EditorColorsScheme.class).isEmpty();
}
private final static class MySchemeItem {
private EditorColorsScheme myScheme;
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -30,7 +30,6 @@ public interface TabbedContent extends Content {
void addContent(@NotNull JComponent content, @NotNull String name, boolean selectTab);
void removeContent(@NotNull JComponent content);
void renameContent(@NotNull JComponent tab, @NotNull String newTabName);
void selectContent(int index);
List<Pair<String, JComponent>> getTabs();
String getTitlePrefix();
@@ -18,7 +18,6 @@ package com.intellij.openapi.application;
import com.intellij.Patches;
import com.intellij.openapi.application.ex.ClipboardUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.wm.IdeFrame;
import com.intellij.util.Alarm;
import org.jetbrains.annotations.NotNull;
@@ -54,7 +53,6 @@ public abstract class ClipboardAnalyzeListener extends ApplicationActivationList
@Override
public void applicationDeactivated(IdeFrame ideFrame) {
if (SystemInfo.isMac) return;
myCachedClipboardValue = ClipboardUtil.getTextInClipboard();
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@ import com.intellij.openapi.editor.markup.TextAttributes;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.text.JTextComponent;
/**
@@ -160,7 +161,9 @@ public class TextComponentSelectionModel implements SelectionModel {
@Override
public void copySelectionToClipboard() {
EditorCopyPasteHelper.getInstance().copySelectionToClipboard(myEditor);
if (! (myTextComponent instanceof JPasswordField)) {
EditorCopyPasteHelper.getInstance().copySelectionToClipboard(myEditor);
}
}
@Override
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2013 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@
package com.intellij.openapi.wm.impl.content;
import com.intellij.ide.ui.AntialiasingType;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.ui.EngravedTextGraphics;
import com.intellij.ui.Gray;
@@ -114,18 +113,13 @@ public class BaseLabel extends JLabel {
setToolTipText(content.getDescription());
final boolean show = Boolean.TRUE.equals(content.getUserData(ToolWindow.SHOW_CONTENT_ICON))
|| content.getComponent() instanceof Iconable;
Icon icon = content.getIcon();
if (content.getComponent() instanceof Iconable) { // handling tabbed content after 'split group' action
icon = ((Iconable)content.getComponent()).getIcon(Iconable.ICON_FLAG_VISIBILITY);
}
final boolean show = Boolean.TRUE.equals(content.getUserData(ToolWindow.SHOW_CONTENT_ICON));
if (show) {
if (isSelected) {
setIcon(icon);
setIcon(content.getIcon());
}
else {
setIcon(icon != null ? new WatermarkIcon(icon, .5f) : null);
setIcon(content.getIcon() != null ? new WatermarkIcon(content.getIcon(), .5f) : null);
}
}
else {
@@ -19,19 +19,14 @@ import com.intellij.ide.IdeEventQueue;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.util.Pair;
import com.intellij.reference.SoftReference;
import com.intellij.ui.ClickListener;
import com.intellij.ui.components.JBList;
import com.intellij.ui.content.TabbedContent;
import com.intellij.util.ContentUtilEx;
import com.intellij.util.NotNullFunction;
import com.intellij.util.ui.EmptyIcon;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.WatermarkIcon;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
@@ -57,7 +52,7 @@ public class TabbedContentTabLabel extends ContentTabLabel {
}
};
private final TabbedContent myContent;
@Nullable private Reference<JBPopup> myPopupReference = null;
private Reference<JBPopup> myPopupReference = null;
public TabbedContentTabLabel(TabbedContent content, TabContentLayout layout) {
super(content, layout);
@@ -73,7 +68,7 @@ public class TabbedContentTabLabel extends ContentTabLabel {
private void showPopup() {
IdeEventQueue.getInstance().getPopupManager().closeAllPopups();
ArrayList<String> names = new ArrayList<>();
ArrayList<String> names = new ArrayList<String>();
for (Pair<String, JComponent> tab : myContent.getTabs()) {
names.add(tab.first);
}
@@ -86,9 +81,7 @@ public class TabbedContentTabLabel extends ContentTabLabel {
@NotNull
@Override
public JComponent fun(Object dom) {
String tabName = dom.toString();
label.setText(tabName);
setIconInPopupLabel(label, tabName);
label.setText(dom.toString());
return label;
}
});
@@ -99,67 +92,19 @@ public class TabbedContentTabLabel extends ContentTabLabel {
myContent.selectContent(index);
}
}).createPopup();
myPopupReference = new WeakReference<>(popup);
myPopupReference = new WeakReference<JBPopup>(popup);
popup.showUnderneathOf(this);
}
private void setIconInPopupLabel(JLabel label, String tabName) {
Icon baseIcon = getBaseIcon();
boolean hasIconsInTabs = baseIcon != null;
for (Pair<String, JComponent> nextTabWithName : myContent.getTabs()) {
if (nextTabWithName.getFirst().equals(tabName)) {
JComponent tab = nextTabWithName.getSecond();
Icon tabIcon = null;
if (tab instanceof Iconable) {
tabIcon = ((Iconable)tab).getIcon(Iconable.ICON_FLAG_VISIBILITY);
if (hasIconsInTabs && tabIcon == null) {
tabIcon = EmptyIcon.create(baseIcon);
}
}
label.setIcon(tabIcon);
}
}
}
@Nullable
private Icon getBaseIcon() {
Icon baseIcon = null;
for (Pair<String, JComponent> nextTabWithName : myContent.getTabs()) {
JComponent tabComponent = nextTabWithName.getSecond();
if (tabComponent instanceof Iconable) {
Icon tabIcon = ((Iconable)tabComponent).getIcon(Iconable.ICON_FLAG_VISIBILITY);
if (tabIcon != null) {
baseIcon = tabIcon;
break;
}
}
}
return baseIcon;
}
@Override
public void update() {
super.update();
if (myContent != null) {
String tabName = myContent.getTabName();
setText(tabName);
setTabIcon(tabName, this);
setText(myContent.getTabName());
}
setHorizontalAlignment(LEFT);
}
private void setTabIcon(String tabName, JLabel jLabel) {
for (Pair<String, JComponent> nextTabWithName : myContent.getTabs()) {
if (tabName != null && nextTabWithName.getFirst().equals(ContentUtilEx.getTabNameWithoutPrefix(myContent, tabName))) {
JComponent tab = nextTabWithName.getSecond();
if (tab instanceof Iconable) {
Icon baseIcon = ((Iconable)tab).getIcon(Iconable.ICON_FLAG_VISIBILITY);
jLabel.setIcon(isSelected() || baseIcon == null ? baseIcon : new WatermarkIcon(baseIcon, .5f));
}
}
}
}
@Override
public Dimension getPreferredSize() {
final Dimension size = super.getPreferredSize();
@@ -17,12 +17,10 @@ package com.intellij.ui.content.impl;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.util.Pair;
import com.intellij.ui.content.ContentManager;
import com.intellij.ui.content.TabbedContent;
import com.intellij.util.ContentUtilEx;
import com.intellij.util.ui.WatermarkIcon;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -35,7 +33,7 @@ import java.util.List;
* @author Konstantin Bulenkov
*/
public class TabbedContentImpl extends ContentImpl implements TabbedContent {
private final List<Pair<String, JComponent>> myTabs = new ArrayList<>();
private final List<Pair<String, JComponent>> myTabs = new ArrayList<Pair<String, JComponent>>();
private String myPrefix;
public TabbedContentImpl(JComponent component, String displayName, boolean isPinnable, String titlePrefix) {
@@ -86,25 +84,6 @@ public class TabbedContentImpl extends ContentImpl implements TabbedContent {
}
}
@Override
public void renameContent(@NotNull JComponent tab, @NotNull String newTabName) {
Pair<String, JComponent> toRemove = null;
for (Pair<String, JComponent> existingTab : myTabs) {
if (existingTab.second == tab) {
toRemove = existingTab;
break;
}
}
int index = myTabs.indexOf(toRemove);
if (index != -1) {
myTabs.remove(index);
}
myTabs.add(Pair.create(newTabName, tab));
if (getComponent() == tab) {
super.setDisplayName(newTabName);
}
}
@Override
public String getDisplayName() {
return getTabName();
@@ -168,23 +147,9 @@ public class TabbedContentImpl extends ContentImpl implements TabbedContent {
myPrefix = titlePrefix;
}
@Override
public void setIcon(Icon icon) {
for (Pair<String, JComponent> nextTabWithName : getTabs()) {
if (nextTabWithName.getFirst().equals(ContentUtilEx.getTabNameWithoutPrefix(this, getTabName()))) {
JComponent tab = nextTabWithName.getSecond();
if (tab instanceof Iconable) {
Icon baseIcon = ((Iconable)tab).getIcon(Iconable.ICON_FLAG_VISIBILITY);
super.setIcon(isSelected() || baseIcon == null ? baseIcon : new WatermarkIcon(baseIcon, .5f));
break;
}
}
}
}
@Override
public void split() {
List<Pair<String, JComponent>> copy = new ArrayList<>(myTabs);
List<Pair<String, JComponent>> copy = new ArrayList<Pair<String, JComponent>>(myTabs);
int selectedTab = ContentUtilEx.getSelectedTab(this);
ContentManager manager = getManager();
String prefix = getTitlePrefix();
@@ -196,7 +161,6 @@ public class TabbedContentImpl extends ContentImpl implements TabbedContent {
final String tabName = copy.get(i).first;
ContentUtilEx.addTabbedContent(manager, component, prefix, tabName, select);
}
setShouldDisposeContent(false);
Disposer.dispose(this);
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,6 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
import com.intellij.ui.content.ContentManager;
@@ -196,10 +195,4 @@ public class ContentUtilEx extends ContentsUtil {
}
return -1;
}
@Nullable
public static String getTabNameWithoutPrefix(@NotNull TabbedContent content, @NotNull String fullTabName) {
String prefix = content.getTitlePrefix();
return prefix == null ? fullTabName : StringUtil.trimStart(fullTabName, getFullPrefix(prefix));
}
}
@@ -17,7 +17,6 @@ package com.intellij.testGuiFramework.framework;
import com.intellij.diagnostic.AbstractMessage;
import com.intellij.diagnostic.MessagePool;
import com.intellij.ide.GeneralSettings;
import com.intellij.ide.PrivacyPolicy;
import com.intellij.ide.RecentProjectsManager;
import com.intellij.openapi.actionSystem.ActionManager;
@@ -159,12 +158,8 @@ public final class GuiTestUtil {
// Called by IdeTestApplication via reflection.
@SuppressWarnings("unused")
public static void setUpDefaultGeneralSettings() {
//setGuiTestingMode(true);
GeneralSettings.getInstance().setShowTipsOnStartup(false);
setUpDefaultProjectCreationLocationPath();
setUpSdks();
}
public static String getSystemJdk() {
@@ -179,11 +174,6 @@ public final class GuiTestUtil {
return jdkHome;
}
public static void setupGitPath() {
//GitVcsApplicationSettings settings = GitVcsApplicationSettings.getInstance();
//settings.setPathToGit(GitExecutor.PathHolder.GIT_EXECUTABLE);
}
public static void setUpSdks() {
String jdkHome = getSystemPropertyOrEnvironmentVariable(JDK_HOME_FOR_TESTS);
@@ -224,6 +214,9 @@ public final class GuiTestUtil {
JavaSdk javaSdk = JavaSdk.getInstance();
//in case of running different from IntelliJ or Android Studio IDE (PyCharm for example)
if (javaSdk == null) return;
String jdk_name = "JDK";
final Sdk newJdk = javaSdk.createJdk(jdk_name, path.toString(), false);
final Sdk foundJdk = ProjectJdkTable.getInstance().findJdk(newJdk.getName(), newJdk.getSdkType().getName());
@@ -109,7 +109,6 @@ public class IdeTestApplication {
ClassLoader ideClassLoader = ourInstance.getIdeClassLoader();
Class<?> clazz = ideClassLoader.loadClass(GuiTestUtil.class.getCanonicalName());
method("waitForIdeToStart").in(clazz).invoke();
method("setUpDefaultGeneralSettings").in(clazz).invoke();
}
return ourInstance;
@@ -15,13 +15,14 @@
*/
package com.intellij.testGuiFramework.impl;
import com.intellij.ide.GeneralSettings;
import com.intellij.testGuiFramework.framework.GuiTestBase;
import com.intellij.testGuiFramework.framework.GuiTestUtil;
import com.intellij.util.net.HttpConfigurable;
import org.fest.swing.core.FastRobot;
import java.lang.reflect.InvocationTargetException;
import static com.intellij.testGuiFramework.framework.GuiTestUtil.setUpDefaultProjectCreationLocationPath;
/**
* @author Sergey Karashevich
@@ -34,30 +35,43 @@ public class GuiTestCase extends GuiTestBase {
super();
}
@Override
public void setUp() throws Exception {
super.setUp();
public static class GuiSettings {
setUpDefaultProjectCreationLocationPath();
myRobot = new FastRobot();
private static final Object lock = new Object();
private static GuiSettings SETTINGS;
public static GuiSettings setUp() {
synchronized (lock) {
if (SETTINGS == null) SETTINGS = new GuiSettings();
return SETTINGS;
}
}
GuiSettings(){
GeneralSettings.getInstance().setShowTipsOnStartup(false);
GuiTestUtil.setUpDefaultProjectCreationLocationPath();
GuiTestUtil.setUpSdks();
HttpConfigurable ideSettings = HttpConfigurable.getInstance();
ideSettings.USE_HTTP_PROXY = false;
ideSettings.PROXY_HOST = "";
ideSettings.PROXY_PORT = 80;
if (IS_UNDER_TEAMCITY) GitSettings.INSTANCE.setup();
}
setIdeSettings();
if (IS_UNDER_TEAMCITY) GitSettings.INSTANCE.setup();
}
@Override
public void tearDown() throws InvocationTargetException, InterruptedException {
GitSettings.INSTANCE.restore();
super.tearDown();
@Override
public void setUp() throws Exception {
super.setUp();
myRobot = new FastRobot();
GuiSettings.setUp();
}
@Override
public void tearDown() throws InvocationTargetException, InterruptedException {
GitSettings.INSTANCE.restore();
super.tearDown();
}
}
private static void setIdeSettings() {
// Clear HTTP proxy settings, in case a test changed them.
HttpConfigurable ideSettings = HttpConfigurable.getInstance();
ideSettings.USE_HTTP_PROXY = false;
ideSettings.PROXY_HOST = "";
ideSettings.PROXY_PORT = 80;
}
}
@@ -305,14 +305,14 @@ vcs.log.open.another.log.visible=false
vcs.log.open.another.log.visible.description=An action that opens a new tab with log
vcs.log.keep.up.to.date=true
vcs.log.keep.up.to.date.description=Load log on start after heavy tasks are completed and keep it up to date even when not visible
vcs.log.labels.redesign=true
vcs.log.labels.redesign.description=Show branch labels on the right with combined tag icons, do not display tag names, combine tracked branches, display detached heads with an exclamation mark
vcs.log.highlight.not.indexed=false
vcs.log.highlight.not.indexed.description=Highlight commits that are not indexed
vcs.log.index.git=true
vcs.log.index.git.description=Index all commits in Git repository for fast filtering
vcs.log.graph.history=false
vcs.log.graph.history.description=Action in context menu that opens a new log tab filtered by file in context
vcs.log.labels.left.aligned=false
vcs.log.labels.left.aligned.description=Align labels in Log table to the left
vcs.executable.validator.timeout.sec=60
vcs.unversioned.files.in.commit=true
@@ -22,6 +22,7 @@ import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diff.impl.patch.PatchReader;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.VcsApplicationSettings;
import com.intellij.openapi.wm.IdeFrame;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
@@ -43,6 +44,19 @@ public class PatchClipboardTracker extends ApplicationComponent.Adapter {
}
private static class PatchClipboardListener extends ClipboardAnalyzeListener {
@Override
public void applicationActivated(IdeFrame ideFrame) {
// we can't get clipboard details especially content size, so we should avoid clipboard processing when it's possible;
if (!VcsApplicationSettings.getInstance().DETECT_PATCH_ON_THE_FLY) return;
super.applicationActivated(ideFrame);
}
@Override
public void applicationDeactivated(IdeFrame ideFrame) {
if (!VcsApplicationSettings.getInstance().DETECT_PATCH_ON_THE_FLY) return;
super.applicationDeactivated(ideFrame);
}
@Override
protected void handle(@NotNull Project project, @NotNull String value) {
new ApplyPatchFromClipboardAction.MyApplyPatchFromClipboardDialog(project, value).show();
@@ -50,7 +64,6 @@ public class PatchClipboardTracker extends ApplicationComponent.Adapter {
@Override
public boolean canHandle(@NotNull String value) {
if (!VcsApplicationSettings.getInstance().DETECT_PATCH_ON_THE_FLY) return false;
return PatchReader.isPatchContent(value);
}
}
@@ -31,8 +31,8 @@ public interface RefGroup {
List<VcsRef> getRefs();
/**
* Returns the background color of this ref group, which will be used to paint it on the Branches panel.
* Returns the colors of this ref group, which will be used to paint it in the table.
*/
@NotNull
Color getBgColor();
List<Color> getColors();
}
@@ -0,0 +1,83 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.vcs.log.impl;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.intellij.vcs.log.RefGroup;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.VcsRefType;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
import java.util.*;
import java.util.List;
public class SimpleRefGroup implements RefGroup {
@NotNull private final String myName;
@NotNull private final List<VcsRef> myRefs;
public SimpleRefGroup(@NotNull String name, @NotNull List<VcsRef> refs) {
myName = name;
myRefs = refs;
}
@Override
public boolean isExpanded() {
return false;
}
@NotNull
@Override
public String getName() {
return myName;
}
@NotNull
@Override
public List<VcsRef> getRefs() {
return myRefs;
}
@NotNull
@Override
public List<Color> getColors() {
return getColors(myRefs);
}
@NotNull
public static List<Color> getColors(@NotNull Collection<VcsRef> refs) {
MultiMap<VcsRefType, VcsRef> referencesByType = ContainerUtil.groupBy(refs, VcsRef::getType);
if (referencesByType.size() == 1) {
Map.Entry<VcsRefType, Collection<VcsRef>> firstItem =
ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(referencesByType.entrySet()));
boolean multiple = firstItem.getValue().size() > 1;
Color color = firstItem.getKey().getBackgroundColor();
return multiple ? Arrays.asList(color, color) : Collections.singletonList(color);
}
else {
List<Color> colorsList = ContainerUtil.newArrayList();
for (VcsRefType type : referencesByType.keySet()) {
if (referencesByType.get(type).size() > 1) {
colorsList.add(type.getBackgroundColor());
}
colorsList.add(type.getBackgroundColor());
}
return colorsList;
}
}
}
@@ -52,7 +52,7 @@ public class SingletonRefGroup implements RefGroup {
@NotNull
@Override
public Color getBgColor() {
return myRef.getType().getBackgroundColor();
public List<Color> getColors() {
return Collections.singletonList(myRef.getType().getBackgroundColor());
}
}
@@ -110,7 +110,7 @@ public class BranchFilterPopupComponent extends MultipleValueFilterPopupComponen
@NotNull
@Override
public AnAction createAction(@NotNull String name) {
return new PredefinedValueAction(Collections.singletonList(name)) {
return new PredefinedValueAction(name) {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
myFilterModel.setFilter(myFilterModel.createFilter(myValues)); // does not add to recent
@@ -126,7 +126,7 @@ public class BranchFilterPopupComponent extends MultipleValueFilterPopupComponen
@NotNull
@Override
protected AnAction createCollapsedAction(String actionName) {
return createPredefinedValueAction(Collections.singletonList(actionName)); // adds to recent
return new PredefinedValueAction(actionName); // adds to recent
}
}
}
@@ -127,10 +127,7 @@ public abstract class BranchPopupBuilder {
private static void putActionsForReferences(List<RefGroup> references, Groups actions) {
for (final RefGroup refGroup : references) {
if (refGroup instanceof SingletonRefGroup) {
String name = refGroup.getName();
if (!actions.singletonGroups.contains(name)) {
actions.singletonGroups.add(name);
}
actions.singletonGroups.add(refGroup.getName());
}
else if (refGroup.isExpanded()) {
addToGroup(refGroup, actions.expandedGroups);
@@ -142,20 +139,9 @@ public abstract class BranchPopupBuilder {
}
private static void addToGroup(final RefGroup refGroup, TreeMap<String, TreeSet<String>> groupToAdd) {
TreeSet<String> existingGroup = groupToAdd.get(refGroup.getName());
TreeSet<String> actions = new TreeSet<>();
TreeSet<String> groupActions = groupToAdd.computeIfAbsent(refGroup.getName(), key -> new TreeSet<>());
for (VcsRef ref : refGroup.getRefs()) {
actions.add(ref.getName());
}
if (existingGroup == null) {
groupToAdd.put(refGroup.getName(), actions);
}
else {
for (String action : actions) {
existingGroup.add(action);
}
groupActions.add(ref.getName());
}
}
}
@@ -84,11 +84,6 @@ abstract class MultipleValueFilterPopupComponent<Filter extends VcsLogFilter> ex
return StringUtil.join(values, ", ");
}
@NotNull
protected AnAction createPredefinedValueAction(@NotNull List<String> values) {
return new PredefinedValueAction(values);
}
@NotNull
protected AnAction createSelectMultipleValuesAction() {
return new SelectMultipleValuesAction();
@@ -105,6 +100,10 @@ abstract class MultipleValueFilterPopupComponent<Filter extends VcsLogFilter> ex
@NotNull protected final List<String> myValues;
public PredefinedValueAction(@NotNull String value) {
this(Collections.singletonList(value));
}
public PredefinedValueAction(@NotNull List<String> values) {
super(null, tooltip(values), null);
getTemplatePresentation().setText(displayableText(values), false);
@@ -15,9 +15,12 @@
*/
package com.intellij.vcs.log.ui.filter;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.openapi.util.Couple;
import com.intellij.openapi.vcs.ui.FlatSpeedSearchPopup;
import com.intellij.ui.popup.PopupFactoryImpl;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.vcs.log.VcsLogUserFilter;
import com.intellij.vcs.log.data.VcsLogData;
@@ -29,20 +32,22 @@ import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.TreeSet;
/**
* Show a popup to select a user or enter the user name.
*/
class UserFilterPopupComponent extends MultipleValueFilterPopupComponent<VcsLogUserFilter> {
@NotNull private final VcsLogData myLogData;
@NotNull private final List<String> myAllUsers;
UserFilterPopupComponent(@NotNull VcsLogUiProperties uiProperties,
@NotNull VcsLogData logData,
@NotNull FilterModel<VcsLogUserFilter> filterModel) {
super("User", uiProperties, filterModel);
myLogData = logData;
myAllUsers = collectUsers(logData);
}
@NotNull
@@ -63,12 +68,23 @@ class UserFilterPopupComponent extends MultipleValueFilterPopupComponent<VcsLogU
group.add(createAllAction());
group.add(createSelectMultipleValuesAction());
if (!myLogData.getCurrentUser().isEmpty()) {
group.add(createPredefinedValueAction(Collections.singletonList(VcsLogUserFilterImpl.ME)));
group.add(new PredefinedValueAction(VcsLogUserFilterImpl.ME));
}
group.addAll(createRecentItemsActionGroup());
return group;
}
@NotNull
protected ActionGroup createSpeedSearchActionGroup() {
DefaultActionGroup group = new DefaultActionGroup();
group.add(new SpeedsearchPredefinedValueAction(VcsLogUserFilterImpl.ME));
group.add(Separator.getInstance());
for (String user : myAllUsers) {
group.add(new SpeedsearchPredefinedValueAction(user));
}
return group;
}
@NotNull
@Override
protected List<List<String>> getRecentValuesFromSettings() {
@@ -83,11 +99,55 @@ class UserFilterPopupComponent extends MultipleValueFilterPopupComponent<VcsLogU
@NotNull
@Override
protected List<String> getAllValues() {
return ContainerUtil.map(myLogData.getAllUsers(), user -> {
return myAllUsers;
}
@NotNull
@Override
protected ListPopup createPopupMenu() {
ActionGroup actionGroup = createActionGroup();
ActionGroup speedsearchGroup = createSpeedSearchActionGroup();
return new UserLogSpeedSearchPopup(new DefaultActionGroup(actionGroup, speedsearchGroup),
DataManager.getInstance().getDataContext(this));
}
@NotNull
private static List<String> collectUsers(@NotNull VcsLogData logData) {
List<String> users = ContainerUtil.map(logData.getAllUsers(), user -> {
String shortPresentation = VcsUserUtil.getShortPresentation(user);
Couple<String> firstAndLastName = VcsUserUtil.getFirstAndLastName(shortPresentation);
if (firstAndLastName == null) return shortPresentation;
return VcsUserUtil.capitalizeName(firstAndLastName.first) + " " + VcsUserUtil.capitalizeName(firstAndLastName.second);
});
TreeSet<String> sortedUniqueUsers = new TreeSet<>(users);
return new ArrayList<>(sortedUniqueUsers);
}
private static class UserLogSpeedSearchPopup extends FlatSpeedSearchPopup {
public UserLogSpeedSearchPopup(@NotNull DefaultActionGroup actionGroup, @NotNull DataContext dataContext) {
super(null, actionGroup, dataContext, null, false);
}
@Override
public boolean shouldBeShowing(Object value) {
if (!super.shouldBeShowing(value)) return false;
if (!(value instanceof PopupFactoryImpl.ActionItem)) return true;
AnAction action = ((PopupFactoryImpl.ActionItem)value).getAction();
if (getSpeedSearch().isHoldingFilter()) {
if (action instanceof MultipleValueFilterPopupComponent.PredefinedValueAction) {
return action instanceof SpeedsearchAction ||
((MultipleValueFilterPopupComponent.PredefinedValueAction)action).myValues.size() > 1;
}
return true;
}
else {
return !isSpeedsearchAction(action);
}
}
}
private class SpeedsearchPredefinedValueAction extends PredefinedValueAction implements FlatSpeedSearchPopup.SpeedsearchAction {
public SpeedsearchPredefinedValueAction(String user) {super(user);}
}
}
@@ -15,25 +15,27 @@
*/
package com.intellij.vcs.log.ui.frame;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.panels.Wrapper;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.VcsRefType;
import com.intellij.vcs.log.ui.render.GraphCommitCellRenderer;
import com.intellij.vcs.log.ui.render.LabelIcon;
import com.intellij.vcs.log.ui.render.RectanglePainter;
import com.intellij.vcs.log.ui.render.RectangleReferencePainter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static com.intellij.openapi.vcs.history.VcsHistoryUtil.getCommitDetailsFont;
import static com.intellij.vcs.log.ui.frame.CommitPanel.getCommitDetailsBackground;
@@ -73,37 +75,28 @@ public class ReferencesPanel extends JPanel {
int height = getIconHeight();
JBLabel firstLabel = null;
if (GraphCommitCellRenderer.isRedesignedLabels()) {
for (Map.Entry<VcsRefType, Collection<VcsRef>> typeAndRefs : myGroupedVisibleReferences.entrySet()) {
VcsRefType type = typeAndRefs.getKey();
Collection<VcsRef> refs = typeAndRefs.getValue();
int refIndex = 0;
for (VcsRef reference : refs) {
Icon icon = createIcon(type, refs, refIndex, height);
String ending = (refIndex != refs.size() - 1) ? "," : "";
String text = reference.getName() + ending;
JBLabel label = createLabel(text, icon);
if (firstLabel == null) {
firstLabel = label;
add(label);
}
else {
addWrapped(label, firstLabel);
}
refIndex++;
for (Map.Entry<VcsRefType, Collection<VcsRef>> typeAndRefs : myGroupedVisibleReferences.entrySet()) {
VcsRefType type = typeAndRefs.getKey();
Collection<VcsRef> refs = typeAndRefs.getValue();
int refIndex = 0;
for (VcsRef reference : refs) {
Icon icon = createIcon(type, refs, refIndex, height);
String ending = (refIndex != refs.size() - 1) ? "," : "";
String text = reference.getName() + ending;
JBLabel label = createLabel(text, icon);
if (firstLabel == null) {
firstLabel = label;
add(label);
}
}
if (getHiddenReferencesSize() > 0) {
JBLabel label = createRestLabel(getHiddenReferencesSize());
addWrapped(label, ObjectUtils.assertNotNull(firstLabel));
else {
addWrapped(label, firstLabel);
}
refIndex++;
}
}
else {
for (Map.Entry<VcsRefType, Collection<VcsRef>> typeAndRefs : myGroupedVisibleReferences.entrySet()) {
for (VcsRef reference : typeAndRefs.getValue()) {
add(new ReferencePanel(reference));
}
}
if (getHiddenReferencesSize() > 0) {
JBLabel label = createRestLabel(getHiddenReferencesSize());
addWrapped(label, ObjectUtils.assertNotNull(firstLabel));
}
setVisible(!myGroupedVisibleReferences.isEmpty());
revalidate();
@@ -165,6 +158,17 @@ public class ReferencesPanel extends JPanel {
return getCommitDetailsBackground();
}
@NotNull
public static Color getLabelColor(@NotNull Color color) {
if (UIUtil.isUnderDarcula()) {
color = ColorUtil.darker(color, 6);
}
else {
color = ColorUtil.brighter(color, 6);
}
return ColorUtil.desaturate(color, 3);
}
private static class ReferencePanel extends JPanel {
@NotNull private final RectanglePainter myLabelPainter;
@NotNull private final VcsRef myReference;
@@ -178,7 +182,7 @@ public class ReferencesPanel extends JPanel {
@Override
public void paint(Graphics g) {
myLabelPainter.paint((Graphics2D)g, myReference.getName(), 0, 0,
RectangleReferencePainter.getLabelColor(myReference.getType().getBackgroundColor()));
getLabelColor(myReference.getType().getBackgroundColor()));
}
@Override
@@ -1,6 +1,5 @@
package com.intellij.vcs.log.ui.render;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkRenderer;
import com.intellij.ui.SimpleColoredComponent;
@@ -34,7 +33,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
@NotNull private final MyComponent myComponent;
@NotNull private final MyComponent myTemplateComponent;
@Nullable private final ReferencePainter myTooltipPainter;
@NotNull private final ReferencePainter myTooltipPainter;
public GraphCommitCellRenderer(@NotNull VcsLogData logData,
@NotNull GraphCellPainter painter,
@@ -42,7 +41,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
myLogData = logData;
myGraphTable = table;
myTooltipPainter = isRedesignedLabels() ? new LabelPainter(myLogData) : null;
myTooltipPainter = new LabelPainter(myLogData);
myComponent = new MyComponent(logData, painter, table);
myTemplateComponent = new MyComponent(logData, painter, table);
}
@@ -58,21 +57,23 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
return myComponent;
}
public static boolean isRedesignedLabels() {
return Registry.is("vcs.log.labels.redesign");
}
@Nullable
public JComponent getTooltip(@NotNull Object value, @NotNull Point point, int row) {
if (myTooltipPainter == null) return null;
GraphCommitCell cell = getValue(value);
Collection<VcsRef> refs = cell.getRefsToThisCommit();
if (!refs.isEmpty()) {
myTooltipPainter.customizePainter(myComponent, refs, myComponent.getBackground(), myComponent.getForeground(),
true/*counterintuitive, but true*/, getColumnWidth());
if (getReferencesWidth(row) >= getColumnWidth() - point.getX()) {
return new TooltipReferencesPanel(myLogData, myTooltipPainter, refs);
if (myTooltipPainter.isLeftAligned()) {
double distance = point.getX() - myTemplateComponent.getGraphWidth(cell.getPrintElements());
if (distance > 0 && distance <= getReferencesWidth(row, cell)) {
return new TooltipReferencesPanel(myLogData, myTooltipPainter, refs);
}
}
else {
if (getColumnWidth() - point.getX() <= getReferencesWidth(row, cell)) {
return new TooltipReferencesPanel(myLogData, myTooltipPainter, refs);
}
}
}
return null;
@@ -83,7 +84,10 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
}
private int getReferencesWidth(int row) {
GraphCommitCell cell = getValue(myGraphTable.getModel().getValueAt(row, GraphTableModel.COMMIT_COLUMN));
return getReferencesWidth(row, getValue(myGraphTable.getModel().getValueAt(row, GraphTableModel.COMMIT_COLUMN)));
}
private int getReferencesWidth(int row, @NotNull GraphCommitCell cell) {
Collection<VcsRef> refs = cell.getRefsToThisCommit();
if (!refs.isEmpty()) {
myTemplateComponent.customize(cell, myGraphTable.isRowSelected(row), myGraphTable.hasFocus(),
@@ -122,7 +126,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
myPainter = painter;
myGraphTable = table;
myReferencePainter = isRedesignedLabels() ? new LabelPainter(myLogData) : new RectangleReferencePainter(myLogData);
myReferencePainter = new LabelPainter(myLogData);
myIssueLinkRenderer = new IssueLinkRenderer(myLogData.getProject(), this);
myFont = RectanglePainter.getFont();
@@ -173,7 +177,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
myReferencePainter.customizePainter(this, refs, getBackground(), baseForeground, isSelected,
0 /*left aligned painter does not use available width*/);
appendTextPadding(myGraphImage.getWidth() + myReferencePainter.getSize().width);
appendTextPadding(myGraphImage.getWidth() + myReferencePainter.getSize().width + LabelPainter.RIGHT_PADDING);
appendText(cell, style);
}
else {
@@ -208,6 +212,23 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
@NotNull
private PaintInfo getGraphImage(@NotNull Collection<? extends PrintElement> printElements) {
double maxIndex = getMaxGraphElementIndex(printElements);
BufferedImage image = UIUtil.createImage((int)(PaintParameters.getNodeWidth(myGraphTable.getRowHeight()) * (maxIndex + 2)),
myGraphTable.getRowHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
myPainter.draw(g2, printElements);
int width = (int)(maxIndex * PaintParameters.getNodeWidth(myGraphTable.getRowHeight()));
return new PaintInfo(image, width);
}
private int getGraphWidth(@NotNull Collection<? extends PrintElement> printElements) {
double maxIndex = getMaxGraphElementIndex(printElements);
return (int)(maxIndex * PaintParameters.getNodeWidth(myGraphTable.getRowHeight()));
}
private double getMaxGraphElementIndex(@NotNull Collection<? extends PrintElement> printElements) {
double maxIndex = 0;
for (PrintElement printElement : printElements) {
maxIndex = Math.max(maxIndex, printElement.getPositionInCurrentRow());
@@ -219,14 +240,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
maxIndex++;
maxIndex = Math.max(maxIndex, Math.min(MAX_GRAPH_WIDTH, myGraphTable.getVisibleGraph().getRecommendedWidth()));
BufferedImage image = UIUtil.createImage((int)(PaintParameters.getNodeWidth(myGraphTable.getRowHeight()) * (maxIndex + 2)),
myGraphTable.getRowHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
myPainter.draw(g2, printElements);
int width = (int)(maxIndex * PaintParameters.getNodeWidth(myGraphTable.getRowHeight()));
return new PaintInfo(image, width);
return maxIndex;
}
@NotNull
@@ -32,20 +32,18 @@ package com.intellij.vcs.log.ui.render;
import com.intellij.openapi.ui.GraphicsConfig;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.JBColor;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import com.intellij.vcs.log.RefGroup;
import com.intellij.vcs.log.VcsLogRefManager;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.VcsRefType;
import com.intellij.vcs.log.data.VcsLogData;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -53,9 +51,12 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import static com.intellij.vcs.log.impl.SimpleRefGroup.getColors;
public class LabelPainter implements ReferencePainter {
public static final int TOP_TEXT_PADDING = JBUI.scale(1);
public static final int BOTTOM_TEXT_PADDING = JBUI.scale(2);
@@ -130,7 +131,8 @@ public class LabelPainter implements ReferencePainter {
}
}
else {
LabelIcon labelIcon = new LabelIcon(height, background, getGroupColors(group));
List<Color> colors = group.getColors();
LabelIcon labelIcon = new LabelIcon(height, background, colors.toArray(new Color[colors.size()]));
width += labelIcon.getIconWidth() + MIDDLE_PADDING;
String text = shortenRefName(group.getName(), fontMetrics, availableWidth - width);
@@ -185,30 +187,6 @@ public class LabelPainter implements ReferencePainter {
return refName;
}
@NotNull
public static Color[] getGroupColors(@NotNull RefGroup group) {
MultiMap<VcsRefType, VcsRef> referencesByType = ContainerUtil.groupBy(group.getRefs(), VcsRef::getType);
Color[] colors;
if (referencesByType.size() == 1) {
Map.Entry<VcsRefType, Collection<VcsRef>> firstItem =
ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(referencesByType.entrySet()));
boolean multiple = firstItem.getValue().size() > 1;
Color color = firstItem.getKey().getBackgroundColor();
colors = multiple ? new Color[]{color, color} : new Color[]{color};
}
else {
List<Color> colorsList = ContainerUtil.newArrayList();
for (VcsRefType type : referencesByType.keySet()) {
if (referencesByType.get(type).size() > 1) {
colorsList.add(type.getBackgroundColor());
}
colorsList.add(type.getBackgroundColor());
}
colors = colorsList.toArray(new Color[colorsList.size()]);
}
return colors;
}
public void paint(@NotNull Graphics2D g2, int x, int y, int height) {
if (myLabels.isEmpty()) return;
@@ -253,7 +231,7 @@ public class LabelPainter implements ReferencePainter {
@Override
public boolean isLeftAligned() {
return false;
return Registry.is("vcs.log.labels.left.aligned");
}
@Override
@@ -1,122 +0,0 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.vcs.log.ui.render;
import com.intellij.openapi.ui.GraphicsConfig;
import com.intellij.openapi.util.Pair;
import com.intellij.ui.ColorUtil;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import com.intellij.vcs.log.VcsLogRefManager;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.VcsRefType;
import com.intellij.vcs.log.data.VcsLogData;
import com.intellij.vcs.log.paint.PaintParameters;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class RectangleReferencePainter implements ReferencePainter {
@NotNull private final VcsLogData myLogData;
@NotNull private List<Pair<String, Color>> myLabels = ContainerUtil.newArrayList();
private int myHeight = JBUI.scale(22);
private int myWidth = 0;
private final RectanglePainter myLabelPainter = new RectanglePainter(false) {
@Override
protected Font getLabelFont() {
return getReferenceFont();
}
};
public RectangleReferencePainter(@NotNull VcsLogData data) {
myLogData = data;
}
@Override
public void customizePainter(@NotNull JComponent component,
@NotNull Collection<VcsRef> references,
@NotNull Color background,
@NotNull Color foreground,
boolean isSelected,
int availableWidth) {
FontMetrics metrics = component.getFontMetrics(getReferenceFont());
myHeight = metrics.getHeight() + RectanglePainter.TOP_TEXT_PADDING + RectanglePainter.BOTTOM_TEXT_PADDING;
myWidth = 2 * PaintParameters.LABEL_PADDING;
myLabels = ContainerUtil.newArrayList();
VcsLogRefManager manager = ReferencePainter.getRefManager(myLogData, references);
if (manager == null) return;
List<VcsRef> sorted = ContainerUtil.sorted(references, manager.getLabelsOrderComparator());
for (Map.Entry<VcsRefType, Collection<VcsRef>> entry : ContainerUtil.groupBy(sorted, VcsRef::getType).entrySet()) {
VcsRef ref = ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(entry.getValue()));
String text = ref.getName() + (entry.getValue().size() > 1 ? " +" : "");
myLabels.add(Pair.create(text, entry.getKey().getBackgroundColor()));
myWidth += myLabelPainter.calculateSize(text, metrics).getWidth() + PaintParameters.LABEL_PADDING;
}
}
public void paint(@NotNull Graphics2D g2, int x, int y, int height) {
if (myLabels.isEmpty()) return;
GraphicsConfig config = GraphicsUtil.setupAAPainting(g2);
g2.setFont(getReferenceFont());
g2.setStroke(new BasicStroke(1.5f));
FontMetrics fontMetrics = g2.getFontMetrics();
x += PaintParameters.LABEL_PADDING;
for (Pair<String, Color> label : myLabels) {
Dimension size = myLabelPainter.calculateSize(label.first, fontMetrics);
int paddingY = y + (height - size.height) / 2;
myLabelPainter.paint(g2, label.first, x, paddingY, getLabelColor(label.second));
x += size.width + PaintParameters.LABEL_PADDING;
}
config.restore();
}
@NotNull
public static Color getLabelColor(@NotNull Color color) {
if (UIUtil.isUnderDarcula()) {
color = ColorUtil.darker(color, 6);
}
else {
color = ColorUtil.brighter(color, 6);
}
return ColorUtil.desaturate(color, 3);
}
public Dimension getSize() {
if (myLabels.isEmpty()) return new Dimension();
return new Dimension(myWidth, myHeight);
}
@Override
public boolean isLeftAligned() {
return true;
}
}
@@ -40,6 +40,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.generate.tostring.GenerateToStringClassFilter;
import org.jetbrains.java.generate.config.Config;
import org.jetbrains.java.generate.config.ConflictResolutionPolicy;
import org.jetbrains.java.generate.template.TemplateResource;
import org.jetbrains.java.generate.template.toString.ToStringTemplatesManager;
import org.jetbrains.java.generate.view.TemplatesPanel;
@@ -116,9 +117,12 @@ public class GenerateToStringActionHandlerImpl implements GenerateToStringAction
ToStringTemplatesManager.getInstance().setDefaultTemplate(template);
if (template.isValidTemplate()) {
final GenerateToStringWorker worker = new GenerateToStringWorker(clazz, editor, chooser.isInsertOverrideAnnotation());
// decide what to do if the method already exists
ConflictResolutionPolicy resolutionPolicy = worker.exitsMethodDialog(template);
WriteAction.run(() -> {
try {
new GenerateToStringWorker(clazz, editor, chooser.isInsertOverrideAnnotation()).execute(selectedMembers, template);
worker.execute(selectedMembers, template, resolutionPolicy);
}
catch (Exception e) {
GenerationUtil.handleException(project, e);
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -121,9 +121,7 @@ public class GenerateToStringWorker {
return toStringMethod;
}
public void execute(Collection<PsiMember> members, TemplateResource template) throws IncorrectOperationException, GenerateCodeException {
// decide what to do if the method already exists
ConflictResolutionPolicy resolutionPolicy = exitsMethodDialog(template);
public void execute(Collection<PsiMember> members, TemplateResource template, final ConflictResolutionPolicy resolutionPolicy) throws IncorrectOperationException, GenerateCodeException {
// what insert policy should we use?
resolutionPolicy.setNewMethodStrategy(getStrategy(config.getInsertNewMethodInitialOption()));
@@ -151,7 +151,7 @@ class Foo {
new WriteCommandAction(myFixture.project, myFixture.file) {
@Override
protected void run(@NotNull Result result) throws Throwable {
worker.execute(members, template)
worker.execute(members, template, policy)
}
}.execute()
@@ -10,6 +10,7 @@ import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.intellij.vcs.log.*;
import com.intellij.vcs.log.impl.SimpleRefGroup;
import com.intellij.vcs.log.impl.SingletonRefGroup;
import com.intellij.vcs.log.impl.VcsLogUtil;
import git4idea.GitBranch;
@@ -155,7 +156,7 @@ public class GitRefManager implements VcsLogRefManager {
}
else {
if (!repository.isOnBranch()) {
groups.add(new TableRefGroup("!", Collections.singletonList(head)));
groups.add(new SimpleRefGroup("!", Collections.singletonList(head)));
sortedReferences = sortedReferences.subList(1, sortedReferences.size());
}
}
@@ -177,7 +178,7 @@ public class GitRefManager implements VcsLogRefManager {
}
}
groups.add(new TableRefGroup(name, sortedReferences));
groups.add(new SimpleRefGroup(name, sortedReferences));
return groups;
}
@@ -358,8 +359,8 @@ public class GitRefManager implements VcsLogRefManager {
@NotNull
@Override
public Color getBgColor() {
return VcsLogStandardColors.Refs.TIP;
public List<Color> getColors() {
return Collections.singletonList(VcsLogStandardColors.Refs.TIP);
}
}
@@ -391,41 +392,8 @@ public class GitRefManager implements VcsLogRefManager {
@NotNull
@Override
public Color getBgColor() {
return VcsLogStandardColors.Refs.BRANCH_REF;
}
}
private static class TableRefGroup implements RefGroup {
@NotNull private final String myName;
@NotNull private final List<VcsRef> myRefs;
private TableRefGroup(@NotNull String name, @NotNull List<VcsRef> refs) {
myName = name;
myRefs = refs;
}
@Override
public boolean isExpanded() {
return false;
}
@NotNull
@Override
public String getName() {
return myName;
}
@NotNull
@Override
public List<VcsRef> getRefs() {
return myRefs;
}
@NotNull
@Override
public Color getBgColor() {
return myRefs.get(0).getType().getBackgroundColor();
public List<Color> getColors() {
return Collections.singletonList(VcsLogStandardColors.Refs.BRANCH_REF);
}
}
@@ -20,6 +20,7 @@ import com.intellij.util.Function;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.vcs.log.*;
import com.intellij.vcs.log.impl.SimpleRefGroup;
import com.intellij.vcs.log.impl.SingletonRefGroup;
import com.intellij.vcs.log.impl.VcsLogUtil;
import org.jetbrains.annotations.NotNull;
@@ -193,37 +194,4 @@ public class HgRefManager implements VcsLogRefManager {
return Objects.hash(myName, myIsBranch);
}
}
private static class SimpleRefGroup implements RefGroup {
@NotNull private final String myName;
@NotNull private final List<VcsRef> myRefs;
private SimpleRefGroup(@NotNull String name, @NotNull List<VcsRef> refs) {
myName = name;
myRefs = refs;
}
@Override
public boolean isExpanded() {
return false;
}
@NotNull
@Override
public String getName() {
return myName;
}
@NotNull
@Override
public List<VcsRef> getRefs() {
return myRefs;
}
@NotNull
@Override
public Color getBgColor() {
return myRefs.get(0).getType().getBackgroundColor();
}
}
}
@@ -29,6 +29,8 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManager;
import com.intellij.util.Consumer;
import com.jetbrains.python.console.PyCodeExecutor;
import com.jetbrains.python.console.PydevConsoleRunner;
@@ -59,7 +61,7 @@ public class PyExecuteSelectionAction extends AnAction {
else {
String line = getLineUnderCaret(editor);
if (line != null) {
execute(e, line);
execute(e, line.trim());
moveCaretDown(editor);
}
}
@@ -175,6 +177,15 @@ public class PyExecuteSelectionAction extends AnAction {
.selectContentDescriptor(dataContext, project, consoles, "Select console to execute in", descriptor -> {
if (descriptor != null && descriptor.getExecutionConsole() instanceof PyCodeExecutor) {
consumer.consume((PyCodeExecutor)descriptor.getExecutionConsole());
final PythonConsoleToolWindow toolWindow = PythonConsoleToolWindow.getInstance(project);
if (toolWindow != null && !toolWindow.getToolWindow().isVisible()) {
toolWindow.getToolWindow().show(null);
ContentManager contentManager = toolWindow.getToolWindow().getContentManager();
Content content = contentManager.findContent(descriptor.getDisplayName());
if (content != null) {
contentManager.setSelectedContent(content);
}
}
}
});
}
@@ -219,7 +230,7 @@ public class PyExecuteSelectionAction extends AnAction {
Module context) {
final PythonConsoleToolWindow toolWindow = PythonConsoleToolWindow.getInstance(project);
if (toolWindow != null) {
if (toolWindow != null && toolWindow.getConsoleContentDescriptors().size() > 0) {
toolWindow.activate(() -> {
List<RunContentDescriptor> descs = toolWindow.getConsoleContentDescriptors();
@@ -237,6 +248,9 @@ public class PyExecuteSelectionAction extends AnAction {
public void handleConsoleInitialized(LanguageConsoleView consoleView) {
if (consoleView instanceof PyCodeExecutor) {
consumer.consume((PyCodeExecutor)consoleView);
if (toolWindow != null) {
toolWindow.getToolWindow().show(null);
}
}
}
});
@@ -57,6 +57,11 @@ public class AddSchemaPrefixIntention extends PsiElementBaseIntentionAction {
return NAME;
}
@Override
public boolean startInWriteAction() {
return false;
}
@Override
public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException {
final XmlAttribute xmlns = getXmlnsDeclaration(element);