From 29a3ad1d0c2f90cf1d451acbd4d1bcf12f7a0ddb Mon Sep 17 00:00:00 2001 From: Constantine Plotnikov Date: Mon, 28 Sep 2009 05:35:56 +0400 Subject: [PATCH 001/147] Merged SVN plugins From 8f9b8e0bd16723fdc1d4fd7be4ff1ac5f25e6217 Mon Sep 17 00:00:00 2001 From: "vladimir.krivosheev" Date: Thu, 16 Dec 2010 22:23:18 +0300 Subject: [PATCH 002/147] Merge /Users/develar/workspace/flex-ui-designer From c0b270cc78b6bbe2ef422158f131bac5ddf87ba5 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Tue, 10 Apr 2012 19:33:49 +0400 Subject: [PATCH 003/147] initial TypoScript lexer --- .../jetbrains/typoscript/lang/TypoScript.flex | 107 ++ .../typoscript/lang/TypoScriptFileType.java | 47 + .../typoscript/lang/TypoScriptLanguage.java | 22 + .../typoscript/lang/TypoScriptLexer.java | 15 + .../typoscript/lang/TypoScriptTokenType.java | 16 + .../typoscript/lang/TypoScriptTokenTypes.java | 40 + .../typoscript/lang/_TypoScriptLexer.java | 650 ++++++++ .../lexer/assignments.test.expected | 61 + testData/typoscript/lexer/assignments.test.ts | 8 + .../typoscript/lexer/codeBlock.test.expected | 101 ++ testData/typoscript/lexer/codeBlock.test.ts | 23 + .../lexer/copyingOperator.test.expected | 25 + .../typoscript/lexer/copyingOperator.test.ts | 3 + .../lexer/exampleFromTypo.test.expected | 1358 +++++++++++++++++ .../typoscript/lexer/exampleFromTypo.test.ts | 281 ++++ .../typoscript/lexer/include.test.expected | 21 + testData/typoscript/lexer/include.test.ts | 7 + .../lexer/multilineValue.test.expected | 56 + .../typoscript/lexer/multilineValue.test.ts | 17 + .../lexer/objectPaths.test.expected | 49 + testData/typoscript/lexer/objectPaths.test.ts | 3 + .../lexer/sharpComment.test.expected | 1 + .../typoscript/lexer/sharpComment.test.ts | 1 + .../lexer/simpleAssignment.test.expected | 3 + .../typoscript/lexer/simpleAssignment.test.ts | 1 + .../lexer/singleLineComments.test.expected | 28 + .../lexer/singleLineComments.test.ts | 12 + .../lexer/slashComment.test.expected | 1 + .../typoscript/lexer/slashComment.test.ts | 1 + .../lexer/unsettingOperator.test.expected | 18 + .../lexer/unsettingOperator.test.ts | 3 + .../valueModificationOperator.test.expected | 53 + .../lexer/valueModificationOperator.test.ts | 7 + .../typoscript/TypoScriptLexerTest.java | 120 ++ typoScript.iml | 15 + 35 files changed, 3174 insertions(+) create mode 100644 src/com/jetbrains/typoscript/lang/TypoScript.flex create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptFileType.java create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptLexer.java create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java create mode 100644 src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java create mode 100644 testData/typoscript/lexer/assignments.test.expected create mode 100644 testData/typoscript/lexer/assignments.test.ts create mode 100644 testData/typoscript/lexer/codeBlock.test.expected create mode 100644 testData/typoscript/lexer/codeBlock.test.ts create mode 100644 testData/typoscript/lexer/copyingOperator.test.expected create mode 100644 testData/typoscript/lexer/copyingOperator.test.ts create mode 100644 testData/typoscript/lexer/exampleFromTypo.test.expected create mode 100644 testData/typoscript/lexer/exampleFromTypo.test.ts create mode 100644 testData/typoscript/lexer/include.test.expected create mode 100644 testData/typoscript/lexer/include.test.ts create mode 100644 testData/typoscript/lexer/multilineValue.test.expected create mode 100644 testData/typoscript/lexer/multilineValue.test.ts create mode 100644 testData/typoscript/lexer/objectPaths.test.expected create mode 100644 testData/typoscript/lexer/objectPaths.test.ts create mode 100644 testData/typoscript/lexer/sharpComment.test.expected create mode 100644 testData/typoscript/lexer/sharpComment.test.ts create mode 100644 testData/typoscript/lexer/simpleAssignment.test.expected create mode 100644 testData/typoscript/lexer/simpleAssignment.test.ts create mode 100644 testData/typoscript/lexer/singleLineComments.test.expected create mode 100644 testData/typoscript/lexer/singleLineComments.test.ts create mode 100644 testData/typoscript/lexer/slashComment.test.expected create mode 100644 testData/typoscript/lexer/slashComment.test.ts create mode 100644 testData/typoscript/lexer/unsettingOperator.test.expected create mode 100644 testData/typoscript/lexer/unsettingOperator.test.ts create mode 100644 testData/typoscript/lexer/valueModificationOperator.test.expected create mode 100644 testData/typoscript/lexer/valueModificationOperator.test.ts create mode 100644 tests/com/jetbrains/typoscript/TypoScriptLexerTest.java create mode 100644 typoScript.iml diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.flex b/src/com/jetbrains/typoscript/lang/TypoScript.flex new file mode 100644 index 000000000000..69eea1902869 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScript.flex @@ -0,0 +1,107 @@ +package com.jetbrains.typoscript.lang; +import com.intellij.lexer.FlexLexer; +import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; +import java.io.Reader; + +%% + +%{ + + public _TypoScriptLexer() { + this((Reader)null); + } +%} + +%public +%class _TypoScriptLexer +%implements FlexLexer +%function advance //todo[lene] ? +%type IElementType +%unicode //todo[lene] ? doc says ascii only +%eof{ return; +%eof} + +NOT_WHITE_SPACE=[^\ \n\r\t\f] +WHITE_SPACE_CHARS=[\ \n\r\t\f]* +WHITESPACE_WITH_NEW_LINE = [\ \t\f]*(\n|\r|\r\n){WHITE_SPACE_CHARS} +STRING_TAIL = [^\r\n]* +ONE_LINE_COMMENT=("/"|"#"){STRING_TAIL} +C_STYLE_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*" +COMMENT_TAIL=([^"*"]*("*"+[^"*""/"])?)*("*"+"/")? //todo[lene] +ENDTRIMMED_STRING_TAIL = ({STRING_TAIL}{NOT_WHITE_SPACE})? +TRIMMED_STRING_TAIL = {NOT_WHITE_SPACE}{ENDTRIMMED_STRING_TAIL} + +OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* + +%state EXPRESSION_SIGN +%state ASSIGNMENT_VALUE +%state ONE_LINE_IGNORED_ZONE + +%xstate COPYING_OPERATOR_VALUE + +%xstate MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE +%xstate MULTILINE_OPERATOR_VALUE +%xstate MULTILINE_NEW_LINE + +%xstate MODIFICATION_OPERATOR_VALUE +%xstate MODIFICATION_OPERATOR_FUNCTION_ARGUMENT +%% + +{WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } +{WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } + + {ONE_LINE_COMMENT} { return TypoScriptTokenTypes.ONE_LINE_COMMENT; } + {C_STYLE_COMMENT} { return TypoScriptTokenTypes.C_STYLE_COMMENT; } + {OBJECT_PATH_ENTITY} { yybegin(EXPRESSION_SIGN); return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; } + "." { return TypoScriptTokenTypes.OBJECT_PATH_SEPARATOR; } + "["{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.CONDITION; } + + + {OBJECT_PATH_ENTITY} { return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; } + "." { return TypoScriptTokenTypes.OBJECT_PATH_SEPARATOR; } + + {OBJECT_PATH_ENTITY} { return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; } + "." { return TypoScriptTokenTypes.OBJECT_PATH_SEPARATOR; } + {WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + {WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } + + + "=" { yybegin(ASSIGNMENT_VALUE); return TypoScriptTokenTypes.ASSIGNMENT_OPERATOR; } + ":=" { yybegin(MODIFICATION_OPERATOR_VALUE); return TypoScriptTokenTypes.MODIFICATION_OPERATOR; } + ">" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.UNSETTING_OPERATOR; } + "<" { yybegin(COPYING_OPERATOR_VALUE); return TypoScriptTokenTypes.COPYING_OPERATOR; } + "<"{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.INCLUDE_STATEMENT; } + //todo[lene] create "=<" reference sign for typoscript templates; or handle < in assignment value + "(" { yybegin(MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE); + return TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_BEGIN; } + "{" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN; } + "{"{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.IGNORED_TEXT; } + "}" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_END; } + + + {TRIMMED_STRING_TAIL} { yybegin(YYINITIAL); return TypoScriptTokenTypes.ASSIGNMENT_VALUE; } + {STRING_TAIL} { yybegin(YYINITIAL); return TypoScriptTokenTypes.IGNORED_TEXT; } + + + {STRING_TAIL} { yybegin(MULTILINE_OPERATOR_VALUE); + return TypoScriptTokenTypes.IGNORED_TEXT; } + {WHITESPACE_WITH_NEW_LINE} { yybegin(MULTILINE_OPERATOR_VALUE); + return TokenType.WHITE_SPACE; } + {WHITESPACE_WITH_NEW_LINE} { return TokenType.WHITE_SPACE; } + [^\ \n\r\t\f\)]{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.MULTILINE_VALUE; } + ")" { yybegin(ONE_LINE_IGNORED_ZONE); + return TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_END; } + + ([^" "\r\n"("][^\r\n"("]*[^" "\r\n"("])|([^" "\r\n"("]) { return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION; } + "(" { yybegin(MODIFICATION_OPERATOR_FUNCTION_ARGUMENT); + return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN;} + ([^" "\r\n")"][^\r\n")"]*[^" "\r\n")"])|([^" "\r\n")"]) { return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_ARGUMENT;} + ")" { yybegin(ONE_LINE_IGNORED_ZONE); + return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_PARAM_END; } + {WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + {WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } + + + . {return TokenType.BAD_CHARACTER;} \ No newline at end of file diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java b/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java new file mode 100644 index 000000000000..8b42c7543826 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java @@ -0,0 +1,47 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.openapi.fileTypes.LanguageFileType; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * @author lene + * Date: 03.04.12 + */ +public class TypoScriptFileType extends LanguageFileType { + public static final TypoScriptFileType INSTANCE = new TypoScriptFileType(); + + private TypoScriptFileType() { + super(TypoScriptLanguage.INSTANCE); + /* FileTypeEditorHighlighterProviders.INSTANCE.addExplicitExtension(this, new EditorHighlighterProvider() {//todo[lene] + @Override + public EditorHighlighter getEditorHighlighter(@Nullable Project project, + @NotNull FileType fileType, @Nullable VirtualFile virtualFile, + @NotNull EditorColorsScheme colors) { + return new PlayEditorHighlighter(project, virtualFile, colors); + } + });*/ + } + + @NotNull + public String getName() { + return "TypoScript"; + } + + @NotNull + public String getDescription() { + return "TypoScript"; + } + + @NotNull + public String getDefaultExtension() { + return "ts"; //todo[lene] + } + + public Icon getIcon() { + return null;//todo[lene] + } +} + + diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java b/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java new file mode 100644 index 000000000000..35de39069c43 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java @@ -0,0 +1,22 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.lang.Language; +import com.intellij.openapi.fileTypes.LanguageFileType; +import com.intellij.psi.templateLanguages.TemplateLanguage; + +/** + * @author lene + * Date: 03.04.12 + */ +public class TypoScriptLanguage extends Language /*implements TemplateLanguage */ {//todo[lene] + public static TypoScriptLanguage INSTANCE = new TypoScriptLanguage(); + + private TypoScriptLanguage() { + super("TypoScript", ""); + } + + @Override + public LanguageFileType getAssociatedFileType() { + return TypoScriptFileType.INSTANCE; + } +} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java b/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java new file mode 100644 index 000000000000..d6e0e37d852d --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java @@ -0,0 +1,15 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.lexer.FlexAdapter; + +import java.io.Reader; + +/** + * @author lene + * Date: 03.04.12 + */ +public class TypoScriptLexer extends FlexAdapter { + public TypoScriptLexer() { + super(new _TypoScriptLexer((Reader)null)); + } +} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java b/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java new file mode 100644 index 000000000000..133e619b6ebb --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java @@ -0,0 +1,16 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +/** + * @author lene + * Date: 03.04.12 + */ +public class TypoScriptTokenType extends IElementType { + + public TypoScriptTokenType(@NotNull @NonNls final String debugName) { + super(debugName, TypoScriptLanguage.INSTANCE); + } +} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java new file mode 100644 index 000000000000..f382cbbfaa6d --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java @@ -0,0 +1,40 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.psi.TokenType; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; + +/** + * @author lene + * Date: 03.04.12 + */ +public interface TypoScriptTokenTypes extends TokenType { + IElementType C_STYLE_COMMENT = new TypoScriptTokenType("c style comment"); + IElementType ONE_LINE_COMMENT = new TypoScriptTokenType("one line comment"); + + TokenSet COMMENTS = TokenSet.create(C_STYLE_COMMENT, ONE_LINE_COMMENT); + + IElementType MODIFICATION_OPERATOR = new TypoScriptTokenType(":="); + IElementType ASSIGNMENT_OPERATOR = new TypoScriptTokenType("="); + + IElementType MULTILINE_VALUE_OPERATOR_BEGIN = new TypoScriptTokenType("("); + IElementType MULTILINE_VALUE_OPERATOR_END = new TypoScriptTokenType(")"); + + IElementType CODE_BLOCK_OPERATOR_BEGIN = new TypoScriptTokenType("{"); + IElementType CODE_BLOCK_OPERATOR_END = new TypoScriptTokenType("}"); + IElementType UNSETTING_OPERATOR = new TypoScriptTokenType(">"); + IElementType COPYING_OPERATOR = new TypoScriptTokenType("<"); + + IElementType ASSIGNMENT_VALUE = new TypoScriptTokenType("assignment value"); + IElementType MULTILINE_VALUE = new TypoScriptTokenType("multiline value"); + IElementType IGNORED_TEXT = new TypoScriptTokenType("ignored text"); + + IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("modification function"); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("modification ("); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("modification )"); + IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("modification value"); + IElementType OBJECT_PATH_ENTITY = new TypoScriptTokenType("object path entity"); + IElementType OBJECT_PATH_SEPARATOR = new TypoScriptTokenType("."); + IElementType INCLUDE_STATEMENT = new TypoScriptTokenType("include"); + IElementType CONDITION = new TypoScriptTokenType("condition"); +} diff --git a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java new file mode 100644 index 000000000000..5baa401503a7 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java @@ -0,0 +1,650 @@ +/* The following code was generated by JFlex 1.4.3 on 10.04.12 19:28 */ + +package com.jetbrains.typoscript.lang; +import com.intellij.lexer.FlexLexer; +import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; +import java.io.Reader; + + +/** + * This class is a scanner generated by + * JFlex 1.4.3 + * on 10.04.12 19:28 from the specification file + * C:/opt/IDEA/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.flex + */ +public class _TypoScriptLexer implements FlexLexer { + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int COPYING_OPERATOR_VALUE = 8; + public static final int ASSIGNMENT_VALUE = 4; + public static final int MODIFICATION_OPERATOR_VALUE = 16; + public static final int EXPRESSION_SIGN = 2; + public static final int ONE_LINE_IGNORED_ZONE = 6; + public static final int YYINITIAL = 0; + public static final int MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE = 10; + public static final int MULTILINE_OPERATOR_VALUE = 12; + public static final int MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = 18; + public static final int MULTILINE_NEW_LINE = 14; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + 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 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\2\1\3\1\0\1\2\1\1\22\0\1\22\2\0\1\5"+ + "\4\0\1\16\1\21\1\6\2\0\1\7\1\10\1\4\12\7\1\13"+ + "\1\0\1\15\1\12\1\14\2\0\32\7\1\11\3\0\1\7\1\0"+ + "\32\7\1\17\1\0\1\20\uff82\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\4\1\1\2\1\3\2\0\2\1\1\4\1\5\1\1"+ + "\2\6\1\7\1\10\1\11\1\12\1\13\1\14\1\2"+ + "\1\15\1\4\1\16\1\17\1\20\1\21\1\22\1\23"+ + "\1\3\1\24\1\25\1\1\1\4\1\26\2\27\1\30"+ + "\2\31\1\32\1\6\3\0\1\33\4\0\1\1\1\0"+ + "\1\1\1\6\1\34\1\6\1\0\1\34"; + + private static int [] zzUnpackAction() { + int [] result = new int[59]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\23\0\46\0\71\0\114\0\137\0\162\0\205"+ + "\0\230\0\253\0\276\0\321\0\344\0\367\0\u010a\0\u011d"+ + "\0\276\0\u0130\0\u0143\0\u0156\0\276\0\u0169\0\276\0\u017c"+ + "\0\276\0\276\0\276\0\276\0\u018f\0\u01a2\0\u01b5\0\u01c8"+ + "\0\u01db\0\u01ee\0\u0201\0\276\0\u0214\0\u0227\0\276\0\u023a"+ + "\0\u024d\0\276\0\u0260\0\u0130\0\u0143\0\u0156\0\276\0\u018f"+ + "\0\u01db\0\u0201\0\u0214\0\u0227\0\u023a\0\u024d\0\u0273\0\u0286"+ + "\0\u0299\0\u02ac\0\276"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[59]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\13\1\14\1\15\1\14\1\16\1\17\1\13\1\20"+ + "\1\21\1\22\3\13\1\23\1\13\1\24\1\25\1\13"+ + "\1\15\1\13\1\14\1\15\1\14\3\13\1\26\1\21"+ + "\1\13\1\27\1\30\1\31\1\32\1\33\1\34\2\13"+ + "\1\15\1\35\1\14\1\15\1\14\16\35\1\15\1\36"+ + "\1\14\1\4\1\14\16\36\1\4\1\13\1\14\1\15"+ + "\1\14\3\13\1\26\1\21\11\13\1\15\1\37\1\40"+ + "\1\6\1\40\16\37\1\6\1\41\1\42\1\43\1\42"+ + "\15\41\1\44\1\43\3\13\1\0\17\13\1\45\1\14"+ + "\1\46\1\14\12\45\1\47\3\45\1\15\1\50\1\14"+ + "\1\51\1\14\15\50\1\52\1\15\24\0\3\14\16\0"+ + "\1\14\1\0\1\14\1\15\1\14\16\0\1\15\1\17"+ + "\1\0\1\17\1\0\2\17\1\53\15\17\1\0\1\17"+ + "\1\0\17\17\7\0\1\20\13\0\1\22\1\0\1\54"+ + "\1\0\16\22\1\54\1\23\1\0\1\55\1\0\16\23"+ + "\1\55\1\24\1\0\1\56\1\0\16\24\1\56\7\0"+ + "\1\26\25\0\1\57\10\0\1\35\1\0\1\60\1\0"+ + "\16\35\1\60\1\36\1\0\1\36\1\0\17\36\1\37"+ + "\1\0\1\37\1\0\17\37\1\0\3\40\16\0\1\40"+ + "\1\41\1\0\1\61\1\0\16\41\1\61\1\0\3\42"+ + "\16\0\1\42\1\0\1\42\1\62\1\42\16\0\1\62"+ + "\1\45\1\0\1\45\1\0\12\45\1\0\3\45\1\63"+ + "\1\45\1\14\1\46\1\14\12\45\1\0\3\45\1\64"+ + "\1\50\1\0\1\50\1\0\15\50\1\0\1\65\1\50"+ + "\1\14\1\51\1\14\15\50\1\0\1\66\1\67\1\70"+ + "\1\67\1\70\2\67\1\17\15\67\1\70\1\67\1\70"+ + "\2\67\1\71\14\67\6\70\1\72\14\70\1\67\1\70"+ + "\1\67\1\70\1\17\1\67\1\71\14\67\4\70\1\73"+ + "\1\70\1\72\14\70"; + + private static int [] zzUnpackTrans() { + int [] result = new int[703]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + private static final char[] EMPTY_BUFFER = new char[0]; + private static final int YYEOF = -1; + private static java.io.Reader zzReader = null; // Fake + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\6\1\2\0\2\1\1\11\5\1\1\11\3\1\1\11"+ + "\1\1\1\11\1\1\4\11\7\1\1\11\2\1\1\11"+ + "\2\1\1\11\1\1\3\0\1\11\4\0\1\1\1\0"+ + "\4\1\1\0\1\11"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[59]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private CharSequence zzBuffer = ""; + + /** this buffer may contains the current text array to be matched when it is cheap to acquire it */ + private char[] zzBufferArray; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the textposition at the last state to be included in yytext */ + private int zzPushbackPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /** denotes if the user-EOF-code has already been executed */ + private boolean zzEOFDone; + + /* user code: */ + + public _TypoScriptLexer() { + this((Reader)null); + } + + + public _TypoScriptLexer(java.io.Reader in) { + this.zzReader = in; + } + + /** + * Creates a new scanner. + * There is also java.io.Reader version of this constructor. + * + * @param in the java.io.Inputstream to read input from. + */ + public _TypoScriptLexer(java.io.InputStream in) { + this(new java.io.InputStreamReader(in)); + } + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x10000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 70) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + public final int getTokenStart(){ + return zzStartRead; + } + + public final int getTokenEnd(){ + return getTokenStart() + yylength(); + } + + public void reset(CharSequence buffer, int start, int end,int initialState){ + zzBuffer = buffer; + zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); + zzCurrentPos = zzMarkedPos = zzStartRead = start; + zzPushbackPos = 0; + zzAtEOF = false; + zzAtBOL = true; + zzEndRead = end; + yybegin(initialState); + } + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + return true; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final CharSequence yytext() { + return zzBuffer.subSequence(zzStartRead, zzMarkedPos); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos); + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Contains user EOF-code, which will be executed exactly once, + * when the end of file is reached + */ + private void zzDoEOF() { + if (!zzEOFDone) { + zzEOFDone = true; + + } + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public IElementType advance() throws java.io.IOException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + CharSequence zzBufferL = zzBuffer; + char[] zzBufferArrayL = zzBufferArray; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) + zzInput = zzBufferL.charAt(zzCurrentPosL++); + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = zzBufferL.charAt(zzCurrentPosL++); + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 24: + { yybegin(MODIFICATION_OPERATOR_FUNCTION_ARGUMENT); + return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN; + } + case 29: break; + case 2: + { return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; + } + case 30: break; + case 23: + { return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION; + } + case 31: break; + case 4: + { return TokenType.BAD_CHARACTER; + } + case 32: break; + case 17: + { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN; + } + case 33: break; + case 7: + { yybegin(EXPRESSION_SIGN); return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; + } + case 34: break; + case 28: + { return TypoScriptTokenTypes.C_STYLE_COMMENT; + } + case 35: break; + case 20: + { yybegin(MULTILINE_OPERATOR_VALUE); + return TokenType.WHITE_SPACE; + } + case 36: break; + case 1: + { return TokenType.WHITE_SPACE; + } + case 37: break; + case 22: + { yybegin(ONE_LINE_IGNORED_ZONE); + return TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_END; + } + case 38: break; + case 19: + { yybegin(YYINITIAL); return TypoScriptTokenTypes.IGNORED_TEXT; + } + case 39: break; + case 6: + { return TypoScriptTokenTypes.ONE_LINE_COMMENT; + } + case 40: break; + case 25: + { return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_ARGUMENT; + } + case 41: break; + case 21: + { return TypoScriptTokenTypes.MULTILINE_VALUE; + } + case 42: break; + case 13: + { yybegin(ASSIGNMENT_VALUE); return TypoScriptTokenTypes.ASSIGNMENT_OPERATOR; + } + case 43: break; + case 3: + { yybegin(MULTILINE_OPERATOR_VALUE); + return TypoScriptTokenTypes.IGNORED_TEXT; + } + case 44: break; + case 27: + { yybegin(MODIFICATION_OPERATOR_VALUE); return TypoScriptTokenTypes.MODIFICATION_OPERATOR; + } + case 45: break; + case 12: + { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_END; + } + case 46: break; + case 11: + { return TypoScriptTokenTypes.IGNORED_TEXT; + } + case 47: break; + case 15: + { yybegin(COPYING_OPERATOR_VALUE); return TypoScriptTokenTypes.COPYING_OPERATOR; + } + case 48: break; + case 9: + { return TypoScriptTokenTypes.CONDITION; + } + case 49: break; + case 5: + { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; + } + case 50: break; + case 26: + { yybegin(ONE_LINE_IGNORED_ZONE); + return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_PARAM_END; + } + case 51: break; + case 18: + { yybegin(YYINITIAL); return TypoScriptTokenTypes.ASSIGNMENT_VALUE; + } + case 52: break; + case 10: + { return TypoScriptTokenTypes.INCLUDE_STATEMENT; + } + case 53: break; + case 8: + { return TypoScriptTokenTypes.OBJECT_PATH_SEPARATOR; + } + case 54: break; + case 16: + { yybegin(MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE); + return TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_BEGIN; + } + case 55: break; + case 14: + { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.UNSETTING_OPERATOR; + } + case 56: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + zzDoEOF(); + return null; + } + else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/testData/typoscript/lexer/assignments.test.expected b/testData/typoscript/lexer/assignments.test.expected new file mode 100644 index 000000000000..fcf66447424a --- /dev/null +++ b/testData/typoscript/lexer/assignments.test.expected @@ -0,0 +1,61 @@ +object path entity ('myObject') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('[value 1]') +WHITE_SPACE (' + ') +object path entity ('myObject') +. ('.') +object path entity ('myProperty') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('') +WHITE_SPACE (' + ') +object path entity ('myObject') +. ('.') +object path entity ('myProperty') +. ('.') +object path entity ('firstProperty') += ('=') +WHITE_SPACE (' ') +assignment value ('[value 3]') +WHITE_SPACE (' +') +object path entity ('myObject') +. ('.') +object path entity ('myProperty') +. ('.') +object path entity ('secondProperty') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('[value 4]') +WHITE_SPACE (' + +') +object path entity ('myObject') +. ('.') +object path entity ('myProperty') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('{value 2 with [GLOBAL] anf other () provocations}') +WHITE_SPACE (' +') +object path entity ('myObject') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('HTML') +WHITE_SPACE (' +') +object path entity ('myObject') +. ('.') +object path entity ('value') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value (' HTML - code ') \ No newline at end of file diff --git a/testData/typoscript/lexer/assignments.test.ts b/testData/typoscript/lexer/assignments.test.ts new file mode 100644 index 000000000000..67fb4eb5a07b --- /dev/null +++ b/testData/typoscript/lexer/assignments.test.ts @@ -0,0 +1,8 @@ +myObject = [value 1] + myObject.myProperty = + myObject.myProperty.firstProperty= [value 3] +myObject.myProperty.secondProperty = [value 4] + +myObject.myProperty = {value 2 with [GLOBAL] anf other () provocations} +myObject = HTML +myObject.value = HTML - code \ No newline at end of file diff --git a/testData/typoscript/lexer/codeBlock.test.expected b/testData/typoscript/lexer/codeBlock.test.expected new file mode 100644 index 000000000000..55ddbbf91f3b --- /dev/null +++ b/testData/typoscript/lexer/codeBlock.test.expected @@ -0,0 +1,101 @@ +object path entity ('myObject') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' +') +object path entity ('field') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('title') +WHITE_SPACE (' + ') +object path entity ('ifEmpty') +WHITE_SPACE (' ') +{ ('{') +ignored text (' ignored text') +WHITE_SPACE (' + ') +object path entity ('data') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('leveltitle:0 } bracket is ignored') +WHITE_SPACE (' + ') +condition ('[i = 5]') +WHITE_SPACE (' + ') +} ('}') +ignored text (' some ignored text') +WHITE_SPACE (' +') +} ('}') +WHITE_SPACE (' +') +} ('}') +ignored text (' this brace is also ignored by parser') +WHITE_SPACE (' + +') +object path entity ('second') +. ('.') +object path entity ('object') +{ ('{') +WHITE_SPACE (' +') +ignored text ('{ ignored opening bracket') +WHITE_SPACE (' + ') +. ('.') +object path entity ('10') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('left') +WHITE_SPACE (' + ') +object path entity ('prop') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +object path entity ('test') +WHITE_SPACE (' + ') +object path entity ('text') +( ('(') +WHITE_SPACE (' + ') +multiline value ('} ignored bracket') +WHITE_SPACE (' + ') +) (')') +WHITE_SPACE (' +') +} ('}') +WHITE_SPACE (' + +') +object path entity ('third') +. ('.') +object path entity ('object') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('do') +. ('.') +object path entity ('not') +. ('.') +object path entity ('ignore') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('i') += ('=') +assignment value ('5') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' +') +} ('}') \ No newline at end of file diff --git a/testData/typoscript/lexer/codeBlock.test.ts b/testData/typoscript/lexer/codeBlock.test.ts new file mode 100644 index 000000000000..d8c40f97e49e --- /dev/null +++ b/testData/typoscript/lexer/codeBlock.test.ts @@ -0,0 +1,23 @@ +myObject { +field = title + ifEmpty { ignored text + data = leveltitle:0 } bracket is ignored + [i = 5] + } some ignored text +} +} this brace is also ignored by parser + +second.object{ +{ ignored opening bracket + .10 = left + prop < test + text( + } ignored bracket + ) +} + +third.object{ + do.not.ignore{ + i=5 + } +} \ No newline at end of file diff --git a/testData/typoscript/lexer/copyingOperator.test.expected b/testData/typoscript/lexer/copyingOperator.test.expected new file mode 100644 index 000000000000..9b67190c3954 --- /dev/null +++ b/testData/typoscript/lexer/copyingOperator.test.expected @@ -0,0 +1,25 @@ +object path entity ('myOtherObject') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +object path entity ('myObject') +WHITE_SPACE (' +') +object path entity ('20') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +object path entity ('pageObj') +. ('.') +object path entity ('10') +WHITE_SPACE (' ') +object path entity ('strange') +WHITE_SPACE (' ') +object path entity ('text') +WHITE_SPACE (' +') +object path entity ('30') +WHITE_SPACE (' ') +< ('<') +. ('.') +object path entity ('10') \ No newline at end of file diff --git a/testData/typoscript/lexer/copyingOperator.test.ts b/testData/typoscript/lexer/copyingOperator.test.ts new file mode 100644 index 000000000000..f19dbd517690 --- /dev/null +++ b/testData/typoscript/lexer/copyingOperator.test.ts @@ -0,0 +1,3 @@ +myOtherObject < myObject +20 < pageObj.10 strange text +30 <.10 \ No newline at end of file diff --git a/testData/typoscript/lexer/exampleFromTypo.test.expected b/testData/typoscript/lexer/exampleFromTypo.test.expected new file mode 100644 index 000000000000..8f579152cb64 --- /dev/null +++ b/testData/typoscript/lexer/exampleFromTypo.test.expected @@ -0,0 +1,1358 @@ +object path entity ('mod') +. ('.') +object path entity ('wizards') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('newContentElement') +. ('.') +object path entity ('wizardItems') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('forms') +. ('.') +object path entity ('elements') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('mailform') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('tt_content_defValues') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('bodytext') +WHITE_SPACE (' ') +( ('(') +WHITE_SPACE (' +') +multiline value ('enctype = multipart/form-data') +WHITE_SPACE (' +') +multiline value ('method = post') +WHITE_SPACE (' +') +multiline value ('prefix = tx_form') +WHITE_SPACE (' + ') +) (')') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('form') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('defaults') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showTabs') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('elements, options, form') +WHITE_SPACE (' + ') +object path entity ('tabs') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('elements') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('basic, predefined, content') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('basic') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showButtons') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('checkbox, fieldset, fileupload, hidden, password, radio, reset, select, submit, textarea, textline') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('predefined') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showButtons') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('email, radiogroup, checkboxgroup, name') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('content') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showButtons') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('header, textblock') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('options') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('legend, label, attributes, options, validation, filters, various') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('accept, acceptcharset, accesskey, action, alt, checked, class, cols, dir, disabled, enctype, id, label, lang, maxlength, method, multiple, name, readonly, rows, selected, size, src, style, tabindex, title, type, value') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('label') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('label') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('validation') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showRules') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('alphabetic, alphanumeric, between, date, digit, email, equals, fileallowedtypes, filemaximumsize, fileminimumsize, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') +WHITE_SPACE (' + ') +object path entity ('rules') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('alphabetic') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, allowWhiteSpace') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('alphanumeric') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, allowWhiteSpace') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('between') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, minimum, maximum, inclusive') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('date') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, format') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('digit') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('email') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('equals') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, field') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('fileallowedtypes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, types') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('filemaximumsize') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, maximum') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('fileminimumsize') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, minimum') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('float') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('greaterthan') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, minimum') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('inarray') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, array, strict') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('integer') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('ip') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('length') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, minimum, maximum') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('lessthan') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, maximum') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('regexp') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage, expression') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('required') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('uri') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('message, error, breakOnError, showMessage') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('filtering') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showFilters') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, removexss, stripnewlines, titlecase, trim, uppercase') +WHITE_SPACE (' + ') +object path entity ('filters') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('alphabetic') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('allowWhiteSpace') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('alphanumeric') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('allowWhiteSpace') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('currency') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('decimalPoint, thousandSeparator') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('digit') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('integer') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('lowercase') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('regexp') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('expression') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('removexss') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('stripnewlines') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('titlecase') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('trim') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('characterList') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('uppercase') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('form') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('prefix, attributes, postProcessor') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('accept, acceptcharset, action, class, dir, enctype, id, lang, method, name, style, title') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('postProcessor') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showPostProcessors') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('mail') +WHITE_SPACE (' + ') +object path entity ('postProcessors') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('mail') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('recipientEmail, senderEmail') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('elements') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('button') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('attributes') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('value') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('checkbox') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('label, attributes') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('name, value') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('fieldset') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('legend') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('fileupload') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('label, attributes, validation') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('name') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('validation') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showRules') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('required, fileallowedtypes, filemaximumsize, fileminimumsize') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('hidden') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('attributes') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('name, value') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('password') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('label, attributes, validation') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('name') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('validation') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showRules') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('required, equals') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('radio') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +. ('.') +object path entity ('checkbox') +WHITE_SPACE (' + ') +object path entity ('reset') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +. ('.') +object path entity ('button') +WHITE_SPACE (' + ') +object path entity ('select') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('label, attributes, options, validation') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('name, multiple') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('validation') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showRules') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('required') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('submit') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +. ('.') +object path entity ('button') +WHITE_SPACE (' + ') +object path entity ('textarea') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('label, attributes, validation, filters') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('name, cols, rows') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('filtering') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showFilters') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('alphabetic, alphanumeric, lowercase, regexp, stripnewlines, titlecase, trim, uppercase') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('validation') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showRules') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('alphabetic, alphanumeric, length, regexp, required') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('textline') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('label, attributes, validation, filters') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('attributes') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showProperties') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('name') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('validation') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showRules') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('alphabetic, alphanumeric, between, date, digit, email, equals, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('filtering') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showFilters') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, titlecase, trim, uppercase') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('checkboxgroup') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('legend, options, various, validation') +WHITE_SPACE (' + ') +object path entity ('accordions') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('validation') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showRules') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('required') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('email') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +. ('.') +object path entity ('textline') +WHITE_SPACE (' + ') +object path entity ('header') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('various') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('textblock') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('various') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('name') +WHITE_SPACE (' ') +{ ('{') +WHITE_SPACE (' + ') +object path entity ('showAccordions') +WHITE_SPACE (' ') += ('=') +WHITE_SPACE (' ') +assignment value ('legend, various') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +object path entity ('radiogroup') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +. ('.') +object path entity ('checkboxgroup') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' + ') +} ('}') +WHITE_SPACE (' +') +} ('}') +WHITE_SPACE (' +') \ No newline at end of file diff --git a/testData/typoscript/lexer/exampleFromTypo.test.ts b/testData/typoscript/lexer/exampleFromTypo.test.ts new file mode 100644 index 000000000000..131eab10833f --- /dev/null +++ b/testData/typoscript/lexer/exampleFromTypo.test.ts @@ -0,0 +1,281 @@ +mod.wizards { + newContentElement.wizardItems { + forms.elements { + mailform { + tt_content_defValues { + bodytext ( +enctype = multipart/form-data +method = post +prefix = tx_form + ) + } + } + } + } + form { + defaults { + showTabs = elements, options, form + tabs { + elements { + showAccordions = basic, predefined, content + accordions { + basic { + showButtons = checkbox, fieldset, fileupload, hidden, password, radio, reset, select, submit, textarea, textline + } + predefined { + showButtons = email, radiogroup, checkboxgroup, name + } + content { + showButtons = header, textblock + } + } + } + options { + showAccordions = legend, label, attributes, options, validation, filters, various + accordions { + attributes { + showProperties = accept, acceptcharset, accesskey, action, alt, checked, class, cols, dir, disabled, enctype, id, label, lang, maxlength, method, multiple, name, readonly, rows, selected, size, src, style, tabindex, title, type, value + } + label { + showProperties = label + } + validation { + showRules = alphabetic, alphanumeric, between, date, digit, email, equals, fileallowedtypes, filemaximumsize, fileminimumsize, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri + rules { + alphabetic { + showProperties = message, error, breakOnError, showMessage, allowWhiteSpace + } + alphanumeric { + showProperties = message, error, breakOnError, showMessage, allowWhiteSpace + } + between { + showProperties = message, error, breakOnError, showMessage, minimum, maximum, inclusive + } + date { + showProperties = message, error, breakOnError, showMessage, format + } + digit { + showProperties = message, error, breakOnError, showMessage + } + email { + showProperties = message, error, breakOnError, showMessage + } + equals { + showProperties = message, error, breakOnError, showMessage, field + } + fileallowedtypes { + showProperties = message, error, breakOnError, showMessage, types + } + filemaximumsize { + showProperties = message, error, breakOnError, showMessage, maximum + } + fileminimumsize { + showProperties = message, error, breakOnError, showMessage, minimum + } + float { + showProperties = message, error, breakOnError, showMessage + } + greaterthan { + showProperties = message, error, breakOnError, showMessage, minimum + } + inarray { + showProperties = message, error, breakOnError, showMessage, array, strict + } + integer { + showProperties = message, error, breakOnError, showMessage + } + ip { + showProperties = message, error, breakOnError, showMessage + } + length { + showProperties = message, error, breakOnError, showMessage, minimum, maximum + } + lessthan { + showProperties = message, error, breakOnError, showMessage, maximum + } + regexp { + showProperties = message, error, breakOnError, showMessage, expression + } + required { + showProperties = message, error, breakOnError, showMessage + } + uri { + showProperties = message, error, breakOnError, showMessage + } + } + } + filtering { + showFilters = alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, removexss, stripnewlines, titlecase, trim, uppercase + filters { + alphabetic { + showProperties = allowWhiteSpace + } + alphanumeric { + showProperties = allowWhiteSpace + } + currency { + showProperties = decimalPoint, thousandSeparator + } + digit { + showProperties = + } + integer { + showProperties = + } + lowercase { + showProperties = + } + regexp { + showProperties = expression + } + removexss { + showProperties = + } + stripnewlines { + showProperties = + } + titlecase { + showProperties = + } + trim { + showProperties = characterList + } + uppercase { + showProperties = + } + } + } + } + } + form { + showAccordions = prefix, attributes, postProcessor + accordions { + attributes { + showProperties = accept, acceptcharset, action, class, dir, enctype, id, lang, method, name, style, title + } + postProcessor { + showPostProcessors = mail + postProcessors { + mail { + showProperties = recipientEmail, senderEmail + } + } + } + } + } + } + } + elements { + button { + showAccordions = attributes + accordions { + attributes { + showProperties = value + } + } + } + checkbox { + showAccordions = label, attributes + accordions { + attributes { + showProperties = name, value + } + } + } + fieldset { + showAccordions = legend + } + fileupload { + showAccordions = label, attributes, validation + accordions { + attributes { + showProperties = name + } + validation { + showRules = required, fileallowedtypes, filemaximumsize, fileminimumsize + } + } + } + hidden { + showAccordions = attributes + accordions { + attributes { + showProperties = name, value + } + } + } + password { + showAccordions = label, attributes, validation + accordions { + attributes { + showProperties = name + } + validation { + showRules = required, equals + } + } + } + radio < .checkbox + reset < .button + select { + showAccordions = label, attributes, options, validation + accordions { + attributes { + showProperties = name, multiple + } + validation { + showRules = required + } + } + } + submit < .button + textarea { + showAccordions = label, attributes, validation, filters + accordions { + attributes { + showProperties = name, cols, rows + } + filtering { + showFilters = alphabetic, alphanumeric, lowercase, regexp, stripnewlines, titlecase, trim, uppercase + } + validation { + showRules = alphabetic, alphanumeric, length, regexp, required + } + } + } + textline { + showAccordions = label, attributes, validation, filters + accordions { + attributes { + showProperties = name + } + validation { + showRules = alphabetic, alphanumeric, between, date, digit, email, equals, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri + } + filtering { + showFilters = alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, titlecase, trim, uppercase + } + } + } + checkboxgroup { + showAccordions = legend, options, various, validation + accordions { + validation { + showRules = required + } + } + } + email < .textline + header { + showAccordions = various + } + textblock { + showAccordions = various + } + name { + showAccordions = legend, various + } + radiogroup < .checkboxgroup + } + } +} diff --git a/testData/typoscript/lexer/include.test.expected b/testData/typoscript/lexer/include.test.expected new file mode 100644 index 000000000000..91ee0fbcb655 --- /dev/null +++ b/testData/typoscript/lexer/include.test.expected @@ -0,0 +1,21 @@ +include ('') +WHITE_SPACE (' +') +include ('') +WHITE_SPACE (' +') +include (' t = 8') +WHITE_SPACE (' +') +include ('<') +WHITE_SPACE (' +') +include ('< INCLsome strange text>') +WHITE_SPACE (' +') +include ('< f = 34') +WHITE_SPACE (' +') +include ('< fff.dsfs') +WHITE_SPACE (' +') \ No newline at end of file diff --git a/testData/typoscript/lexer/include.test.ts b/testData/typoscript/lexer/include.test.ts new file mode 100644 index 000000000000..bc32dad07fa1 --- /dev/null +++ b/testData/typoscript/lexer/include.test.ts @@ -0,0 +1,7 @@ + + + t = 8 +< +< INCLsome strange text> +< f = 34 +< fff.dsfs diff --git a/testData/typoscript/lexer/multilineValue.test.expected b/testData/typoscript/lexer/multilineValue.test.expected new file mode 100644 index 000000000000..af3984ec8846 --- /dev/null +++ b/testData/typoscript/lexer/multilineValue.test.expected @@ -0,0 +1,56 @@ +object path entity ('myObject') +( ('(') +WHITE_SPACE (' + ') +multiline value ('some value') +WHITE_SPACE (' +') +) (')') +WHITE_SPACE (' + +') +object path entity ('myObject') +. ('.') +object path entity ('nextProperty') +WHITE_SPACE (' ') +( ('(') +ignored text ('ignored text') +WHITE_SPACE (' + ') +multiline value ('some other value ))') +WHITE_SPACE (' + ') +multiline value ('and one more string with provocations{') +WHITE_SPACE (' + ') +multiline value ('[GLOBAL]') +WHITE_SPACE (' + ') +multiline value ('}') +WHITE_SPACE (' +') +) (')') +WHITE_SPACE (' + +') +object path entity ('myObject3') +WHITE_SPACE (' ') +( ('(') +WHITE_SPACE (' + ') +multiline value ('prop{') +WHITE_SPACE (' + ') +multiline value ('p1 = 2') +WHITE_SPACE (' + ') +multiline value ('p4 = 5') +WHITE_SPACE (' + ') +multiline value ('}') +WHITE_SPACE (' +') +) (')') +ignored text ('also ignored text') +WHITE_SPACE (' +') \ No newline at end of file diff --git a/testData/typoscript/lexer/multilineValue.test.ts b/testData/typoscript/lexer/multilineValue.test.ts new file mode 100644 index 000000000000..fd10b7fe1df4 --- /dev/null +++ b/testData/typoscript/lexer/multilineValue.test.ts @@ -0,0 +1,17 @@ +myObject( + some value +) + +myObject.nextProperty (ignored text + some other value )) + and one more string with provocations{ + [GLOBAL] + } +) + +myObject3 ( + prop{ + p1 = 2 + p4 = 5 + } +)also ignored text diff --git a/testData/typoscript/lexer/objectPaths.test.expected b/testData/typoscript/lexer/objectPaths.test.expected new file mode 100644 index 000000000000..bf176b0d790e --- /dev/null +++ b/testData/typoscript/lexer/objectPaths.test.expected @@ -0,0 +1,49 @@ +object path entity ('myObject') +. ('.') +object path entity ('prop1') +. ('.') +object path entity ('prop2') +. ('.') +object path entity ('prop3') +. ('.') +object path entity ('prop4') +. ('.') +object path entity ('prop5') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +object path entity ('otherObject') +. ('.') +object path entity ('prop') +WHITE_SPACE (' +') +. ('.') +object path entity ('10') +WHITE_SPACE (' ') +> ('>') +ignored text (' not.a.path') +WHITE_SPACE (' +') +object path entity ('9path') +. ('.') +BAD_CHARACTER ('%') +object path entity ('BAD_SYMBOL') +BAD_CHARACTER ('%') +. ('.') +object path entity ('prop') +WHITE_SPACE (' ') +< ('<') +WHITE_SPACE (' ') +object path entity ('not') +WHITE_SPACE (' ') +object path entity ('a') +WHITE_SPACE (' ') +object path entity ('path') +. ('.') +object path entity ('because') +. ('.') +object path entity ('of') +. ('.') +object path entity ('spaces') +WHITE_SPACE (' +') \ No newline at end of file diff --git a/testData/typoscript/lexer/objectPaths.test.ts b/testData/typoscript/lexer/objectPaths.test.ts new file mode 100644 index 000000000000..1cfd30334ea2 --- /dev/null +++ b/testData/typoscript/lexer/objectPaths.test.ts @@ -0,0 +1,3 @@ +myObject.prop1.prop2.prop3.prop4.prop5 < otherObject.prop +.10 > not.a.path +9path.%BAD_SYMBOL%.prop < not a path.because.of.spaces diff --git a/testData/typoscript/lexer/sharpComment.test.expected b/testData/typoscript/lexer/sharpComment.test.expected new file mode 100644 index 000000000000..d09766766b08 --- /dev/null +++ b/testData/typoscript/lexer/sharpComment.test.expected @@ -0,0 +1 @@ +one line comment ('#CommentText') \ No newline at end of file diff --git a/testData/typoscript/lexer/sharpComment.test.ts b/testData/typoscript/lexer/sharpComment.test.ts new file mode 100644 index 000000000000..ddcea3fcf30b --- /dev/null +++ b/testData/typoscript/lexer/sharpComment.test.ts @@ -0,0 +1 @@ +#CommentText \ No newline at end of file diff --git a/testData/typoscript/lexer/simpleAssignment.test.expected b/testData/typoscript/lexer/simpleAssignment.test.expected new file mode 100644 index 000000000000..28fa7f86f067 --- /dev/null +++ b/testData/typoscript/lexer/simpleAssignment.test.expected @@ -0,0 +1,3 @@ +object path entity ('myObject') += ('=') +assignment value ('[value 1]') \ No newline at end of file diff --git a/testData/typoscript/lexer/simpleAssignment.test.ts b/testData/typoscript/lexer/simpleAssignment.test.ts new file mode 100644 index 000000000000..e7989e38cf60 --- /dev/null +++ b/testData/typoscript/lexer/simpleAssignment.test.ts @@ -0,0 +1 @@ +myObject=[value 1] \ No newline at end of file diff --git a/testData/typoscript/lexer/singleLineComments.test.expected b/testData/typoscript/lexer/singleLineComments.test.expected new file mode 100644 index 000000000000..f5a8630e586f --- /dev/null +++ b/testData/typoscript/lexer/singleLineComments.test.expected @@ -0,0 +1,28 @@ +one line comment ('#CommentText') +WHITE_SPACE (' +') +one line comment ('/ another comment') +WHITE_SPACE (' + +') +one line comment ('/third comment for test') +WHITE_SPACE (' +') +one line comment ('#fourth comment') +WHITE_SPACE (' +') +one line comment ('# the fifth comment') +WHITE_SPACE (' + +') +one line comment ('#sixth comment') +WHITE_SPACE (' +') +one line comment ('/seventh') +WHITE_SPACE (' +') +one line comment ('/and one more comment') +WHITE_SPACE (' + +') +one line comment ('// must be single comment') diff --git a/testData/typoscript/lexer/singleLineComments.test.ts b/testData/typoscript/lexer/singleLineComments.test.ts new file mode 100644 index 000000000000..a33149656861 --- /dev/null +++ b/testData/typoscript/lexer/singleLineComments.test.ts @@ -0,0 +1,12 @@ +#CommentText +/ another comment + +/third comment for test +#fourth comment +# the fifth comment + +#sixth comment +/seventh +/and one more comment + +// must be single comment \ No newline at end of file diff --git a/testData/typoscript/lexer/slashComment.test.expected b/testData/typoscript/lexer/slashComment.test.expected new file mode 100644 index 000000000000..e987dbc92b43 --- /dev/null +++ b/testData/typoscript/lexer/slashComment.test.expected @@ -0,0 +1 @@ +one line comment ('/CommentText') \ No newline at end of file diff --git a/testData/typoscript/lexer/slashComment.test.ts b/testData/typoscript/lexer/slashComment.test.ts new file mode 100644 index 000000000000..8e5cad163eba --- /dev/null +++ b/testData/typoscript/lexer/slashComment.test.ts @@ -0,0 +1 @@ +/CommentText \ No newline at end of file diff --git a/testData/typoscript/lexer/unsettingOperator.test.expected b/testData/typoscript/lexer/unsettingOperator.test.expected new file mode 100644 index 000000000000..5893eab0015c --- /dev/null +++ b/testData/typoscript/lexer/unsettingOperator.test.expected @@ -0,0 +1,18 @@ +WHITE_SPACE (' ') +object path entity ('myObject') +WHITE_SPACE (' ') +> ('>') +WHITE_SPACE (' +') +object path entity ('object') +WHITE_SPACE (' ') +> ('>') +ignored text (' some irrelevant text') +WHITE_SPACE (' +') +object path entity ('nextObjext') +. ('.') +object path entity ('secondProperty') +WHITE_SPACE (' ') +> ('>') +ignored text (' [GLOBAL] {test=3} (value)') \ No newline at end of file diff --git a/testData/typoscript/lexer/unsettingOperator.test.ts b/testData/typoscript/lexer/unsettingOperator.test.ts new file mode 100644 index 000000000000..3a0622d8a062 --- /dev/null +++ b/testData/typoscript/lexer/unsettingOperator.test.ts @@ -0,0 +1,3 @@ + myObject > +object > some irrelevant text +nextObjext.secondProperty > [GLOBAL] {test=3} (value) \ No newline at end of file diff --git a/testData/typoscript/lexer/valueModificationOperator.test.expected b/testData/typoscript/lexer/valueModificationOperator.test.expected new file mode 100644 index 000000000000..80af8418da33 --- /dev/null +++ b/testData/typoscript/lexer/valueModificationOperator.test.expected @@ -0,0 +1,53 @@ +object path entity ('value1') +:= (':=') +modification function ('addToList') +modification ( ('(') +modification value ('4,5') +modification ) (')') +WHITE_SPACE (' +') +object path entity ('value2') +:= (':=') +modification function ('addToList') +modification ( ('(') +modification value ('4,5') +WHITE_SPACE (' +') +object path entity ('value3') +:= (':=') +modification ( ('(') +WHITE_SPACE (' ') +modification value ('4 and some text') +WHITE_SPACE (' ') +modification ) (')') +WHITE_SPACE (' +') +object path entity ('value4') +BAD_CHARACTER (':') +WHITE_SPACE (' +') +object path entity ('value5') +:= (':=') +modification function ('add To My List') +WHITE_SPACE (' ') +modification ( ('(') +WHITE_SPACE (' ') +modification value ('4,5') +modification ) (')') +WHITE_SPACE (' +') +object path entity ('value6') +:= (':=') +modification function ('add To My List') +modification ( ('(') +modification value ('4,5') +modification ) (')') +ignored text (' some ignored text') +WHITE_SPACE (' +') +object path entity ('value7') +BAD_CHARACTER (':') +WHITE_SPACE (' ') +object path entity ('addToList') +( ('(') +ignored text (' ,5)') \ No newline at end of file diff --git a/testData/typoscript/lexer/valueModificationOperator.test.ts b/testData/typoscript/lexer/valueModificationOperator.test.ts new file mode 100644 index 000000000000..ce6071e38318 --- /dev/null +++ b/testData/typoscript/lexer/valueModificationOperator.test.ts @@ -0,0 +1,7 @@ +value1:=addToList(4,5) +value2:=addToList(4,5 +value3:=( 4 and some text ) +value4: +value5:=add To My List ( 4,5) +value6:=add To My List(4,5) some ignored text +value7: addToList( ,5) \ No newline at end of file diff --git a/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java b/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java new file mode 100644 index 000000000000..ba085b3ef25a --- /dev/null +++ b/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java @@ -0,0 +1,120 @@ +package com.jetbrains.typoscript; + +import com.intellij.lexer.Lexer; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.psi.tree.IElementType; +import com.intellij.testFramework.UsefulTestCase; +import com.jetbrains.typoscript.lang.TypoScriptLexer; +import org.jetbrains.annotations.NonNls; + +import java.io.File; +import java.io.IOException; + +/** + * @author lene + * Date: 04.04.12 + */ +public class TypoScriptLexerTest extends UsefulTestCase { + @NonNls + private static final String INPUT_DATA_FILE_EXT = "test.ts"; + @NonNls + private static final String EXPECTED_RESULT_FILE_EXT = "test.expected"; + + + public void testSlashComment() throws Throwable { + doTest(); + } + + public void testSharpComment() throws Throwable { + doTest(); + } + + public void testSingleLineComments() throws Throwable { + doTest(); + } + + public void testSimpleAssignment() throws Throwable { + doTest(); + } + + public void testAssignments() throws Throwable { + doTest(); + } + + public void testCopyingOperator() throws Throwable { + doTest(); + } + + public void testUnsettingOperator() throws Throwable { + doTest(); + } + + public void testMultilineValue() throws Throwable { + doTest(); + } + + public void testValueModificationOperator() throws Throwable { + doTest(); + } + + public void testInclude() throws Throwable { + doTest(); + } + + public void testObjectPaths() throws Throwable { + doTest(); + } + + public void testCodeBlock() throws Throwable { + doTest(); + } + + public void testExampleFromTypo() throws Throwable { + doTest(); + } + + private void doTest() throws IOException { + Lexer lexer = new TypoScriptLexer(); + String testText = getInputData(getDataSubPath(), getTestName(true)); + String expected = getExpectedDataFilePath(getDataSubPath(), getTestName(true)); + doFileLexerTest(lexer, testText, expected); + } + + private static void doFileLexerTest(Lexer lexer, String testText, String expected) { + lexer.start(testText); + String result = ""; + for (IElementType tokenType = lexer.getTokenType(); tokenType != null; tokenType = lexer.getTokenType()) { + String tokenText = lexer.getBufferSequence().subSequence(lexer.getTokenStart(), lexer.getTokenEnd()).toString(); + String tokenTypeName = tokenType.toString(); + String line = tokenTypeName + " ('" + tokenText + "')\n"; + result += line; + lexer.advance(); + } + UsefulTestCase.assertSameLinesWithFile(expected, result); + } + + private static String getExpectedDataFilePath(final String dataSubPath, final String testName) { + return getInputDataFilePath(dataSubPath, testName, EXPECTED_RESULT_FILE_EXT); + } + + private static String getInputData(final String dataSubPath, final String testName) { + final String filePath = getInputDataFilePath(dataSubPath, testName, INPUT_DATA_FILE_EXT); + try { + return FileUtil.loadFile(new File(filePath)); + } + catch (IOException e) { + System.out.println(filePath); + throw new RuntimeException(e); + } + } + + private static String getInputDataFilePath(final String dataSubPath, final String testName, final String fileExtension) { + return PathManager.getHomePath() + "/" + dataSubPath + "/" + testName + "." + fileExtension; + } + + @NonNls + private static String getDataSubPath() { + return "/plugins/typoScript/testData/typoscript/lexer"; + } +} \ No newline at end of file diff --git a/typoScript.iml b/typoScript.iml new file mode 100644 index 000000000000..7541cd0e9cf5 --- /dev/null +++ b/typoScript.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + From a7f7bafb968e5f8163373ddaa28d666a45d54ceb Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Wed, 11 Apr 2012 20:46:34 +0400 Subject: [PATCH 004/147] TypoScript lexer-based highlighting --- .../messages/TypoScriptBundle.properties | 0 src/META-INF/plugin.xml | 20 + .../jetbrains/typoscript/lang/TypoScript.bnf | 66 + .../typoscript/lang/TypoScriptFileType.java | 17 +- .../lang/TypoScriptFileTypeFactory.java | 16 + .../typoscript/lang/TypoScriptLanguage.java | 5 +- .../typoscript/lang/TypoScriptTokenTypes.java | 51 +- .../TypoScriptHighlightingData.java | 34 + .../lexer/assignments.test.expected | 70 +- .../typoscript/lexer/codeBlock.test.expected | 98 +- testData/typoscript/lexer/codeBlock.test.ts | 4 +- .../lexer/copyingOperator.test.expected | 28 +- .../lexer/exampleFromTypo.test.expected | 1088 ++++++++--------- .../typoscript/lexer/include.test.expected | 14 +- .../lexer/multilineValue.test.expected | 44 +- .../typoscript/lexer/multilineValue.test.ts | 4 +- .../lexer/objectPaths.test.expected | 68 +- .../lexer/sharpComment.test.expected | 2 +- .../lexer/simpleAssignment.test.expected | 6 +- .../lexer/singleLineComments.test.expected | 18 +- .../lexer/slashComment.test.expected | 2 +- .../lexer/unsettingOperator.test.expected | 20 +- .../valueModificationOperator.test.expected | 68 +- .../lexer/valueModificationOperator.test.ts | 2 +- typoScript.iml | 1 + 25 files changed, 948 insertions(+), 798 deletions(-) create mode 100644 resources/messages/TypoScriptBundle.properties create mode 100644 src/META-INF/plugin.xml create mode 100644 src/com/jetbrains/typoscript/lang/TypoScript.bnf create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java create mode 100644 src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java diff --git a/resources/messages/TypoScriptBundle.properties b/resources/messages/TypoScriptBundle.properties new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/META-INF/plugin.xml b/src/META-INF/plugin.xml new file mode 100644 index 000000000000..266fe7be6394 --- /dev/null +++ b/src/META-INF/plugin.xml @@ -0,0 +1,20 @@ + + + + + com.jetbrains.typoscript + TypoScript Support + + Typo3 language TypoScript support + + 1.0 + JetBrains + com.intellij.modules.ultimate + resources.messages.TypoScriptBundle + + + + + + + diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.bnf b/src/com/jetbrains/typoscript/lang/TypoScript.bnf new file mode 100644 index 000000000000..8f1d158e7025 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScript.bnf @@ -0,0 +1,66 @@ +{ + generatePsi=false + + parserClass="com.jetbrains.typoscript.lang.TypoScriptParser" + stubParserClass="com.jetbrains.typoscript.lang.TypoScriptParserUtil" + tokenTypeClass="com.jetbrains.typoscript.lang.TypoScriptTokenType" + elementTypeClass="com.jetbrains.typoscript.lang.TypoScriptTokenType" + elementTypeHolderClass="com.jetbrains.typoscript.lang.TypoScriptElementTypes" + generateTokens=false + parserImports="static com.jetbrains.typoscript.lang.TypoScriptTokenTypes.*" + + //tokens + //C_STYLE_COMMENT + //ONE_LINE_COMMENT +/* + IElementType MODIFICATION_OPERATOR = new TypoScriptTokenType("MODIFY"); + IElementType ASSIGNMENT_OPERATOR = new TypoScriptTokenType("ASSIGN"); + + IElementType MULTILINE_VALUE_OPERATOR_BEGIN = new TypoScriptTokenType("MULTILINE_OPEN"); + IElementType MULTILINE_VALUE_OPERATOR_END = new TypoScriptTokenType("MULTILINE_CLOSE"); + IElementType MULTILINE_VALUE = new TypoScriptTokenType("MULTILINE_VALUE"); + + IElementType CODE_BLOCK_OPERATOR_BEGIN = new TypoScriptTokenType("CODE_BLOCK_OPEN"); + IElementType CODE_BLOCK_OPERATOR_END = new TypoScriptTokenType("CODE_BLOCK_CLOSE"); + IElementType UNSETTING_OPERATOR = new TypoScriptTokenType("UNSET"); + IElementType COPYING_OPERATOR = new TypoScriptTokenType("COPY"); + + IElementType ASSIGNMENT_VALUE = new TypoScriptTokenType("ASSIGNMENT_VALUE"); + IElementType IGNORED_TEXT = new TypoScriptTokenType("IGNORED_TEXT"); + + IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("MODIFICATION_FUNCTION"); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("MODIFICATION_OPEN"); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("MODIFICATION_CLOSE"); + IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("MODIFICATION_VALUE"); + + IElementType OBJECT_PATH_ENTITY = new TypoScriptTokenType("OBJECT_PATH_ENTITY"); + IElementType OBJECT_PATH_SEPARATOR = new TypoScriptTokenType("OBJECT_PATH_SEPARATOR"); + + IElementType INCLUDE_STATEMENT = new TypoScriptTokenType("INCLUDE"); + IElementType CONDITION = new TypoScriptTokenType("CONDITION");*/ +} + //do we need to declare operators again? + +object_path ::= OBJECT_PATH_ENTITY (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY)* +meta internal_object_path ::= object_path | OBJECT_PATH_SEPARATOR object_path + +assignment ::= ASSIGNMENT ASSIGNMENT_VALUE +meta internal_assignment ::= internal_object_path ASSIGNMENT ASSIGNMENT_VALUE + +value_modification ::= MODIFY MODIFICATION_FUNCTION MODIFICATION_OPEN MODIFICATION_VALUE MODIFICATION_CLOSE + +multiline_value ::= MULTILINE_OPEN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_CLOSE IGNORED_TEXT? + +copying ::= COPY object_path + +unsetting ::= UNSET IGNORED_TEXT? + +meta expression ::= assignment | value_modification | multiline_value | copying | unsetting | codeBlock + +codeBlock ::= object_path CODE_BLOCK_OPEN IGNORED_TEXT? (expression)* CODE_BLOCK_CLOSE IGNORED_TEXT? + + + + + + diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java b/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java index 8b42c7543826..179be96f8ba1 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java @@ -1,6 +1,7 @@ package com.jetbrains.typoscript.lang; import com.intellij.openapi.fileTypes.LanguageFileType; +import com.intellij.openapi.util.IconLoader; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -9,38 +10,44 @@ import javax.swing.*; * @author lene * Date: 03.04.12 */ -public class TypoScriptFileType extends LanguageFileType { +public class TypoScriptFileType extends LanguageFileType { + private static final Icon ICON = IconLoader.getIcon("/icons/typo3.png"); //todo[lene] + public static final TypoScriptFileType INSTANCE = new TypoScriptFileType(); private TypoScriptFileType() { super(TypoScriptLanguage.INSTANCE); - /* FileTypeEditorHighlighterProviders.INSTANCE.addExplicitExtension(this, new EditorHighlighterProvider() {//todo[lene] + /* FileTypeEditorHighlighterProviders.INSTANCE.addExplicitExtension(this, new EditorHighlighterProvider() {//todo[lene] @Override public EditorHighlighter getEditorHighlighter(@Nullable Project project, @NotNull FileType fileType, @Nullable VirtualFile virtualFile, @NotNull EditorColorsScheme colors) { - return new PlayEditorHighlighter(project, virtualFile, colors); + return new TypoScriptEditorHighlighter(project, virtualFile, colors); } });*/ } @NotNull + @Override public String getName() { return "TypoScript"; } @NotNull + @Override public String getDescription() { return "TypoScript"; } @NotNull + @Override public String getDefaultExtension() { - return "ts"; //todo[lene] + return "ts"; } + @Override public Icon getIcon() { - return null;//todo[lene] + return ICON;//todo[lene] } } diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java b/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java new file mode 100644 index 000000000000..8bb14b136343 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java @@ -0,0 +1,16 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.openapi.fileTypes.FileTypeConsumer; +import com.intellij.openapi.fileTypes.FileTypeFactory; +import org.jetbrains.annotations.NotNull; + +/** + * @author lene + * Date: 11.04.12 + */ +public class TypoScriptFileTypeFactory extends FileTypeFactory { + @Override + public void createFileTypes(@NotNull FileTypeConsumer consumer) { + consumer.consume(TypoScriptFileType.INSTANCE, TypoScriptFileType.INSTANCE.getDefaultExtension()); + } +} \ No newline at end of file diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java b/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java index 35de39069c43..23edd4b0c4c8 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java @@ -2,14 +2,15 @@ package com.jetbrains.typoscript.lang; import com.intellij.lang.Language; import com.intellij.openapi.fileTypes.LanguageFileType; +import com.intellij.openapi.fileTypes.PlainTextLanguage; import com.intellij.psi.templateLanguages.TemplateLanguage; /** * @author lene * Date: 03.04.12 */ -public class TypoScriptLanguage extends Language /*implements TemplateLanguage */ {//todo[lene] - public static TypoScriptLanguage INSTANCE = new TypoScriptLanguage(); +public class TypoScriptLanguage extends Language { + public static final TypoScriptLanguage INSTANCE = new TypoScriptLanguage(); private TypoScriptLanguage() { super("TypoScript", ""); diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java index f382cbbfaa6d..4c38c8c8c03b 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java @@ -9,32 +9,37 @@ import com.intellij.psi.tree.TokenSet; * Date: 03.04.12 */ public interface TypoScriptTokenTypes extends TokenType { - IElementType C_STYLE_COMMENT = new TypoScriptTokenType("c style comment"); - IElementType ONE_LINE_COMMENT = new TypoScriptTokenType("one line comment"); + IElementType C_STYLE_COMMENT = new TypoScriptTokenType("C_STYLE_COMMENT"); + IElementType ONE_LINE_COMMENT = new TypoScriptTokenType("ONE_LINE_COMMENT"); + IElementType IGNORED_TEXT = new TypoScriptTokenType("IGNORED_TEXT"); - TokenSet COMMENTS = TokenSet.create(C_STYLE_COMMENT, ONE_LINE_COMMENT); + IElementType ASSIGNMENT_OPERATOR = new TypoScriptTokenType("ASSIGN"); + IElementType ASSIGNMENT_VALUE = new TypoScriptTokenType("ASSIGNMENT_VALUE"); - IElementType MODIFICATION_OPERATOR = new TypoScriptTokenType(":="); - IElementType ASSIGNMENT_OPERATOR = new TypoScriptTokenType("="); + IElementType MULTILINE_VALUE_OPERATOR_BEGIN = new TypoScriptTokenType("MULTILINE_OPEN"); + IElementType MULTILINE_VALUE_OPERATOR_END = new TypoScriptTokenType("MULTILINE_CLOSE"); + IElementType MULTILINE_VALUE = new TypoScriptTokenType("MULTILINE_VALUE"); - IElementType MULTILINE_VALUE_OPERATOR_BEGIN = new TypoScriptTokenType("("); - IElementType MULTILINE_VALUE_OPERATOR_END = new TypoScriptTokenType(")"); + IElementType CODE_BLOCK_OPERATOR_BEGIN = new TypoScriptTokenType("CODE_BLOCK_OPEN"); + IElementType CODE_BLOCK_OPERATOR_END = new TypoScriptTokenType("CODE_BLOCK_CLOSE"); - IElementType CODE_BLOCK_OPERATOR_BEGIN = new TypoScriptTokenType("{"); - IElementType CODE_BLOCK_OPERATOR_END = new TypoScriptTokenType("}"); - IElementType UNSETTING_OPERATOR = new TypoScriptTokenType(">"); - IElementType COPYING_OPERATOR = new TypoScriptTokenType("<"); + IElementType UNSETTING_OPERATOR = new TypoScriptTokenType("UNSET"); + IElementType COPYING_OPERATOR = new TypoScriptTokenType("COPY"); - IElementType ASSIGNMENT_VALUE = new TypoScriptTokenType("assignment value"); - IElementType MULTILINE_VALUE = new TypoScriptTokenType("multiline value"); - IElementType IGNORED_TEXT = new TypoScriptTokenType("ignored text"); - - IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("modification function"); - IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("modification ("); - IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("modification )"); - IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("modification value"); - IElementType OBJECT_PATH_ENTITY = new TypoScriptTokenType("object path entity"); - IElementType OBJECT_PATH_SEPARATOR = new TypoScriptTokenType("."); - IElementType INCLUDE_STATEMENT = new TypoScriptTokenType("include"); - IElementType CONDITION = new TypoScriptTokenType("condition"); + IElementType MODIFICATION_OPERATOR = new TypoScriptTokenType("MODIFY"); + IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("MODIFICATION_FUNCTION"); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("MODIFICATION_OPEN"); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("MODIFICATION_CLOSE"); + IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("MODIFICATION_VALUE"); + + TokenSet OPERATORS = TokenSet.create(MODIFICATION_OPERATOR, ASSIGNMENT_OPERATOR, + MULTILINE_VALUE_OPERATOR_BEGIN, MULTILINE_VALUE_OPERATOR_END, + CODE_BLOCK_OPERATOR_BEGIN, CODE_BLOCK_OPERATOR_END, + UNSETTING_OPERATOR, COPYING_OPERATOR); + + IElementType OBJECT_PATH_ENTITY = new TypoScriptTokenType("OBJECT_PATH_ENTITY"); + IElementType OBJECT_PATH_SEPARATOR = new TypoScriptTokenType("OBJECT_PATH_SEPARATOR"); + + IElementType INCLUDE_STATEMENT = new TypoScriptTokenType("INCLUDE"); + IElementType CONDITION = new TypoScriptTokenType("CONDITION"); } diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java new file mode 100644 index 000000000000..ca7b5303a379 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java @@ -0,0 +1,34 @@ +package com.jetbrains.typoscript.lang.highlighter; + +import com.intellij.openapi.editor.HighlighterColors; +import com.intellij.openapi.editor.SyntaxHighlighterColors; +import com.intellij.openapi.editor.colors.TextAttributesKey; + +/** + * @author lene + * Date: 11.04.12 + */ +public class TypoScriptHighlightingData { + public static final TextAttributesKey ONE_LINE_COMMENT = + TextAttributesKey.createTextAttributesKey("TS_ONE_LINE_COMMENT", SyntaxHighlighterColors.LINE_COMMENT.getDefaultAttributes()); + public static final TextAttributesKey MULTILINE_COMMENT = + TextAttributesKey.createTextAttributesKey("TS_MULTILINE_COMMENT", SyntaxHighlighterColors.JAVA_BLOCK_COMMENT.getDefaultAttributes()); + public static final TextAttributesKey OPERATOR_SIGN = + TextAttributesKey.createTextAttributesKey("TS_OPERATOR_SIGN", SyntaxHighlighterColors.OPERATION_SIGN.getDefaultAttributes()); + public static final TextAttributesKey STRING_VALUE = + TextAttributesKey.createTextAttributesKey("STRING_VALUE", SyntaxHighlighterColors.STRING.getDefaultAttributes()); + public static final TextAttributesKey OBJECT_PATH_ENTITY = + TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_ENTITY", HighlighterColors.TEXT.getDefaultAttributes()); + public static final TextAttributesKey OBJECT_PATH_SEPARATOR = + TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_SEPARATOR", SyntaxHighlighterColors.DOT.getDefaultAttributes()); + + + /* +IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("MODIFICATION_FUNCTION"); +IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("MODIFICATION_OPEN"); +IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("MODIFICATION_CLOSE"); +IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("MODIFICATION_VALUE"); + */ + public static final TextAttributesKey BAD_CHARACTER = + TextAttributesKey.createTextAttributesKey("TS_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER.getDefaultAttributes()); +} diff --git a/testData/typoscript/lexer/assignments.test.expected b/testData/typoscript/lexer/assignments.test.expected index fcf66447424a..24b1b3a94deb 100644 --- a/testData/typoscript/lexer/assignments.test.expected +++ b/testData/typoscript/lexer/assignments.test.expected @@ -1,61 +1,61 @@ -object path entity ('myObject') +OBJECT_PATH_ENTITY ('myObject') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('[value 1]') +ASSIGNMENT_VALUE ('[value 1]') WHITE_SPACE (' ') -object path entity ('myObject') -. ('.') -object path entity ('myProperty') +OBJECT_PATH_ENTITY ('myObject') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('myProperty') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('') +ASSIGNMENT_VALUE ('') WHITE_SPACE (' ') -object path entity ('myObject') -. ('.') -object path entity ('myProperty') -. ('.') -object path entity ('firstProperty') -= ('=') +OBJECT_PATH_ENTITY ('myObject') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('myProperty') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('firstProperty') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('[value 3]') +ASSIGNMENT_VALUE ('[value 3]') WHITE_SPACE (' ') -object path entity ('myObject') -. ('.') -object path entity ('myProperty') -. ('.') -object path entity ('secondProperty') +OBJECT_PATH_ENTITY ('myObject') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('myProperty') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('secondProperty') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('[value 4]') +ASSIGNMENT_VALUE ('[value 4]') WHITE_SPACE (' ') -object path entity ('myObject') -. ('.') -object path entity ('myProperty') +OBJECT_PATH_ENTITY ('myObject') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('myProperty') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('{value 2 with [GLOBAL] anf other () provocations}') +ASSIGNMENT_VALUE ('{value 2 with [GLOBAL] anf other () provocations}') WHITE_SPACE (' ') -object path entity ('myObject') +OBJECT_PATH_ENTITY ('myObject') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('HTML') +ASSIGNMENT_VALUE ('HTML') WHITE_SPACE (' ') -object path entity ('myObject') -. ('.') -object path entity ('value') +OBJECT_PATH_ENTITY ('myObject') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('value') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value (' HTML - code ') \ No newline at end of file +ASSIGNMENT_VALUE (' HTML - code ') \ No newline at end of file diff --git a/testData/typoscript/lexer/codeBlock.test.expected b/testData/typoscript/lexer/codeBlock.test.expected index 55ddbbf91f3b..444c499db1dd 100644 --- a/testData/typoscript/lexer/codeBlock.test.expected +++ b/testData/typoscript/lexer/codeBlock.test.expected @@ -1,101 +1,101 @@ -object path entity ('myObject') +OBJECT_PATH_ENTITY ('myObject') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('field') +OBJECT_PATH_ENTITY ('field') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('title') +ASSIGNMENT_VALUE ('title') WHITE_SPACE (' ') -object path entity ('ifEmpty') +OBJECT_PATH_ENTITY ('ifEmpty') WHITE_SPACE (' ') -{ ('{') -ignored text (' ignored text') +CODE_BLOCK_OPEN ('{') +IGNORED_TEXT (' IGNORED_TEXT') WHITE_SPACE (' ') -object path entity ('data') +OBJECT_PATH_ENTITY ('data') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('leveltitle:0 } bracket is ignored') +ASSIGNMENT_VALUE ('leveltitle:0 } bracket is ignored') WHITE_SPACE (' ') -condition ('[i = 5]') +CONDITION ('[i = 5]') WHITE_SPACE (' ') -} ('}') -ignored text (' some ignored text') +CODE_BLOCK_CLOSE ('}') +IGNORED_TEXT (' some IGNORED_TEXT') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') -ignored text (' this brace is also ignored by parser') +CODE_BLOCK_CLOSE ('}') +IGNORED_TEXT (' this brace is also ignored by parser') WHITE_SPACE (' ') -object path entity ('second') -. ('.') -object path entity ('object') -{ ('{') +OBJECT_PATH_ENTITY ('second') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('object') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -ignored text ('{ ignored opening bracket') +IGNORED_TEXT ('{ ignored opening bracket') WHITE_SPACE (' ') -. ('.') -object path entity ('10') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('10') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('left') +ASSIGNMENT_VALUE ('left') WHITE_SPACE (' ') -object path entity ('prop') +OBJECT_PATH_ENTITY ('prop') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -object path entity ('test') +OBJECT_PATH_ENTITY ('test') WHITE_SPACE (' ') -object path entity ('text') -( ('(') +OBJECT_PATH_ENTITY ('text') +MULTILINE_OPEN ('(') WHITE_SPACE (' ') -multiline value ('} ignored bracket') +MULTILINE_VALUE ('} ignored bracket') WHITE_SPACE (' ') -) (')') +MULTILINE_CLOSE (')') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('third') -. ('.') -object path entity ('object') -{ ('{') +OBJECT_PATH_ENTITY ('third') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('object') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('do') -. ('.') -object path entity ('not') -. ('.') -object path entity ('ignore') -{ ('{') +OBJECT_PATH_ENTITY ('do') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('not') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('ignore') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('i') -= ('=') -assignment value ('5') +OBJECT_PATH_ENTITY ('i') +ASSIGN ('=') +ASSIGNMENT_VALUE ('5') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') \ No newline at end of file +CODE_BLOCK_CLOSE ('}') \ No newline at end of file diff --git a/testData/typoscript/lexer/codeBlock.test.ts b/testData/typoscript/lexer/codeBlock.test.ts index d8c40f97e49e..96abfb168c3f 100644 --- a/testData/typoscript/lexer/codeBlock.test.ts +++ b/testData/typoscript/lexer/codeBlock.test.ts @@ -1,9 +1,9 @@ myObject { field = title - ifEmpty { ignored text + ifEmpty { IGNORED_TEXT data = leveltitle:0 } bracket is ignored [i = 5] - } some ignored text + } some IGNORED_TEXT } } this brace is also ignored by parser diff --git a/testData/typoscript/lexer/copyingOperator.test.expected b/testData/typoscript/lexer/copyingOperator.test.expected index 9b67190c3954..b7e70d513351 100644 --- a/testData/typoscript/lexer/copyingOperator.test.expected +++ b/testData/typoscript/lexer/copyingOperator.test.expected @@ -1,25 +1,25 @@ -object path entity ('myOtherObject') +OBJECT_PATH_ENTITY ('myOtherObject') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -object path entity ('myObject') +OBJECT_PATH_ENTITY ('myObject') WHITE_SPACE (' ') -object path entity ('20') +OBJECT_PATH_ENTITY ('20') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -object path entity ('pageObj') -. ('.') -object path entity ('10') +OBJECT_PATH_ENTITY ('pageObj') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('10') WHITE_SPACE (' ') -object path entity ('strange') +OBJECT_PATH_ENTITY ('strange') WHITE_SPACE (' ') -object path entity ('text') +OBJECT_PATH_ENTITY ('text') WHITE_SPACE (' ') -object path entity ('30') +OBJECT_PATH_ENTITY ('30') WHITE_SPACE (' ') -< ('<') -. ('.') -object path entity ('10') \ No newline at end of file +COPY ('<') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('10') \ No newline at end of file diff --git a/testData/typoscript/lexer/exampleFromTypo.test.expected b/testData/typoscript/lexer/exampleFromTypo.test.expected index 8f579152cb64..8d754c4b6e4e 100644 --- a/testData/typoscript/lexer/exampleFromTypo.test.expected +++ b/testData/typoscript/lexer/exampleFromTypo.test.expected @@ -1,1358 +1,1358 @@ -object path entity ('mod') -. ('.') -object path entity ('wizards') +OBJECT_PATH_ENTITY ('mod') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('wizards') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('newContentElement') -. ('.') -object path entity ('wizardItems') +OBJECT_PATH_ENTITY ('newContentElement') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('wizardItems') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('forms') -. ('.') -object path entity ('elements') +OBJECT_PATH_ENTITY ('forms') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('elements') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('mailform') +OBJECT_PATH_ENTITY ('mailform') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('tt_content_defValues') +OBJECT_PATH_ENTITY ('tt_content_defValues') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('bodytext') +OBJECT_PATH_ENTITY ('bodytext') WHITE_SPACE (' ') -( ('(') +MULTILINE_OPEN ('(') WHITE_SPACE (' ') -multiline value ('enctype = multipart/form-data') +MULTILINE_VALUE ('enctype = multipart/form-data') WHITE_SPACE (' ') -multiline value ('method = post') +MULTILINE_VALUE ('method = post') WHITE_SPACE (' ') -multiline value ('prefix = tx_form') +MULTILINE_VALUE ('prefix = tx_form') WHITE_SPACE (' ') -) (')') +MULTILINE_CLOSE (')') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('form') +OBJECT_PATH_ENTITY ('form') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('defaults') +OBJECT_PATH_ENTITY ('defaults') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showTabs') +OBJECT_PATH_ENTITY ('showTabs') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('elements, options, form') +ASSIGNMENT_VALUE ('elements, options, form') WHITE_SPACE (' ') -object path entity ('tabs') +OBJECT_PATH_ENTITY ('tabs') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('elements') +OBJECT_PATH_ENTITY ('elements') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('basic, predefined, content') +ASSIGNMENT_VALUE ('basic, predefined, content') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('basic') +OBJECT_PATH_ENTITY ('basic') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showButtons') +OBJECT_PATH_ENTITY ('showButtons') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('checkbox, fieldset, fileupload, hidden, password, radio, reset, select, submit, textarea, textline') +ASSIGNMENT_VALUE ('checkbox, fieldset, fileupload, hidden, password, radio, reset, select, submit, textarea, textline') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('predefined') +OBJECT_PATH_ENTITY ('predefined') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showButtons') +OBJECT_PATH_ENTITY ('showButtons') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('email, radiogroup, checkboxgroup, name') +ASSIGNMENT_VALUE ('email, radiogroup, checkboxgroup, name') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('content') +OBJECT_PATH_ENTITY ('content') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showButtons') +OBJECT_PATH_ENTITY ('showButtons') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('header, textblock') +ASSIGNMENT_VALUE ('header, textblock') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('options') +OBJECT_PATH_ENTITY ('options') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('legend, label, attributes, options, validation, filters, various') +ASSIGNMENT_VALUE ('legend, label, attributes, options, validation, filters, various') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('accept, acceptcharset, accesskey, action, alt, checked, class, cols, dir, disabled, enctype, id, label, lang, maxlength, method, multiple, name, readonly, rows, selected, size, src, style, tabindex, title, type, value') +ASSIGNMENT_VALUE ('accept, acceptcharset, accesskey, action, alt, checked, class, cols, dir, disabled, enctype, id, label, lang, maxlength, method, multiple, name, readonly, rows, selected, size, src, style, tabindex, title, type, value') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('label') +OBJECT_PATH_ENTITY ('label') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('label') +ASSIGNMENT_VALUE ('label') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('validation') +OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showRules') +OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('alphabetic, alphanumeric, between, date, digit, email, equals, fileallowedtypes, filemaximumsize, fileminimumsize, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') +ASSIGNMENT_VALUE ('alphabetic, alphanumeric, between, date, digit, email, equals, fileallowedtypes, filemaximumsize, fileminimumsize, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') WHITE_SPACE (' ') -object path entity ('rules') +OBJECT_PATH_ENTITY ('rules') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('alphabetic') +OBJECT_PATH_ENTITY ('alphabetic') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, allowWhiteSpace') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, allowWhiteSpace') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('alphanumeric') +OBJECT_PATH_ENTITY ('alphanumeric') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, allowWhiteSpace') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, allowWhiteSpace') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('between') +OBJECT_PATH_ENTITY ('between') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, minimum, maximum, inclusive') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum, maximum, inclusive') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('date') +OBJECT_PATH_ENTITY ('date') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, format') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, format') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('digit') +OBJECT_PATH_ENTITY ('digit') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('email') +OBJECT_PATH_ENTITY ('email') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('equals') +OBJECT_PATH_ENTITY ('equals') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, field') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, field') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('fileallowedtypes') +OBJECT_PATH_ENTITY ('fileallowedtypes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, types') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, types') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('filemaximumsize') +OBJECT_PATH_ENTITY ('filemaximumsize') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, maximum') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, maximum') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('fileminimumsize') +OBJECT_PATH_ENTITY ('fileminimumsize') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, minimum') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('float') +OBJECT_PATH_ENTITY ('float') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('greaterthan') +OBJECT_PATH_ENTITY ('greaterthan') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, minimum') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('inarray') +OBJECT_PATH_ENTITY ('inarray') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, array, strict') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, array, strict') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('integer') +OBJECT_PATH_ENTITY ('integer') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('ip') +OBJECT_PATH_ENTITY ('ip') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('length') +OBJECT_PATH_ENTITY ('length') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, minimum, maximum') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum, maximum') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('lessthan') +OBJECT_PATH_ENTITY ('lessthan') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, maximum') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, maximum') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('regexp') +OBJECT_PATH_ENTITY ('regexp') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage, expression') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, expression') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('required') +OBJECT_PATH_ENTITY ('required') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('uri') +OBJECT_PATH_ENTITY ('uri') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('message, error, breakOnError, showMessage') +ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('filtering') +OBJECT_PATH_ENTITY ('filtering') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showFilters') +OBJECT_PATH_ENTITY ('showFilters') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, removexss, stripnewlines, titlecase, trim, uppercase') +ASSIGNMENT_VALUE ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, removexss, stripnewlines, titlecase, trim, uppercase') WHITE_SPACE (' ') -object path entity ('filters') +OBJECT_PATH_ENTITY ('filters') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('alphabetic') +OBJECT_PATH_ENTITY ('alphabetic') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('allowWhiteSpace') +ASSIGNMENT_VALUE ('allowWhiteSpace') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('alphanumeric') +OBJECT_PATH_ENTITY ('alphanumeric') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('allowWhiteSpace') +ASSIGNMENT_VALUE ('allowWhiteSpace') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('currency') +OBJECT_PATH_ENTITY ('currency') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('decimalPoint, thousandSeparator') +ASSIGNMENT_VALUE ('decimalPoint, thousandSeparator') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('digit') +OBJECT_PATH_ENTITY ('digit') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('integer') +OBJECT_PATH_ENTITY ('integer') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('lowercase') +OBJECT_PATH_ENTITY ('lowercase') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('regexp') +OBJECT_PATH_ENTITY ('regexp') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('expression') +ASSIGNMENT_VALUE ('expression') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('removexss') +OBJECT_PATH_ENTITY ('removexss') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('stripnewlines') +OBJECT_PATH_ENTITY ('stripnewlines') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('titlecase') +OBJECT_PATH_ENTITY ('titlecase') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('trim') +OBJECT_PATH_ENTITY ('trim') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('characterList') +ASSIGNMENT_VALUE ('characterList') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('uppercase') +OBJECT_PATH_ENTITY ('uppercase') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('form') +OBJECT_PATH_ENTITY ('form') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('prefix, attributes, postProcessor') +ASSIGNMENT_VALUE ('prefix, attributes, postProcessor') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('accept, acceptcharset, action, class, dir, enctype, id, lang, method, name, style, title') +ASSIGNMENT_VALUE ('accept, acceptcharset, action, class, dir, enctype, id, lang, method, name, style, title') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('postProcessor') +OBJECT_PATH_ENTITY ('postProcessor') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showPostProcessors') +OBJECT_PATH_ENTITY ('showPostProcessors') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('mail') +ASSIGNMENT_VALUE ('mail') WHITE_SPACE (' ') -object path entity ('postProcessors') +OBJECT_PATH_ENTITY ('postProcessors') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('mail') +OBJECT_PATH_ENTITY ('mail') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('recipientEmail, senderEmail') +ASSIGNMENT_VALUE ('recipientEmail, senderEmail') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('elements') +OBJECT_PATH_ENTITY ('elements') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('button') +OBJECT_PATH_ENTITY ('button') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('attributes') +ASSIGNMENT_VALUE ('attributes') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('value') +ASSIGNMENT_VALUE ('value') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('checkbox') +OBJECT_PATH_ENTITY ('checkbox') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('label, attributes') +ASSIGNMENT_VALUE ('label, attributes') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('name, value') +ASSIGNMENT_VALUE ('name, value') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('fieldset') +OBJECT_PATH_ENTITY ('fieldset') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('legend') +ASSIGNMENT_VALUE ('legend') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('fileupload') +OBJECT_PATH_ENTITY ('fileupload') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('label, attributes, validation') +ASSIGNMENT_VALUE ('label, attributes, validation') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('name') +ASSIGNMENT_VALUE ('name') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('validation') +OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showRules') +OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('required, fileallowedtypes, filemaximumsize, fileminimumsize') +ASSIGNMENT_VALUE ('required, fileallowedtypes, filemaximumsize, fileminimumsize') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('hidden') +OBJECT_PATH_ENTITY ('hidden') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('attributes') +ASSIGNMENT_VALUE ('attributes') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('name, value') +ASSIGNMENT_VALUE ('name, value') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('password') +OBJECT_PATH_ENTITY ('password') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('label, attributes, validation') +ASSIGNMENT_VALUE ('label, attributes, validation') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('name') +ASSIGNMENT_VALUE ('name') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('validation') +OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showRules') +OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('required, equals') +ASSIGNMENT_VALUE ('required, equals') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('radio') +OBJECT_PATH_ENTITY ('radio') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -. ('.') -object path entity ('checkbox') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('checkbox') WHITE_SPACE (' ') -object path entity ('reset') +OBJECT_PATH_ENTITY ('reset') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -. ('.') -object path entity ('button') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('button') WHITE_SPACE (' ') -object path entity ('select') +OBJECT_PATH_ENTITY ('select') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('label, attributes, options, validation') +ASSIGNMENT_VALUE ('label, attributes, options, validation') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('name, multiple') +ASSIGNMENT_VALUE ('name, multiple') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('validation') +OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showRules') +OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('required') +ASSIGNMENT_VALUE ('required') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('submit') +OBJECT_PATH_ENTITY ('submit') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -. ('.') -object path entity ('button') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('button') WHITE_SPACE (' ') -object path entity ('textarea') +OBJECT_PATH_ENTITY ('textarea') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('label, attributes, validation, filters') +ASSIGNMENT_VALUE ('label, attributes, validation, filters') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('name, cols, rows') +ASSIGNMENT_VALUE ('name, cols, rows') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('filtering') +OBJECT_PATH_ENTITY ('filtering') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showFilters') +OBJECT_PATH_ENTITY ('showFilters') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('alphabetic, alphanumeric, lowercase, regexp, stripnewlines, titlecase, trim, uppercase') +ASSIGNMENT_VALUE ('alphabetic, alphanumeric, lowercase, regexp, stripnewlines, titlecase, trim, uppercase') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('validation') +OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showRules') +OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('alphabetic, alphanumeric, length, regexp, required') +ASSIGNMENT_VALUE ('alphabetic, alphanumeric, length, regexp, required') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('textline') +OBJECT_PATH_ENTITY ('textline') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('label, attributes, validation, filters') +ASSIGNMENT_VALUE ('label, attributes, validation, filters') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('attributes') +OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showProperties') +OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('name') +ASSIGNMENT_VALUE ('name') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('validation') +OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showRules') +OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('alphabetic, alphanumeric, between, date, digit, email, equals, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') +ASSIGNMENT_VALUE ('alphabetic, alphanumeric, between, date, digit, email, equals, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('filtering') +OBJECT_PATH_ENTITY ('filtering') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showFilters') +OBJECT_PATH_ENTITY ('showFilters') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, titlecase, trim, uppercase') +ASSIGNMENT_VALUE ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, titlecase, trim, uppercase') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('checkboxgroup') +OBJECT_PATH_ENTITY ('checkboxgroup') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('legend, options, various, validation') +ASSIGNMENT_VALUE ('legend, options, various, validation') WHITE_SPACE (' ') -object path entity ('accordions') +OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('validation') +OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showRules') +OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('required') +ASSIGNMENT_VALUE ('required') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('email') +OBJECT_PATH_ENTITY ('email') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -. ('.') -object path entity ('textline') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('textline') WHITE_SPACE (' ') -object path entity ('header') +OBJECT_PATH_ENTITY ('header') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('various') +ASSIGNMENT_VALUE ('various') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('textblock') +OBJECT_PATH_ENTITY ('textblock') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('various') +ASSIGNMENT_VALUE ('various') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('name') +OBJECT_PATH_ENTITY ('name') WHITE_SPACE (' ') -{ ('{') +CODE_BLOCK_OPEN ('{') WHITE_SPACE (' ') -object path entity ('showAccordions') +OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') -= ('=') +ASSIGN ('=') WHITE_SPACE (' ') -assignment value ('legend, various') +ASSIGNMENT_VALUE ('legend, various') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -object path entity ('radiogroup') +OBJECT_PATH_ENTITY ('radiogroup') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -. ('.') -object path entity ('checkboxgroup') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('checkboxgroup') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') -} ('}') +CODE_BLOCK_CLOSE ('}') WHITE_SPACE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/include.test.expected b/testData/typoscript/lexer/include.test.expected index 91ee0fbcb655..056fd5b80bb0 100644 --- a/testData/typoscript/lexer/include.test.expected +++ b/testData/typoscript/lexer/include.test.expected @@ -1,21 +1,21 @@ -include ('') +INCLUDE ('') WHITE_SPACE (' ') -include ('') +INCLUDE ('') WHITE_SPACE (' ') -include (' t = 8') +INCLUDE (' t = 8') WHITE_SPACE (' ') -include ('<') +INCLUDE ('<') WHITE_SPACE (' ') -include ('< INCLsome strange text>') +INCLUDE ('< INCLsome strange text>') WHITE_SPACE (' ') -include ('< f = 34') +INCLUDE ('< f = 34') WHITE_SPACE (' ') -include ('< fff.dsfs') +INCLUDE ('< fff.dsfs') WHITE_SPACE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/multilineValue.test.expected b/testData/typoscript/lexer/multilineValue.test.expected index af3984ec8846..6a7dfa54f3bd 100644 --- a/testData/typoscript/lexer/multilineValue.test.expected +++ b/testData/typoscript/lexer/multilineValue.test.expected @@ -1,56 +1,56 @@ -object path entity ('myObject') -( ('(') +OBJECT_PATH_ENTITY ('myObject') +MULTILINE_OPEN ('(') WHITE_SPACE (' ') -multiline value ('some value') +MULTILINE_VALUE ('some value') WHITE_SPACE (' ') -) (')') +MULTILINE_CLOSE (')') WHITE_SPACE (' ') -object path entity ('myObject') -. ('.') -object path entity ('nextProperty') +OBJECT_PATH_ENTITY ('myObject') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('nextProperty') WHITE_SPACE (' ') -( ('(') -ignored text ('ignored text') +MULTILINE_OPEN ('(') +IGNORED_TEXT ('IGNORED_TEXT') WHITE_SPACE (' ') -multiline value ('some other value ))') +MULTILINE_VALUE ('some other value ))') WHITE_SPACE (' ') -multiline value ('and one more string with provocations{') +MULTILINE_VALUE ('and one more string with provocations{') WHITE_SPACE (' ') -multiline value ('[GLOBAL]') +MULTILINE_VALUE ('[GLOBAL]') WHITE_SPACE (' ') -multiline value ('}') +MULTILINE_VALUE ('}') WHITE_SPACE (' ') -) (')') +MULTILINE_CLOSE (')') WHITE_SPACE (' ') -object path entity ('myObject3') +OBJECT_PATH_ENTITY ('myObject3') WHITE_SPACE (' ') -( ('(') +MULTILINE_OPEN ('(') WHITE_SPACE (' ') -multiline value ('prop{') +MULTILINE_VALUE ('prop{') WHITE_SPACE (' ') -multiline value ('p1 = 2') +MULTILINE_VALUE ('p1 = 2') WHITE_SPACE (' ') -multiline value ('p4 = 5') +MULTILINE_VALUE ('p4 = 5') WHITE_SPACE (' ') -multiline value ('}') +MULTILINE_VALUE ('}') WHITE_SPACE (' ') -) (')') -ignored text ('also ignored text') +MULTILINE_CLOSE (')') +IGNORED_TEXT ('also IGNORED_TEXT') WHITE_SPACE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/multilineValue.test.ts b/testData/typoscript/lexer/multilineValue.test.ts index fd10b7fe1df4..01f5ba5c97e4 100644 --- a/testData/typoscript/lexer/multilineValue.test.ts +++ b/testData/typoscript/lexer/multilineValue.test.ts @@ -2,7 +2,7 @@ myObject( some value ) -myObject.nextProperty (ignored text +myObject.nextProperty (IGNORED_TEXT some other value )) and one more string with provocations{ [GLOBAL] @@ -14,4 +14,4 @@ myObject3 ( p1 = 2 p4 = 5 } -)also ignored text +)also IGNORED_TEXT diff --git a/testData/typoscript/lexer/objectPaths.test.expected b/testData/typoscript/lexer/objectPaths.test.expected index bf176b0d790e..6651b8f7ae25 100644 --- a/testData/typoscript/lexer/objectPaths.test.expected +++ b/testData/typoscript/lexer/objectPaths.test.expected @@ -1,49 +1,49 @@ -object path entity ('myObject') -. ('.') -object path entity ('prop1') -. ('.') -object path entity ('prop2') -. ('.') -object path entity ('prop3') -. ('.') -object path entity ('prop4') -. ('.') -object path entity ('prop5') +OBJECT_PATH_ENTITY ('myObject') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('prop1') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('prop2') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('prop3') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('prop4') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('prop5') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -object path entity ('otherObject') -. ('.') -object path entity ('prop') +OBJECT_PATH_ENTITY ('otherObject') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('prop') WHITE_SPACE (' ') -. ('.') -object path entity ('10') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('10') WHITE_SPACE (' ') -> ('>') -ignored text (' not.a.path') +UNSET ('>') +IGNORED_TEXT (' not.a.path') WHITE_SPACE (' ') -object path entity ('9path') -. ('.') +OBJECT_PATH_ENTITY ('9path') +OBJECT_PATH_SEPARATOR ('.') BAD_CHARACTER ('%') -object path entity ('BAD_SYMBOL') +OBJECT_PATH_ENTITY ('BAD_SYMBOL') BAD_CHARACTER ('%') -. ('.') -object path entity ('prop') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('prop') WHITE_SPACE (' ') -< ('<') +COPY ('<') WHITE_SPACE (' ') -object path entity ('not') +OBJECT_PATH_ENTITY ('not') WHITE_SPACE (' ') -object path entity ('a') +OBJECT_PATH_ENTITY ('a') WHITE_SPACE (' ') -object path entity ('path') -. ('.') -object path entity ('because') -. ('.') -object path entity ('of') -. ('.') -object path entity ('spaces') +OBJECT_PATH_ENTITY ('path') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('because') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('of') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('spaces') WHITE_SPACE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/sharpComment.test.expected b/testData/typoscript/lexer/sharpComment.test.expected index d09766766b08..de03073294f6 100644 --- a/testData/typoscript/lexer/sharpComment.test.expected +++ b/testData/typoscript/lexer/sharpComment.test.expected @@ -1 +1 @@ -one line comment ('#CommentText') \ No newline at end of file +ONE_LINE_COMMENT ('#CommentText') \ No newline at end of file diff --git a/testData/typoscript/lexer/simpleAssignment.test.expected b/testData/typoscript/lexer/simpleAssignment.test.expected index 28fa7f86f067..c403ec0be579 100644 --- a/testData/typoscript/lexer/simpleAssignment.test.expected +++ b/testData/typoscript/lexer/simpleAssignment.test.expected @@ -1,3 +1,3 @@ -object path entity ('myObject') -= ('=') -assignment value ('[value 1]') \ No newline at end of file +OBJECT_PATH_ENTITY ('myObject') +ASSIGN ('=') +ASSIGNMENT_VALUE ('[value 1]') \ No newline at end of file diff --git a/testData/typoscript/lexer/singleLineComments.test.expected b/testData/typoscript/lexer/singleLineComments.test.expected index f5a8630e586f..4e942cd0a466 100644 --- a/testData/typoscript/lexer/singleLineComments.test.expected +++ b/testData/typoscript/lexer/singleLineComments.test.expected @@ -1,28 +1,28 @@ -one line comment ('#CommentText') +ONE_LINE_COMMENT ('#CommentText') WHITE_SPACE (' ') -one line comment ('/ another comment') +ONE_LINE_COMMENT ('/ another comment') WHITE_SPACE (' ') -one line comment ('/third comment for test') +ONE_LINE_COMMENT ('/third comment for test') WHITE_SPACE (' ') -one line comment ('#fourth comment') +ONE_LINE_COMMENT ('#fourth comment') WHITE_SPACE (' ') -one line comment ('# the fifth comment') +ONE_LINE_COMMENT ('# the fifth comment') WHITE_SPACE (' ') -one line comment ('#sixth comment') +ONE_LINE_COMMENT ('#sixth comment') WHITE_SPACE (' ') -one line comment ('/seventh') +ONE_LINE_COMMENT ('/seventh') WHITE_SPACE (' ') -one line comment ('/and one more comment') +ONE_LINE_COMMENT ('/and one more comment') WHITE_SPACE (' ') -one line comment ('// must be single comment') +ONE_LINE_COMMENT ('// must be single comment') diff --git a/testData/typoscript/lexer/slashComment.test.expected b/testData/typoscript/lexer/slashComment.test.expected index e987dbc92b43..ddb2f1ca8478 100644 --- a/testData/typoscript/lexer/slashComment.test.expected +++ b/testData/typoscript/lexer/slashComment.test.expected @@ -1 +1 @@ -one line comment ('/CommentText') \ No newline at end of file +ONE_LINE_COMMENT ('/CommentText') \ No newline at end of file diff --git a/testData/typoscript/lexer/unsettingOperator.test.expected b/testData/typoscript/lexer/unsettingOperator.test.expected index 5893eab0015c..8ba591b81fdf 100644 --- a/testData/typoscript/lexer/unsettingOperator.test.expected +++ b/testData/typoscript/lexer/unsettingOperator.test.expected @@ -1,18 +1,18 @@ WHITE_SPACE (' ') -object path entity ('myObject') +OBJECT_PATH_ENTITY ('myObject') WHITE_SPACE (' ') -> ('>') +UNSET ('>') WHITE_SPACE (' ') -object path entity ('object') +OBJECT_PATH_ENTITY ('object') WHITE_SPACE (' ') -> ('>') -ignored text (' some irrelevant text') +UNSET ('>') +IGNORED_TEXT (' some irrelevant text') WHITE_SPACE (' ') -object path entity ('nextObjext') -. ('.') -object path entity ('secondProperty') +OBJECT_PATH_ENTITY ('nextObjext') +OBJECT_PATH_SEPARATOR ('.') +OBJECT_PATH_ENTITY ('secondProperty') WHITE_SPACE (' ') -> ('>') -ignored text (' [GLOBAL] {test=3} (value)') \ No newline at end of file +UNSET ('>') +IGNORED_TEXT (' [GLOBAL] {test=3} (value)') \ No newline at end of file diff --git a/testData/typoscript/lexer/valueModificationOperator.test.expected b/testData/typoscript/lexer/valueModificationOperator.test.expected index 80af8418da33..55ab9233d70f 100644 --- a/testData/typoscript/lexer/valueModificationOperator.test.expected +++ b/testData/typoscript/lexer/valueModificationOperator.test.expected @@ -1,53 +1,53 @@ -object path entity ('value1') -:= (':=') -modification function ('addToList') -modification ( ('(') -modification value ('4,5') -modification ) (')') +OBJECT_PATH_ENTITY ('value1') +MODIFY (':=') +MODIFICATION_FUNCTION ('addToList') +MODIFICATION_OPEN ('(') +MODIFICATION_VALUE ('4,5') +MODIFICATION_CLOSE (')') WHITE_SPACE (' ') -object path entity ('value2') -:= (':=') -modification function ('addToList') -modification ( ('(') -modification value ('4,5') +OBJECT_PATH_ENTITY ('value2') +MODIFY (':=') +MODIFICATION_FUNCTION ('addToList') +MODIFICATION_OPEN ('(') +MODIFICATION_VALUE ('4,5') WHITE_SPACE (' ') -object path entity ('value3') -:= (':=') -modification ( ('(') +OBJECT_PATH_ENTITY ('value3') +MODIFY (':=') +MODIFICATION_OPEN ('(') WHITE_SPACE (' ') -modification value ('4 and some text') +MODIFICATION_VALUE ('4 and some text') WHITE_SPACE (' ') -modification ) (')') +MODIFICATION_CLOSE (')') WHITE_SPACE (' ') -object path entity ('value4') +OBJECT_PATH_ENTITY ('value4') BAD_CHARACTER (':') WHITE_SPACE (' ') -object path entity ('value5') -:= (':=') -modification function ('add To My List') +OBJECT_PATH_ENTITY ('value5') +MODIFY (':=') +MODIFICATION_FUNCTION ('add To My List') WHITE_SPACE (' ') -modification ( ('(') +MODIFICATION_OPEN ('(') WHITE_SPACE (' ') -modification value ('4,5') -modification ) (')') +MODIFICATION_VALUE ('4,5') +MODIFICATION_CLOSE (')') WHITE_SPACE (' ') -object path entity ('value6') -:= (':=') -modification function ('add To My List') -modification ( ('(') -modification value ('4,5') -modification ) (')') -ignored text (' some ignored text') +OBJECT_PATH_ENTITY ('value6') +MODIFY (':=') +MODIFICATION_FUNCTION ('add To My List') +MODIFICATION_OPEN ('(') +MODIFICATION_VALUE ('4,5') +MODIFICATION_CLOSE (')') +IGNORED_TEXT (' some IGNORED_TEXT') WHITE_SPACE (' ') -object path entity ('value7') +OBJECT_PATH_ENTITY ('value7') BAD_CHARACTER (':') WHITE_SPACE (' ') -object path entity ('addToList') -( ('(') -ignored text (' ,5)') \ No newline at end of file +OBJECT_PATH_ENTITY ('addToList') +MULTILINE_OPEN ('(') +IGNORED_TEXT (' ,5)') \ No newline at end of file diff --git a/testData/typoscript/lexer/valueModificationOperator.test.ts b/testData/typoscript/lexer/valueModificationOperator.test.ts index ce6071e38318..defa66046b0c 100644 --- a/testData/typoscript/lexer/valueModificationOperator.test.ts +++ b/testData/typoscript/lexer/valueModificationOperator.test.ts @@ -3,5 +3,5 @@ value2:=addToList(4,5 value3:=( 4 and some text ) value4: value5:=add To My List ( 4,5) -value6:=add To My List(4,5) some ignored text +value6:=add To My List(4,5) some IGNORED_TEXT value7: addToList( ,5) \ No newline at end of file diff --git a/typoScript.iml b/typoScript.iml index 7541cd0e9cf5..317dff3cd775 100644 --- a/typoScript.iml +++ b/typoScript.iml @@ -5,6 +5,7 @@ + From 5741aa7cc4a532d5106e045f4ac0a4a08e187572 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Thu, 12 Apr 2012 18:56:47 +0400 Subject: [PATCH 005/147] TypoScript highlighting config and generated parser base --- .../lang/TypoScriptElementTypes.java | 58 ++ .../lang/TypoScriptGeneratedParser.java | 473 ++++++++++++ .../typoscript/lang/psi/Assignment.java | 10 + .../typoscript/lang/psi/CodeBlock.java | 31 + .../typoscript/lang/psi/ConditionElement.java | 10 + .../typoscript/lang/psi/Copying.java | 13 + .../lang/psi/IncludeStatementElement.java | 10 + .../lang/psi/MultilineValueAssignment.java | 10 + .../typoscript/lang/psi/ObjectPath.java | 10 + .../lang/psi/OneLineCommentElement.java | 10 + .../typoscript/lang/psi/Unsetting.java | 10 + .../lang/psi/ValueModification.java | 10 + .../lang/psi/impl/AssignmentImpl.java | 19 + .../lang/psi/impl/CodeBlockImpl.java | 61 ++ .../lang/psi/impl/ConditionElementImpl.java | 19 + .../typoscript/lang/psi/impl/CopyingImpl.java | 25 + .../psi/impl/IncludeStatementElementImpl.java | 19 + .../impl/MultilineValueAssignmentImpl.java | 19 + .../lang/psi/impl/ObjectPathImpl.java | 19 + .../psi/impl/OneLineCommentElementImpl.java | 19 + .../lang/psi/impl/UnsettingImpl.java | 19 + .../lang/psi/impl/ValueModificationImpl.java | 19 + resources/icons/typo3.png | Bin 0 -> 457 bytes .../messages/TypoScriptBundle.properties | 11 + src/META-INF/plugin.xml | 3 + .../typoscript/TypoScriptBundle.java | 36 + .../lang/GeneratedParserUtilBase.java | 690 ++++++++++++++++++ .../jetbrains/typoscript/lang/TypoScript.bnf | 62 +- .../lang/TypoScriptParserDefinition.java | 71 ++ .../typoscript/lang/TypoScriptParserUtil.java | 8 + .../typoscript/lang/TypoScriptTokenTypes.java | 14 +- .../TypoScriptColorsAndFontsPage.java | 100 +++ .../TypoScriptHighlightingData.java | 8 +- .../lang/psi/TypoScriptCompositeElement.java | 12 + .../psi/TypoScriptCompositeElementImpl.java | 22 + .../typoscript/lang/psi/TypoScriptFile.java | 30 + typoScript.iml | 2 + 37 files changed, 1916 insertions(+), 46 deletions(-) create mode 100644 gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java create mode 100644 gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/Assignment.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/Copying.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/OneLineCommentElement.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/Unsetting.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/ValueModification.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/OneLineCommentElementImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java create mode 100644 resources/icons/typo3.png create mode 100644 src/com/jetbrains/typoscript/TypoScriptBundle.java create mode 100644 src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java create mode 100644 src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java create mode 100644 src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java create mode 100644 src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java create mode 100644 src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java diff --git a/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java b/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java new file mode 100644 index 000000000000..a12f39c6fa92 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java @@ -0,0 +1,58 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang; + +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.PsiElement; +import com.intellij.lang.ASTNode; +import com.jetbrains.typoscript.lang.psi.impl.*; + +public interface TypoScriptElementTypes { + + IElementType ASSIGNMENT = new TypoScriptTokenType("ASSIGNMENT"); + IElementType CODE_BLOCK = new TypoScriptTokenType("CODE_BLOCK"); + IElementType CONDITION_ELEMENT = new TypoScriptTokenType("CONDITION_ELEMENT"); + IElementType COPYING = new TypoScriptTokenType("COPYING"); + IElementType INCLUDE_STATEMENT_ELEMENT = new TypoScriptTokenType("INCLUDE_STATEMENT_ELEMENT"); + IElementType MULTILINE_VALUE_ASSIGNMENT = new TypoScriptTokenType("MULTILINE_VALUE_ASSIGNMENT"); + IElementType OBJECT_PATH = new TypoScriptTokenType("OBJECT_PATH"); + IElementType ONE_LINE_COMMENT_ELEMENT = new TypoScriptTokenType("ONE_LINE_COMMENT_ELEMENT"); + IElementType UNSETTING = new TypoScriptTokenType("UNSETTING"); + IElementType VALUE_MODIFICATION = new TypoScriptTokenType("VALUE_MODIFICATION"); + + class Factory { + public static PsiElement createElement(ASTNode node) { + IElementType type = node.getElementType(); + if (type == ASSIGNMENT) { + return new AssignmentImpl(node); + } + else if (type == CODE_BLOCK) { + return new CodeBlockImpl(node); + } + else if (type == CONDITION_ELEMENT) { + return new ConditionElementImpl(node); + } + else if (type == COPYING) { + return new CopyingImpl(node); + } + else if (type == INCLUDE_STATEMENT_ELEMENT) { + return new IncludeStatementElementImpl(node); + } + else if (type == MULTILINE_VALUE_ASSIGNMENT) { + return new MultilineValueAssignmentImpl(node); + } + else if (type == OBJECT_PATH) { + return new ObjectPathImpl(node); + } + else if (type == ONE_LINE_COMMENT_ELEMENT) { + return new OneLineCommentElementImpl(node); + } + else if (type == UNSETTING) { + return new UnsettingImpl(node); + } + else if (type == VALUE_MODIFICATION) { + return new ValueModificationImpl(node); + } + throw new AssertionError("Unknown element type: " + type); + } + } +} diff --git a/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java b/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java new file mode 100644 index 000000000000..d7926c4b54cc --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java @@ -0,0 +1,473 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang; + +import org.jetbrains.annotations.*; +import com.intellij.lang.LighterASTNode; +import com.intellij.lang.PsiBuilder; +import com.intellij.lang.PsiBuilder.Marker; +import com.intellij.openapi.diagnostic.Logger; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import static com.jetbrains.typoscript.lang.TypoScriptParserUtil.*; +import com.intellij.psi.tree.IElementType; +import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.TokenSet; +import com.intellij.lang.PsiParser; +import static com.jetbrains.typoscript.lang.TypoScriptTokenTypes.*; + +@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"}) +public class TypoScriptGeneratedParser implements PsiParser { + + public static Logger LOG_ = Logger.getInstance("com.jetbrains.typoscript.lang.TypoScriptGeneratedParser"); + + @NotNull + public ASTNode parse(final IElementType root_, final PsiBuilder builder_) { + int level_ = 0; + boolean result_; + if (root_ == ASSIGNMENT) { + result_ = assignment(builder_, level_ + 1); + } + else if (root_ == CODE_BLOCK) { + result_ = code_block(builder_, level_ + 1); + } + else if (root_ == CONDITION_ELEMENT) { + result_ = condition_element(builder_, level_ + 1); + } + else if (root_ == COPYING) { + result_ = copying(builder_, level_ + 1); + } + else if (root_ == INCLUDE_STATEMENT_ELEMENT) { + result_ = include_statement_element(builder_, level_ + 1); + } + else if (root_ == MULTILINE_VALUE_ASSIGNMENT) { + result_ = multiline_value_assignment(builder_, level_ + 1); + } + else if (root_ == OBJECT_PATH) { + result_ = object_path(builder_, level_ + 1); + } + else if (root_ == ONE_LINE_COMMENT_ELEMENT) { + result_ = one_line_comment_element(builder_, level_ + 1); + } + else if (root_ == UNSETTING) { + result_ = unsetting(builder_, level_ + 1); + } + else if (root_ == VALUE_MODIFICATION) { + result_ = value_modification(builder_, level_ + 1); + } + else { + Marker marker_ = builder_.mark(); + result_ = c_style_comment_element(builder_, level_ + 1); + while (builder_.getTokenType() != null) { + builder_.advanceLexer(); + } + marker_.done(root_); + } + return builder_.getTreeBuilt(); + } + + /* ********************************************************** */ + // ASSIGNMENT ASSIGNMENT_VALUE + public static boolean assignment(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "assignment")) return false; + if (!nextTokenIs(builder_, ASSIGNMENT)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, ASSIGNMENT); + result_ = result_ && consumeToken(builder_, ASSIGNMENT_VALUE); + if (result_) { + marker_.done(ASSIGNMENT); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + /* ********************************************************** */ + // C_STYLE_COMMENT + static boolean c_style_comment_element(PsiBuilder builder_, int level_) { + return consumeToken(builder_, C_STYLE_COMMENT); + } + + /* ********************************************************** */ + // object_path CODE_BLOCK_OPERATOR_BEGIN IGNORED_TEXT? (internal_expression)* CODE_BLOCK_OPERATOR_END IGNORED_TEXT? + public static boolean code_block(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "code_block")) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = object_path(builder_, level_ + 1); + result_ = result_ && consumeToken(builder_, CODE_BLOCK_OPERATOR_BEGIN); + result_ = result_ && code_block_2(builder_, level_ + 1); + result_ = result_ && code_block_3(builder_, level_ + 1); + result_ = result_ && consumeToken(builder_, CODE_BLOCK_OPERATOR_END); + result_ = result_ && code_block_5(builder_, level_ + 1); + if (result_) { + marker_.done(CODE_BLOCK); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + // IGNORED_TEXT? + private static boolean code_block_2(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "code_block_2")) return false; + consumeToken(builder_, IGNORED_TEXT); + return true; + } + + // (internal_expression)* + private static boolean code_block_3(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "code_block_3")) return false; + int offset_ = builder_.getCurrentOffset(); + while (true) { + if (!code_block_3_0(builder_, level_ + 1)) break; + int next_offset_ = builder_.getCurrentOffset(); + if (offset_ == next_offset_) { + empty_element_parsed_guard_(builder_, offset_, "code_block_3"); + break; + } + offset_ = next_offset_; + } + return true; + } + + // (internal_expression) + private static boolean code_block_3_0(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "code_block_3_0")) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = internal_expression(builder_, level_ + 1); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + return result_; + } + + // IGNORED_TEXT? + private static boolean code_block_5(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "code_block_5")) return false; + consumeToken(builder_, IGNORED_TEXT); + return true; + } + + /* ********************************************************** */ + // CONDITION + public static boolean condition_element(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "condition_element")) return false; + if (!nextTokenIs(builder_, CONDITION)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, CONDITION); + if (result_) { + marker_.done(CONDITION_ELEMENT); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + /* ********************************************************** */ + // COPYING_OPERATOR object_path + public static boolean copying(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "copying")) return false; + if (!nextTokenIs(builder_, COPYING_OPERATOR)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, COPYING_OPERATOR); + result_ = result_ && object_path(builder_, level_ + 1); + if (result_) { + marker_.done(COPYING); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + /* ********************************************************** */ + // ONE_LINE_COMMENT + public static boolean include_statement_element(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "include_statement_element")) return false; + if (!nextTokenIs(builder_, ONE_LINE_COMMENT)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, ONE_LINE_COMMENT); + if (result_) { + marker_.done(INCLUDE_STATEMENT_ELEMENT); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + /* ********************************************************** */ + // internal_object_path { assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block} + static boolean internal_expression(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "internal_expression")) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = internal_object_path(builder_, level_ + 1); + result_ = result_ && internal_expression_1(builder_, level_ + 1); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + return result_; + } + + // { assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block} + private static boolean internal_expression_1(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "internal_expression_1")) return false; + return internal_expression_1_0(builder_, level_ + 1); + } + + // assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block + private static boolean internal_expression_1_0(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "internal_expression_1_0")) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = assignment(builder_, level_ + 1); + if (!result_) result_ = value_modification(builder_, level_ + 1); + if (!result_) result_ = multiline_value_assignment(builder_, level_ + 1); + if (!result_) result_ = copying(builder_, level_ + 1); + if (!result_) result_ = unsetting(builder_, level_ + 1); + if (!result_) result_ = code_block(builder_, level_ + 1); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + return result_; + } + + /* ********************************************************** */ + // object_path | OBJECT_PATH_SEPARATOR object_path + static boolean internal_object_path(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "internal_object_path")) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = object_path(builder_, level_ + 1); + if (!result_) result_ = internal_object_path_1(builder_, level_ + 1); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + return result_; + } + + // OBJECT_PATH_SEPARATOR object_path + private static boolean internal_object_path_1(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "internal_object_path_1")) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, OBJECT_PATH_SEPARATOR); + result_ = result_ && object_path(builder_, level_ + 1); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + return result_; + } + + /* ********************************************************** */ + // MULTILINE_VALUE_OPERATOR_BEGIN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_VALUE_OPERATOR_END IGNORED_TEXT? + public static boolean multiline_value_assignment(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment")) return false; + if (!nextTokenIs(builder_, MULTILINE_VALUE_OPERATOR_BEGIN)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, MULTILINE_VALUE_OPERATOR_BEGIN); + result_ = result_ && multiline_value_assignment_1(builder_, level_ + 1); + result_ = result_ && multiline_value_assignment_2(builder_, level_ + 1); + result_ = result_ && consumeToken(builder_, MULTILINE_VALUE_OPERATOR_END); + result_ = result_ && multiline_value_assignment_4(builder_, level_ + 1); + if (result_) { + marker_.done(MULTILINE_VALUE_ASSIGNMENT); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + // IGNORED_TEXT? + private static boolean multiline_value_assignment_1(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment_1")) return false; + consumeToken(builder_, IGNORED_TEXT); + return true; + } + + // (MULTILINE_VALUE)* + private static boolean multiline_value_assignment_2(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment_2")) return false; + int offset_ = builder_.getCurrentOffset(); + while (true) { + if (!multiline_value_assignment_2_0(builder_, level_ + 1)) break; + int next_offset_ = builder_.getCurrentOffset(); + if (offset_ == next_offset_) { + empty_element_parsed_guard_(builder_, offset_, "multiline_value_assignment_2"); + break; + } + offset_ = next_offset_; + } + return true; + } + + // (MULTILINE_VALUE) + private static boolean multiline_value_assignment_2_0(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment_2_0")) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, MULTILINE_VALUE); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + return result_; + } + + // IGNORED_TEXT? + private static boolean multiline_value_assignment_4(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment_4")) return false; + consumeToken(builder_, IGNORED_TEXT); + return true; + } + + /* ********************************************************** */ + // OBJECT_PATH_ENTITY (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY)* + public static boolean object_path(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "object_path")) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, OBJECT_PATH_ENTITY); + result_ = result_ && object_path_1(builder_, level_ + 1); + if (result_) { + marker_.done(OBJECT_PATH); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + // (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY)* + private static boolean object_path_1(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "object_path_1")) return false; + int offset_ = builder_.getCurrentOffset(); + while (true) { + if (!object_path_1_0(builder_, level_ + 1)) break; + int next_offset_ = builder_.getCurrentOffset(); + if (offset_ == next_offset_) { + empty_element_parsed_guard_(builder_, offset_, "object_path_1"); + break; + } + offset_ = next_offset_; + } + return true; + } + + // (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY) + private static boolean object_path_1_0(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "object_path_1_0")) return false; + return object_path_1_0_0(builder_, level_ + 1); + } + + // OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY + private static boolean object_path_1_0_0(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "object_path_1_0_0")) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, OBJECT_PATH_SEPARATOR); + result_ = result_ && consumeToken(builder_, OBJECT_PATH_ENTITY); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + return result_; + } + + /* ********************************************************** */ + // ONE_LINE_COMMENT + public static boolean one_line_comment_element(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "one_line_comment_element")) return false; + if (!nextTokenIs(builder_, ONE_LINE_COMMENT)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, ONE_LINE_COMMENT); + if (result_) { + marker_.done(ONE_LINE_COMMENT_ELEMENT); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + /* ********************************************************** */ + // UNSETTING_OPERATOR IGNORED_TEXT? + public static boolean unsetting(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "unsetting")) return false; + if (!nextTokenIs(builder_, UNSETTING_OPERATOR)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, UNSETTING_OPERATOR); + result_ = result_ && unsetting_1(builder_, level_ + 1); + if (result_) { + marker_.done(UNSETTING); + } + else { + marker_.rollbackTo(); + } + return result_; + } + + // IGNORED_TEXT? + private static boolean unsetting_1(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "unsetting_1")) return false; + consumeToken(builder_, IGNORED_TEXT); + return true; + } + + /* ********************************************************** */ + // MODIFICATION_OPERATOR MODIFICATION_OPERATOR_FUNCTION MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN MODIFICATION_OPERATOR_FUNCTION_ARGUMENT MODIFICATION_OPERATOR_FUNCTION_PARAM_END + public static boolean value_modification(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "value_modification")) return false; + if (!nextTokenIs(builder_, MODIFICATION_OPERATOR)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, MODIFICATION_OPERATOR); + result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION); + result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN); + result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_ARGUMENT); + result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_PARAM_END); + if (result_) { + marker_.done(VALUE_MODIFICATION); + } + else { + marker_.rollbackTo(); + } + return result_; + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/Assignment.java b/gen/com/jetbrains/typoscript/lang/psi/Assignment.java new file mode 100644 index 000000000000..e7f31136c799 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/Assignment.java @@ -0,0 +1,10 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface Assignment extends TypoScriptCompositeElement { + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java b/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java new file mode 100644 index 000000000000..e07e2e1f4ebe --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java @@ -0,0 +1,31 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface CodeBlock extends TypoScriptCompositeElement { + + @NotNull + List getAssignmentList(); + + @NotNull + List getCodeBlockList(); + + @NotNull + List getCopyingList(); + + @NotNull + List getMultilineValueAssignmentList(); + + @NotNull + List getObjectPathList(); + + @NotNull + List getUnsettingList(); + + @NotNull + List getValueModificationList(); + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java b/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java new file mode 100644 index 000000000000..d63ba4cc14b4 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java @@ -0,0 +1,10 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface ConditionElement extends TypoScriptCompositeElement { + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/Copying.java b/gen/com/jetbrains/typoscript/lang/psi/Copying.java new file mode 100644 index 000000000000..4f2b03aeb0c7 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/Copying.java @@ -0,0 +1,13 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface Copying extends TypoScriptCompositeElement { + + @NotNull + ObjectPath getObjectPath(); + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java b/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java new file mode 100644 index 000000000000..7a060927f2f1 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java @@ -0,0 +1,10 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface IncludeStatementElement extends TypoScriptCompositeElement { + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java b/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java new file mode 100644 index 000000000000..286032f9a618 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java @@ -0,0 +1,10 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface MultilineValueAssignment extends TypoScriptCompositeElement { + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java b/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java new file mode 100644 index 000000000000..ea3716877430 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java @@ -0,0 +1,10 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface ObjectPath extends TypoScriptCompositeElement { + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/OneLineCommentElement.java b/gen/com/jetbrains/typoscript/lang/psi/OneLineCommentElement.java new file mode 100644 index 000000000000..7e6a3e12c234 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/OneLineCommentElement.java @@ -0,0 +1,10 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface OneLineCommentElement extends TypoScriptCompositeElement { + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java b/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java new file mode 100644 index 000000000000..75c1a0b4bd26 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java @@ -0,0 +1,10 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface Unsetting extends TypoScriptCompositeElement { + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java b/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java new file mode 100644 index 000000000000..7879d909ff96 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java @@ -0,0 +1,10 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface ValueModification extends TypoScriptCompositeElement { + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java new file mode 100644 index 000000000000..146d403d0070 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java @@ -0,0 +1,19 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class AssignmentImpl extends TypoScriptCompositeElementImpl implements Assignment { + + public AssignmentImpl(ASTNode node) { + super(node); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java new file mode 100644 index 000000000000..62b69444aa63 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java @@ -0,0 +1,61 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class CodeBlockImpl extends TypoScriptCompositeElementImpl implements CodeBlock { + + public CodeBlockImpl(ASTNode node) { + super(node); + } + + @Override + @NotNull + public List getAssignmentList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, Assignment.class); + } + + @Override + @NotNull + public List getCodeBlockList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, CodeBlock.class); + } + + @Override + @NotNull + public List getCopyingList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, Copying.class); + } + + @Override + @NotNull + public List getMultilineValueAssignmentList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, MultilineValueAssignment.class); + } + + @Override + @NotNull + public List getObjectPathList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, ObjectPath.class); + } + + @Override + @NotNull + public List getUnsettingList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, Unsetting.class); + } + + @Override + @NotNull + public List getValueModificationList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, ValueModification.class); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java new file mode 100644 index 000000000000..5387bde61c46 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java @@ -0,0 +1,19 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class ConditionElementImpl extends TypoScriptCompositeElementImpl implements ConditionElement { + + public ConditionElementImpl(ASTNode node) { + super(node); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java new file mode 100644 index 000000000000..dafeea983840 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java @@ -0,0 +1,25 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class CopyingImpl extends TypoScriptCompositeElementImpl implements Copying { + + public CopyingImpl(ASTNode node) { + super(node); + } + + @Override + @NotNull + public ObjectPath getObjectPath() { + return findNotNullChildByClass(ObjectPath.class); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java new file mode 100644 index 000000000000..bf32d4592802 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java @@ -0,0 +1,19 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class IncludeStatementElementImpl extends TypoScriptCompositeElementImpl implements IncludeStatementElement { + + public IncludeStatementElementImpl(ASTNode node) { + super(node); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java new file mode 100644 index 000000000000..48bcdadedf47 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java @@ -0,0 +1,19 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class MultilineValueAssignmentImpl extends TypoScriptCompositeElementImpl implements MultilineValueAssignment { + + public MultilineValueAssignmentImpl(ASTNode node) { + super(node); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java new file mode 100644 index 000000000000..b1f7f017e0cd --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java @@ -0,0 +1,19 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class ObjectPathImpl extends TypoScriptCompositeElementImpl implements ObjectPath { + + public ObjectPathImpl(ASTNode node) { + super(node); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/OneLineCommentElementImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/OneLineCommentElementImpl.java new file mode 100644 index 000000000000..8e4ec4f695a6 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/OneLineCommentElementImpl.java @@ -0,0 +1,19 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class OneLineCommentElementImpl extends TypoScriptCompositeElementImpl implements OneLineCommentElement { + + public OneLineCommentElementImpl(ASTNode node) { + super(node); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java new file mode 100644 index 000000000000..4f0a54fc28cd --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java @@ -0,0 +1,19 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class UnsettingImpl extends TypoScriptCompositeElementImpl implements Unsetting { + + public UnsettingImpl(ASTNode node) { + super(node); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java new file mode 100644 index 000000000000..4c6a182a9bef --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java @@ -0,0 +1,19 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; +import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; +import com.jetbrains.typoscript.lang.psi.*; + +public class ValueModificationImpl extends TypoScriptCompositeElementImpl implements ValueModification { + + public ValueModificationImpl(ASTNode node) { + super(node); + } + +} diff --git a/resources/icons/typo3.png b/resources/icons/typo3.png new file mode 100644 index 0000000000000000000000000000000000000000..a1bb420cc382ac8e7cf648d60c169992e73c549e GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZWUgpAgso z|NsB_^77Az2Y(*!{d0HopF11=TwC({@|@LAj{iPCWzPM*zm7LeySMZAk*Z$@ihk|O zZN9#?{`%@)JCiD}F8{SHviS1iyh{syt@p~fFz44A=hXAF;?GX|x!mIC5<~mL4Z_<} zxHiYLZi->p5MiWKQUtVAxg^Lhm;q=j0kGsla34@PXMsm#F#`kF2M}g-T4OQ;C@53n z8c`CQpH@P$~SnrIEF|}E$zK6)MUWp5`IK!fx?5ew+c@FuV3P+rNKXErr+-L zO}q;%EVoyeZ`^QN%fD!|!Kw^Tiv@uPc_(CE>vU|L=5ysh^rwbbb?=~D|=ZoQ)(rzj9 Q3g{LFPgg&ebxsLQ0P~8~lK=n! literal 0 HcmV?d00001 diff --git a/resources/messages/TypoScriptBundle.properties b/resources/messages/TypoScriptBundle.properties index e69de29bb2d1..a331ca79d2fc 100644 --- a/resources/messages/TypoScriptBundle.properties +++ b/resources/messages/TypoScriptBundle.properties @@ -0,0 +1,11 @@ +color.settings.name=TypoScript +color.settings.keyword=Keywords +color.settings.one.line.comment=Line comment +color.settings.multiline.comment=Block comment +color.settings.operator=Operation +color.settings.string=String +color.settings.object.path=Object path element +color.settings.object.path.separator=Dot +color.settings.assigned.value=Assigned value +color.settings.bad.character=Bad character +color.settings.ignored.text=Ignored text \ No newline at end of file diff --git a/src/META-INF/plugin.xml b/src/META-INF/plugin.xml index 266fe7be6394..fa2165bcff62 100644 --- a/src/META-INF/plugin.xml +++ b/src/META-INF/plugin.xml @@ -15,6 +15,9 @@ + + + diff --git a/src/com/jetbrains/typoscript/TypoScriptBundle.java b/src/com/jetbrains/typoscript/TypoScriptBundle.java new file mode 100644 index 000000000000..ecae99849782 --- /dev/null +++ b/src/com/jetbrains/typoscript/TypoScriptBundle.java @@ -0,0 +1,36 @@ +package com.jetbrains.typoscript; + +import com.intellij.CommonBundle; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.PropertyKey; + +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import java.util.ResourceBundle; + +/** + * @author lene + * Date: 12.04.12 + */ +public class TypoScriptBundle { + private static Reference ourBundle; + + @NonNls public static final String TYPOSCRIPT_BUNDLE = "messages.TypoScriptBundle"; + + private TypoScriptBundle() { + } + + public static String message(@PropertyKey(resourceBundle = TYPOSCRIPT_BUNDLE) String key, Object... params) { + return CommonBundle.message(getBundle(), key, params); + } + + private static ResourceBundle getBundle() { + ResourceBundle bundle = null; + if (ourBundle != null) bundle = ourBundle.get(); + if (bundle == null) { + bundle = ResourceBundle.getBundle(TYPOSCRIPT_BUNDLE); + ourBundle = new SoftReference(bundle); + } + return bundle; + } +} diff --git a/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java b/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java new file mode 100644 index 000000000000..fd1e91b3eca1 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java @@ -0,0 +1,690 @@ +package com.jetbrains.typoscript.lang; + + +import com.intellij.lang.*; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.text.StringHash; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.psi.TokenType; +import com.intellij.psi.impl.source.resolve.FileContextUtil; +import com.intellij.psi.impl.source.tree.CompositePsiElement; +import com.intellij.psi.tree.ICompositeElementType; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; +import com.intellij.util.containers.LimitedPool; +import gnu.trove.THashSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedList; + +/** + * @author lene + * Date: 11.04.12 + *

+ * Copied from https://github.com/JetBrains/Grammar-Kit/blob/master/support/org/intellij/grammar/parser/GeneratedParserUtilBase.java + */ +@SuppressWarnings("StringEquality") +public class GeneratedParserUtilBase { + + private static final Logger LOG = Logger.getInstance("org.intellij.grammar.parser.GeneratedParserUtilBase"); + + public static final IElementType DUMMY_BLOCK = new DummyBlockElementType(); + + public interface Parser { + boolean parse(PsiBuilder builder, int level); + } + + public static final Parser TOKEN_ADVANCER = new Parser() { + @Override + public boolean parse(PsiBuilder builder, int level) { + if (builder.eof()) return false; + builder.advanceLexer(); + return true; + } + }; + + public static final Parser TRUE_CONDITION = new Parser() { + @Override + public boolean parse(PsiBuilder builder, int level) { + return true; + } + }; + + public static boolean recursion_guard_(PsiBuilder builder_, int level_, String funcName_) { + if (level_ > 1000) { + builder_.error("Maximum recursion level (" + 1000 + ") reached in " + funcName_); + return false; + } + return true; + } + + public static void empty_element_parsed_guard_(PsiBuilder builder_, int offset_, String funcName_) { + builder_.error("Empty element parsed in " + funcName_ + " at offset " + offset_); + } + + public static boolean invalid_left_marker_guard_(PsiBuilder builder_, PsiBuilder.Marker marker_, String funcName_) { + //builder_.error("Invalid left marker encountered in " + funcName_ +" at offset " + builder_.getCurrentOffset()); + boolean goodMarker = marker_ != null && ((LighterASTNode)marker_).getTokenType() != TokenType.ERROR_ELEMENT; + if (!goodMarker) return false; + ErrorState state = ErrorState.get(builder_); + + Frame frame = state.levelCheck.isEmpty() ? null : state.levelCheck.getLast(); + return frame == null || frame.errorReportedAt <= builder_.getCurrentOffset(); + } + + public static boolean consumeToken(PsiBuilder builder_, IElementType token) { + if (nextTokenIsInner(builder_, token, true)) { + builder_.advanceLexer(); + return true; + } + return false; + } + + public static boolean nextTokenIs(PsiBuilder builder_, IElementType token) { + return nextTokenIsInner(builder_, token, false); + } + + public static boolean nextTokenIsInner(PsiBuilder builder_, IElementType token, boolean force) { + ErrorState state = ErrorState.get(builder_); + if (state.completionState != null && !force) return true; + IElementType tokenType = builder_.getTokenType(); + if (!state.suppressErrors && state.predicateCount < 2) { + addVariant(state, builder_, token); + } + return token == tokenType; + } + + public static void addVariant(PsiBuilder builder_, String text) { + addVariant(ErrorState.get(builder_), builder_, text); + } + + private static void addVariant(ErrorState state, PsiBuilder builder_, Object o) { + final int offset = builder_.getCurrentOffset(); + Variant variant = state.VARIANTS.alloc(); + variant.init(offset, o, state.predicateSign); + state.variants.add(variant); + if (variant.expected && state.lastExpectedVariantOffset < variant.offset) { + state.lastExpectedVariantOffset = variant.offset; + } + + CompletionState completionState = state.completionState; + if (completionState != null && state.predicateSign) { + addCompletionVariant(state, completionState, builder_, o, offset); + } + } + + public static boolean consumeToken(PsiBuilder builder_, String text) { + ErrorState state = ErrorState.get(builder_); + if (!state.suppressErrors && state.predicateCount < 2) { + addVariant(state, builder_, text); + } + return consumeTokenInner(builder_, text, state.caseSensitive); + } + + public static boolean consumeTokenInner(PsiBuilder builder_, String text, boolean caseSensitive) { + final CharSequence sequence = builder_.getOriginalText(); + final int offset = builder_.getCurrentOffset(); + final int endOffset = offset + text.length(); + CharSequence tokenText = sequence.subSequence(offset, Math.min(endOffset, sequence.length())); + + if (Comparing.equal(text, tokenText, caseSensitive)) { + int count = 0; + while (true) { + final int nextOffset = builder_.rawTokenTypeStart(++count); + if (nextOffset > endOffset) { + return false; + } + else if (nextOffset == endOffset) { + break; + } + } + while (count-- > 0) builder_.advanceLexer(); + return true; + } + return false; + } + + private static void addCompletionVariant(ErrorState state, + CompletionState completionState, + PsiBuilder builder_, + Object o, + int offset) { + boolean add = false; + int diff = completionState.offset - offset; + String text = completionState.convertItem(o); + int length = text == null ? 0 : text.length(); + if (length == 0) return; + if (diff == 0) { + add = true; + } + else if (diff > 0 && diff <= length) { + CharSequence fragment = builder_.getOriginalText().subSequence(offset, completionState.offset); + add = StringUtil.startsWithIgnoreCase(text, fragment.toString()); + } + else if (diff < 0) { + for (int i = -1; ; i--) { + IElementType type = builder_.rawLookup(i); + int tokenStart = builder_.rawTokenTypeStart(i); + if (state.whitespaceTokens.contains(type) || state.commentTokens.contains(type)) { + diff = completionState.offset - tokenStart; + } + else if (type != null && tokenStart < completionState.offset) { + CharSequence fragment = builder_.getOriginalText().subSequence(tokenStart, completionState.offset); + if (StringUtil.startsWithIgnoreCase(text, fragment.toString())) { + diff = completionState.offset - tokenStart; + } + break; + } + else { + break; + } + } + add = diff >= 0 && diff < length; + } + add = add && length > 1 && !(text.charAt(0) == '<' && text.charAt(length - 1) == '>') && + !(text.charAt(0) == '\'' && text.charAt(length - 1) == '\'' && length < 5); + if (add) { + completionState.items.add(text); + } + } + + + public static final String _SECTION_NOT_ = "_SECTION_NOT_"; + public static final String _SECTION_AND_ = "_SECTION_AND_"; + public static final String _SECTION_RECOVER_ = "_SECTION_RECOVER_"; + public static final String _SECTION_GENERAL_ = "_SECTION_GENERAL_"; + + public static void enterErrorRecordingSection(PsiBuilder builder_, int key, @NotNull String sectionType) { + ErrorState state = ErrorState.get(builder_); + state.levelCheck.add(new Frame(builder_.getCurrentOffset(), key, sectionType)); + if (sectionType == _SECTION_AND_) { + if (state.predicateCount == 0 && !state.predicateSign) { + throw new AssertionError("Incorrect false predicate sign"); + } + state.predicateCount++; + } + else if (sectionType == _SECTION_NOT_) { + if (state.predicateCount == 0) { + state.predicateSign = false; + } + else { + state.predicateSign = !state.predicateSign; + } + state.predicateCount++; + } + } + + public static boolean exitErrorRecordingSection(PsiBuilder builder_, + boolean result, + int key, + boolean pinned, + @NotNull String sectionType, + @Nullable Parser eatMore) { + ErrorState state = ErrorState.get(builder_); + + Frame frame = null; + int initialOffset = builder_.getCurrentOffset(); + if (state.levelCheck.isEmpty() || key != (frame = state.levelCheck.removeLast()).level || !sectionType.equals(frame.section)) { + LOG.error("Unbalanced error section: got " + new Frame(initialOffset, key, sectionType) + ", expected " + frame); + return result; + } + if (sectionType == _SECTION_AND_ || sectionType == _SECTION_NOT_) { + state.predicateCount--; + if (sectionType == _SECTION_NOT_) state.predicateSign = !state.predicateSign; + return result; + } + if (sectionType == _SECTION_RECOVER_ && !state.suppressErrors && eatMore != null) { + state.suppressErrors = true; + final boolean eatMoreFlagOnce = !builder_.eof() && eatMore.parse(builder_, frame.level + 1); + final int lastErrorPos = getLastVariantOffset(state, initialOffset); + boolean eatMoreFlag = eatMoreFlagOnce || frame.offset == initialOffset && lastErrorPos > frame.offset; + + final LighterASTNode latestDoneMarker = + (pinned || result) && lastErrorPos > initialOffset && eatMoreFlagOnce ? builder_.getLatestDoneMarker() : null; + PsiBuilder.Marker extensionMarker = null; + IElementType extensionTokenType = null; + if (latestDoneMarker instanceof PsiBuilder.Marker) { + extensionMarker = ((PsiBuilder.Marker)latestDoneMarker).precede(); + extensionTokenType = latestDoneMarker.getTokenType(); + ((PsiBuilder.Marker)latestDoneMarker).drop(); + } + // advance to the last error pos + // skip tokens until lastErrorPos. parseAsTree might look better here... + int parenCount = 0; + while (eatMoreFlag && builder_.getCurrentOffset() < lastErrorPos) { + if (state.braces != null) { + if (builder_.getTokenType() == state.braces[0].getLeftBraceType()) { + parenCount++; + } + else if (builder_.getTokenType() == state.braces[0].getRightBraceType()) parenCount--; + } + builder_.advanceLexer(); + eatMoreFlag = parenCount != 0 || eatMore.parse(builder_, frame.level + 1); + } + boolean errorReported = frame.errorReportedAt == initialOffset; + if (errorReported) { + if (eatMoreFlag) { + builder_.advanceLexer(); + parseAsTree(state, builder_, frame.level + 1, DUMMY_BLOCK, true, TOKEN_ADVANCER, eatMore); + } + } + else if (eatMoreFlag) { + String tokenText = builder_.getTokenText(); + String expectedText = state.getExpectedText(builder_); + PsiBuilder.Marker mark = builder_.mark(); + builder_.advanceLexer(); + final String gotText = !expectedText.isEmpty() ? "got '" + tokenText + "'" : "'" + tokenText + "' unexpected"; + mark.error(expectedText + gotText); + parseAsTree(state, builder_, frame.level + 1, DUMMY_BLOCK, true, TOKEN_ADVANCER, eatMore); + errorReported = true; + } + else if (eatMoreFlagOnce || (!result && frame.offset != builder_.getCurrentOffset())) { + reportError(state, builder_, true); + errorReported = true; + } + if (extensionMarker != null) { + extensionMarker.done(extensionTokenType); + } + state.suppressErrors = false; + if (errorReported || result) { + state.clearExpectedVariants(); + } + if (!result && eatMoreFlagOnce && frame.offset != builder_.getCurrentOffset()) result = true; + } + else if (!result && pinned && frame.errorReportedAt < 0) { + // do not report if there're errors after current offset + if (getLastVariantOffset(state, initialOffset) == initialOffset) { + // do not force, inner recoverRoot might have skipped some tokens + if (reportError(state, builder_, false)) { + frame.errorReportedAt = initialOffset; + } + } + } + // propagate errorReportedAt up the stack to avoid duplicate reporting + Frame prevFrame = state.levelCheck.isEmpty() ? null : state.levelCheck.getLast(); + if (prevFrame != null && prevFrame.errorReportedAt < frame.errorReportedAt) prevFrame.errorReportedAt = frame.errorReportedAt; + return result; + } + + public static boolean report_error_(PsiBuilder builder_, boolean current_) { + if (!current_) report_error_(builder_); + return current_; + } + + public static void report_error_(PsiBuilder builder_) { + ErrorState state = ErrorState.get(builder_); + + Frame frame = state.levelCheck.isEmpty() ? null : state.levelCheck.getLast(); + if (frame == null) { + LOG.error("Unbalanced error section: got null , expected " + frame); + return; + } + int offset = builder_.getCurrentOffset(); + if (frame.errorReportedAt < offset && getLastVariantOffset(state, builder_.getCurrentOffset()) <= offset) { + if (reportError(state, builder_, true)) { + frame.errorReportedAt = offset; + } + } + } + + private static int getLastVariantOffset(ErrorState state, int defValue) { + return state.lastExpectedVariantOffset < 0 ? defValue : state.lastExpectedVariantOffset; + } + + private static boolean reportError(ErrorState state, PsiBuilder builder_, boolean force) { + String expectedText = state.getExpectedText(builder_); + boolean notEmpty = StringUtil.isNotEmpty(expectedText); + if (force || notEmpty) { + final String gotText = builder_.eof() ? "unexpected end of file" : + notEmpty ? "got '" + builder_.getTokenText() + "'" : + "'" + builder_.getTokenText() + "' unexpected"; + builder_.error(expectedText + gotText); + return true; + } + return false; + } + + + private static final Key ERROR_STATE_KEY = Key.create("ERROR_STATE_KEY"); + public static final Key COMPLETION_STATE_KEY = Key.create("COMPLETION_STATE_KEY"); + + public static class CompletionState { + public final int offset; + public final Collection items = new THashSet(); + + public CompletionState(int offset) { + this.offset = offset; + } + + @Nullable + public String convertItem(Object o) { + return o.toString(); + } + } + + public static class ErrorState { + int predicateCount; + boolean predicateSign = true; + boolean suppressErrors; + final LinkedList levelCheck = new LinkedList(); + CompletionState completionState; + + private boolean caseSensitive; + private BracePair[] braces; + private TokenSet whitespaceTokens = TokenSet.EMPTY; + private TokenSet commentTokens = TokenSet.EMPTY; + + private int lastExpectedVariantOffset = -1; + ArrayList variants = new ArrayList(); + final LimitedPool VARIANTS = new LimitedPool(5000, new LimitedPool.ObjectFactory() { + public Variant create() { + return new Variant(); + } + + public void cleanup(final Variant v) { + } + }); + + + public static ErrorState get(PsiBuilder builder) { + ErrorState state = builder.getUserDataUnprotected(ERROR_STATE_KEY); + if (state == null) { + builder.putUserDataUnprotected(ERROR_STATE_KEY, state = new ErrorState()); + PsiFile file = builder.getUserDataUnprotected(FileContextUtil.CONTAINING_FILE_KEY); + state.completionState = file == null ? null : file.getUserData(COMPLETION_STATE_KEY); + if (file != null) { + Language language = file.getLanguage(); + state.caseSensitive = language.isCaseSensitive(); + PairedBraceMatcher matcher = LanguageBraceMatching.INSTANCE.forLanguage(language); + state.braces = matcher == null ? null : matcher.getPairs(); + if (state.braces != null && state.braces.length == 0) state.braces = null; + ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(language); + if (parserDefinition != null) { + state.commentTokens = parserDefinition.getCommentTokens(); + state.whitespaceTokens = parserDefinition.getWhitespaceTokens(); + } + } + } + return state; + } + + public String getExpectedText(PsiBuilder builder_) { + int offset = builder_.getCurrentOffset(); + StringBuilder sb = new StringBuilder(); + if (addExpected(sb, offset, true)) { + sb.append(" expected, "); + } + else if (addExpected(sb, offset, false)) sb.append(" unexpected, "); + return sb.toString(); + } + + private static final int MAX_VARIANTS_TO_DISPLAY = Integer.MAX_VALUE; + + private boolean addExpected(StringBuilder sb, int offset, boolean expected) { + String[] strings = new String[variants.size()]; + long[] hashes = new long[strings.length]; + Arrays.fill(strings, ""); + int count = 0; + loop: + for (Variant variant : variants) { + if (offset == variant.offset) { + if (variant.expected != expected) continue; + String text = variant.object.toString(); + long hash = StringHash.calc(text); + for (int i = 0; i < count; i++) { + if (hashes[i] == hash) continue loop; + } + hashes[count] = hash; + strings[count] = text; + count++; + } + } + Arrays.sort(strings); + count = 0; + for (String s : strings) { + if (s == "") continue; + if (count++ > 0) { + if (count > MAX_VARIANTS_TO_DISPLAY) { + sb.append(" and ..."); + break; + } + else { + sb.append(", "); + } + } + char c = s.charAt(0); + String displayText = c == '<' || StringUtil.isJavaIdentifierStart(c) ? s : '\'' + s + '\''; + sb.append(displayText); + } + if (count > 1 && count < MAX_VARIANTS_TO_DISPLAY) { + int idx = sb.lastIndexOf(", "); + sb.replace(idx, idx + 1, " or"); + } + return count > 0; + } + + void clearExpectedVariants() { + lastExpectedVariantOffset = -1; + for (Variant v : variants) { + VARIANTS.recycle(v); + } + variants.clear(); + } + } + + public static class Frame { + int offset; + int level; + String section; + int errorReportedAt = -1; + + public Frame(int offset, int level, String section) { + this.offset = offset; + this.level = level; + this.section = section; + } + + @Override + public String toString() { + return "<" + offset + ", " + section + ", " + level + ">"; + } + } + + + public static class Variant { + int offset; + Object object; + boolean expected; + + public void init(int offset, Object text, boolean expected) { + this.offset = offset; + this.object = text; + this.expected = expected; + } + + @Override + public String toString() { + return "<" + offset + ", " + expected + ", " + object + ">"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Variant variant = (Variant)o; + + if (expected != variant.expected) return false; + if (offset != variant.offset) return false; + if (!this.object.equals(variant.object)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = offset; + result = 31 * result + object.hashCode(); + result = 31 * result + (expected ? 1 : 0); + return result; + } + } + + @Nullable + private static IElementType getClosingBracket(ErrorState state, IElementType type) { + if (state.braces == null) return null; + for (BracePair pair : state.braces) { + if (type == pair.getLeftBraceType()) return pair.getRightBraceType(); + } + return null; + } + + + private static final int MAX_CHILDREN_IN_TREE = 10; + + public static boolean parseAsTree(ErrorState state, final PsiBuilder builder_, int level, final IElementType chunkType, + boolean checkBraces, final Parser parser, final Parser eatMoreCondition) { + final LinkedList> parenList = new LinkedList>(); + final LinkedList> siblingList = new LinkedList>(); + PsiBuilder.Marker marker = null; + + final Runnable checkSiblingsRunnable = new Runnable() { + public void run() { + main: + while (!siblingList.isEmpty()) { + final Pair parenPair = parenList.peek(); + final int rating = siblingList.getFirst().second; + int count = 0; + for (Pair pair : siblingList) { + if (pair.second != rating || parenPair != null && pair.first == parenPair.second) break main; + if (++count >= MAX_CHILDREN_IN_TREE) { + final PsiBuilder.Marker parentMarker = pair.first.precede(); + while (count-- > 0) { + siblingList.removeFirst(); + } + parentMarker.done(chunkType); + siblingList.addFirst(Pair.create(parentMarker, rating + 1)); + continue main; + } + } + break; + } + } + }; + boolean checkParens = state.braces != null && checkBraces; + int totalCount = 0; + int tokenCount = 0; + if (checkParens && builder_.rawLookup(-1) == state.braces[0].getLeftBraceType()) { + LighterASTNode doneMarker = builder_.getLatestDoneMarker(); + if (doneMarker != null && + doneMarker.getStartOffset() == builder_.rawTokenTypeStart(-1) && + doneMarker.getTokenType() == TokenType.ERROR_ELEMENT) { + parenList.add(Pair.create(((PsiBuilder.Marker)doneMarker).precede(), (PsiBuilder.Marker)null)); + } + } + while (true) { + final IElementType tokenType = builder_.getTokenType(); + if (checkParens && + (tokenType == state.braces[0].getLeftBraceType() || tokenType == state.braces[0].getRightBraceType() && !parenList.isEmpty())) { + if (marker != null) { + marker.done(chunkType); + siblingList.addFirst(Pair.create(marker, 1)); + marker = null; + tokenCount = 0; + } + if (tokenType == state.braces[0].getLeftBraceType()) { + final Pair prev = siblingList.peek(); + parenList.addFirst(Pair.create(builder_.mark(), prev == null ? null : prev.first)); + } + checkSiblingsRunnable.run(); + builder_.advanceLexer(); + if (tokenType == state.braces[0].getRightBraceType()) { + final Pair pair = parenList.removeFirst(); + pair.first.done(chunkType); + // drop all markers inside parens + while (!siblingList.isEmpty() && siblingList.getFirst().first != pair.second) { + siblingList.removeFirst(); + } + siblingList.addFirst(Pair.create(pair.first, 1)); + checkSiblingsRunnable.run(); + } + } + else { + if (marker == null) { + marker = builder_.mark(); + } + final boolean result = eatMoreCondition.parse(builder_, level + 1) && parser.parse(builder_, level + 1); + if (result) { + tokenCount++; + totalCount++; + } + if (!result) { + break; + } + } + + if (tokenCount >= MAX_CHILDREN_IN_TREE && marker != null) { + marker.done(chunkType); + siblingList.addFirst(Pair.create(marker, 1)); + checkSiblingsRunnable.run(); + marker = null; + tokenCount = 0; + } + } + if (marker != null) { + marker.drop(); + } + for (Pair pair : parenList) { + pair.first.drop(); + } + return totalCount != 0; + } + + private static class DummyBlockElementType extends IElementType implements ICompositeElementType { + DummyBlockElementType() { + super("DUMMY_BLOCK", Language.ANY); + } + + @NotNull + @Override + public ASTNode createCompositeNode() { + return new DummyBlock(); + } + } + + public static class DummyBlock extends CompositePsiElement { + DummyBlock() { + super(DUMMY_BLOCK); + } + + @Override + public PsiReference[] getReferences() { + return PsiReference.EMPTY_ARRAY; + } + + @Override + public boolean canNavigateToSource() { + return false; + } + + @Override + public boolean canNavigate() { + return false; + } + + @NotNull + @Override + public Language getLanguage() { + return getParent().getLanguage(); + } + } +} diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.bnf b/src/com/jetbrains/typoscript/lang/TypoScript.bnf index 8f1d158e7025..678a2c4e05a4 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScript.bnf +++ b/src/com/jetbrains/typoscript/lang/TypoScript.bnf @@ -1,63 +1,47 @@ { - generatePsi=false - parserClass="com.jetbrains.typoscript.lang.TypoScriptParser" + parserClass="com.jetbrains.typoscript.lang.TypoScriptGeneratedParser" stubParserClass="com.jetbrains.typoscript.lang.TypoScriptParserUtil" + generateStubParser = true + // generateFirstCheck = true tokenTypeClass="com.jetbrains.typoscript.lang.TypoScriptTokenType" elementTypeClass="com.jetbrains.typoscript.lang.TypoScriptTokenType" elementTypeHolderClass="com.jetbrains.typoscript.lang.TypoScriptElementTypes" generateTokens=false parserImports="static com.jetbrains.typoscript.lang.TypoScriptTokenTypes.*" - //tokens - //C_STYLE_COMMENT - //ONE_LINE_COMMENT -/* - IElementType MODIFICATION_OPERATOR = new TypoScriptTokenType("MODIFY"); - IElementType ASSIGNMENT_OPERATOR = new TypoScriptTokenType("ASSIGN"); + generatePsi=true + implements="com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElement" + extends="com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl" - IElementType MULTILINE_VALUE_OPERATOR_BEGIN = new TypoScriptTokenType("MULTILINE_OPEN"); - IElementType MULTILINE_VALUE_OPERATOR_END = new TypoScriptTokenType("MULTILINE_CLOSE"); - IElementType MULTILINE_VALUE = new TypoScriptTokenType("MULTILINE_VALUE"); - - IElementType CODE_BLOCK_OPERATOR_BEGIN = new TypoScriptTokenType("CODE_BLOCK_OPEN"); - IElementType CODE_BLOCK_OPERATOR_END = new TypoScriptTokenType("CODE_BLOCK_CLOSE"); - IElementType UNSETTING_OPERATOR = new TypoScriptTokenType("UNSET"); - IElementType COPYING_OPERATOR = new TypoScriptTokenType("COPY"); - - IElementType ASSIGNMENT_VALUE = new TypoScriptTokenType("ASSIGNMENT_VALUE"); - IElementType IGNORED_TEXT = new TypoScriptTokenType("IGNORED_TEXT"); - - IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("MODIFICATION_FUNCTION"); - IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("MODIFICATION_OPEN"); - IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("MODIFICATION_CLOSE"); - IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("MODIFICATION_VALUE"); - - IElementType OBJECT_PATH_ENTITY = new TypoScriptTokenType("OBJECT_PATH_ENTITY"); - IElementType OBJECT_PATH_SEPARATOR = new TypoScriptTokenType("OBJECT_PATH_SEPARATOR"); - - IElementType INCLUDE_STATEMENT = new TypoScriptTokenType("INCLUDE"); - IElementType CONDITION = new TypoScriptTokenType("CONDITION");*/ + psiImplClassSuffix="Impl" + psiPackage="com.jetbrains.typoscript.lang.psi" + psiImplPackage="com.jetbrains.typoscript.lang.psi.impl" } - //do we need to declare operators again? + + +c_style_comment_element ::= C_STYLE_COMMENT +one_line_comment_element ::= ONE_LINE_COMMENT +include_statement_element ::= ONE_LINE_COMMENT +condition_element ::= CONDITION + object_path ::= OBJECT_PATH_ENTITY (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY)* -meta internal_object_path ::= object_path | OBJECT_PATH_SEPARATOR object_path +private internal_object_path ::= object_path | OBJECT_PATH_SEPARATOR object_path assignment ::= ASSIGNMENT ASSIGNMENT_VALUE -meta internal_assignment ::= internal_object_path ASSIGNMENT ASSIGNMENT_VALUE -value_modification ::= MODIFY MODIFICATION_FUNCTION MODIFICATION_OPEN MODIFICATION_VALUE MODIFICATION_CLOSE +value_modification ::= MODIFICATION_OPERATOR MODIFICATION_OPERATOR_FUNCTION MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN MODIFICATION_OPERATOR_FUNCTION_ARGUMENT MODIFICATION_OPERATOR_FUNCTION_PARAM_END -multiline_value ::= MULTILINE_OPEN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_CLOSE IGNORED_TEXT? +multiline_value_assignment ::= MULTILINE_VALUE_OPERATOR_BEGIN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_VALUE_OPERATOR_END IGNORED_TEXT? -copying ::= COPY object_path +copying ::= COPYING_OPERATOR object_path -unsetting ::= UNSET IGNORED_TEXT? +unsetting ::= UNSETTING_OPERATOR IGNORED_TEXT? -meta expression ::= assignment | value_modification | multiline_value | copying | unsetting | codeBlock +private internal_expression ::= internal_object_path { assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block} -codeBlock ::= object_path CODE_BLOCK_OPEN IGNORED_TEXT? (expression)* CODE_BLOCK_CLOSE IGNORED_TEXT? +code_block ::= object_path CODE_BLOCK_OPERATOR_BEGIN IGNORED_TEXT? (internal_expression)* CODE_BLOCK_OPERATOR_END IGNORED_TEXT? diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java b/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java new file mode 100644 index 000000000000..90ae0a4774bf --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java @@ -0,0 +1,71 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.project.Project; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.tree.IFileElementType; +import com.intellij.psi.tree.IStubFileElementType; +import com.intellij.psi.tree.TokenSet; +import com.jetbrains.typoscript.lang.psi.TypoScriptFile; +import org.jetbrains.annotations.NotNull; + +/** + * @author lene + * Date: 11.04.12 + */ +public class TypoScriptParserDefinition implements ParserDefinition { + @NotNull + @Override + public Lexer createLexer(Project project) { + return new TypoScriptLexer(); + } + + @Override + public PsiParser createParser(Project project) { + return new TypoScriptGeneratedParser(); + } + + @Override + public IFileElementType getFileNodeType() { + return new IStubFileElementType(TypoScriptLanguage.INSTANCE); + } + + @NotNull + @Override + public TokenSet getWhitespaceTokens() { + return TypoScriptTokenTypes.WHITESPACES; + } + + @NotNull + @Override + public TokenSet getCommentTokens() { + return TypoScriptTokenTypes.COMMENTS; + } + + @NotNull + @Override + public TokenSet getStringLiteralElements() { + return TypoScriptTokenTypes.STRING_LITERALS; + } + + @NotNull + @Override + public PsiElement createElement(ASTNode node) { + return TypoScriptElementTypes.Factory.createElement(node); + } + + @Override + public PsiFile createFile(FileViewProvider viewProvider) { + return new TypoScriptFile(viewProvider); + } + + @Override + public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) { + return SpaceRequirements.MAY;//todo[lene] + } +} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java b/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java new file mode 100644 index 000000000000..8eb8720df63c --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java @@ -0,0 +1,8 @@ +package com.jetbrains.typoscript.lang; + +/** + * @author lene + * Date: 11.04.12 + */ +public class TypoScriptParserUtil extends GeneratedParserUtilBase { +} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java index 4c38c8c8c03b..38b38a96b08f 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java @@ -32,14 +32,18 @@ public interface TypoScriptTokenTypes extends TokenType { IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("MODIFICATION_CLOSE"); IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("MODIFICATION_VALUE"); - TokenSet OPERATORS = TokenSet.create(MODIFICATION_OPERATOR, ASSIGNMENT_OPERATOR, - MULTILINE_VALUE_OPERATOR_BEGIN, MULTILINE_VALUE_OPERATOR_END, - CODE_BLOCK_OPERATOR_BEGIN, CODE_BLOCK_OPERATOR_END, - UNSETTING_OPERATOR, COPYING_OPERATOR); - IElementType OBJECT_PATH_ENTITY = new TypoScriptTokenType("OBJECT_PATH_ENTITY"); IElementType OBJECT_PATH_SEPARATOR = new TypoScriptTokenType("OBJECT_PATH_SEPARATOR"); IElementType INCLUDE_STATEMENT = new TypoScriptTokenType("INCLUDE"); IElementType CONDITION = new TypoScriptTokenType("CONDITION"); + + TokenSet OPERATORS = TokenSet.create(MODIFICATION_OPERATOR, ASSIGNMENT_OPERATOR, + MULTILINE_VALUE_OPERATOR_BEGIN, MULTILINE_VALUE_OPERATOR_END, + CODE_BLOCK_OPERATOR_BEGIN, CODE_BLOCK_OPERATOR_END, + UNSETTING_OPERATOR, COPYING_OPERATOR); + + TokenSet WHITESPACES = TokenSet.create(WHITE_SPACE); + TokenSet COMMENTS = TokenSet.create(ONE_LINE_COMMENT, C_STYLE_COMMENT, IGNORED_TEXT); + TokenSet STRING_LITERALS = TokenSet.create(ASSIGNMENT_VALUE, MULTILINE_VALUE); } diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java new file mode 100644 index 000000000000..1373ff2b1e61 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java @@ -0,0 +1,100 @@ +package com.jetbrains.typoscript.lang.highlighter; + +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.options.colors.AttributesDescriptor; +import com.intellij.openapi.options.colors.ColorDescriptor; +import com.intellij.openapi.options.colors.ColorSettingsPage; +import com.intellij.psi.codeStyle.DisplayPriority; +import com.intellij.psi.codeStyle.DisplayPrioritySortable; +import com.jetbrains.typoscript.TypoScriptBundle; +import com.jetbrains.typoscript.lang.TypoScriptFileType; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Map; + +/** + * @author lene + * Date: 12.04.12 + */ +public class TypoScriptColorsAndFontsPage implements ColorSettingsPage, DisplayPrioritySortable { + + @NonNls private static final String DEMO_TEXT = "/*\n" + + " * Menu description\n" + + " */\n" + + "temp.menu = COA\n" + + "temp.menu { some ignored text\n" + + " 10 = HMENU\n" + + " 10.entryLevel = 0\n" + + " 10.1 = TMENU\n" + + " 10.1 {\n" + + " wrap =

|
\n" + + " NO.ATagParams = class=\"menuButton\"\n" + + " } \n" + + "} \n" + + "\n" + + "# Default PAGE object:\n" + + "page = PAGE\n" + + "page.typeNum = 0\n" + + "page.10 < temp.menu "; + + + private static final AttributesDescriptor[] ATTRIBUTES = + new AttributesDescriptor[]{ + new AttributesDescriptor(TypoScriptBundle.message("color.settings.one.line.comment"), TypoScriptHighlightingData.ONE_LINE_COMMENT), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.multiline.comment"), TypoScriptHighlightingData.MULTILINE_COMMENT), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.ignored.text"), TypoScriptHighlightingData.IGNORED_TEXT), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.operator"), TypoScriptHighlightingData.OPERATOR_SIGN), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.string"), TypoScriptHighlightingData.STRING_VALUE), + //todo[lene] name? + new AttributesDescriptor(TypoScriptBundle.message("color.settings.object.path"), TypoScriptHighlightingData.OBJECT_PATH_ENTITY), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.object.path.separator"), + TypoScriptHighlightingData.OBJECT_PATH_SEPARATOR), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.assigned.value"), TypoScriptHighlightingData.ASSIGNED_VALUE), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.bad.character"), TypoScriptHighlightingData.BAD_CHARACTER) + }; + + @NotNull + public String getDisplayName() { + return TypoScriptBundle.message("color.settings.name"); + } + + @Nullable + public Icon getIcon() { + return TypoScriptFileType.INSTANCE.getIcon(); + } + + @NotNull + public AttributesDescriptor[] getAttributeDescriptors() { + return ATTRIBUTES; + } + + @NotNull + public ColorDescriptor[] getColorDescriptors() { + return new ColorDescriptor[0]; + } + + @NotNull + public SyntaxHighlighter getHighlighter() { + return new TypoScriptSyntaxHighlighter(); + } + + @NonNls + @NotNull + public String getDemoText() { + return DEMO_TEXT; + } + + @Nullable + public Map getAdditionalHighlightingTagToDescriptorMap() { + return null; + } + + @Override + public DisplayPriority getPriority() { + return DisplayPriority.LANGUAGE_SETTINGS; + } +} diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java index ca7b5303a379..8f77e76a66d5 100644 --- a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java @@ -13,14 +13,18 @@ public class TypoScriptHighlightingData { TextAttributesKey.createTextAttributesKey("TS_ONE_LINE_COMMENT", SyntaxHighlighterColors.LINE_COMMENT.getDefaultAttributes()); public static final TextAttributesKey MULTILINE_COMMENT = TextAttributesKey.createTextAttributesKey("TS_MULTILINE_COMMENT", SyntaxHighlighterColors.JAVA_BLOCK_COMMENT.getDefaultAttributes()); + public static final TextAttributesKey IGNORED_TEXT = + TextAttributesKey.createTextAttributesKey("TS_IGNORED_TEXT", SyntaxHighlighterColors.LINE_COMMENT.getDefaultAttributes()); public static final TextAttributesKey OPERATOR_SIGN = TextAttributesKey.createTextAttributesKey("TS_OPERATOR_SIGN", SyntaxHighlighterColors.OPERATION_SIGN.getDefaultAttributes()); public static final TextAttributesKey STRING_VALUE = TextAttributesKey.createTextAttributesKey("STRING_VALUE", SyntaxHighlighterColors.STRING.getDefaultAttributes()); + public static final TextAttributesKey ASSIGNED_VALUE = + TextAttributesKey.createTextAttributesKey("ASSIGNED_VALUE", HighlighterColors.TEXT.getDefaultAttributes()); public static final TextAttributesKey OBJECT_PATH_ENTITY = - TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_ENTITY", HighlighterColors.TEXT.getDefaultAttributes()); + TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_ENTITY", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); public static final TextAttributesKey OBJECT_PATH_SEPARATOR = - TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_SEPARATOR", SyntaxHighlighterColors.DOT.getDefaultAttributes()); + TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_SEPARATOR", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); /* diff --git a/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java b/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java new file mode 100644 index 000000000000..2081affba300 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java @@ -0,0 +1,12 @@ +package com.jetbrains.typoscript.lang.psi; + +import com.intellij.psi.NavigatablePsiElement; +import com.intellij.psi.tree.IElementType; + +/** + * @author lene + * Date: 11.04.12 + */ +public interface TypoScriptCompositeElement extends NavigatablePsiElement { + IElementType getTokenType(); +} diff --git a/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java b/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java new file mode 100644 index 000000000000..9d5badb28311 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java @@ -0,0 +1,22 @@ +package com.jetbrains.typoscript.lang.psi; + +import com.intellij.extapi.psi.ASTWrapperPsiElement; +import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NotNull; + +/** + * @author lene + * Date: 11.04.12 + */ +public class TypoScriptCompositeElementImpl extends ASTWrapperPsiElement implements TypoScriptCompositeElement { + + public TypoScriptCompositeElementImpl(@NotNull final ASTNode node) { + super(node); + } + + @Override + public IElementType getTokenType() { + return getNode().getElementType(); + } +} diff --git a/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java b/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java new file mode 100644 index 000000000000..fd7bbec51acb --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java @@ -0,0 +1,30 @@ +package com.jetbrains.typoscript.lang.psi; + +import com.intellij.extapi.psi.PsiFileBase; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.psi.FileViewProvider; +import com.jetbrains.typoscript.lang.TypoScriptFileType; +import com.jetbrains.typoscript.lang.TypoScriptLanguage; +import org.jetbrains.annotations.NotNull; + +/** + * @author lene + * Date: 11.04.12 + */ +public class TypoScriptFile extends PsiFileBase { + + public TypoScriptFile(@NotNull FileViewProvider viewProvider) { + super(viewProvider, TypoScriptLanguage.INSTANCE); + } + + @NotNull + @Override + public FileType getFileType() { + return TypoScriptFileType.INSTANCE; + } + + @Override + public String toString() { + return "TypoScript File"; + } +} diff --git a/typoScript.iml b/typoScript.iml index 317dff3cd775..a25c711e53bd 100644 --- a/typoScript.iml +++ b/typoScript.iml @@ -6,11 +6,13 @@ + + From 53a3ca87cef47585cb44c94fcd9c5ae199838d7a Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Tue, 17 Apr 2012 17:16:29 +0400 Subject: [PATCH 006/147] c style comments support --- .../jetbrains/typoscript/lang/TypoScript.flex | 5 +-- .../typoscript/lang/_TypoScriptLexer.java | 41 +++++++++---------- .../typoscript/lexer/comments.test.expected | 26 ++++++++++++ testData/typoscript/lexer/comments.test.ts | 13 ++++++ .../typoscript/TypoScriptLexerTest.java | 4 ++ 5 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 testData/typoscript/lexer/comments.test.expected create mode 100644 testData/typoscript/lexer/comments.test.ts diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.flex b/src/com/jetbrains/typoscript/lang/TypoScript.flex index 69eea1902869..0ae9a2c34c38 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScript.flex +++ b/src/com/jetbrains/typoscript/lang/TypoScript.flex @@ -27,8 +27,7 @@ WHITE_SPACE_CHARS=[\ \n\r\t\f]* WHITESPACE_WITH_NEW_LINE = [\ \t\f]*(\n|\r|\r\n){WHITE_SPACE_CHARS} STRING_TAIL = [^\r\n]* ONE_LINE_COMMENT=("/"|"#"){STRING_TAIL} -C_STYLE_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*" -COMMENT_TAIL=([^"*"]*("*"+[^"*""/"])?)*("*"+"/")? //todo[lene] +C_STYLE_COMMENT="/*" ~((\n|\r|\r\n){WHITE_SPACE_CHARS}"*/") ENDTRIMMED_STRING_TAIL = ({STRING_TAIL}{NOT_WHITE_SPACE})? TRIMMED_STRING_TAIL = {NOT_WHITE_SPACE}{ENDTRIMMED_STRING_TAIL} @@ -52,7 +51,7 @@ OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* {WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } {ONE_LINE_COMMENT} { return TypoScriptTokenTypes.ONE_LINE_COMMENT; } - {C_STYLE_COMMENT} { return TypoScriptTokenTypes.C_STYLE_COMMENT; } + {C_STYLE_COMMENT} { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.C_STYLE_COMMENT; } {OBJECT_PATH_ENTITY} { yybegin(EXPRESSION_SIGN); return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; } "." { return TypoScriptTokenTypes.OBJECT_PATH_SEPARATOR; } "["{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.CONDITION; } diff --git a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java index 5baa401503a7..7c3b0d17ab74 100644 --- a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java +++ b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 10.04.12 19:28 */ +/* The following code was generated by JFlex 1.4.3 on 17.04.12 17:09 */ package com.jetbrains.typoscript.lang; import com.intellij.lexer.FlexLexer; @@ -10,7 +10,7 @@ import java.io.Reader; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 10.04.12 19:28 from the specification file + * on 17.04.12 17:09 from the specification file * C:/opt/IDEA/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.flex */ public class _TypoScriptLexer implements FlexLexer { @@ -65,10 +65,10 @@ public class _TypoScriptLexer implements FlexLexer { "\1\15\1\4\1\16\1\17\1\20\1\21\1\22\1\23"+ "\1\3\1\24\1\25\1\1\1\4\1\26\2\27\1\30"+ "\2\31\1\32\1\6\3\0\1\33\4\0\1\1\1\0"+ - "\1\1\1\6\1\34\1\6\1\0\1\34"; + "\1\1\3\0\1\34"; private static int [] zzUnpackAction() { - int [] result = new int[59]; + int [] result = new int[58]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -100,10 +100,10 @@ public class _TypoScriptLexer implements FlexLexer { "\0\u01db\0\u01ee\0\u0201\0\276\0\u0214\0\u0227\0\276\0\u023a"+ "\0\u024d\0\276\0\u0260\0\u0130\0\u0143\0\u0156\0\276\0\u018f"+ "\0\u01db\0\u0201\0\u0214\0\u0227\0\u023a\0\u024d\0\u0273\0\u0286"+ - "\0\u0299\0\u02ac\0\276"; + "\0\u0299\0\276"; private static int [] zzUnpackRowMap() { - int [] result = new int[59]; + int [] result = new int[58]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -150,14 +150,13 @@ public class _TypoScriptLexer implements FlexLexer { "\1\45\1\0\1\45\1\0\12\45\1\0\3\45\1\63"+ "\1\45\1\14\1\46\1\14\12\45\1\0\3\45\1\64"+ "\1\50\1\0\1\50\1\0\15\50\1\0\1\65\1\50"+ - "\1\14\1\51\1\14\15\50\1\0\1\66\1\67\1\70"+ - "\1\67\1\70\2\67\1\17\15\67\1\70\1\67\1\70"+ - "\2\67\1\71\14\67\6\70\1\72\14\70\1\67\1\70"+ - "\1\67\1\70\1\17\1\67\1\71\14\67\4\70\1\73"+ - "\1\70\1\72\14\70"; + "\1\14\1\51\1\14\15\50\1\0\1\66\1\53\1\67"+ + "\1\53\1\67\17\53\1\70\3\67\2\70\1\71\13\70"+ + "\1\67\1\70\1\67\1\70\1\67\20\70\1\67\1\70"+ + "\1\67\1\72\16\70"; private static int [] zzUnpackTrans() { - int [] result = new int[703]; + int [] result = new int[684]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -201,10 +200,10 @@ public class _TypoScriptLexer implements FlexLexer { "\6\1\2\0\2\1\1\11\5\1\1\11\3\1\1\11"+ "\1\1\1\11\1\1\4\11\7\1\1\11\2\1\1\11"+ "\2\1\1\11\1\1\3\0\1\11\4\0\1\1\1\0"+ - "\4\1\1\0\1\11"; + "\1\1\3\0\1\11"; private static int [] zzUnpackAttribute() { - int [] result = new int[59]; + int [] result = new int[58]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -524,25 +523,25 @@ public class _TypoScriptLexer implements FlexLexer { { return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; } case 30: break; + case 28: + { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.C_STYLE_COMMENT; + } + case 31: break; case 23: { return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION; } - case 31: break; + case 32: break; case 4: { return TokenType.BAD_CHARACTER; } - case 32: break; + case 33: break; case 17: { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN; } - case 33: break; + case 34: break; case 7: { yybegin(EXPRESSION_SIGN); return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; } - case 34: break; - case 28: - { return TypoScriptTokenTypes.C_STYLE_COMMENT; - } case 35: break; case 20: { yybegin(MULTILINE_OPERATOR_VALUE); diff --git a/testData/typoscript/lexer/comments.test.expected b/testData/typoscript/lexer/comments.test.expected new file mode 100644 index 000000000000..ff5c0da41462 --- /dev/null +++ b/testData/typoscript/lexer/comments.test.expected @@ -0,0 +1,26 @@ +C_STYLE_COMMENT ('/* +a comment */ +*/') +WHITE_SPACE (' + +') +C_STYLE_COMMENT ('/** +also comment + */') +WHITE_SPACE (' + + ') +C_STYLE_COMMENT ('/* */ +comment */ + */') +IGNORED_TEXT (' ignored text') +WHITE_SPACE (' + +') +OBJECT_PATH_ENTITY ('assign') +WHITE_SPACE (' ') +ASSIGN ('=') +WHITE_SPACE (' ') +ASSIGNMENT_VALUE ('ment') +WHITE_SPACE (' +') \ No newline at end of file diff --git a/testData/typoscript/lexer/comments.test.ts b/testData/typoscript/lexer/comments.test.ts new file mode 100644 index 000000000000..529ef0377a98 --- /dev/null +++ b/testData/typoscript/lexer/comments.test.ts @@ -0,0 +1,13 @@ +/* +a comment */ +*/ + +/** +also comment + */ + + /* */ +comment */ + */ ignored text + +assign = ment diff --git a/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java b/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java index ba085b3ef25a..c5375b6b0f83 100644 --- a/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java +++ b/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java @@ -74,6 +74,10 @@ public class TypoScriptLexerTest extends UsefulTestCase { doTest(); } + public void testComments() throws Throwable { + doTest(); + } + private void doTest() throws IOException { Lexer lexer = new TypoScriptLexer(); String testText = getInputData(getDataSubPath(), getTestName(true)); From 531f8d3d1492fc10056b5b59cac4bcef0f95c8e4 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Tue, 17 Apr 2012 17:38:48 +0400 Subject: [PATCH 007/147] No space inside object path --- .../jetbrains/typoscript/lang/TypoScript.flex | 14 ++- .../typoscript/lang/_TypoScriptLexer.java | 118 +++++++++--------- 2 files changed, 68 insertions(+), 64 deletions(-) diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.flex b/src/com/jetbrains/typoscript/lang/TypoScript.flex index 0ae9a2c34c38..cf274716b699 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScript.flex +++ b/src/com/jetbrains/typoscript/lang/TypoScript.flex @@ -34,6 +34,7 @@ TRIMMED_STRING_TAIL = {NOT_WHITE_SPACE}{ENDTRIMMED_STRING_TAIL} OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* %state EXPRESSION_SIGN +%state STRICT_EXPRESSION_SIGN %state ASSIGNMENT_VALUE %state ONE_LINE_IGNORED_ZONE @@ -66,15 +67,16 @@ OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* {WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } - "=" { yybegin(ASSIGNMENT_VALUE); return TypoScriptTokenTypes.ASSIGNMENT_OPERATOR; } - ":=" { yybegin(MODIFICATION_OPERATOR_VALUE); return TypoScriptTokenTypes.MODIFICATION_OPERATOR; } - ">" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.UNSETTING_OPERATOR; } - "<" { yybegin(COPYING_OPERATOR_VALUE); return TypoScriptTokenTypes.COPYING_OPERATOR; } + {WHITE_SPACE_CHARS} {yybegin(STRICT_EXPRESSION_SIGN); return TokenType.WHITE_SPACE; } + "=" { yybegin(ASSIGNMENT_VALUE); return TypoScriptTokenTypes.ASSIGNMENT_OPERATOR; } + ":=" { yybegin(MODIFICATION_OPERATOR_VALUE); return TypoScriptTokenTypes.MODIFICATION_OPERATOR; } + ">" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.UNSETTING_OPERATOR; } + "<" { yybegin(COPYING_OPERATOR_VALUE); return TypoScriptTokenTypes.COPYING_OPERATOR; } "<"{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.INCLUDE_STATEMENT; } //todo[lene] create "=<" reference sign for typoscript templates; or handle < in assignment value - "(" { yybegin(MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE); + "(" { yybegin(MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_BEGIN; } - "{" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN; } + "{" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN; } "{"{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.IGNORED_TEXT; } "}" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_END; } diff --git a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java index 7c3b0d17ab74..249a70094b65 100644 --- a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java +++ b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 17.04.12 17:09 */ +/* The following code was generated by JFlex 1.4.3 on 17.04.12 17:37 */ package com.jetbrains.typoscript.lang; import com.intellij.lexer.FlexLexer; @@ -10,7 +10,7 @@ import java.io.Reader; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 17.04.12 17:09 from the specification file + * on 17.04.12 17:37 from the specification file * C:/opt/IDEA/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.flex */ public class _TypoScriptLexer implements FlexLexer { @@ -18,16 +18,17 @@ public class _TypoScriptLexer implements FlexLexer { private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ - public static final int COPYING_OPERATOR_VALUE = 8; - public static final int ASSIGNMENT_VALUE = 4; - public static final int MODIFICATION_OPERATOR_VALUE = 16; + public static final int COPYING_OPERATOR_VALUE = 10; + public static final int ASSIGNMENT_VALUE = 6; + public static final int MODIFICATION_OPERATOR_VALUE = 18; + public static final int STRICT_EXPRESSION_SIGN = 4; public static final int EXPRESSION_SIGN = 2; - public static final int ONE_LINE_IGNORED_ZONE = 6; + public static final int ONE_LINE_IGNORED_ZONE = 8; public static final int YYINITIAL = 0; - public static final int MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE = 10; - public static final int MULTILINE_OPERATOR_VALUE = 12; - public static final int MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = 18; - public static final int MULTILINE_NEW_LINE = 14; + public static final int MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE = 12; + public static final int MULTILINE_OPERATOR_VALUE = 14; + public static final int MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = 20; + public static final int MULTILINE_NEW_LINE = 16; /** * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l @@ -37,7 +38,7 @@ public class _TypoScriptLexer 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 + 8, 8, 9, 9, 10, 10 }; /** @@ -60,15 +61,15 @@ public class _TypoScriptLexer implements FlexLexer { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\4\1\1\2\1\3\2\0\2\1\1\4\1\5\1\1"+ + "\5\1\1\2\1\3\2\0\2\1\1\4\1\5\1\1"+ "\2\6\1\7\1\10\1\11\1\12\1\13\1\14\1\2"+ - "\1\15\1\4\1\16\1\17\1\20\1\21\1\22\1\23"+ - "\1\3\1\24\1\25\1\1\1\4\1\26\2\27\1\30"+ - "\2\31\1\32\1\6\3\0\1\33\4\0\1\1\1\0"+ - "\1\1\3\0\1\34"; + "\1\15\1\4\1\16\1\17\1\20\1\21\1\0\1\22"+ + "\1\23\1\3\1\24\1\25\1\1\1\4\1\26\2\27"+ + "\1\30\2\31\1\32\1\6\3\0\1\33\4\0\1\1"+ + "\1\0\1\1\3\0\1\34"; private static int [] zzUnpackAction() { - int [] result = new int[58]; + int [] result = new int[60]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -95,15 +96,15 @@ public class _TypoScriptLexer implements FlexLexer { private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\23\0\46\0\71\0\114\0\137\0\162\0\205"+ "\0\230\0\253\0\276\0\321\0\344\0\367\0\u010a\0\u011d"+ - "\0\276\0\u0130\0\u0143\0\u0156\0\276\0\u0169\0\276\0\u017c"+ - "\0\276\0\276\0\276\0\276\0\u018f\0\u01a2\0\u01b5\0\u01c8"+ - "\0\u01db\0\u01ee\0\u0201\0\276\0\u0214\0\u0227\0\276\0\u023a"+ - "\0\u024d\0\276\0\u0260\0\u0130\0\u0143\0\u0156\0\276\0\u018f"+ - "\0\u01db\0\u0201\0\u0214\0\u0227\0\u023a\0\u024d\0\u0273\0\u0286"+ - "\0\u0299\0\276"; + "\0\u0130\0\321\0\u0143\0\u0156\0\u0169\0\321\0\u017c\0\321"+ + "\0\u018f\0\321\0\321\0\321\0\321\0\u018f\0\u01a2\0\u01b5"+ + "\0\u01c8\0\u01db\0\u01ee\0\u0201\0\u0214\0\321\0\u0227\0\u023a"+ + "\0\321\0\u024d\0\u0260\0\321\0\u0273\0\u0143\0\u0156\0\u0169"+ + "\0\321\0\u01a2\0\u01ee\0\u0214\0\u0227\0\u023a\0\u024d\0\u0260"+ + "\0\u0286\0\u0299\0\u02ac\0\321"; private static int [] zzUnpackRowMap() { - int [] result = new int[58]; + int [] result = new int[60]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -126,37 +127,38 @@ public class _TypoScriptLexer implements FlexLexer { private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\1\13\1\14\1\15\1\14\1\16\1\17\1\13\1\20"+ - "\1\21\1\22\3\13\1\23\1\13\1\24\1\25\1\13"+ - "\1\15\1\13\1\14\1\15\1\14\3\13\1\26\1\21"+ - "\1\13\1\27\1\30\1\31\1\32\1\33\1\34\2\13"+ - "\1\15\1\35\1\14\1\15\1\14\16\35\1\15\1\36"+ - "\1\14\1\4\1\14\16\36\1\4\1\13\1\14\1\15"+ - "\1\14\3\13\1\26\1\21\11\13\1\15\1\37\1\40"+ - "\1\6\1\40\16\37\1\6\1\41\1\42\1\43\1\42"+ - "\15\41\1\44\1\43\3\13\1\0\17\13\1\45\1\14"+ - "\1\46\1\14\12\45\1\47\3\45\1\15\1\50\1\14"+ - "\1\51\1\14\15\50\1\52\1\15\24\0\3\14\16\0"+ - "\1\14\1\0\1\14\1\15\1\14\16\0\1\15\1\17"+ - "\1\0\1\17\1\0\2\17\1\53\15\17\1\0\1\17"+ - "\1\0\17\17\7\0\1\20\13\0\1\22\1\0\1\54"+ - "\1\0\16\22\1\54\1\23\1\0\1\55\1\0\16\23"+ - "\1\55\1\24\1\0\1\56\1\0\16\24\1\56\7\0"+ - "\1\26\25\0\1\57\10\0\1\35\1\0\1\60\1\0"+ - "\16\35\1\60\1\36\1\0\1\36\1\0\17\36\1\37"+ - "\1\0\1\37\1\0\17\37\1\0\3\40\16\0\1\40"+ - "\1\41\1\0\1\61\1\0\16\41\1\61\1\0\3\42"+ - "\16\0\1\42\1\0\1\42\1\62\1\42\16\0\1\62"+ - "\1\45\1\0\1\45\1\0\12\45\1\0\3\45\1\63"+ - "\1\45\1\14\1\46\1\14\12\45\1\0\3\45\1\64"+ - "\1\50\1\0\1\50\1\0\15\50\1\0\1\65\1\50"+ - "\1\14\1\51\1\14\15\50\1\0\1\66\1\53\1\67"+ - "\1\53\1\67\17\53\1\70\3\67\2\70\1\71\13\70"+ - "\1\67\1\70\1\67\1\70\1\67\20\70\1\67\1\70"+ - "\1\67\1\72\16\70"; + "\1\14\1\15\1\16\1\15\1\17\1\20\1\14\1\21"+ + "\1\22\1\23\3\14\1\24\1\14\1\25\1\26\1\14"+ + "\1\16\1\14\1\15\1\16\1\15\3\14\1\27\1\22"+ + "\1\14\1\30\1\31\1\32\1\33\1\34\1\35\2\14"+ + "\1\16\1\0\1\15\1\16\1\15\6\0\1\30\1\36"+ + "\1\32\1\33\1\34\1\35\2\0\1\16\1\37\1\15"+ + "\1\16\1\15\16\37\1\16\1\40\1\15\1\5\1\15"+ + "\16\40\1\5\1\14\1\15\1\16\1\15\3\14\1\27"+ + "\1\22\11\14\1\16\1\41\1\42\1\7\1\42\16\41"+ + "\1\7\1\43\1\44\1\45\1\44\15\43\1\46\1\45"+ + "\3\14\1\0\17\14\1\47\1\15\1\50\1\15\12\47"+ + "\1\51\3\47\1\16\1\52\1\15\1\53\1\15\15\52"+ + "\1\54\1\16\24\0\3\15\16\0\1\15\1\0\1\15"+ + "\1\16\1\15\16\0\1\16\1\20\1\0\1\20\1\0"+ + "\2\20\1\55\15\20\1\0\1\20\1\0\17\20\7\0"+ + "\1\21\13\0\1\23\1\0\1\56\1\0\16\23\1\56"+ + "\1\24\1\0\1\57\1\0\16\24\1\57\1\25\1\0"+ + "\1\60\1\0\16\25\1\60\7\0\1\27\25\0\1\61"+ + "\10\0\1\37\1\0\1\62\1\0\16\37\1\62\1\40"+ + "\1\0\1\40\1\0\17\40\1\41\1\0\1\41\1\0"+ + "\17\41\1\0\3\42\16\0\1\42\1\43\1\0\1\63"+ + "\1\0\16\43\1\63\1\0\3\44\16\0\1\44\1\0"+ + "\1\44\1\64\1\44\16\0\1\64\1\47\1\0\1\47"+ + "\1\0\12\47\1\0\3\47\1\65\1\47\1\15\1\50"+ + "\1\15\12\47\1\0\3\47\1\66\1\52\1\0\1\52"+ + "\1\0\15\52\1\0\1\67\1\52\1\15\1\53\1\15"+ + "\15\52\1\0\1\70\1\55\1\71\1\55\1\71\17\55"+ + "\1\72\3\71\2\72\1\73\13\72\1\71\1\72\1\71"+ + "\1\72\1\71\20\72\1\71\1\72\1\71\1\74\16\72"; private static int [] zzUnpackTrans() { - int [] result = new int[684]; + int [] result = new int[703]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -197,13 +199,13 @@ public class _TypoScriptLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\6\1\2\0\2\1\1\11\5\1\1\11\3\1\1\11"+ - "\1\1\1\11\1\1\4\11\7\1\1\11\2\1\1\11"+ - "\2\1\1\11\1\1\3\0\1\11\4\0\1\1\1\0"+ - "\1\1\3\0\1\11"; + "\7\1\2\0\2\1\1\11\5\1\1\11\3\1\1\11"+ + "\1\1\1\11\1\1\4\11\1\0\7\1\1\11\2\1"+ + "\1\11\2\1\1\11\1\1\3\0\1\11\4\0\1\1"+ + "\1\0\1\1\3\0\1\11"; private static int [] zzUnpackAttribute() { - int [] result = new int[58]; + int [] result = new int[60]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; From d59db7c18ed10bc7cc5a16036bdb1174ef8bacc0 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Tue, 17 Apr 2012 18:29:05 +0400 Subject: [PATCH 008/147] WhiteSpaceWithNewLine element --- .../jetbrains/typoscript/lang/TypoScript.flex | 8 +- .../typoscript/lang/_TypoScriptLexer.java | 18 +- .../lexer/assignments.test.expected | 12 +- .../typoscript/lexer/codeBlock.test.expected | 38 +- .../typoscript/lexer/comments.test.expected | 8 +- .../lexer/copyingOperator.test.expected | 4 +- .../lexer/exampleFromTypo.test.expected | 556 +++++++++--------- .../typoscript/lexer/include.test.expected | 14 +- .../lexer/multilineValue.test.expected | 10 +- .../lexer/objectPaths.test.expected | 6 +- .../lexer/singleLineComments.test.expected | 18 +- .../lexer/unsettingOperator.test.expected | 4 +- .../valueModificationOperator.test.expected | 12 +- 13 files changed, 354 insertions(+), 354 deletions(-) diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.flex b/src/com/jetbrains/typoscript/lang/TypoScript.flex index cf274716b699..4912f476cb48 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScript.flex +++ b/src/com/jetbrains/typoscript/lang/TypoScript.flex @@ -48,7 +48,7 @@ OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* %xstate MODIFICATION_OPERATOR_FUNCTION_ARGUMENT %% -{WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } +{WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE; } {WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } {ONE_LINE_COMMENT} { return TypoScriptTokenTypes.ONE_LINE_COMMENT; } @@ -63,7 +63,7 @@ OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* {OBJECT_PATH_ENTITY} { return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; } "." { return TypoScriptTokenTypes.OBJECT_PATH_SEPARATOR; } - {WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + {WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE; } {WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } @@ -88,7 +88,7 @@ OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* {STRING_TAIL} { yybegin(MULTILINE_OPERATOR_VALUE); return TypoScriptTokenTypes.IGNORED_TEXT; } {WHITESPACE_WITH_NEW_LINE} { yybegin(MULTILINE_OPERATOR_VALUE); - return TokenType.WHITE_SPACE; } + return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE; } {WHITESPACE_WITH_NEW_LINE} { return TokenType.WHITE_SPACE; } [^\ \n\r\t\f\)]{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.MULTILINE_VALUE; } ")" { yybegin(ONE_LINE_IGNORED_ZONE); @@ -100,7 +100,7 @@ OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* ([^" "\r\n")"][^\r\n")"]*[^" "\r\n")"])|([^" "\r\n")"]) { return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_ARGUMENT;} ")" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_PARAM_END; } - {WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + {WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE; } {WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } diff --git a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java index 249a70094b65..ceabefc4814f 100644 --- a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java +++ b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 17.04.12 17:37 */ +/* The following code was generated by JFlex 1.4.3 on 17.04.12 18:23 */ package com.jetbrains.typoscript.lang; import com.intellij.lexer.FlexLexer; @@ -10,7 +10,7 @@ import java.io.Reader; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 17.04.12 17:37 from the specification file + * on 17.04.12 18:23 from the specification file * C:/opt/IDEA/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.flex */ public class _TypoScriptLexer implements FlexLexer { @@ -545,19 +545,19 @@ public class _TypoScriptLexer implements FlexLexer { { yybegin(EXPRESSION_SIGN); return TypoScriptTokenTypes.OBJECT_PATH_ENTITY; } case 35: break; - case 20: - { yybegin(MULTILINE_OPERATOR_VALUE); - return TokenType.WHITE_SPACE; - } - case 36: break; case 1: { return TokenType.WHITE_SPACE; } - case 37: break; + case 36: break; case 22: { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_END; } + case 37: break; + case 20: + { yybegin(MULTILINE_OPERATOR_VALUE); + return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE; + } case 38: break; case 19: { yybegin(YYINITIAL); return TypoScriptTokenTypes.IGNORED_TEXT; @@ -605,7 +605,7 @@ public class _TypoScriptLexer implements FlexLexer { } case 49: break; case 5: - { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; + { yybegin(YYINITIAL); return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE; } case 50: break; case 26: diff --git a/testData/typoscript/lexer/assignments.test.expected b/testData/typoscript/lexer/assignments.test.expected index 24b1b3a94deb..d6561f960cd9 100644 --- a/testData/typoscript/lexer/assignments.test.expected +++ b/testData/typoscript/lexer/assignments.test.expected @@ -3,7 +3,7 @@ WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('[value 1]') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('myObject') OBJECT_PATH_SEPARATOR ('.') @@ -12,7 +12,7 @@ WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('myObject') OBJECT_PATH_SEPARATOR ('.') @@ -22,7 +22,7 @@ OBJECT_PATH_ENTITY ('firstProperty') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('[value 3]') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('myObject') OBJECT_PATH_SEPARATOR ('.') @@ -33,7 +33,7 @@ WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('[value 4]') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('myObject') @@ -43,14 +43,14 @@ WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('{value 2 with [GLOBAL] anf other () provocations}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('myObject') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('HTML') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('myObject') OBJECT_PATH_SEPARATOR ('.') diff --git a/testData/typoscript/lexer/codeBlock.test.expected b/testData/typoscript/lexer/codeBlock.test.expected index 444c499db1dd..47367edd7ede 100644 --- a/testData/typoscript/lexer/codeBlock.test.expected +++ b/testData/typoscript/lexer/codeBlock.test.expected @@ -1,51 +1,51 @@ OBJECT_PATH_ENTITY ('myObject') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('field') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('title') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('ifEmpty') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') IGNORED_TEXT (' IGNORED_TEXT') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('data') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('leveltitle:0 } bracket is ignored') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CONDITION ('[i = 5]') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') IGNORED_TEXT (' some IGNORED_TEXT') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') IGNORED_TEXT (' this brace is also ignored by parser') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('second') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('object') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') IGNORED_TEXT ('{ ignored opening bracket') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('10') @@ -53,34 +53,34 @@ WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('left') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('prop') WHITE_SPACE (' ') COPY ('<') WHITE_SPACE (' ') OBJECT_PATH_ENTITY ('test') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('text') MULTILINE_OPEN ('(') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') MULTILINE_VALUE ('} ignored bracket') WHITE_SPACE (' ') MULTILINE_CLOSE (')') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('third') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('object') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('do') OBJECT_PATH_SEPARATOR ('.') @@ -88,14 +88,14 @@ OBJECT_PATH_ENTITY ('not') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('ignore') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('i') ASSIGN ('=') ASSIGNMENT_VALUE ('5') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') \ No newline at end of file diff --git a/testData/typoscript/lexer/comments.test.expected b/testData/typoscript/lexer/comments.test.expected index ff5c0da41462..1be9eb30f027 100644 --- a/testData/typoscript/lexer/comments.test.expected +++ b/testData/typoscript/lexer/comments.test.expected @@ -1,20 +1,20 @@ C_STYLE_COMMENT ('/* a comment */ */') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') C_STYLE_COMMENT ('/** also comment */') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') C_STYLE_COMMENT ('/* */ comment */ */') IGNORED_TEXT (' ignored text') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('assign') @@ -22,5 +22,5 @@ WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('ment') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/copyingOperator.test.expected b/testData/typoscript/lexer/copyingOperator.test.expected index b7e70d513351..fa262ff869f7 100644 --- a/testData/typoscript/lexer/copyingOperator.test.expected +++ b/testData/typoscript/lexer/copyingOperator.test.expected @@ -3,7 +3,7 @@ WHITE_SPACE (' ') COPY ('<') WHITE_SPACE (' ') OBJECT_PATH_ENTITY ('myObject') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('20') WHITE_SPACE (' ') @@ -16,7 +16,7 @@ WHITE_SPACE (' ') OBJECT_PATH_ENTITY ('strange') WHITE_SPACE (' ') OBJECT_PATH_ENTITY ('text') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('30') WHITE_SPACE (' ') diff --git a/testData/typoscript/lexer/exampleFromTypo.test.expected b/testData/typoscript/lexer/exampleFromTypo.test.expected index 8d754c4b6e4e..fcf99d499224 100644 --- a/testData/typoscript/lexer/exampleFromTypo.test.expected +++ b/testData/typoscript/lexer/exampleFromTypo.test.expected @@ -3,36 +3,36 @@ OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('wizards') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('newContentElement') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('wizardItems') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('forms') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('elements') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('mailform') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('tt_content_defValues') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('bodytext') WHITE_SPACE (' ') MULTILINE_OPEN ('(') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') MULTILINE_VALUE ('enctype = multipart/form-data') WHITE_SPACE (' @@ -44,996 +44,996 @@ MULTILINE_VALUE ('prefix = tx_form') WHITE_SPACE (' ') MULTILINE_CLOSE (')') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('form') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('defaults') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showTabs') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('elements, options, form') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('tabs') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('elements') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('basic, predefined, content') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('basic') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showButtons') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('checkbox, fieldset, fileupload, hidden, password, radio, reset, select, submit, textarea, textline') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('predefined') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showButtons') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('email, radiogroup, checkboxgroup, name') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('content') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showButtons') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('header, textblock') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('options') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('legend, label, attributes, options, validation, filters, various') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('accept, acceptcharset, accesskey, action, alt, checked, class, cols, dir, disabled, enctype, id, label, lang, maxlength, method, multiple, name, readonly, rows, selected, size, src, style, tabindex, title, type, value') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('label') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('label') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('alphabetic, alphanumeric, between, date, digit, email, equals, fileallowedtypes, filemaximumsize, fileminimumsize, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('rules') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('alphabetic') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, allowWhiteSpace') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('alphanumeric') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, allowWhiteSpace') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('between') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum, maximum, inclusive') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('date') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, format') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('digit') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('email') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('equals') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, field') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('fileallowedtypes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, types') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('filemaximumsize') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, maximum') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('fileminimumsize') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('float') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('greaterthan') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('inarray') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, array, strict') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('integer') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('ip') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('length') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum, maximum') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('lessthan') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, maximum') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('regexp') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, expression') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('required') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('uri') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('filtering') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showFilters') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, removexss, stripnewlines, titlecase, trim, uppercase') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('filters') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('alphabetic') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('allowWhiteSpace') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('alphanumeric') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('allowWhiteSpace') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('currency') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('decimalPoint, thousandSeparator') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('digit') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('integer') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('lowercase') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('regexp') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('expression') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('removexss') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('stripnewlines') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('titlecase') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('trim') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('characterList') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('uppercase') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('form') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('prefix, attributes, postProcessor') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('accept, acceptcharset, action, class, dir, enctype, id, lang, method, name, style, title') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('postProcessor') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showPostProcessors') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('mail') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('postProcessors') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('mail') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('recipientEmail, senderEmail') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('elements') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('button') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('attributes') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('value') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('checkbox') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('label, attributes') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('name, value') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('fieldset') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('legend') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('fileupload') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('label, attributes, validation') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('name') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('required, fileallowedtypes, filemaximumsize, fileminimumsize') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('hidden') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('attributes') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('name, value') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('password') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('label, attributes, validation') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('name') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('required, equals') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('radio') WHITE_SPACE (' ') @@ -1041,7 +1041,7 @@ COPY ('<') WHITE_SPACE (' ') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('checkbox') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('reset') WHITE_SPACE (' ') @@ -1049,60 +1049,60 @@ COPY ('<') WHITE_SPACE (' ') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('button') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('select') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('label, attributes, options, validation') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('name, multiple') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('required') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('submit') WHITE_SPACE (' ') @@ -1110,181 +1110,181 @@ COPY ('<') WHITE_SPACE (' ') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('button') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('textarea') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('label, attributes, validation, filters') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('name, cols, rows') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('filtering') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showFilters') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('alphabetic, alphanumeric, lowercase, regexp, stripnewlines, titlecase, trim, uppercase') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('alphabetic, alphanumeric, length, regexp, required') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('textline') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('label, attributes, validation, filters') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('attributes') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showProperties') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('name') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('alphabetic, alphanumeric, between, date, digit, email, equals, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('filtering') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showFilters') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, titlecase, trim, uppercase') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('checkboxgroup') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('legend, options, various, validation') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('accordions') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('validation') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showRules') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('required') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('email') WHITE_SPACE (' ') @@ -1292,52 +1292,52 @@ COPY ('<') WHITE_SPACE (' ') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('textline') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('header') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('various') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('textblock') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('various') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('name') WHITE_SPACE (' ') CODE_BLOCK_OPEN ('{') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('showAccordions') WHITE_SPACE (' ') ASSIGN ('=') WHITE_SPACE (' ') ASSIGNMENT_VALUE ('legend, various') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('radiogroup') WHITE_SPACE (' ') @@ -1345,14 +1345,14 @@ COPY ('<') WHITE_SPACE (' ') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('checkboxgroup') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') CODE_BLOCK_CLOSE ('}') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/include.test.expected b/testData/typoscript/lexer/include.test.expected index 056fd5b80bb0..e2ae7bc12cee 100644 --- a/testData/typoscript/lexer/include.test.expected +++ b/testData/typoscript/lexer/include.test.expected @@ -1,21 +1,21 @@ INCLUDE ('') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') INCLUDE ('') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') INCLUDE (' t = 8') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') INCLUDE ('<') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') INCLUDE ('< INCLsome strange text>') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') INCLUDE ('< f = 34') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') INCLUDE ('< fff.dsfs') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/multilineValue.test.expected b/testData/typoscript/lexer/multilineValue.test.expected index 6a7dfa54f3bd..853d16523708 100644 --- a/testData/typoscript/lexer/multilineValue.test.expected +++ b/testData/typoscript/lexer/multilineValue.test.expected @@ -1,12 +1,12 @@ OBJECT_PATH_ENTITY ('myObject') MULTILINE_OPEN ('(') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') MULTILINE_VALUE ('some value') WHITE_SPACE (' ') MULTILINE_CLOSE (')') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('myObject') @@ -30,13 +30,13 @@ MULTILINE_VALUE ('}') WHITE_SPACE (' ') MULTILINE_CLOSE (')') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('myObject3') WHITE_SPACE (' ') MULTILINE_OPEN ('(') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') MULTILINE_VALUE ('prop{') WHITE_SPACE (' @@ -52,5 +52,5 @@ WHITE_SPACE (' ') MULTILINE_CLOSE (')') IGNORED_TEXT ('also IGNORED_TEXT') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/objectPaths.test.expected b/testData/typoscript/lexer/objectPaths.test.expected index 6651b8f7ae25..b36a0c2312c4 100644 --- a/testData/typoscript/lexer/objectPaths.test.expected +++ b/testData/typoscript/lexer/objectPaths.test.expected @@ -15,14 +15,14 @@ WHITE_SPACE (' ') OBJECT_PATH_ENTITY ('otherObject') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('prop') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('10') WHITE_SPACE (' ') UNSET ('>') IGNORED_TEXT (' not.a.path') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('9path') OBJECT_PATH_SEPARATOR ('.') @@ -45,5 +45,5 @@ OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('of') OBJECT_PATH_SEPARATOR ('.') OBJECT_PATH_ENTITY ('spaces') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/singleLineComments.test.expected b/testData/typoscript/lexer/singleLineComments.test.expected index 4e942cd0a466..4027cef53b01 100644 --- a/testData/typoscript/lexer/singleLineComments.test.expected +++ b/testData/typoscript/lexer/singleLineComments.test.expected @@ -1,28 +1,28 @@ ONE_LINE_COMMENT ('#CommentText') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') ONE_LINE_COMMENT ('/ another comment') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') ONE_LINE_COMMENT ('/third comment for test') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') ONE_LINE_COMMENT ('#fourth comment') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') ONE_LINE_COMMENT ('# the fifth comment') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') ONE_LINE_COMMENT ('#sixth comment') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') ONE_LINE_COMMENT ('/seventh') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') ONE_LINE_COMMENT ('/and one more comment') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') -ONE_LINE_COMMENT ('// must be single comment') +ONE_LINE_COMMENT ('// must be single comment') \ No newline at end of file diff --git a/testData/typoscript/lexer/unsettingOperator.test.expected b/testData/typoscript/lexer/unsettingOperator.test.expected index 8ba591b81fdf..c7879c4e0de5 100644 --- a/testData/typoscript/lexer/unsettingOperator.test.expected +++ b/testData/typoscript/lexer/unsettingOperator.test.expected @@ -2,13 +2,13 @@ WHITE_SPACE (' ') OBJECT_PATH_ENTITY ('myObject') WHITE_SPACE (' ') UNSET ('>') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('object') WHITE_SPACE (' ') UNSET ('>') IGNORED_TEXT (' some irrelevant text') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('nextObjext') OBJECT_PATH_SEPARATOR ('.') diff --git a/testData/typoscript/lexer/valueModificationOperator.test.expected b/testData/typoscript/lexer/valueModificationOperator.test.expected index 55ab9233d70f..97be0316a98f 100644 --- a/testData/typoscript/lexer/valueModificationOperator.test.expected +++ b/testData/typoscript/lexer/valueModificationOperator.test.expected @@ -4,14 +4,14 @@ MODIFICATION_FUNCTION ('addToList') MODIFICATION_OPEN ('(') MODIFICATION_VALUE ('4,5') MODIFICATION_CLOSE (')') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('value2') MODIFY (':=') MODIFICATION_FUNCTION ('addToList') MODIFICATION_OPEN ('(') MODIFICATION_VALUE ('4,5') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('value3') MODIFY (':=') @@ -20,11 +20,11 @@ WHITE_SPACE (' ') MODIFICATION_VALUE ('4 and some text') WHITE_SPACE (' ') MODIFICATION_CLOSE (')') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('value4') BAD_CHARACTER (':') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('value5') MODIFY (':=') @@ -34,7 +34,7 @@ MODIFICATION_OPEN ('(') WHITE_SPACE (' ') MODIFICATION_VALUE ('4,5') MODIFICATION_CLOSE (')') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('value6') MODIFY (':=') @@ -43,7 +43,7 @@ MODIFICATION_OPEN ('(') MODIFICATION_VALUE ('4,5') MODIFICATION_CLOSE (')') IGNORED_TEXT (' some IGNORED_TEXT') -WHITE_SPACE (' +WHITE_SPACE_WITH_NEW_LINE (' ') OBJECT_PATH_ENTITY ('value7') BAD_CHARACTER (':') From 326842544f4d1023e5bf871cfac4a2b50e555cc7 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Tue, 17 Apr 2012 19:25:23 +0400 Subject: [PATCH 009/147] Remove useless state in lexer --- .../jetbrains/typoscript/lang/TypoScript.flex | 15 +-- .../typoscript/lang/_TypoScriptLexer.java | 118 +++++++++--------- 2 files changed, 64 insertions(+), 69 deletions(-) diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.flex b/src/com/jetbrains/typoscript/lang/TypoScript.flex index 4912f476cb48..66a67f5cbd96 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScript.flex +++ b/src/com/jetbrains/typoscript/lang/TypoScript.flex @@ -34,7 +34,6 @@ TRIMMED_STRING_TAIL = {NOT_WHITE_SPACE}{ENDTRIMMED_STRING_TAIL} OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* %state EXPRESSION_SIGN -%state STRICT_EXPRESSION_SIGN %state ASSIGNMENT_VALUE %state ONE_LINE_IGNORED_ZONE @@ -66,17 +65,15 @@ OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* {WHITESPACE_WITH_NEW_LINE} { yybegin(YYINITIAL); return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE; } {WHITE_SPACE_CHARS} { return TokenType.WHITE_SPACE; } - - {WHITE_SPACE_CHARS} {yybegin(STRICT_EXPRESSION_SIGN); return TokenType.WHITE_SPACE; } - "=" { yybegin(ASSIGNMENT_VALUE); return TypoScriptTokenTypes.ASSIGNMENT_OPERATOR; } - ":=" { yybegin(MODIFICATION_OPERATOR_VALUE); return TypoScriptTokenTypes.MODIFICATION_OPERATOR; } - ">" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.UNSETTING_OPERATOR; } - "<" { yybegin(COPYING_OPERATOR_VALUE); return TypoScriptTokenTypes.COPYING_OPERATOR; } + "=" { yybegin(ASSIGNMENT_VALUE); return TypoScriptTokenTypes.ASSIGNMENT_OPERATOR; } + ":=" { yybegin(MODIFICATION_OPERATOR_VALUE); return TypoScriptTokenTypes.MODIFICATION_OPERATOR; } + ">" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.UNSETTING_OPERATOR; } + "<" { yybegin(COPYING_OPERATOR_VALUE); return TypoScriptTokenTypes.COPYING_OPERATOR; } "<"{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.INCLUDE_STATEMENT; } //todo[lene] create "=<" reference sign for typoscript templates; or handle < in assignment value - "(" { yybegin(MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE); + "(" { yybegin(MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_BEGIN; } - "{" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN; } + "{" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN; } "{"{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.IGNORED_TEXT; } "}" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_END; } diff --git a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java index ceabefc4814f..f3dbeeb4640c 100644 --- a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java +++ b/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 17.04.12 18:23 */ +/* The following code was generated by JFlex 1.4.3 on 17.04.12 19:23 */ package com.jetbrains.typoscript.lang; import com.intellij.lexer.FlexLexer; @@ -10,7 +10,7 @@ import java.io.Reader; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 17.04.12 18:23 from the specification file + * on 17.04.12 19:23 from the specification file * C:/opt/IDEA/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.flex */ public class _TypoScriptLexer implements FlexLexer { @@ -18,17 +18,16 @@ public class _TypoScriptLexer implements FlexLexer { private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ - public static final int COPYING_OPERATOR_VALUE = 10; - public static final int ASSIGNMENT_VALUE = 6; - public static final int MODIFICATION_OPERATOR_VALUE = 18; - public static final int STRICT_EXPRESSION_SIGN = 4; + public static final int COPYING_OPERATOR_VALUE = 8; + public static final int ASSIGNMENT_VALUE = 4; + public static final int MODIFICATION_OPERATOR_VALUE = 16; public static final int EXPRESSION_SIGN = 2; - public static final int ONE_LINE_IGNORED_ZONE = 8; + public static final int ONE_LINE_IGNORED_ZONE = 6; public static final int YYINITIAL = 0; - public static final int MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE = 12; - public static final int MULTILINE_OPERATOR_VALUE = 14; - public static final int MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = 20; - public static final int MULTILINE_NEW_LINE = 16; + public static final int MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE = 10; + public static final int MULTILINE_OPERATOR_VALUE = 12; + public static final int MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = 18; + public static final int MULTILINE_NEW_LINE = 14; /** * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l @@ -38,7 +37,7 @@ public class _TypoScriptLexer 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 + 8, 8, 9, 9 }; /** @@ -61,15 +60,15 @@ public class _TypoScriptLexer implements FlexLexer { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\5\1\1\2\1\3\2\0\2\1\1\4\1\5\1\1"+ + "\4\1\1\2\1\3\2\0\2\1\1\4\1\5\1\1"+ "\2\6\1\7\1\10\1\11\1\12\1\13\1\14\1\2"+ - "\1\15\1\4\1\16\1\17\1\20\1\21\1\0\1\22"+ - "\1\23\1\3\1\24\1\25\1\1\1\4\1\26\2\27"+ - "\1\30\2\31\1\32\1\6\3\0\1\33\4\0\1\1"+ - "\1\0\1\1\3\0\1\34"; + "\1\15\1\4\1\16\1\17\1\20\1\21\1\22\1\23"+ + "\1\3\1\24\1\25\1\1\1\4\1\26\2\27\1\30"+ + "\2\31\1\32\1\6\3\0\1\33\4\0\1\1\1\0"+ + "\1\1\3\0\1\34"; private static int [] zzUnpackAction() { - int [] result = new int[60]; + int [] result = new int[58]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -96,15 +95,15 @@ public class _TypoScriptLexer implements FlexLexer { private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\23\0\46\0\71\0\114\0\137\0\162\0\205"+ "\0\230\0\253\0\276\0\321\0\344\0\367\0\u010a\0\u011d"+ - "\0\u0130\0\321\0\u0143\0\u0156\0\u0169\0\321\0\u017c\0\321"+ - "\0\u018f\0\321\0\321\0\321\0\321\0\u018f\0\u01a2\0\u01b5"+ - "\0\u01c8\0\u01db\0\u01ee\0\u0201\0\u0214\0\321\0\u0227\0\u023a"+ - "\0\321\0\u024d\0\u0260\0\321\0\u0273\0\u0143\0\u0156\0\u0169"+ - "\0\321\0\u01a2\0\u01ee\0\u0214\0\u0227\0\u023a\0\u024d\0\u0260"+ - "\0\u0286\0\u0299\0\u02ac\0\321"; + "\0\276\0\u0130\0\u0143\0\u0156\0\276\0\u0169\0\276\0\u017c"+ + "\0\276\0\276\0\276\0\276\0\u018f\0\u01a2\0\u01b5\0\u01c8"+ + "\0\u01db\0\u01ee\0\u0201\0\276\0\u0214\0\u0227\0\276\0\u023a"+ + "\0\u024d\0\276\0\u0260\0\u0130\0\u0143\0\u0156\0\276\0\u018f"+ + "\0\u01db\0\u0201\0\u0214\0\u0227\0\u023a\0\u024d\0\u0273\0\u0286"+ + "\0\u0299\0\276"; private static int [] zzUnpackRowMap() { - int [] result = new int[60]; + int [] result = new int[58]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -127,38 +126,37 @@ public class _TypoScriptLexer implements FlexLexer { private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\1\14\1\15\1\16\1\15\1\17\1\20\1\14\1\21"+ - "\1\22\1\23\3\14\1\24\1\14\1\25\1\26\1\14"+ - "\1\16\1\14\1\15\1\16\1\15\3\14\1\27\1\22"+ - "\1\14\1\30\1\31\1\32\1\33\1\34\1\35\2\14"+ - "\1\16\1\0\1\15\1\16\1\15\6\0\1\30\1\36"+ - "\1\32\1\33\1\34\1\35\2\0\1\16\1\37\1\15"+ - "\1\16\1\15\16\37\1\16\1\40\1\15\1\5\1\15"+ - "\16\40\1\5\1\14\1\15\1\16\1\15\3\14\1\27"+ - "\1\22\11\14\1\16\1\41\1\42\1\7\1\42\16\41"+ - "\1\7\1\43\1\44\1\45\1\44\15\43\1\46\1\45"+ - "\3\14\1\0\17\14\1\47\1\15\1\50\1\15\12\47"+ - "\1\51\3\47\1\16\1\52\1\15\1\53\1\15\15\52"+ - "\1\54\1\16\24\0\3\15\16\0\1\15\1\0\1\15"+ - "\1\16\1\15\16\0\1\16\1\20\1\0\1\20\1\0"+ - "\2\20\1\55\15\20\1\0\1\20\1\0\17\20\7\0"+ - "\1\21\13\0\1\23\1\0\1\56\1\0\16\23\1\56"+ - "\1\24\1\0\1\57\1\0\16\24\1\57\1\25\1\0"+ - "\1\60\1\0\16\25\1\60\7\0\1\27\25\0\1\61"+ - "\10\0\1\37\1\0\1\62\1\0\16\37\1\62\1\40"+ - "\1\0\1\40\1\0\17\40\1\41\1\0\1\41\1\0"+ - "\17\41\1\0\3\42\16\0\1\42\1\43\1\0\1\63"+ - "\1\0\16\43\1\63\1\0\3\44\16\0\1\44\1\0"+ - "\1\44\1\64\1\44\16\0\1\64\1\47\1\0\1\47"+ - "\1\0\12\47\1\0\3\47\1\65\1\47\1\15\1\50"+ - "\1\15\12\47\1\0\3\47\1\66\1\52\1\0\1\52"+ - "\1\0\15\52\1\0\1\67\1\52\1\15\1\53\1\15"+ - "\15\52\1\0\1\70\1\55\1\71\1\55\1\71\17\55"+ - "\1\72\3\71\2\72\1\73\13\72\1\71\1\72\1\71"+ - "\1\72\1\71\20\72\1\71\1\72\1\71\1\74\16\72"; + "\1\13\1\14\1\15\1\14\1\16\1\17\1\13\1\20"+ + "\1\21\1\22\3\13\1\23\1\13\1\24\1\25\1\13"+ + "\1\15\1\13\1\14\1\15\1\14\3\13\1\26\1\21"+ + "\1\13\1\27\1\30\1\31\1\32\1\33\1\34\2\13"+ + "\1\15\1\35\1\14\1\15\1\14\16\35\1\15\1\36"+ + "\1\14\1\4\1\14\16\36\1\4\1\13\1\14\1\15"+ + "\1\14\3\13\1\26\1\21\11\13\1\15\1\37\1\40"+ + "\1\6\1\40\16\37\1\6\1\41\1\42\1\43\1\42"+ + "\15\41\1\44\1\43\3\13\1\0\17\13\1\45\1\14"+ + "\1\46\1\14\12\45\1\47\3\45\1\15\1\50\1\14"+ + "\1\51\1\14\15\50\1\52\1\15\24\0\3\14\16\0"+ + "\1\14\1\0\1\14\1\15\1\14\16\0\1\15\1\17"+ + "\1\0\1\17\1\0\2\17\1\53\15\17\1\0\1\17"+ + "\1\0\17\17\7\0\1\20\13\0\1\22\1\0\1\54"+ + "\1\0\16\22\1\54\1\23\1\0\1\55\1\0\16\23"+ + "\1\55\1\24\1\0\1\56\1\0\16\24\1\56\7\0"+ + "\1\26\25\0\1\57\10\0\1\35\1\0\1\60\1\0"+ + "\16\35\1\60\1\36\1\0\1\36\1\0\17\36\1\37"+ + "\1\0\1\37\1\0\17\37\1\0\3\40\16\0\1\40"+ + "\1\41\1\0\1\61\1\0\16\41\1\61\1\0\3\42"+ + "\16\0\1\42\1\0\1\42\1\62\1\42\16\0\1\62"+ + "\1\45\1\0\1\45\1\0\12\45\1\0\3\45\1\63"+ + "\1\45\1\14\1\46\1\14\12\45\1\0\3\45\1\64"+ + "\1\50\1\0\1\50\1\0\15\50\1\0\1\65\1\50"+ + "\1\14\1\51\1\14\15\50\1\0\1\66\1\53\1\67"+ + "\1\53\1\67\17\53\1\70\3\67\2\70\1\71\13\70"+ + "\1\67\1\70\1\67\1\70\1\67\20\70\1\67\1\70"+ + "\1\67\1\72\16\70"; private static int [] zzUnpackTrans() { - int [] result = new int[703]; + int [] result = new int[684]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -199,13 +197,13 @@ public class _TypoScriptLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\7\1\2\0\2\1\1\11\5\1\1\11\3\1\1\11"+ - "\1\1\1\11\1\1\4\11\1\0\7\1\1\11\2\1"+ - "\1\11\2\1\1\11\1\1\3\0\1\11\4\0\1\1"+ - "\1\0\1\1\3\0\1\11"; + "\6\1\2\0\2\1\1\11\5\1\1\11\3\1\1\11"+ + "\1\1\1\11\1\1\4\11\7\1\1\11\2\1\1\11"+ + "\2\1\1\11\1\1\3\0\1\11\4\0\1\1\1\0"+ + "\1\1\3\0\1\11"; private static int [] zzUnpackAttribute() { - int [] result = new int[60]; + int [] result = new int[58]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; From 21c484696da404d15d3cbd18031c611550e2fdad Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Tue, 17 Apr 2012 22:17:43 +0400 Subject: [PATCH 010/147] improved parser; bracematcher added --- .../lang/TypoScriptElementTypes.java | 4 - .../lang/TypoScriptGeneratedParser.java | 388 +++++++++--------- .../typoscript/lang/psi/Assignment.java | 3 + .../typoscript/lang/psi/CodeBlock.java | 8 +- .../typoscript/lang/psi/Copying.java | 2 +- .../lang/psi/MultilineValueAssignment.java | 3 + .../lang/psi/OneLineCommentElement.java | 10 - .../typoscript/lang/psi/Unsetting.java | 3 + .../lang/psi/ValueModification.java | 3 + .../typoscript/lang/psi/Visitor.java | 49 +++ .../lang/psi/impl/AssignmentImpl.java | 12 + .../lang/psi/impl/CodeBlockImpl.java | 22 +- .../lang/psi/impl/ConditionElementImpl.java | 6 + .../typoscript/lang/psi/impl/CopyingImpl.java | 10 +- .../psi/impl/IncludeStatementElementImpl.java | 6 + .../impl/MultilineValueAssignmentImpl.java | 12 + .../lang/psi/impl/ObjectPathImpl.java | 6 + .../psi/impl/OneLineCommentElementImpl.java | 19 - .../lang/psi/impl/UnsettingImpl.java | 12 + .../lang/psi/impl/ValueModificationImpl.java | 12 + src/META-INF/plugin.xml | 1 + .../lang/GeneratedParserUtilBase.java | 56 +-- .../jetbrains/typoscript/lang/TypoScript.bnf | 41 +- .../lang/TypoScriptBraceMatcher.java | 47 +++ .../typoscript/lang/TypoScriptParserUtil.java | 6 + .../typoscript/lang/TypoScriptTokenTypes.java | 3 +- .../TypoScriptHighlightingData.java | 10 +- 27 files changed, 467 insertions(+), 287 deletions(-) delete mode 100644 gen/com/jetbrains/typoscript/lang/psi/OneLineCommentElement.java create mode 100644 gen/com/jetbrains/typoscript/lang/psi/Visitor.java delete mode 100644 gen/com/jetbrains/typoscript/lang/psi/impl/OneLineCommentElementImpl.java create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java diff --git a/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java b/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java index a12f39c6fa92..1400cf65de1f 100644 --- a/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java +++ b/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java @@ -15,7 +15,6 @@ public interface TypoScriptElementTypes { IElementType INCLUDE_STATEMENT_ELEMENT = new TypoScriptTokenType("INCLUDE_STATEMENT_ELEMENT"); IElementType MULTILINE_VALUE_ASSIGNMENT = new TypoScriptTokenType("MULTILINE_VALUE_ASSIGNMENT"); IElementType OBJECT_PATH = new TypoScriptTokenType("OBJECT_PATH"); - IElementType ONE_LINE_COMMENT_ELEMENT = new TypoScriptTokenType("ONE_LINE_COMMENT_ELEMENT"); IElementType UNSETTING = new TypoScriptTokenType("UNSETTING"); IElementType VALUE_MODIFICATION = new TypoScriptTokenType("VALUE_MODIFICATION"); @@ -43,9 +42,6 @@ public interface TypoScriptElementTypes { else if (type == OBJECT_PATH) { return new ObjectPathImpl(node); } - else if (type == ONE_LINE_COMMENT_ELEMENT) { - return new OneLineCommentElementImpl(node); - } else if (type == UNSETTING) { return new UnsettingImpl(node); } diff --git a/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java b/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java index d7926c4b54cc..1b9cb7370ae5 100644 --- a/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java +++ b/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java @@ -44,9 +44,6 @@ public class TypoScriptGeneratedParser implements PsiParser { else if (root_ == OBJECT_PATH) { result_ = object_path(builder_, level_ + 1); } - else if (root_ == ONE_LINE_COMMENT_ELEMENT) { - result_ = one_line_comment_element(builder_, level_ + 1); - } else if (root_ == UNSETTING) { result_ = unsetting(builder_, level_ + 1); } @@ -55,7 +52,7 @@ public class TypoScriptGeneratedParser implements PsiParser { } else { Marker marker_ = builder_.mark(); - result_ = c_style_comment_element(builder_, level_ + 1); + result_ = parse_root_(root_, builder_, level_); while (builder_.getTokenType() != null) { builder_.advanceLexer(); } @@ -64,50 +61,64 @@ public class TypoScriptGeneratedParser implements PsiParser { return builder_.getTreeBuilt(); } + protected boolean parse_root_(final IElementType root_, final PsiBuilder builder_, final int level_) { + return file(builder_, level_ + 1); + } + /* ********************************************************** */ - // ASSIGNMENT ASSIGNMENT_VALUE + // object_path '=' ASSIGNMENT_VALUE? public static boolean assignment(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "assignment")) return false; - if (!nextTokenIs(builder_, ASSIGNMENT)) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; boolean result_ = false; + boolean pinned_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, ASSIGNMENT); - result_ = result_ && consumeToken(builder_, ASSIGNMENT_VALUE); - if (result_) { + enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); + result_ = object_path(builder_, level_ + 1); + result_ = result_ && consumeToken(builder_, ASSIGNMENT_OPERATOR); + pinned_ = result_; // pin = 2 + result_ = result_ && assignment_2(builder_, level_ + 1); + if (result_ || pinned_) { marker_.done(ASSIGNMENT); } else { marker_.rollbackTo(); } - return result_; + result_ = exitErrorRecordingSection(builder_, result_, level_, pinned_, _SECTION_GENERAL_, null); + return result_ || pinned_; + } + + // ASSIGNMENT_VALUE? + private static boolean assignment_2(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "assignment_2")) return false; + consumeToken(builder_, ASSIGNMENT_VALUE); + return true; } /* ********************************************************** */ - // C_STYLE_COMMENT - static boolean c_style_comment_element(PsiBuilder builder_, int level_) { - return consumeToken(builder_, C_STYLE_COMMENT); - } - - /* ********************************************************** */ - // object_path CODE_BLOCK_OPERATOR_BEGIN IGNORED_TEXT? (internal_expression)* CODE_BLOCK_OPERATOR_END IGNORED_TEXT? + // object_path '{' IGNORED_TEXT? expression* '}' IGNORED_TEXT? public static boolean code_block(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "code_block")) return false; - if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY)) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; boolean result_ = false; + boolean pinned_ = false; final Marker marker_ = builder_.mark(); + enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); result_ = object_path(builder_, level_ + 1); result_ = result_ && consumeToken(builder_, CODE_BLOCK_OPERATOR_BEGIN); - result_ = result_ && code_block_2(builder_, level_ + 1); - result_ = result_ && code_block_3(builder_, level_ + 1); - result_ = result_ && consumeToken(builder_, CODE_BLOCK_OPERATOR_END); - result_ = result_ && code_block_5(builder_, level_ + 1); - if (result_) { + pinned_ = result_; // pin = 2 + result_ = result_ && report_error_(builder_, code_block_2(builder_, level_ + 1)); + result_ = pinned_ && report_error_(builder_, code_block_3(builder_, level_ + 1)) && result_; + result_ = pinned_ && report_error_(builder_, consumeToken(builder_, CODE_BLOCK_OPERATOR_END)) && result_; + result_ = pinned_ && code_block_5(builder_, level_ + 1) && result_; + if (result_ || pinned_) { marker_.done(CODE_BLOCK); } else { marker_.rollbackTo(); } - return result_; + result_ = exitErrorRecordingSection(builder_, result_, level_, pinned_, _SECTION_GENERAL_, null); + return result_ || pinned_; } // IGNORED_TEXT? @@ -117,12 +128,12 @@ public class TypoScriptGeneratedParser implements PsiParser { return true; } - // (internal_expression)* + // expression* private static boolean code_block_3(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "code_block_3")) return false; int offset_ = builder_.getCurrentOffset(); while (true) { - if (!code_block_3_0(builder_, level_ + 1)) break; + if (!expression(builder_, level_ + 1)) break; int next_offset_ = builder_.getCurrentOffset(); if (offset_ == next_offset_) { empty_element_parsed_guard_(builder_, offset_, "code_block_3"); @@ -133,21 +144,6 @@ public class TypoScriptGeneratedParser implements PsiParser { return true; } - // (internal_expression) - private static boolean code_block_3_0(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "code_block_3_0")) return false; - boolean result_ = false; - final Marker marker_ = builder_.mark(); - result_ = internal_expression(builder_, level_ + 1); - if (!result_) { - marker_.rollbackTo(); - } - else { - marker_.drop(); - } - return result_; - } - // IGNORED_TEXT? private static boolean code_block_5(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "code_block_5")) return false; @@ -173,31 +169,94 @@ public class TypoScriptGeneratedParser implements PsiParser { } /* ********************************************************** */ - // COPYING_OPERATOR object_path + // object_path '<' object_path public static boolean copying(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "copying")) return false; - if (!nextTokenIs(builder_, COPYING_OPERATOR)) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; boolean result_ = false; + boolean pinned_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, COPYING_OPERATOR); + enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); + result_ = object_path(builder_, level_ + 1); + result_ = result_ && consumeToken(builder_, COPYING_OPERATOR); + pinned_ = result_; // pin = 2 result_ = result_ && object_path(builder_, level_ + 1); - if (result_) { + if (result_ || pinned_) { marker_.done(COPYING); } else { marker_.rollbackTo(); } + result_ = exitErrorRecordingSection(builder_, result_, level_, pinned_, _SECTION_GENERAL_, null); + return result_ || pinned_; + } + + /* ********************************************************** */ + // assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block + // | condition_element | include_statement_element + static boolean expression(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "expression")) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + enterErrorRecordingSection(builder_, level_, _SECTION_RECOVER_); + result_ = assignment(builder_, level_ + 1); + if (!result_) result_ = value_modification(builder_, level_ + 1); + if (!result_) result_ = multiline_value_assignment(builder_, level_ + 1); + if (!result_) result_ = copying(builder_, level_ + 1); + if (!result_) result_ = unsetting(builder_, level_ + 1); + if (!result_) result_ = code_block(builder_, level_ + 1); + if (!result_) result_ = condition_element(builder_, level_ + 1); + if (!result_) result_ = include_statement_element(builder_, level_ + 1); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + result_ = exitErrorRecordingSection(builder_, result_, level_, false, _SECTION_RECOVER_, top_expression_recover_parser_); return result_; } /* ********************************************************** */ - // ONE_LINE_COMMENT - public static boolean include_statement_element(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "include_statement_element")) return false; - if (!nextTokenIs(builder_, ONE_LINE_COMMENT)) return false; + // (expression)* + static boolean file(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "file")) return false; + int offset_ = builder_.getCurrentOffset(); + while (true) { + if (!file_0(builder_, level_ + 1)) break; + int next_offset_ = builder_.getCurrentOffset(); + if (offset_ == next_offset_) { + empty_element_parsed_guard_(builder_, offset_, "file"); + break; + } + offset_ = next_offset_; + } + return true; + } + + // (expression) + private static boolean file_0(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "file_0")) return false; boolean result_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, ONE_LINE_COMMENT); + result_ = expression(builder_, level_ + 1); + if (!result_) { + marker_.rollbackTo(); + } + else { + marker_.drop(); + } + return result_; + } + + /* ********************************************************** */ + // INCLUDE_STATEMENT + public static boolean include_statement_element(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "include_statement_element")) return false; + if (!nextTokenIs(builder_, INCLUDE_STATEMENT)) return false; + boolean result_ = false; + final Marker marker_ = builder_.mark(); + result_ = consumeToken(builder_, INCLUDE_STATEMENT); if (result_) { marker_.done(INCLUDE_STATEMENT_ELEMENT); } @@ -208,120 +267,47 @@ public class TypoScriptGeneratedParser implements PsiParser { } /* ********************************************************** */ - // internal_object_path { assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block} - static boolean internal_expression(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "internal_expression")) return false; - if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; - boolean result_ = false; - final Marker marker_ = builder_.mark(); - result_ = internal_object_path(builder_, level_ + 1); - result_ = result_ && internal_expression_1(builder_, level_ + 1); - if (!result_) { - marker_.rollbackTo(); - } - else { - marker_.drop(); - } - return result_; - } - - // { assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block} - private static boolean internal_expression_1(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "internal_expression_1")) return false; - return internal_expression_1_0(builder_, level_ + 1); - } - - // assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block - private static boolean internal_expression_1_0(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "internal_expression_1_0")) return false; - boolean result_ = false; - final Marker marker_ = builder_.mark(); - result_ = assignment(builder_, level_ + 1); - if (!result_) result_ = value_modification(builder_, level_ + 1); - if (!result_) result_ = multiline_value_assignment(builder_, level_ + 1); - if (!result_) result_ = copying(builder_, level_ + 1); - if (!result_) result_ = unsetting(builder_, level_ + 1); - if (!result_) result_ = code_block(builder_, level_ + 1); - if (!result_) { - marker_.rollbackTo(); - } - else { - marker_.drop(); - } - return result_; - } - - /* ********************************************************** */ - // object_path | OBJECT_PATH_SEPARATOR object_path - static boolean internal_object_path(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "internal_object_path")) return false; - if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; - boolean result_ = false; - final Marker marker_ = builder_.mark(); - result_ = object_path(builder_, level_ + 1); - if (!result_) result_ = internal_object_path_1(builder_, level_ + 1); - if (!result_) { - marker_.rollbackTo(); - } - else { - marker_.drop(); - } - return result_; - } - - // OBJECT_PATH_SEPARATOR object_path - private static boolean internal_object_path_1(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "internal_object_path_1")) return false; - boolean result_ = false; - final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, OBJECT_PATH_SEPARATOR); - result_ = result_ && object_path(builder_, level_ + 1); - if (!result_) { - marker_.rollbackTo(); - } - else { - marker_.drop(); - } - return result_; - } - - /* ********************************************************** */ - // MULTILINE_VALUE_OPERATOR_BEGIN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_VALUE_OPERATOR_END IGNORED_TEXT? + // object_path MULTILINE_VALUE_OPERATOR_BEGIN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_VALUE_OPERATOR_END IGNORED_TEXT? public static boolean multiline_value_assignment(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "multiline_value_assignment")) return false; - if (!nextTokenIs(builder_, MULTILINE_VALUE_OPERATOR_BEGIN)) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; boolean result_ = false; + boolean pinned_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, MULTILINE_VALUE_OPERATOR_BEGIN); - result_ = result_ && multiline_value_assignment_1(builder_, level_ + 1); - result_ = result_ && multiline_value_assignment_2(builder_, level_ + 1); - result_ = result_ && consumeToken(builder_, MULTILINE_VALUE_OPERATOR_END); - result_ = result_ && multiline_value_assignment_4(builder_, level_ + 1); - if (result_) { + enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); + result_ = object_path(builder_, level_ + 1); + result_ = result_ && consumeToken(builder_, MULTILINE_VALUE_OPERATOR_BEGIN); + pinned_ = result_; // pin = 2 + result_ = result_ && report_error_(builder_, multiline_value_assignment_2(builder_, level_ + 1)); + result_ = pinned_ && report_error_(builder_, multiline_value_assignment_3(builder_, level_ + 1)) && result_; + result_ = pinned_ && report_error_(builder_, consumeToken(builder_, MULTILINE_VALUE_OPERATOR_END)) && result_; + result_ = pinned_ && multiline_value_assignment_5(builder_, level_ + 1) && result_; + if (result_ || pinned_) { marker_.done(MULTILINE_VALUE_ASSIGNMENT); } else { marker_.rollbackTo(); } - return result_; + result_ = exitErrorRecordingSection(builder_, result_, level_, pinned_, _SECTION_GENERAL_, null); + return result_ || pinned_; } // IGNORED_TEXT? - private static boolean multiline_value_assignment_1(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "multiline_value_assignment_1")) return false; + private static boolean multiline_value_assignment_2(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment_2")) return false; consumeToken(builder_, IGNORED_TEXT); return true; } // (MULTILINE_VALUE)* - private static boolean multiline_value_assignment_2(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "multiline_value_assignment_2")) return false; + private static boolean multiline_value_assignment_3(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment_3")) return false; int offset_ = builder_.getCurrentOffset(); while (true) { - if (!multiline_value_assignment_2_0(builder_, level_ + 1)) break; + if (!multiline_value_assignment_3_0(builder_, level_ + 1)) break; int next_offset_ = builder_.getCurrentOffset(); if (offset_ == next_offset_) { - empty_element_parsed_guard_(builder_, offset_, "multiline_value_assignment_2"); + empty_element_parsed_guard_(builder_, offset_, "multiline_value_assignment_3"); break; } offset_ = next_offset_; @@ -330,8 +316,8 @@ public class TypoScriptGeneratedParser implements PsiParser { } // (MULTILINE_VALUE) - private static boolean multiline_value_assignment_2_0(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "multiline_value_assignment_2_0")) return false; + private static boolean multiline_value_assignment_3_0(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment_3_0")) return false; boolean result_ = false; final Marker marker_ = builder_.mark(); result_ = consumeToken(builder_, MULTILINE_VALUE); @@ -345,31 +331,43 @@ public class TypoScriptGeneratedParser implements PsiParser { } // IGNORED_TEXT? - private static boolean multiline_value_assignment_4(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "multiline_value_assignment_4")) return false; + private static boolean multiline_value_assignment_5(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "multiline_value_assignment_5")) return false; consumeToken(builder_, IGNORED_TEXT); return true; } /* ********************************************************** */ - // OBJECT_PATH_ENTITY (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY)* + // '.'? (OBJECT_PATH_ENTITY '.')* OBJECT_PATH_ENTITY public static boolean object_path(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "object_path")) return false; - if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY)) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; boolean result_ = false; + boolean pinned_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, OBJECT_PATH_ENTITY); + enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); + result_ = object_path_0(builder_, level_ + 1); result_ = result_ && object_path_1(builder_, level_ + 1); - if (result_) { + pinned_ = result_; // pin = 2 + result_ = result_ && consumeToken(builder_, OBJECT_PATH_ENTITY); + if (result_ || pinned_) { marker_.done(OBJECT_PATH); } else { marker_.rollbackTo(); } - return result_; + result_ = exitErrorRecordingSection(builder_, result_, level_, pinned_, _SECTION_GENERAL_, null); + return result_ || pinned_; } - // (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY)* + // '.'? + private static boolean object_path_0(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "object_path_0")) return false; + consumeToken(builder_, OBJECT_PATH_SEPARATOR); + return true; + } + + // (OBJECT_PATH_ENTITY '.')* private static boolean object_path_1(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "object_path_1")) return false; int offset_ = builder_.getCurrentOffset(); @@ -385,89 +383,105 @@ public class TypoScriptGeneratedParser implements PsiParser { return true; } - // (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY) + // (OBJECT_PATH_ENTITY '.') private static boolean object_path_1_0(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "object_path_1_0")) return false; return object_path_1_0_0(builder_, level_ + 1); } - // OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY + // OBJECT_PATH_ENTITY '.' private static boolean object_path_1_0_0(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "object_path_1_0_0")) return false; boolean result_ = false; + boolean pinned_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, OBJECT_PATH_SEPARATOR); - result_ = result_ && consumeToken(builder_, OBJECT_PATH_ENTITY); - if (!result_) { + enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); + result_ = consumeToken(builder_, OBJECT_PATH_ENTITY); + result_ = result_ && consumeToken(builder_, OBJECT_PATH_SEPARATOR); + pinned_ = result_; // pin = 2 + if (!result_ && !pinned_) { marker_.rollbackTo(); } else { marker_.drop(); } - return result_; + result_ = exitErrorRecordingSection(builder_, result_, level_, pinned_, _SECTION_GENERAL_, null); + return result_ || pinned_; } /* ********************************************************** */ - // ONE_LINE_COMMENT - public static boolean one_line_comment_element(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "one_line_comment_element")) return false; - if (!nextTokenIs(builder_, ONE_LINE_COMMENT)) return false; + // ! new_line_white_space + static boolean top_expression_recover(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "top_expression_recover")) return false; boolean result_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, ONE_LINE_COMMENT); - if (result_) { - marker_.done(ONE_LINE_COMMENT_ELEMENT); - } - else { - marker_.rollbackTo(); - } + enterErrorRecordingSection(builder_, level_, _SECTION_NOT_); + result_ = !isAfterNewLine(builder_, level_ + 1); + marker_.rollbackTo(); + result_ = exitErrorRecordingSection(builder_, result_, level_, false, _SECTION_NOT_, null); return result_; } /* ********************************************************** */ - // UNSETTING_OPERATOR IGNORED_TEXT? + // object_path '>' IGNORED_TEXT? public static boolean unsetting(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "unsetting")) return false; - if (!nextTokenIs(builder_, UNSETTING_OPERATOR)) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; boolean result_ = false; + boolean pinned_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, UNSETTING_OPERATOR); - result_ = result_ && unsetting_1(builder_, level_ + 1); - if (result_) { + enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); + result_ = object_path(builder_, level_ + 1); + result_ = result_ && consumeToken(builder_, UNSETTING_OPERATOR); + pinned_ = result_; // pin = 2 + result_ = result_ && unsetting_2(builder_, level_ + 1); + if (result_ || pinned_) { marker_.done(UNSETTING); } else { marker_.rollbackTo(); } - return result_; + result_ = exitErrorRecordingSection(builder_, result_, level_, pinned_, _SECTION_GENERAL_, null); + return result_ || pinned_; } // IGNORED_TEXT? - private static boolean unsetting_1(PsiBuilder builder_, int level_) { - if (!recursion_guard_(builder_, level_, "unsetting_1")) return false; + private static boolean unsetting_2(PsiBuilder builder_, int level_) { + if (!recursion_guard_(builder_, level_, "unsetting_2")) return false; consumeToken(builder_, IGNORED_TEXT); return true; } /* ********************************************************** */ - // MODIFICATION_OPERATOR MODIFICATION_OPERATOR_FUNCTION MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN MODIFICATION_OPERATOR_FUNCTION_ARGUMENT MODIFICATION_OPERATOR_FUNCTION_PARAM_END + // object_path ':=' MODIFICATION_OPERATOR_FUNCTION MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN + // MODIFICATION_OPERATOR_FUNCTION_ARGUMENT MODIFICATION_OPERATOR_FUNCTION_PARAM_END public static boolean value_modification(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "value_modification")) return false; - if (!nextTokenIs(builder_, MODIFICATION_OPERATOR)) return false; + if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; boolean result_ = false; + boolean pinned_ = false; final Marker marker_ = builder_.mark(); - result_ = consumeToken(builder_, MODIFICATION_OPERATOR); - result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION); - result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN); - result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_ARGUMENT); - result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_PARAM_END); - if (result_) { + enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); + result_ = object_path(builder_, level_ + 1); + result_ = result_ && consumeToken(builder_, MODIFICATION_OPERATOR); + pinned_ = result_; // pin = 2 + result_ = result_ && report_error_(builder_, consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION)); + result_ = pinned_ && report_error_(builder_, consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN)) && result_; + result_ = pinned_ && report_error_(builder_, consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_ARGUMENT)) && result_; + result_ = pinned_ && consumeToken(builder_, MODIFICATION_OPERATOR_FUNCTION_PARAM_END) && result_; + if (result_ || pinned_) { marker_.done(VALUE_MODIFICATION); } else { marker_.rollbackTo(); } - return result_; + result_ = exitErrorRecordingSection(builder_, result_, level_, pinned_, _SECTION_GENERAL_, null); + return result_ || pinned_; } + final static Parser top_expression_recover_parser_ = new Parser() { + public boolean parse(PsiBuilder builder_, int level_) { + return top_expression_recover(builder_, level_ + 1); + } + }; } diff --git a/gen/com/jetbrains/typoscript/lang/psi/Assignment.java b/gen/com/jetbrains/typoscript/lang/psi/Assignment.java index e7f31136c799..a7ae1a2003ed 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/Assignment.java +++ b/gen/com/jetbrains/typoscript/lang/psi/Assignment.java @@ -7,4 +7,7 @@ import com.intellij.psi.PsiElement; public interface Assignment extends TypoScriptCompositeElement { + @NotNull + ObjectPath getObjectPath(); + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java b/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java index e07e2e1f4ebe..acc80db04428 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java +++ b/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java @@ -13,14 +13,20 @@ public interface CodeBlock extends TypoScriptCompositeElement { @NotNull List getCodeBlockList(); + @NotNull + List getConditionElementList(); + @NotNull List getCopyingList(); + @NotNull + List getIncludeStatementElementList(); + @NotNull List getMultilineValueAssignmentList(); @NotNull - List getObjectPathList(); + ObjectPath getObjectPath(); @NotNull List getUnsettingList(); diff --git a/gen/com/jetbrains/typoscript/lang/psi/Copying.java b/gen/com/jetbrains/typoscript/lang/psi/Copying.java index 4f2b03aeb0c7..11a5d330ccf4 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/Copying.java +++ b/gen/com/jetbrains/typoscript/lang/psi/Copying.java @@ -8,6 +8,6 @@ import com.intellij.psi.PsiElement; public interface Copying extends TypoScriptCompositeElement { @NotNull - ObjectPath getObjectPath(); + List getObjectPathList(); } diff --git a/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java b/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java index 286032f9a618..51a828c74412 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java +++ b/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java @@ -7,4 +7,7 @@ import com.intellij.psi.PsiElement; public interface MultilineValueAssignment extends TypoScriptCompositeElement { + @NotNull + ObjectPath getObjectPath(); + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/OneLineCommentElement.java b/gen/com/jetbrains/typoscript/lang/psi/OneLineCommentElement.java deleted file mode 100644 index 7e6a3e12c234..000000000000 --- a/gen/com/jetbrains/typoscript/lang/psi/OneLineCommentElement.java +++ /dev/null @@ -1,10 +0,0 @@ -// This is a generated file. Not intended for manual editing. -package com.jetbrains.typoscript.lang.psi; - -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.psi.PsiElement; - -public interface OneLineCommentElement extends TypoScriptCompositeElement { - -} diff --git a/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java b/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java index 75c1a0b4bd26..d3e403234251 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java +++ b/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java @@ -7,4 +7,7 @@ import com.intellij.psi.PsiElement; public interface Unsetting extends TypoScriptCompositeElement { + @NotNull + ObjectPath getObjectPath(); + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java b/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java index 7879d909ff96..0ad6526deafc 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java +++ b/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java @@ -7,4 +7,7 @@ import com.intellij.psi.PsiElement; public interface ValueModification extends TypoScriptCompositeElement { + @NotNull + ObjectPath getObjectPath(); + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/Visitor.java b/gen/com/jetbrains/typoscript/lang/psi/Visitor.java new file mode 100644 index 000000000000..8d3745d7e364 --- /dev/null +++ b/gen/com/jetbrains/typoscript/lang/psi/Visitor.java @@ -0,0 +1,49 @@ +// This is a generated file. Not intended for manual editing. +package com.jetbrains.typoscript.lang.psi; + +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElementVisitor; + +public class Visitor extends PsiElementVisitor { + + public void visitAssignment(@NotNull Assignment o) { + visitTypoScriptCompositeElement(o); + } + + public void visitCodeBlock(@NotNull CodeBlock o) { + visitTypoScriptCompositeElement(o); + } + + public void visitConditionElement(@NotNull ConditionElement o) { + visitTypoScriptCompositeElement(o); + } + + public void visitCopying(@NotNull Copying o) { + visitTypoScriptCompositeElement(o); + } + + public void visitIncludeStatementElement(@NotNull IncludeStatementElement o) { + visitTypoScriptCompositeElement(o); + } + + public void visitMultilineValueAssignment(@NotNull MultilineValueAssignment o) { + visitTypoScriptCompositeElement(o); + } + + public void visitObjectPath(@NotNull ObjectPath o) { + visitTypoScriptCompositeElement(o); + } + + public void visitUnsetting(@NotNull Unsetting o) { + visitTypoScriptCompositeElement(o); + } + + public void visitValueModification(@NotNull ValueModification o) { + visitTypoScriptCompositeElement(o); + } + + public void visitTypoScriptCompositeElement(@NotNull TypoScriptCompositeElement o) { + visitElement(o); + } + +} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java index 146d403d0070..96fb60604799 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -16,4 +17,15 @@ public class AssignmentImpl extends TypoScriptCompositeElementImpl implements As super(node); } + @Override + @NotNull + public ObjectPath getObjectPath() { + return findNotNullChildByClass(ObjectPath.class); + } + + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitAssignment(this); + else super.accept(visitor); + } + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java index 62b69444aa63..8faf50d32d51 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -28,12 +29,24 @@ public class CodeBlockImpl extends TypoScriptCompositeElementImpl implements Cod return PsiTreeUtil.getChildrenOfTypeAsList(this, CodeBlock.class); } + @Override + @NotNull + public List getConditionElementList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, ConditionElement.class); + } + @Override @NotNull public List getCopyingList() { return PsiTreeUtil.getChildrenOfTypeAsList(this, Copying.class); } + @Override + @NotNull + public List getIncludeStatementElementList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, IncludeStatementElement.class); + } + @Override @NotNull public List getMultilineValueAssignmentList() { @@ -42,8 +55,8 @@ public class CodeBlockImpl extends TypoScriptCompositeElementImpl implements Cod @Override @NotNull - public List getObjectPathList() { - return PsiTreeUtil.getChildrenOfTypeAsList(this, ObjectPath.class); + public ObjectPath getObjectPath() { + return findNotNullChildByClass(ObjectPath.class); } @Override @@ -58,4 +71,9 @@ public class CodeBlockImpl extends TypoScriptCompositeElementImpl implements Cod return PsiTreeUtil.getChildrenOfTypeAsList(this, ValueModification.class); } + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitCodeBlock(this); + else super.accept(visitor); + } + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java index 5387bde61c46..62efff87a1e6 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -16,4 +17,9 @@ public class ConditionElementImpl extends TypoScriptCompositeElementImpl impleme super(node); } + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitConditionElement(this); + else super.accept(visitor); + } + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java index dafeea983840..00ee16ef4dcc 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -18,8 +19,13 @@ public class CopyingImpl extends TypoScriptCompositeElementImpl implements Copyi @Override @NotNull - public ObjectPath getObjectPath() { - return findNotNullChildByClass(ObjectPath.class); + public List getObjectPathList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, ObjectPath.class); + } + + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitCopying(this); + else super.accept(visitor); } } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java index bf32d4592802..f26afc882f75 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -16,4 +17,9 @@ public class IncludeStatementElementImpl extends TypoScriptCompositeElementImpl super(node); } + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitIncludeStatementElement(this); + else super.accept(visitor); + } + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java index 48bcdadedf47..6ce99682ff3a 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -16,4 +17,15 @@ public class MultilineValueAssignmentImpl extends TypoScriptCompositeElementImpl super(node); } + @Override + @NotNull + public ObjectPath getObjectPath() { + return findNotNullChildByClass(ObjectPath.class); + } + + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitMultilineValueAssignment(this); + else super.accept(visitor); + } + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java index b1f7f017e0cd..7f95ddb91b33 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -16,4 +17,9 @@ public class ObjectPathImpl extends TypoScriptCompositeElementImpl implements Ob super(node); } + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitObjectPath(this); + else super.accept(visitor); + } + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/OneLineCommentElementImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/OneLineCommentElementImpl.java deleted file mode 100644 index 8e4ec4f695a6..000000000000 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/OneLineCommentElementImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -// This is a generated file. Not intended for manual editing. -package com.jetbrains.typoscript.lang.psi.impl; - -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiTreeUtil; -import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; -import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; -import com.jetbrains.typoscript.lang.psi.*; - -public class OneLineCommentElementImpl extends TypoScriptCompositeElementImpl implements OneLineCommentElement { - - public OneLineCommentElementImpl(ASTNode node) { - super(node); - } - -} diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java index 4f0a54fc28cd..4e6d268088a3 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -16,4 +17,15 @@ public class UnsettingImpl extends TypoScriptCompositeElementImpl implements Uns super(node); } + @Override + @NotNull + public ObjectPath getObjectPath() { + return findNotNullChildByClass(ObjectPath.class); + } + + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitUnsetting(this); + else super.accept(visitor); + } + } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java index 4c6a182a9bef..10f42e3aee0f 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java @@ -5,6 +5,7 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import static com.jetbrains.typoscript.lang.TypoScriptElementTypes.*; import com.jetbrains.typoscript.lang.psi.TypoScriptCompositeElementImpl; @@ -16,4 +17,15 @@ public class ValueModificationImpl extends TypoScriptCompositeElementImpl implem super(node); } + @Override + @NotNull + public ObjectPath getObjectPath() { + return findNotNullChildByClass(ObjectPath.class); + } + + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof Visitor) ((Visitor)visitor).visitValueModification(this); + else super.accept(visitor); + } + } diff --git a/src/META-INF/plugin.xml b/src/META-INF/plugin.xml index fa2165bcff62..d5c98949d307 100644 --- a/src/META-INF/plugin.xml +++ b/src/META-INF/plugin.xml @@ -18,6 +18,7 @@ + diff --git a/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java b/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java index fd1e91b3eca1..60f56d8f473f 100644 --- a/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java +++ b/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java @@ -1,6 +1,5 @@ package com.jetbrains.typoscript.lang; - import com.intellij.lang.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Comparing; @@ -27,10 +26,7 @@ import java.util.Collection; import java.util.LinkedList; /** - * @author lene - * Date: 11.04.12 - *

- * Copied from https://github.com/JetBrains/Grammar-Kit/blob/master/support/org/intellij/grammar/parser/GeneratedParserUtilBase.java + * @author gregsh */ @SuppressWarnings("StringEquality") public class GeneratedParserUtilBase { @@ -68,7 +64,7 @@ public class GeneratedParserUtilBase { } public static void empty_element_parsed_guard_(PsiBuilder builder_, int offset_, String funcName_) { - builder_.error("Empty element parsed in " + funcName_ + " at offset " + offset_); + builder_.error("Empty element parsed in " + funcName_ +" at offset " + offset_); } public static boolean invalid_left_marker_guard_(PsiBuilder builder_, PsiBuilder.Marker marker_, String funcName_) { @@ -139,7 +135,7 @@ public class GeneratedParserUtilBase { if (Comparing.equal(text, tokenText, caseSensitive)) { int count = 0; while (true) { - final int nextOffset = builder_.rawTokenTypeStart(++count); + final int nextOffset = builder_.rawTokenTypeStart(++ count); if (nextOffset > endOffset) { return false; } @@ -161,7 +157,7 @@ public class GeneratedParserUtilBase { boolean add = false; int diff = completionState.offset - offset; String text = completionState.convertItem(o); - int length = text == null ? 0 : text.length(); + int length = text == null? 0 : text.length(); if (length == 0) return; if (diff == 0) { add = true; @@ -171,7 +167,7 @@ public class GeneratedParserUtilBase { add = StringUtil.startsWithIgnoreCase(text, fragment.toString()); } else if (diff < 0) { - for (int i = -1; ; i--) { + for (int i=-1; ; i--) { IElementType type = builder_.rawLookup(i); int tokenStart = builder_.rawTokenTypeStart(i); if (state.whitespaceTokens.contains(type) || state.commentTokens.contains(type)) { @@ -184,9 +180,7 @@ public class GeneratedParserUtilBase { } break; } - else { - break; - } + else break; } add = diff >= 0 && diff < length; } @@ -262,10 +256,8 @@ public class GeneratedParserUtilBase { int parenCount = 0; while (eatMoreFlag && builder_.getCurrentOffset() < lastErrorPos) { if (state.braces != null) { - if (builder_.getTokenType() == state.braces[0].getLeftBraceType()) { - parenCount++; - } - else if (builder_.getTokenType() == state.braces[0].getRightBraceType()) parenCount--; + if (builder_.getTokenType() == state.braces[0].getLeftBraceType()) parenCount ++; + else if (builder_.getTokenType() == state.braces[0].getRightBraceType()) parenCount --; } builder_.advanceLexer(); eatMoreFlag = parenCount != 0 || eatMore.parse(builder_, frame.level + 1); @@ -323,7 +315,7 @@ public class GeneratedParserUtilBase { public static void report_error_(PsiBuilder builder_) { ErrorState state = ErrorState.get(builder_); - Frame frame = state.levelCheck.isEmpty() ? null : state.levelCheck.getLast(); + Frame frame = state.levelCheck.isEmpty()? null : state.levelCheck.getLast(); if (frame == null) { LOG.error("Unbalanced error section: got null , expected " + frame); return; @@ -337,16 +329,16 @@ public class GeneratedParserUtilBase { } private static int getLastVariantOffset(ErrorState state, int defValue) { - return state.lastExpectedVariantOffset < 0 ? defValue : state.lastExpectedVariantOffset; + return state.lastExpectedVariantOffset < 0? defValue : state.lastExpectedVariantOffset; } private static boolean reportError(ErrorState state, PsiBuilder builder_, boolean force) { String expectedText = state.getExpectedText(builder_); boolean notEmpty = StringUtil.isNotEmpty(expectedText); if (force || notEmpty) { - final String gotText = builder_.eof() ? "unexpected end of file" : - notEmpty ? "got '" + builder_.getTokenText() + "'" : - "'" + builder_.getTokenText() + "' unexpected"; + final String gotText = builder_.eof()? "unexpected end of file" : + notEmpty? "got '" + builder_.getTokenText() +"'" : + "'" + builder_.getTokenText() +"' unexpected"; builder_.error(expectedText + gotText); return true; } @@ -400,12 +392,12 @@ public class GeneratedParserUtilBase { if (state == null) { builder.putUserDataUnprotected(ERROR_STATE_KEY, state = new ErrorState()); PsiFile file = builder.getUserDataUnprotected(FileContextUtil.CONTAINING_FILE_KEY); - state.completionState = file == null ? null : file.getUserData(COMPLETION_STATE_KEY); + state.completionState = file == null? null: file.getUserData(COMPLETION_STATE_KEY); if (file != null) { Language language = file.getLanguage(); state.caseSensitive = language.isCaseSensitive(); PairedBraceMatcher matcher = LanguageBraceMatching.INSTANCE.forLanguage(language); - state.braces = matcher == null ? null : matcher.getPairs(); + state.braces = matcher == null? null : matcher.getPairs(); if (state.braces != null && state.braces.length == 0) state.braces = null; ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(language); if (parserDefinition != null) { @@ -428,19 +420,17 @@ public class GeneratedParserUtilBase { } private static final int MAX_VARIANTS_TO_DISPLAY = Integer.MAX_VALUE; - private boolean addExpected(StringBuilder sb, int offset, boolean expected) { String[] strings = new String[variants.size()]; long[] hashes = new long[strings.length]; Arrays.fill(strings, ""); int count = 0; - loop: - for (Variant variant : variants) { + loop: for (Variant variant : variants) { if (offset == variant.offset) { if (variant.expected != expected) continue; String text = variant.object.toString(); long hash = StringHash.calc(text); - for (int i = 0; i < count; i++) { + for (int i=0; i"; + return "<"+offset+", "+section+", "+level+">"; } } @@ -550,7 +540,6 @@ public class GeneratedParserUtilBase { private static final int MAX_CHILDREN_IN_TREE = 10; - public static boolean parseAsTree(ErrorState state, final PsiBuilder builder_, int level, final IElementType chunkType, boolean checkBraces, final Parser parser, final Parser eatMoreCondition) { final LinkedList> parenList = new LinkedList>(); @@ -585,16 +574,13 @@ public class GeneratedParserUtilBase { int tokenCount = 0; if (checkParens && builder_.rawLookup(-1) == state.braces[0].getLeftBraceType()) { LighterASTNode doneMarker = builder_.getLatestDoneMarker(); - if (doneMarker != null && - doneMarker.getStartOffset() == builder_.rawTokenTypeStart(-1) && - doneMarker.getTokenType() == TokenType.ERROR_ELEMENT) { + if (doneMarker != null && doneMarker.getStartOffset() == builder_.rawTokenTypeStart(-1) && doneMarker.getTokenType() == TokenType.ERROR_ELEMENT) { parenList.add(Pair.create(((PsiBuilder.Marker)doneMarker).precede(), (PsiBuilder.Marker)null)); } } while (true) { final IElementType tokenType = builder_.getTokenType(); - if (checkParens && - (tokenType == state.braces[0].getLeftBraceType() || tokenType == state.braces[0].getRightBraceType() && !parenList.isEmpty())) { + if (checkParens && (tokenType == state.braces[0].getLeftBraceType() || tokenType == state.braces[0].getRightBraceType() && !parenList.isEmpty())) { if (marker != null) { marker.done(chunkType); siblingList.addFirst(Pair.create(marker, 1)); @@ -649,7 +635,7 @@ public class GeneratedParserUtilBase { return totalCount != 0; } - private static class DummyBlockElementType extends IElementType implements ICompositeElementType { + private static class DummyBlockElementType extends IElementType implements ICompositeElementType{ DummyBlockElementType() { super("DUMMY_BLOCK", Language.ANY); } diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.bnf b/src/com/jetbrains/typoscript/lang/TypoScript.bnf index 678a2c4e05a4..cb3a22cb7bf6 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScript.bnf +++ b/src/com/jetbrains/typoscript/lang/TypoScript.bnf @@ -3,7 +3,6 @@ parserClass="com.jetbrains.typoscript.lang.TypoScriptGeneratedParser" stubParserClass="com.jetbrains.typoscript.lang.TypoScriptParserUtil" generateStubParser = true - // generateFirstCheck = true tokenTypeClass="com.jetbrains.typoscript.lang.TypoScriptTokenType" elementTypeClass="com.jetbrains.typoscript.lang.TypoScriptTokenType" elementTypeHolderClass="com.jetbrains.typoscript.lang.TypoScriptElementTypes" @@ -17,34 +16,38 @@ psiImplClassSuffix="Impl" psiPackage="com.jetbrains.typoscript.lang.psi" psiImplPackage="com.jetbrains.typoscript.lang.psi.impl" + + CODE_BLOCK_OPERATOR_BEGIN = '{' + CODE_BLOCK_OPERATOR_END = '}' + MODIFICATION_OPERATOR = ':=' + ASSIGNMENT_OPERATOR = '=' + UNSETTING_OPERATOR = '>' + COPYING_OPERATOR = '<' + OBJECT_PATH_SEPARATOR = '.' } +file ::= (expression)* +private expression ::= assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block +| condition_element | include_statement_element {recoverUntil="top_expression_recover"} +private top_expression_recover ::= ! new_line_white_space +external new_line_white_space ::= isAfterNewLine -c_style_comment_element ::= C_STYLE_COMMENT -one_line_comment_element ::= ONE_LINE_COMMENT -include_statement_element ::= ONE_LINE_COMMENT +include_statement_element ::= INCLUDE_STATEMENT condition_element ::= CONDITION +assignment ::= object_path '=' ASSIGNMENT_VALUE? {pin=2} -object_path ::= OBJECT_PATH_ENTITY (OBJECT_PATH_SEPARATOR OBJECT_PATH_ENTITY)* -private internal_object_path ::= object_path | OBJECT_PATH_SEPARATOR object_path +value_modification ::= object_path ':=' MODIFICATION_OPERATOR_FUNCTION MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN + MODIFICATION_OPERATOR_FUNCTION_ARGUMENT MODIFICATION_OPERATOR_FUNCTION_PARAM_END {pin=2} -assignment ::= ASSIGNMENT ASSIGNMENT_VALUE - -value_modification ::= MODIFICATION_OPERATOR MODIFICATION_OPERATOR_FUNCTION MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN MODIFICATION_OPERATOR_FUNCTION_ARGUMENT MODIFICATION_OPERATOR_FUNCTION_PARAM_END - -multiline_value_assignment ::= MULTILINE_VALUE_OPERATOR_BEGIN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_VALUE_OPERATOR_END IGNORED_TEXT? - -copying ::= COPYING_OPERATOR object_path - -unsetting ::= UNSETTING_OPERATOR IGNORED_TEXT? - -private internal_expression ::= internal_object_path { assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block} - -code_block ::= object_path CODE_BLOCK_OPERATOR_BEGIN IGNORED_TEXT? (internal_expression)* CODE_BLOCK_OPERATOR_END IGNORED_TEXT? +multiline_value_assignment ::= object_path MULTILINE_VALUE_OPERATOR_BEGIN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_VALUE_OPERATOR_END IGNORED_TEXT? {pin=2} +copying ::= object_path '<' object_path {pin=2} +unsetting ::= object_path '>' IGNORED_TEXT? {pin=2} +code_block ::= object_path '{' IGNORED_TEXT? expression* '}' IGNORED_TEXT? {pin=2} +object_path ::= '.'? (OBJECT_PATH_ENTITY '.')* OBJECT_PATH_ENTITY {pin(".*")=2} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java b/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java new file mode 100644 index 000000000000..dca0ddcebfcc --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java @@ -0,0 +1,47 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.lang.BracePair; +import com.intellij.lang.PairedBraceMatcher; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.PsiManagerEx; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtilCore; +import com.jetbrains.typoscript.lang.psi.TypoScriptFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author lene + * Date: 16.04.12 + */ +public class TypoScriptBraceMatcher implements PairedBraceMatcher { + + private static final BracePair[] PAIRS = new BracePair[]{ + new BracePair(TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN, + TypoScriptTokenTypes.MODIFICATION_OPERATOR_FUNCTION_PARAM_END, true), + new BracePair(TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_BEGIN, TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_END, false), + new BracePair(TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN, TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_END, false) + }; + + @Override + public BracePair[] getPairs() { + return PAIRS; + } + + @Override + public boolean isPairedBracesAllowedBeforeType(@NotNull IElementType lbraceType, @Nullable IElementType contextType) { + return true; + } + + @Override + public int getCodeConstructStart(PsiFile file, int openingBraceOffset) { + if (file instanceof TypoScriptFile) { + PsiElement brace = PsiUtilCore.getElementAtOffset(file, openingBraceOffset); + PsiElement parent = brace.getParent(); + return parent!=null? parent.getTextOffset():openingBraceOffset; + } + return openingBraceOffset; + } +} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java b/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java index 8eb8720df63c..345e214ea267 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java @@ -1,8 +1,14 @@ package com.jetbrains.typoscript.lang; +import com.intellij.lang.PsiBuilder; + /** * @author lene * Date: 11.04.12 */ public class TypoScriptParserUtil extends GeneratedParserUtilBase { + + public static boolean isAfterNewLine(PsiBuilder builder, int level) { + return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE == builder.rawLookup(-1); + } } diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java index 38b38a96b08f..cd8649652a94 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java @@ -12,6 +12,7 @@ public interface TypoScriptTokenTypes extends TokenType { IElementType C_STYLE_COMMENT = new TypoScriptTokenType("C_STYLE_COMMENT"); IElementType ONE_LINE_COMMENT = new TypoScriptTokenType("ONE_LINE_COMMENT"); IElementType IGNORED_TEXT = new TypoScriptTokenType("IGNORED_TEXT"); + IElementType WHITE_SPACE_WITH_NEW_LINE = new TypoScriptTokenType("WHITE_SPACE_WITH_NEW_LINE"); IElementType ASSIGNMENT_OPERATOR = new TypoScriptTokenType("ASSIGN"); IElementType ASSIGNMENT_VALUE = new TypoScriptTokenType("ASSIGNMENT_VALUE"); @@ -43,7 +44,7 @@ public interface TypoScriptTokenTypes extends TokenType { CODE_BLOCK_OPERATOR_BEGIN, CODE_BLOCK_OPERATOR_END, UNSETTING_OPERATOR, COPYING_OPERATOR); - TokenSet WHITESPACES = TokenSet.create(WHITE_SPACE); + TokenSet WHITESPACES = TokenSet.create(WHITE_SPACE , WHITE_SPACE_WITH_NEW_LINE); TokenSet COMMENTS = TokenSet.create(ONE_LINE_COMMENT, C_STYLE_COMMENT, IGNORED_TEXT); TokenSet STRING_LITERALS = TokenSet.create(ASSIGNMENT_VALUE, MULTILINE_VALUE); } diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java index 8f77e76a66d5..786d9fd477ac 100644 --- a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java @@ -25,14 +25,12 @@ public class TypoScriptHighlightingData { TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_ENTITY", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); public static final TextAttributesKey OBJECT_PATH_SEPARATOR = TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_SEPARATOR", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); + public static final TextAttributesKey CONDITION = + TextAttributesKey.createTextAttributesKey("TS_CONDITION", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); + public static final TextAttributesKey INCLUDE_STATEMENT = + TextAttributesKey.createTextAttributesKey("TS_INCLUDE", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); - /* -IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("MODIFICATION_FUNCTION"); -IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("MODIFICATION_OPEN"); -IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("MODIFICATION_CLOSE"); -IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("MODIFICATION_VALUE"); - */ public static final TextAttributesKey BAD_CHARACTER = TextAttributesKey.createTextAttributesKey("TS_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER.getDefaultAttributes()); } From 4d5cd1b89424cea0b83139925e66a4667d37bddb Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Wed, 18 Apr 2012 15:23:55 +0400 Subject: [PATCH 011/147] Customized parser error messages --- .../typoscript/lang/TypoScriptTokenTypes.java | 32 +- .../lexer/assignments.test.expected | 70 +- .../typoscript/lexer/codeBlock.test.expected | 88 +- .../typoscript/lexer/comments.test.expected | 6 +- .../lexer/copyingOperator.test.expected | 28 +- .../lexer/exampleFromTypo.test.expected | 1088 ++++++++--------- .../lexer/multilineValue.test.expected | 40 +- .../lexer/objectPaths.test.expected | 66 +- .../lexer/simpleAssignment.test.expected | 6 +- .../lexer/unsettingOperator.test.expected | 16 +- .../valueModificationOperator.test.expected | 64 +- 11 files changed, 752 insertions(+), 752 deletions(-) diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java index cd8649652a94..0544a7ba8934 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java @@ -14,27 +14,27 @@ public interface TypoScriptTokenTypes extends TokenType { IElementType IGNORED_TEXT = new TypoScriptTokenType("IGNORED_TEXT"); IElementType WHITE_SPACE_WITH_NEW_LINE = new TypoScriptTokenType("WHITE_SPACE_WITH_NEW_LINE"); - IElementType ASSIGNMENT_OPERATOR = new TypoScriptTokenType("ASSIGN"); - IElementType ASSIGNMENT_VALUE = new TypoScriptTokenType("ASSIGNMENT_VALUE"); + IElementType ASSIGNMENT_OPERATOR = new TypoScriptTokenType("="); + IElementType ASSIGNMENT_VALUE = new TypoScriptTokenType("assignment value"); - IElementType MULTILINE_VALUE_OPERATOR_BEGIN = new TypoScriptTokenType("MULTILINE_OPEN"); - IElementType MULTILINE_VALUE_OPERATOR_END = new TypoScriptTokenType("MULTILINE_CLOSE"); - IElementType MULTILINE_VALUE = new TypoScriptTokenType("MULTILINE_VALUE"); + IElementType MULTILINE_VALUE_OPERATOR_BEGIN = new TypoScriptTokenType("("); + IElementType MULTILINE_VALUE_OPERATOR_END = new TypoScriptTokenType(")"); + IElementType MULTILINE_VALUE = new TypoScriptTokenType("multiline value"); - IElementType CODE_BLOCK_OPERATOR_BEGIN = new TypoScriptTokenType("CODE_BLOCK_OPEN"); - IElementType CODE_BLOCK_OPERATOR_END = new TypoScriptTokenType("CODE_BLOCK_CLOSE"); + IElementType CODE_BLOCK_OPERATOR_BEGIN = new TypoScriptTokenType("{"); + IElementType CODE_BLOCK_OPERATOR_END = new TypoScriptTokenType("}"); - IElementType UNSETTING_OPERATOR = new TypoScriptTokenType("UNSET"); - IElementType COPYING_OPERATOR = new TypoScriptTokenType("COPY"); + IElementType UNSETTING_OPERATOR = new TypoScriptTokenType(">"); + IElementType COPYING_OPERATOR = new TypoScriptTokenType("<"); - IElementType MODIFICATION_OPERATOR = new TypoScriptTokenType("MODIFY"); - IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("MODIFICATION_FUNCTION"); - IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("MODIFICATION_OPEN"); - IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("MODIFICATION_CLOSE"); - IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("MODIFICATION_VALUE"); + IElementType MODIFICATION_OPERATOR = new TypoScriptTokenType(":="); + IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("modification function"); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("("); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType(")"); + IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("modification value"); - IElementType OBJECT_PATH_ENTITY = new TypoScriptTokenType("OBJECT_PATH_ENTITY"); - IElementType OBJECT_PATH_SEPARATOR = new TypoScriptTokenType("OBJECT_PATH_SEPARATOR"); + IElementType OBJECT_PATH_ENTITY = new TypoScriptTokenType("object path entity"); + IElementType OBJECT_PATH_SEPARATOR = new TypoScriptTokenType("."); IElementType INCLUDE_STATEMENT = new TypoScriptTokenType("INCLUDE"); IElementType CONDITION = new TypoScriptTokenType("CONDITION"); diff --git a/testData/typoscript/lexer/assignments.test.expected b/testData/typoscript/lexer/assignments.test.expected index d6561f960cd9..e85f622dac59 100644 --- a/testData/typoscript/lexer/assignments.test.expected +++ b/testData/typoscript/lexer/assignments.test.expected @@ -1,61 +1,61 @@ -OBJECT_PATH_ENTITY ('myObject') +object path entity ('myObject') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('[value 1]') +assignment value ('[value 1]') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('myObject') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('myProperty') +object path entity ('myObject') +. ('.') +object path entity ('myProperty') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('') +assignment value ('') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('myObject') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('myProperty') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('firstProperty') -ASSIGN ('=') +object path entity ('myObject') +. ('.') +object path entity ('myProperty') +. ('.') +object path entity ('firstProperty') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('[value 3]') +assignment value ('[value 3]') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('myObject') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('myProperty') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('secondProperty') +object path entity ('myObject') +. ('.') +object path entity ('myProperty') +. ('.') +object path entity ('secondProperty') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('[value 4]') +assignment value ('[value 4]') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('myObject') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('myProperty') +object path entity ('myObject') +. ('.') +object path entity ('myProperty') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('{value 2 with [GLOBAL] anf other () provocations}') +assignment value ('{value 2 with [GLOBAL] anf other () provocations}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('myObject') +object path entity ('myObject') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('HTML') +assignment value ('HTML') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('myObject') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('value') +object path entity ('myObject') +. ('.') +object path entity ('value') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE (' HTML - code ') \ No newline at end of file +assignment value (' HTML - code ') \ No newline at end of file diff --git a/testData/typoscript/lexer/codeBlock.test.expected b/testData/typoscript/lexer/codeBlock.test.expected index 47367edd7ede..e044b225dadb 100644 --- a/testData/typoscript/lexer/codeBlock.test.expected +++ b/testData/typoscript/lexer/codeBlock.test.expected @@ -1,101 +1,101 @@ -OBJECT_PATH_ENTITY ('myObject') +object path entity ('myObject') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('field') +object path entity ('field') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('title') +assignment value ('title') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('ifEmpty') +object path entity ('ifEmpty') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') IGNORED_TEXT (' IGNORED_TEXT') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('data') +object path entity ('data') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('leveltitle:0 } bracket is ignored') +assignment value ('leveltitle:0 } bracket is ignored') WHITE_SPACE_WITH_NEW_LINE (' ') CONDITION ('[i = 5]') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') IGNORED_TEXT (' some IGNORED_TEXT') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') IGNORED_TEXT (' this brace is also ignored by parser') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('second') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('object') -CODE_BLOCK_OPEN ('{') +object path entity ('second') +. ('.') +object path entity ('object') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') IGNORED_TEXT ('{ ignored opening bracket') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('10') +. ('.') +object path entity ('10') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('left') +assignment value ('left') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('prop') +object path entity ('prop') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('test') +object path entity ('test') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('text') -MULTILINE_OPEN ('(') +object path entity ('text') +( ('(') WHITE_SPACE_WITH_NEW_LINE (' ') -MULTILINE_VALUE ('} ignored bracket') +multiline value ('} ignored bracket') WHITE_SPACE (' ') -MULTILINE_CLOSE (')') +) (')') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('third') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('object') -CODE_BLOCK_OPEN ('{') +object path entity ('third') +. ('.') +object path entity ('object') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('do') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('not') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('ignore') -CODE_BLOCK_OPEN ('{') +object path entity ('do') +. ('.') +object path entity ('not') +. ('.') +object path entity ('ignore') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('i') -ASSIGN ('=') -ASSIGNMENT_VALUE ('5') +object path entity ('i') += ('=') +assignment value ('5') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') \ No newline at end of file +} ('}') \ No newline at end of file diff --git a/testData/typoscript/lexer/comments.test.expected b/testData/typoscript/lexer/comments.test.expected index 1be9eb30f027..38a27d68b1d4 100644 --- a/testData/typoscript/lexer/comments.test.expected +++ b/testData/typoscript/lexer/comments.test.expected @@ -17,10 +17,10 @@ IGNORED_TEXT (' ignored text') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('assign') +object path entity ('assign') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('ment') +assignment value ('ment') WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/copyingOperator.test.expected b/testData/typoscript/lexer/copyingOperator.test.expected index fa262ff869f7..db6e60b75920 100644 --- a/testData/typoscript/lexer/copyingOperator.test.expected +++ b/testData/typoscript/lexer/copyingOperator.test.expected @@ -1,25 +1,25 @@ -OBJECT_PATH_ENTITY ('myOtherObject') +object path entity ('myOtherObject') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('myObject') +object path entity ('myObject') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('20') +object path entity ('20') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('pageObj') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('10') +object path entity ('pageObj') +. ('.') +object path entity ('10') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('strange') +object path entity ('strange') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('text') +object path entity ('text') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('30') +object path entity ('30') WHITE_SPACE (' ') -COPY ('<') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('10') \ No newline at end of file +< ('<') +. ('.') +object path entity ('10') \ No newline at end of file diff --git a/testData/typoscript/lexer/exampleFromTypo.test.expected b/testData/typoscript/lexer/exampleFromTypo.test.expected index fcf99d499224..9d9e78557c39 100644 --- a/testData/typoscript/lexer/exampleFromTypo.test.expected +++ b/testData/typoscript/lexer/exampleFromTypo.test.expected @@ -1,1358 +1,1358 @@ -OBJECT_PATH_ENTITY ('mod') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('wizards') +object path entity ('mod') +. ('.') +object path entity ('wizards') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('newContentElement') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('wizardItems') +object path entity ('newContentElement') +. ('.') +object path entity ('wizardItems') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('forms') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('elements') +object path entity ('forms') +. ('.') +object path entity ('elements') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('mailform') +object path entity ('mailform') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('tt_content_defValues') +object path entity ('tt_content_defValues') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('bodytext') +object path entity ('bodytext') WHITE_SPACE (' ') -MULTILINE_OPEN ('(') +( ('(') WHITE_SPACE_WITH_NEW_LINE (' ') -MULTILINE_VALUE ('enctype = multipart/form-data') +multiline value ('enctype = multipart/form-data') WHITE_SPACE (' ') -MULTILINE_VALUE ('method = post') +multiline value ('method = post') WHITE_SPACE (' ') -MULTILINE_VALUE ('prefix = tx_form') +multiline value ('prefix = tx_form') WHITE_SPACE (' ') -MULTILINE_CLOSE (')') +) (')') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('form') +object path entity ('form') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('defaults') +object path entity ('defaults') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showTabs') +object path entity ('showTabs') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('elements, options, form') +assignment value ('elements, options, form') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('tabs') +object path entity ('tabs') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('elements') +object path entity ('elements') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('basic, predefined, content') +assignment value ('basic, predefined, content') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('basic') +object path entity ('basic') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showButtons') +object path entity ('showButtons') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('checkbox, fieldset, fileupload, hidden, password, radio, reset, select, submit, textarea, textline') +assignment value ('checkbox, fieldset, fileupload, hidden, password, radio, reset, select, submit, textarea, textline') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('predefined') +object path entity ('predefined') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showButtons') +object path entity ('showButtons') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('email, radiogroup, checkboxgroup, name') +assignment value ('email, radiogroup, checkboxgroup, name') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('content') +object path entity ('content') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showButtons') +object path entity ('showButtons') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('header, textblock') +assignment value ('header, textblock') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('options') +object path entity ('options') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('legend, label, attributes, options, validation, filters, various') +assignment value ('legend, label, attributes, options, validation, filters, various') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('accept, acceptcharset, accesskey, action, alt, checked, class, cols, dir, disabled, enctype, id, label, lang, maxlength, method, multiple, name, readonly, rows, selected, size, src, style, tabindex, title, type, value') +assignment value ('accept, acceptcharset, accesskey, action, alt, checked, class, cols, dir, disabled, enctype, id, label, lang, maxlength, method, multiple, name, readonly, rows, selected, size, src, style, tabindex, title, type, value') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('label') +object path entity ('label') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('label') +assignment value ('label') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('validation') +object path entity ('validation') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showRules') +object path entity ('showRules') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('alphabetic, alphanumeric, between, date, digit, email, equals, fileallowedtypes, filemaximumsize, fileminimumsize, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') +assignment value ('alphabetic, alphanumeric, between, date, digit, email, equals, fileallowedtypes, filemaximumsize, fileminimumsize, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('rules') +object path entity ('rules') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('alphabetic') +object path entity ('alphabetic') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, allowWhiteSpace') +assignment value ('message, error, breakOnError, showMessage, allowWhiteSpace') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('alphanumeric') +object path entity ('alphanumeric') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, allowWhiteSpace') +assignment value ('message, error, breakOnError, showMessage, allowWhiteSpace') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('between') +object path entity ('between') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum, maximum, inclusive') +assignment value ('message, error, breakOnError, showMessage, minimum, maximum, inclusive') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('date') +object path entity ('date') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, format') +assignment value ('message, error, breakOnError, showMessage, format') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('digit') +object path entity ('digit') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') +assignment value ('message, error, breakOnError, showMessage') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('email') +object path entity ('email') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') +assignment value ('message, error, breakOnError, showMessage') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('equals') +object path entity ('equals') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, field') +assignment value ('message, error, breakOnError, showMessage, field') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('fileallowedtypes') +object path entity ('fileallowedtypes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, types') +assignment value ('message, error, breakOnError, showMessage, types') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('filemaximumsize') +object path entity ('filemaximumsize') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, maximum') +assignment value ('message, error, breakOnError, showMessage, maximum') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('fileminimumsize') +object path entity ('fileminimumsize') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum') +assignment value ('message, error, breakOnError, showMessage, minimum') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('float') +object path entity ('float') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') +assignment value ('message, error, breakOnError, showMessage') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('greaterthan') +object path entity ('greaterthan') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum') +assignment value ('message, error, breakOnError, showMessage, minimum') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('inarray') +object path entity ('inarray') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, array, strict') +assignment value ('message, error, breakOnError, showMessage, array, strict') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('integer') +object path entity ('integer') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') +assignment value ('message, error, breakOnError, showMessage') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('ip') +object path entity ('ip') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') +assignment value ('message, error, breakOnError, showMessage') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('length') +object path entity ('length') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, minimum, maximum') +assignment value ('message, error, breakOnError, showMessage, minimum, maximum') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('lessthan') +object path entity ('lessthan') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, maximum') +assignment value ('message, error, breakOnError, showMessage, maximum') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('regexp') +object path entity ('regexp') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage, expression') +assignment value ('message, error, breakOnError, showMessage, expression') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('required') +object path entity ('required') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') +assignment value ('message, error, breakOnError, showMessage') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('uri') +object path entity ('uri') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('message, error, breakOnError, showMessage') +assignment value ('message, error, breakOnError, showMessage') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('filtering') +object path entity ('filtering') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showFilters') +object path entity ('showFilters') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, removexss, stripnewlines, titlecase, trim, uppercase') +assignment value ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, removexss, stripnewlines, titlecase, trim, uppercase') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('filters') +object path entity ('filters') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('alphabetic') +object path entity ('alphabetic') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('allowWhiteSpace') +assignment value ('allowWhiteSpace') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('alphanumeric') +object path entity ('alphanumeric') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('allowWhiteSpace') +assignment value ('allowWhiteSpace') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('currency') +object path entity ('currency') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('decimalPoint, thousandSeparator') +assignment value ('decimalPoint, thousandSeparator') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('digit') +object path entity ('digit') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('integer') +object path entity ('integer') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('lowercase') +object path entity ('lowercase') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('regexp') +object path entity ('regexp') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('expression') +assignment value ('expression') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('removexss') +object path entity ('removexss') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('stripnewlines') +object path entity ('stripnewlines') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('titlecase') +object path entity ('titlecase') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('trim') +object path entity ('trim') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('characterList') +assignment value ('characterList') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('uppercase') +object path entity ('uppercase') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('form') +object path entity ('form') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('prefix, attributes, postProcessor') +assignment value ('prefix, attributes, postProcessor') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('accept, acceptcharset, action, class, dir, enctype, id, lang, method, name, style, title') +assignment value ('accept, acceptcharset, action, class, dir, enctype, id, lang, method, name, style, title') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('postProcessor') +object path entity ('postProcessor') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showPostProcessors') +object path entity ('showPostProcessors') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('mail') +assignment value ('mail') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('postProcessors') +object path entity ('postProcessors') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('mail') +object path entity ('mail') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('recipientEmail, senderEmail') +assignment value ('recipientEmail, senderEmail') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('elements') +object path entity ('elements') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('button') +object path entity ('button') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('attributes') +assignment value ('attributes') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('value') +assignment value ('value') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('checkbox') +object path entity ('checkbox') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('label, attributes') +assignment value ('label, attributes') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('name, value') +assignment value ('name, value') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('fieldset') +object path entity ('fieldset') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('legend') +assignment value ('legend') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('fileupload') +object path entity ('fileupload') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('label, attributes, validation') +assignment value ('label, attributes, validation') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('name') +assignment value ('name') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('validation') +object path entity ('validation') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showRules') +object path entity ('showRules') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('required, fileallowedtypes, filemaximumsize, fileminimumsize') +assignment value ('required, fileallowedtypes, filemaximumsize, fileminimumsize') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('hidden') +object path entity ('hidden') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('attributes') +assignment value ('attributes') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('name, value') +assignment value ('name, value') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('password') +object path entity ('password') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('label, attributes, validation') +assignment value ('label, attributes, validation') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('name') +assignment value ('name') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('validation') +object path entity ('validation') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showRules') +object path entity ('showRules') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('required, equals') +assignment value ('required, equals') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('radio') +object path entity ('radio') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('checkbox') +. ('.') +object path entity ('checkbox') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('reset') +object path entity ('reset') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('button') +. ('.') +object path entity ('button') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('select') +object path entity ('select') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('label, attributes, options, validation') +assignment value ('label, attributes, options, validation') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('name, multiple') +assignment value ('name, multiple') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('validation') +object path entity ('validation') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showRules') +object path entity ('showRules') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('required') +assignment value ('required') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('submit') +object path entity ('submit') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('button') +. ('.') +object path entity ('button') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('textarea') +object path entity ('textarea') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('label, attributes, validation, filters') +assignment value ('label, attributes, validation, filters') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('name, cols, rows') +assignment value ('name, cols, rows') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('filtering') +object path entity ('filtering') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showFilters') +object path entity ('showFilters') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('alphabetic, alphanumeric, lowercase, regexp, stripnewlines, titlecase, trim, uppercase') +assignment value ('alphabetic, alphanumeric, lowercase, regexp, stripnewlines, titlecase, trim, uppercase') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('validation') +object path entity ('validation') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showRules') +object path entity ('showRules') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('alphabetic, alphanumeric, length, regexp, required') +assignment value ('alphabetic, alphanumeric, length, regexp, required') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('textline') +object path entity ('textline') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('label, attributes, validation, filters') +assignment value ('label, attributes, validation, filters') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('attributes') +object path entity ('attributes') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showProperties') +object path entity ('showProperties') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('name') +assignment value ('name') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('validation') +object path entity ('validation') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showRules') +object path entity ('showRules') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('alphabetic, alphanumeric, between, date, digit, email, equals, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') +assignment value ('alphabetic, alphanumeric, between, date, digit, email, equals, float, greaterthan, inarray, integer, ip, length, lessthan, regexp, required, uri') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('filtering') +object path entity ('filtering') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showFilters') +object path entity ('showFilters') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, titlecase, trim, uppercase') +assignment value ('alphabetic, alphanumeric, currency, digit, integer, lowercase, regexp, titlecase, trim, uppercase') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('checkboxgroup') +object path entity ('checkboxgroup') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('legend, options, various, validation') +assignment value ('legend, options, various, validation') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('accordions') +object path entity ('accordions') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('validation') +object path entity ('validation') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showRules') +object path entity ('showRules') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('required') +assignment value ('required') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('email') +object path entity ('email') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('textline') +. ('.') +object path entity ('textline') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('header') +object path entity ('header') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('various') +assignment value ('various') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('textblock') +object path entity ('textblock') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('various') +assignment value ('various') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('name') +object path entity ('name') WHITE_SPACE (' ') -CODE_BLOCK_OPEN ('{') +{ ('{') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('showAccordions') +object path entity ('showAccordions') WHITE_SPACE (' ') -ASSIGN ('=') += ('=') WHITE_SPACE (' ') -ASSIGNMENT_VALUE ('legend, various') +assignment value ('legend, various') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('radiogroup') +object path entity ('radiogroup') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('checkboxgroup') +. ('.') +object path entity ('checkboxgroup') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') -CODE_BLOCK_CLOSE ('}') +} ('}') WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/multilineValue.test.expected b/testData/typoscript/lexer/multilineValue.test.expected index 853d16523708..3e4d372e8149 100644 --- a/testData/typoscript/lexer/multilineValue.test.expected +++ b/testData/typoscript/lexer/multilineValue.test.expected @@ -1,56 +1,56 @@ -OBJECT_PATH_ENTITY ('myObject') -MULTILINE_OPEN ('(') +object path entity ('myObject') +( ('(') WHITE_SPACE_WITH_NEW_LINE (' ') -MULTILINE_VALUE ('some value') +multiline value ('some value') WHITE_SPACE (' ') -MULTILINE_CLOSE (')') +) (')') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('myObject') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('nextProperty') +object path entity ('myObject') +. ('.') +object path entity ('nextProperty') WHITE_SPACE (' ') -MULTILINE_OPEN ('(') +( ('(') IGNORED_TEXT ('IGNORED_TEXT') WHITE_SPACE (' ') -MULTILINE_VALUE ('some other value ))') +multiline value ('some other value ))') WHITE_SPACE (' ') -MULTILINE_VALUE ('and one more string with provocations{') +multiline value ('and one more string with provocations{') WHITE_SPACE (' ') -MULTILINE_VALUE ('[GLOBAL]') +multiline value ('[GLOBAL]') WHITE_SPACE (' ') -MULTILINE_VALUE ('}') +multiline value ('}') WHITE_SPACE (' ') -MULTILINE_CLOSE (')') +) (')') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('myObject3') +object path entity ('myObject3') WHITE_SPACE (' ') -MULTILINE_OPEN ('(') +( ('(') WHITE_SPACE_WITH_NEW_LINE (' ') -MULTILINE_VALUE ('prop{') +multiline value ('prop{') WHITE_SPACE (' ') -MULTILINE_VALUE ('p1 = 2') +multiline value ('p1 = 2') WHITE_SPACE (' ') -MULTILINE_VALUE ('p4 = 5') +multiline value ('p4 = 5') WHITE_SPACE (' ') -MULTILINE_VALUE ('}') +multiline value ('}') WHITE_SPACE (' ') -MULTILINE_CLOSE (')') +) (')') IGNORED_TEXT ('also IGNORED_TEXT') WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/objectPaths.test.expected b/testData/typoscript/lexer/objectPaths.test.expected index b36a0c2312c4..677076d1c55f 100644 --- a/testData/typoscript/lexer/objectPaths.test.expected +++ b/testData/typoscript/lexer/objectPaths.test.expected @@ -1,49 +1,49 @@ -OBJECT_PATH_ENTITY ('myObject') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('prop1') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('prop2') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('prop3') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('prop4') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('prop5') +object path entity ('myObject') +. ('.') +object path entity ('prop1') +. ('.') +object path entity ('prop2') +. ('.') +object path entity ('prop3') +. ('.') +object path entity ('prop4') +. ('.') +object path entity ('prop5') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('otherObject') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('prop') +object path entity ('otherObject') +. ('.') +object path entity ('prop') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('10') +. ('.') +object path entity ('10') WHITE_SPACE (' ') -UNSET ('>') +> ('>') IGNORED_TEXT (' not.a.path') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('9path') -OBJECT_PATH_SEPARATOR ('.') +object path entity ('9path') +. ('.') BAD_CHARACTER ('%') -OBJECT_PATH_ENTITY ('BAD_SYMBOL') +object path entity ('BAD_SYMBOL') BAD_CHARACTER ('%') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('prop') +. ('.') +object path entity ('prop') WHITE_SPACE (' ') -COPY ('<') +< ('<') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('not') +object path entity ('not') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('a') +object path entity ('a') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('path') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('because') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('of') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('spaces') +object path entity ('path') +. ('.') +object path entity ('because') +. ('.') +object path entity ('of') +. ('.') +object path entity ('spaces') WHITE_SPACE_WITH_NEW_LINE (' ') \ No newline at end of file diff --git a/testData/typoscript/lexer/simpleAssignment.test.expected b/testData/typoscript/lexer/simpleAssignment.test.expected index c403ec0be579..28fa7f86f067 100644 --- a/testData/typoscript/lexer/simpleAssignment.test.expected +++ b/testData/typoscript/lexer/simpleAssignment.test.expected @@ -1,3 +1,3 @@ -OBJECT_PATH_ENTITY ('myObject') -ASSIGN ('=') -ASSIGNMENT_VALUE ('[value 1]') \ No newline at end of file +object path entity ('myObject') += ('=') +assignment value ('[value 1]') \ No newline at end of file diff --git a/testData/typoscript/lexer/unsettingOperator.test.expected b/testData/typoscript/lexer/unsettingOperator.test.expected index c7879c4e0de5..dfebef6ae036 100644 --- a/testData/typoscript/lexer/unsettingOperator.test.expected +++ b/testData/typoscript/lexer/unsettingOperator.test.expected @@ -1,18 +1,18 @@ WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('myObject') +object path entity ('myObject') WHITE_SPACE (' ') -UNSET ('>') +> ('>') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('object') +object path entity ('object') WHITE_SPACE (' ') -UNSET ('>') +> ('>') IGNORED_TEXT (' some irrelevant text') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('nextObjext') -OBJECT_PATH_SEPARATOR ('.') -OBJECT_PATH_ENTITY ('secondProperty') +object path entity ('nextObjext') +. ('.') +object path entity ('secondProperty') WHITE_SPACE (' ') -UNSET ('>') +> ('>') IGNORED_TEXT (' [GLOBAL] {test=3} (value)') \ No newline at end of file diff --git a/testData/typoscript/lexer/valueModificationOperator.test.expected b/testData/typoscript/lexer/valueModificationOperator.test.expected index 97be0316a98f..e8130c956470 100644 --- a/testData/typoscript/lexer/valueModificationOperator.test.expected +++ b/testData/typoscript/lexer/valueModificationOperator.test.expected @@ -1,53 +1,53 @@ -OBJECT_PATH_ENTITY ('value1') -MODIFY (':=') -MODIFICATION_FUNCTION ('addToList') -MODIFICATION_OPEN ('(') -MODIFICATION_VALUE ('4,5') -MODIFICATION_CLOSE (')') +object path entity ('value1') +:= (':=') +modification function ('addToList') +( ('(') +modification value ('4,5') +) (')') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('value2') -MODIFY (':=') -MODIFICATION_FUNCTION ('addToList') -MODIFICATION_OPEN ('(') -MODIFICATION_VALUE ('4,5') +object path entity ('value2') +:= (':=') +modification function ('addToList') +( ('(') +modification value ('4,5') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('value3') -MODIFY (':=') -MODIFICATION_OPEN ('(') +object path entity ('value3') +:= (':=') +( ('(') WHITE_SPACE (' ') -MODIFICATION_VALUE ('4 and some text') +modification value ('4 and some text') WHITE_SPACE (' ') -MODIFICATION_CLOSE (')') +) (')') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('value4') +object path entity ('value4') BAD_CHARACTER (':') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('value5') -MODIFY (':=') -MODIFICATION_FUNCTION ('add To My List') +object path entity ('value5') +:= (':=') +modification function ('add To My List') WHITE_SPACE (' ') -MODIFICATION_OPEN ('(') +( ('(') WHITE_SPACE (' ') -MODIFICATION_VALUE ('4,5') -MODIFICATION_CLOSE (')') +modification value ('4,5') +) (')') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('value6') -MODIFY (':=') -MODIFICATION_FUNCTION ('add To My List') -MODIFICATION_OPEN ('(') -MODIFICATION_VALUE ('4,5') -MODIFICATION_CLOSE (')') +object path entity ('value6') +:= (':=') +modification function ('add To My List') +( ('(') +modification value ('4,5') +) (')') IGNORED_TEXT (' some IGNORED_TEXT') WHITE_SPACE_WITH_NEW_LINE (' ') -OBJECT_PATH_ENTITY ('value7') +object path entity ('value7') BAD_CHARACTER (':') WHITE_SPACE (' ') -OBJECT_PATH_ENTITY ('addToList') -MULTILINE_OPEN ('(') +object path entity ('addToList') +( ('(') IGNORED_TEXT (' ,5)') \ No newline at end of file From 949ac7636b5f7f540dab8166faf6d9fc38511257 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Wed, 18 Apr 2012 18:59:04 +0400 Subject: [PATCH 012/147] Folding --- src/META-INF/plugin.xml | 4 +- .../lang/TypoScriptFoldingBuilder.java | 120 ++++++++++++++++++ 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java diff --git a/src/META-INF/plugin.xml b/src/META-INF/plugin.xml index d5c98949d307..f4bd10677a6f 100644 --- a/src/META-INF/plugin.xml +++ b/src/META-INF/plugin.xml @@ -9,7 +9,7 @@ 1.0 JetBrains - com.intellij.modules.ultimate + com.intellij.modules.lang resources.messages.TypoScriptBundle @@ -19,6 +19,8 @@ + + diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java b/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java new file mode 100644 index 000000000000..5f15c16586ae --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java @@ -0,0 +1,120 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.folding.FoldingBuilder; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiComment; +import com.intellij.psi.PsiElement; +import com.intellij.psi.tree.IElementType; +import com.jetbrains.typoscript.lang.psi.CodeBlock; +import com.jetbrains.typoscript.lang.psi.MultilineValueAssignment; +import com.jetbrains.typoscript.lang.psi.TypoScriptFile; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; + +/** + * @author lene + * Date: 18.04.12 + */ +public class TypoScriptFoldingBuilder implements FoldingBuilder, DumbAware { + @NotNull + @Override + public FoldingDescriptor[] buildFoldRegions(@NotNull ASTNode node, @NotNull Document document) { + final PsiElement element = node.getPsi(); + if (!(element instanceof TypoScriptFile)) { + return FoldingDescriptor.EMPTY; + } + final TypoScriptFile file = (TypoScriptFile)element; + final PsiElement[] children = file.getChildren(); + Collection result = new LinkedList(); + for (PsiElement child : children) { + if (child != null && (child instanceof CodeBlock || child instanceof MultilineValueAssignment || child instanceof PsiComment)) { + List descriptors = new ArrayList(); + addFoldingDescriptors(descriptors, child, document); + result.addAll(descriptors); + } + } + return result.toArray(new FoldingDescriptor[result.size()]); + } + + private static void addFoldingDescriptors(final List descriptors, + final PsiElement element, + @NotNull Document document) { + + TextRange elementRange = element.getTextRange(); + final int start = elementRange.getStartOffset(); + final int end = elementRange.getEndOffset(); + + if (start + 1 < end) { + TextRange range = null; + ASTNode astNode = element.getNode(); + if (element instanceof CodeBlock) { + range = + buildRangeForBraces(range, astNode, TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN, TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_END); + addFoldingDescriptorsFromChildren(descriptors, element, document); + } + else if (element instanceof MultilineValueAssignment) { + range = buildRangeForBraces(range, astNode, TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_BEGIN, + TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_END); + } + else if (element instanceof PsiComment && ((PsiComment)element).getTokenType() == TypoScriptTokenTypes.C_STYLE_COMMENT) { + int startIndex = astNode.getText().indexOf("/*"); + int endIndex = astNode.getText().lastIndexOf("*/"); + if (startIndex != -1 && startIndex + "/*".length() < endIndex) { + int startOffset = element.getTextRange().getStartOffset(); + range = buildRange(range, startOffset + startIndex + "/*".length(), startOffset + endIndex); + } + } + + if (range != null) { + descriptors.add(new FoldingDescriptor(astNode, range)); + } + } + } + + private static TextRange buildRangeForBraces(TextRange range, + @NotNull ASTNode astNode, + IElementType leftBraceType, + IElementType rightBraceType) { + ASTNode lBrace = astNode.findChildByType(leftBraceType); + ASTNode rBrace = astNode.findChildByType(rightBraceType); + if (lBrace != null && rBrace != null) { + range = buildRange(range, lBrace.getStartOffset() + 1, rBrace.getStartOffset()); + } + return range; + } + + private static TextRange buildRange(TextRange range, int leftOffset, int rightOffset) { + if (leftOffset + 1 < rightOffset) { + range = new TextRange(leftOffset, rightOffset); + } + return range; + } + + private static void addFoldingDescriptorsFromChildren(List descriptors, + PsiElement element, + @NotNull Document document) { + for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) { + if (child instanceof CodeBlock || child instanceof MultilineValueAssignment || child instanceof PsiComment) { + addFoldingDescriptors(descriptors, child, document); + } + } + } + + @Override + public String getPlaceholderText(@NotNull ASTNode node) { + return "..."; + } + + @Override + public boolean isCollapsedByDefault(@NotNull ASTNode node) { + return false; + } +} From bff2deb5af15bc65f573847cdedd7b35588b3438 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Wed, 18 Apr 2012 20:57:36 +0400 Subject: [PATCH 013/147] improved problem report in parser --- .../lang/TypoScriptGeneratedParser.java | 16 ++++++++-------- .../jetbrains/typoscript/lang/psi/Copying.java | 2 +- .../typoscript/lang/psi/impl/CopyingImpl.java | 4 ++-- .../lang/GeneratedParserUtilBase.java | 8 ++++---- .../jetbrains/typoscript/lang/TypoScript.bnf | 7 ++++--- .../typoscript/lang/TypoScriptParserUtil.java | 17 +++++++++++++++-- 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java b/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java index 1b9cb7370ae5..528b6d1233f4 100644 --- a/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java +++ b/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java @@ -75,9 +75,9 @@ public class TypoScriptGeneratedParser implements PsiParser { final Marker marker_ = builder_.mark(); enterErrorRecordingSection(builder_, level_, _SECTION_GENERAL_); result_ = object_path(builder_, level_ + 1); - result_ = result_ && consumeToken(builder_, ASSIGNMENT_OPERATOR); - pinned_ = result_; // pin = 2 - result_ = result_ && assignment_2(builder_, level_ + 1); + pinned_ = result_; // pin = 1 + result_ = result_ && report_error_(builder_, consumeToken(builder_, ASSIGNMENT_OPERATOR)); + result_ = pinned_ && assignment_2(builder_, level_ + 1) && result_; if (result_ || pinned_) { marker_.done(ASSIGNMENT); } @@ -169,7 +169,7 @@ public class TypoScriptGeneratedParser implements PsiParser { } /* ********************************************************** */ - // object_path '<' object_path + // object_path '<' object_path_on_same_line public static boolean copying(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "copying")) return false; if (!nextTokenIs(builder_, OBJECT_PATH_ENTITY) && !nextTokenIs(builder_, OBJECT_PATH_SEPARATOR)) return false; @@ -180,7 +180,7 @@ public class TypoScriptGeneratedParser implements PsiParser { result_ = object_path(builder_, level_ + 1); result_ = result_ && consumeToken(builder_, COPYING_OPERATOR); pinned_ = result_; // pin = 2 - result_ = result_ && object_path(builder_, level_ + 1); + result_ = result_ && isObjectPathOnSameLine(builder_, level_ + 1); if (result_ || pinned_) { marker_.done(COPYING); } @@ -192,19 +192,19 @@ public class TypoScriptGeneratedParser implements PsiParser { } /* ********************************************************** */ - // assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block + // value_modification | multiline_value_assignment | copying | unsetting | code_block | assignment // | condition_element | include_statement_element static boolean expression(PsiBuilder builder_, int level_) { if (!recursion_guard_(builder_, level_, "expression")) return false; boolean result_ = false; final Marker marker_ = builder_.mark(); enterErrorRecordingSection(builder_, level_, _SECTION_RECOVER_); - result_ = assignment(builder_, level_ + 1); - if (!result_) result_ = value_modification(builder_, level_ + 1); + result_ = value_modification(builder_, level_ + 1); if (!result_) result_ = multiline_value_assignment(builder_, level_ + 1); if (!result_) result_ = copying(builder_, level_ + 1); if (!result_) result_ = unsetting(builder_, level_ + 1); if (!result_) result_ = code_block(builder_, level_ + 1); + if (!result_) result_ = assignment(builder_, level_ + 1); if (!result_) result_ = condition_element(builder_, level_ + 1); if (!result_) result_ = include_statement_element(builder_, level_ + 1); if (!result_) { diff --git a/gen/com/jetbrains/typoscript/lang/psi/Copying.java b/gen/com/jetbrains/typoscript/lang/psi/Copying.java index 11a5d330ccf4..4f2b03aeb0c7 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/Copying.java +++ b/gen/com/jetbrains/typoscript/lang/psi/Copying.java @@ -8,6 +8,6 @@ import com.intellij.psi.PsiElement; public interface Copying extends TypoScriptCompositeElement { @NotNull - List getObjectPathList(); + ObjectPath getObjectPath(); } diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java b/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java index 00ee16ef4dcc..c0f0d9e7d3c8 100644 --- a/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java +++ b/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java @@ -19,8 +19,8 @@ public class CopyingImpl extends TypoScriptCompositeElementImpl implements Copyi @Override @NotNull - public List getObjectPathList() { - return PsiTreeUtil.getChildrenOfTypeAsList(this, ObjectPath.class); + public ObjectPath getObjectPath() { + return findNotNullChildByClass(ObjectPath.class); } public void accept(@NotNull PsiElementVisitor visitor) { diff --git a/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java b/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java index 60f56d8f473f..460fc68f11dc 100644 --- a/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java +++ b/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java @@ -26,8 +26,8 @@ import java.util.Collection; import java.util.LinkedList; /** - * @author gregsh - */ +* @author gregsh +*/ @SuppressWarnings("StringEquality") public class GeneratedParserUtilBase { @@ -328,7 +328,7 @@ public class GeneratedParserUtilBase { } } - private static int getLastVariantOffset(ErrorState state, int defValue) { + static int getLastVariantOffset(ErrorState state, int defValue) { return state.lastExpectedVariantOffset < 0? defValue : state.lastExpectedVariantOffset; } @@ -673,4 +673,4 @@ public class GeneratedParserUtilBase { return getParent().getLanguage(); } } -} +} \ No newline at end of file diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.bnf b/src/com/jetbrains/typoscript/lang/TypoScript.bnf index cb3a22cb7bf6..da64af8430bc 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScript.bnf +++ b/src/com/jetbrains/typoscript/lang/TypoScript.bnf @@ -27,7 +27,7 @@ } file ::= (expression)* -private expression ::= assignment | value_modification | multiline_value_assignment | copying | unsetting | code_block +private expression ::= value_modification | multiline_value_assignment | copying | unsetting | code_block | assignment | condition_element | include_statement_element {recoverUntil="top_expression_recover"} private top_expression_recover ::= ! new_line_white_space external new_line_white_space ::= isAfterNewLine @@ -35,14 +35,15 @@ external new_line_white_space ::= isAfterNewLine include_statement_element ::= INCLUDE_STATEMENT condition_element ::= CONDITION -assignment ::= object_path '=' ASSIGNMENT_VALUE? {pin=2} +assignment ::= object_path '=' ASSIGNMENT_VALUE? {pin=1} value_modification ::= object_path ':=' MODIFICATION_OPERATOR_FUNCTION MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN MODIFICATION_OPERATOR_FUNCTION_ARGUMENT MODIFICATION_OPERATOR_FUNCTION_PARAM_END {pin=2} multiline_value_assignment ::= object_path MULTILINE_VALUE_OPERATOR_BEGIN IGNORED_TEXT? (MULTILINE_VALUE)* MULTILINE_VALUE_OPERATOR_END IGNORED_TEXT? {pin=2} -copying ::= object_path '<' object_path {pin=2} +copying ::= object_path '<' object_path_on_same_line {pin=2} +external object_path_on_same_line ::= isObjectPathOnSameLine unsetting ::= object_path '>' IGNORED_TEXT? {pin=2} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java b/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java index 345e214ea267..437e06d06a31 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java @@ -1,6 +1,7 @@ package com.jetbrains.typoscript.lang; import com.intellij.lang.PsiBuilder; +import com.intellij.psi.tree.IElementType; /** * @author lene @@ -8,7 +9,19 @@ import com.intellij.lang.PsiBuilder; */ public class TypoScriptParserUtil extends GeneratedParserUtilBase { - public static boolean isAfterNewLine(PsiBuilder builder, int level) { - return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE == builder.rawLookup(-1); + static boolean isAfterNewLine(PsiBuilder builder, int level) { + return TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE == builder.rawLookup(-1);// && + //getLastVariantOffset(ErrorState.get(builder), builder.getCurrentOffset()) < builder.getCurrentOffset(); + } + + + static boolean isObjectPathOnSameLine(PsiBuilder builder, int level) { + final IElementType type = builder.rawLookup(0); + if (TypoScriptTokenTypes.WHITE_SPACE_WITH_NEW_LINE == type) { + nextTokenIs(builder, TypoScriptTokenTypes.OBJECT_PATH_SEPARATOR); + nextTokenIs(builder, TypoScriptTokenTypes.OBJECT_PATH_ENTITY); + return false; + } + return TypoScriptGeneratedParser.object_path(builder, level + 1); } } From 2bae98695d5574c30b7523dc29e7cccc2c2feab0 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Wed, 18 Apr 2012 21:15:45 +0400 Subject: [PATCH 014/147] Improved highlighting --- .../messages/TypoScriptBundle.properties | 4 +- .../TypoScriptColorsAndFontsPage.java | 38 ++++++++++--------- .../TypoScriptHighlightingData.java | 5 ++- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/resources/messages/TypoScriptBundle.properties b/resources/messages/TypoScriptBundle.properties index a331ca79d2fc..857aa7b9a829 100644 --- a/resources/messages/TypoScriptBundle.properties +++ b/resources/messages/TypoScriptBundle.properties @@ -8,4 +8,6 @@ color.settings.object.path=Object path element color.settings.object.path.separator=Dot color.settings.assigned.value=Assigned value color.settings.bad.character=Bad character -color.settings.ignored.text=Ignored text \ No newline at end of file +color.settings.ignored.text=Ignored text +color.settings.condition=Condition +color.settings.include=Include \ No newline at end of file diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java index 1373ff2b1e61..062ba42e0e3d 100644 --- a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java @@ -23,23 +23,25 @@ import java.util.Map; public class TypoScriptColorsAndFontsPage implements ColorSettingsPage, DisplayPrioritySortable { @NonNls private static final String DEMO_TEXT = "/*\n" + - " * Menu description\n" + - " */\n" + - "temp.menu = COA\n" + - "temp.menu { some ignored text\n" + - " 10 = HMENU\n" + - " 10.entryLevel = 0\n" + - " 10.1 = TMENU\n" + - " 10.1 {\n" + - " wrap =

|
\n" + - " NO.ATagParams = class=\"menuButton\"\n" + - " } \n" + - "} \n" + - "\n" + - "# Default PAGE object:\n" + - "page = PAGE\n" + - "page.typeNum = 0\n" + - "page.10 < temp.menu "; + " * Menu description\n" + + " */\n" + + "\n" + + "temp.menu = COA\n" + + "temp.menu { some ignored text\n" + + " 10 = HMENU\n" + + " 10.entryLevel = 0\n" + + " 10.1 = TMENU\n" + + " 10.1 {\n" + + " wrap =
|
\n" + + " NO.ATagParams = class=\"menuButton\"\n" + + " } \n" + + "} \n" + + "\n" + + "# Default PAGE object:\n" + + "page = PAGE\n" + + "[GLOBAL]\n" + + "page.typeNum = 0\n" + + "page.10 < temp.menu "; private static final AttributesDescriptor[] ATTRIBUTES = @@ -54,6 +56,8 @@ public class TypoScriptColorsAndFontsPage implements ColorSettingsPage, DisplayP new AttributesDescriptor(TypoScriptBundle.message("color.settings.object.path.separator"), TypoScriptHighlightingData.OBJECT_PATH_SEPARATOR), new AttributesDescriptor(TypoScriptBundle.message("color.settings.assigned.value"), TypoScriptHighlightingData.ASSIGNED_VALUE), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.condition"), TypoScriptHighlightingData.CONDITION), + new AttributesDescriptor(TypoScriptBundle.message("color.settings.include"), TypoScriptHighlightingData.INCLUDE_STATEMENT), new AttributesDescriptor(TypoScriptBundle.message("color.settings.bad.character"), TypoScriptHighlightingData.BAD_CHARACTER) }; diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java index 786d9fd477ac..066ae7931356 100644 --- a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java @@ -1,5 +1,6 @@ package com.jetbrains.typoscript.lang.highlighter; +import com.intellij.ide.highlighter.custom.CustomHighlighterColors; import com.intellij.openapi.editor.HighlighterColors; import com.intellij.openapi.editor.SyntaxHighlighterColors; import com.intellij.openapi.editor.colors.TextAttributesKey; @@ -26,9 +27,9 @@ public class TypoScriptHighlightingData { public static final TextAttributesKey OBJECT_PATH_SEPARATOR = TextAttributesKey.createTextAttributesKey("TS_OBJECT_PATH_SEPARATOR", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); public static final TextAttributesKey CONDITION = - TextAttributesKey.createTextAttributesKey("TS_CONDITION", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); + TextAttributesKey.createTextAttributesKey("TS_CONDITION", CustomHighlighterColors.CUSTOM_KEYWORD3_ATTRIBUTES.getDefaultAttributes()); public static final TextAttributesKey INCLUDE_STATEMENT = - TextAttributesKey.createTextAttributesKey("TS_INCLUDE", SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()); + TextAttributesKey.createTextAttributesKey("TS_INCLUDE", CustomHighlighterColors.CUSTOM_KEYWORD4_ATTRIBUTES.getDefaultAttributes()); public static final TextAttributesKey BAD_CHARACTER = From 8f9ef67e844dae5692c29cde54a87f11fc054bd7 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Fri, 20 Apr 2012 14:26:27 +0400 Subject: [PATCH 015/147] Pre-release modifications --- resources/icons/typo3.png | Bin 457 -> 1529 bytes src/META-INF/plugin.xml | 4 +++- .../TypoScriptColorsAndFontsPage.java | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/icons/typo3.png b/resources/icons/typo3.png index a1bb420cc382ac8e7cf648d60c169992e73c549e..5fe6c7b11321ca3a4a46a4d5efa81aaec829c57e 100644 GIT binary patch literal 1529 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh*)icxGNo zet9uiy|1s8XI^nhVqS8pr;Du;&;-5A%oHnAM>BIL3j+%aM*~AcLsvsfQ!{553uALr zOIK%eGgBv+UYGpj(%jU%5}4i;gkDRWdO=Acw*Y9fOKMSOS!#+~QGTuh*vnR#xZPrg z(>$o&6x?nx$EjBz=oo!a#3DsBObD2IKumbD1#;jCKQ#}S+KYh6T0|$~4FdyHuBVG* zNX4xs!M+*7juN%TvwbI65&N0vRG{l5Bs zb$%MhbD96fKA+X+x>ql&i+(ysYJOw-_Sf#e^p8Gw+GEgQ=qGnO&al4j#gF7QEAr=x z?B6F|D}Mj)O#japy;jL|o%*1BI525z!t-@oIoQlxrOmdn|L05)Na=CDt{7(~oxP%1 zag%CBLl4&k)B33gdXvnShfZs_kY(Q1{%FHxR*OqFnI=4|n-~@(;BduRXph%gp))S- zDnBAKX0fczabjXwKCdjAjg9^NZI#!n8_w36vO9>+m30-_^ojB0KE8~{-&q#$yxwLP%)wjKkHC3maOL2a@?Ng|woI&%xic9>v7PwWrD)7dhZOYcHcoSzb?OKuL;)Nc` z6IQTQ9485k4OT8cL1wr=0dqHP+{!p>gTe~DWM4fK<+b^ literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZWUgpAgso z|NsB_^77Az2Y(*!{d0HopF11=TwC({@|@LAj{iPCWzPM*zm7LeySMZAk*Z$@ihk|O zZN9#?{`%@)JCiD}F8{SHviS1iyh{syt@p~fFz44A=hXAF;?GX|x!mIC5<~mL4Z_<} zxHiYLZi->p5MiWKQUtVAxg^Lhm;q=j0kGsla34@PXMsm#F#`kF2M}g-T4OQ;C@53n z8c`CQpH@P$~SnrIEF|}E$zK6)MUWp5`IK!fx?5ew+c@FuV3P+rNKXErr+-L zO}q;%EVoyeZ`^QN%fD!|!Kw^Tiv@uPc_(CE>vU|L=5ysh^rwbbb?=~D|=ZoQ)(rzj9 Q3g{LFPgg&ebxsLQ0P~8~lK=n! diff --git a/src/META-INF/plugin.xml b/src/META-INF/plugin.xml index f4bd10677a6f..dd90205dd1ca 100644 --- a/src/META-INF/plugin.xml +++ b/src/META-INF/plugin.xml @@ -7,7 +7,9 @@ Typo3 language TypoScript support - 1.0 + 0.1.0 + + JetBrains com.intellij.modules.lang resources.messages.TypoScriptBundle diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java index 062ba42e0e3d..fea2d726710c 100644 --- a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java @@ -41,7 +41,8 @@ public class TypoScriptColorsAndFontsPage implements ColorSettingsPage, DisplayP "page = PAGE\n" + "[GLOBAL]\n" + "page.typeNum = 0\n" + - "page.10 < temp.menu "; + "page.10 < temp.menu \n" + + "&text = my text"; private static final AttributesDescriptor[] ATTRIBUTES = From 92299d4ef933730832a8a250b9491b168339bf1e Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Fri, 20 Apr 2012 20:04:16 +0400 Subject: [PATCH 016/147] Structure view --- resources/icons/condition_ts.png | Bin 0 -> 903 bytes resources/icons/include_ts.png | Bin 0 -> 891 bytes resources/icons/property_ts.png | Bin 0 -> 834 bytes src/META-INF/plugin.xml | 2 + .../jetbrains/typoscript/TypoScriptIcons.java | 15 ++ .../lang/TypoScriptStructureViewFactory.java | 162 ++++++++++++++++++ 6 files changed, 179 insertions(+) create mode 100644 resources/icons/condition_ts.png create mode 100644 resources/icons/include_ts.png create mode 100644 resources/icons/property_ts.png create mode 100644 src/com/jetbrains/typoscript/TypoScriptIcons.java create mode 100644 src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java diff --git a/resources/icons/condition_ts.png b/resources/icons/condition_ts.png new file mode 100644 index 0000000000000000000000000000000000000000..c255ccfe118a773d92cc10bcc28a49776028b00a GIT binary patch literal 903 zcmV;219<$2P)Cf|9S5E@@$AEaxzKwG)BC7`oAVy>t z05!*&IJ-C7I9SU`NQf~qGBGi{`Nqib>c>BZ8@C_+y}onZl}`_E^a2f84ATP;Knx%Q zK-keQDR#oj{hx1s`2GLMxBvg&|Nj5~&9DFe?*Q2c-~RhQ`_}LOh5Nt$3v68R2Ba3I z400a;d)FCd;9*$BxtV|62z))GYc|XJQO?w$sR1_Ix6qFg3En3g8 zVaG`ZGchIx0Zw*C4lP?Zf1Q0kDn3!4Qzy1El@b&j!hM#|#89KV^ z8Qy*U%kc93Cx*j^Pcs0886*`{8J@oX$?)a#Zw4MNL56Qavc@32009Ix;2$s?K79Yn zz{$+Wz|8cQ;nR;l44;1eW7x1}E5oJpml^b|>=}HW%^0>``o!?#Cj$dJ3p-F9Bn1Ej z5ZDWhtZdKUe*eet?i)n&$De;0J^)<+(yXLyz>pkd2iE-M`)>wDpf^~VSQ-9(dUXk; z7a)MZ#@s!1c!|7?kN&U!+>Ao3e;K|5ZU6l9KSM!v1p_Y|6T^}d?-;%U(*jUC10OFd z!{0Y={`~v(^&m(uKmfsFVb86L=bqj9_>bYvhd)4<0KM?_4?}Bh3&WI!+Zeob_!<5% zGBNOQvoWwUGBUisarhQU4@e_G0KrotC>08MBu^KWk>}?A|C{08-~SAn;#>?IENl!1 z?tNuo=U`=E1!{hC{?Oa!=eHNaQX@bBVI*Zvb@LiFC4Cj9|9_ac*|{0GIC&UY*f1BCpEP)Zt~^Ic=%;$vXu_#?=0Lx44eWsH?Lfle)sAT1JIT07#I{700M{! zWWe8VpS5(<6bd|S4P|77IG9B^85nqgMi-YfGE|o}GW-Ds)33h_3{2eo970N33d{`u z(|^2rtOe2w5I_(Ee*ds>vN19g<6~#$VSxnBuYW*sphi#_{|4e8K-c^P8p6US#3?AF zWccg-D;tnHfB=Fh|NGZON=%58i4mgdD^T%YpaI!+^$ah*0W|{Izd#24g&4>!EWry5 zFB727SpWe9F@TX#g@u)s3FK!G`0xutuUx#G;X6<)I4%;b8RjBp9zM1|Uq7jU)Bpq! z*Z@Xm7KSgsA-1qHGcbGxvN?b<@85j{JO3}tJ3tpQ{QJwm$nc-x@2?+VO8^20=7Kw~ zK7F_0;NoTlDFoRn#>K$!>BD=5e?UGc5dT390Wp4ldiU%9pWk;tS^)wG9Ed=7ow@h$ z`InDB85rJtXJB{>#9x4hF#r3-!216e*Z@#C{QL74X!k#c&yVkZ1}3yKAgura1UBIR z-#-TN7N`N& z9^Je?jhUTYTFJ~&fr(#?;|I`ygqnJw?f=1=fod4OzkUAw>G56nKRv!P6R7PPNH0JD zferZg>nBLTx?9H%FuZ>FAVb2?&fvA23NJ9tvw{8m`Teg?k8Xbk*$maZ4wjh!0tjrt zpYNZ6{sX%8|G#x_@87)f_Wlh}A_2v-3RE2^z(9UJ0<#$g00M}S((DWnU;x<2W@u2m R)b0QP002ovPDHLkV1n(Nl>Gnz literal 0 HcmV?d00001 diff --git a/resources/icons/property_ts.png b/resources/icons/property_ts.png new file mode 100644 index 0000000000000000000000000000000000000000..0671c391ed30b2f62ef2dbe6e57d5a86eda79f96 GIT binary patch literal 834 zcmV-I1HJr-P)-Wt3bu>0Pz_hJ_5woUY-RumAQm(OgRE?g zikv(x41~o6I9Qq4nErhK&+y^(H=BodpM@MgeDd6#dv~S*)vbeR00TFsDh7=n^j#+MNoiS*!tk%V^ZfXgB$}f1R#KzV9vI(GcL0B z(39riWn=#P|1ZPezyBEi|NGDI@6UgRKYu_p&>&6$4r48I1xZo4bf{Mu00Ic+0vl&< z3j+=gcA(Aw82)}|Vo0iOW>A-vXSi|yA%h^707G$j0>l6BTnt=Hf}Cn{hKA2yKLUl* zHGlwuxxhqJLV)A%Zw7{cKmRlQ{Q(sD$G{*hEWt1}zlK3wT#aGEvSkdMf{YB`zy4?7 zW0&ED1~LOc0Kp7UVPR!u`tywesF{)B576)bfClKPs55+d4V2_nVR-iTB?BWP1H+Hc z|A67b%?67hfB=FS0JintPX-2%A-}(Y1Q;0Z-G9#T`^P_q7jND(@UikSeE;;9;s5_X z!0`D44|#w9f`!4IPj9~4^6+r6`~te*=jZ=m7wkQKis96S8w~efJ!D9-4`+CD|2M-g zpv322pMF8p1_M9z4RMo5F-O4kn;x|!hadQ zetY-*(TmIHp{bGqAb?;lxOU^_t*QJxf>K7BrV1Pkd>o~gr3^n`{A2hE^zTog0iZnd z<=gx3*Pflf|L)V%nXn`c5J1Q&aox$YCmEhTd6A(it#2T}A;rtY#L4y_sQJT>kH6l3 zdiMF@%WLP~eR?(%IVl4K5PDu%_vGcn8$e7{W�#0Ai#xI|Bq50742Z#AY`f^#A|> M07*qoM6N<$g8O-btpET3 literal 0 HcmV?d00001 diff --git a/src/META-INF/plugin.xml b/src/META-INF/plugin.xml index dd90205dd1ca..2a188f34d81b 100644 --- a/src/META-INF/plugin.xml +++ b/src/META-INF/plugin.xml @@ -23,6 +23,8 @@ + + diff --git a/src/com/jetbrains/typoscript/TypoScriptIcons.java b/src/com/jetbrains/typoscript/TypoScriptIcons.java new file mode 100644 index 000000000000..c460cf24f4a2 --- /dev/null +++ b/src/com/jetbrains/typoscript/TypoScriptIcons.java @@ -0,0 +1,15 @@ +package com.jetbrains.typoscript; + +import com.intellij.openapi.util.IconLoader; + +import javax.swing.*; + +/** + * @author lene + * Date: 20.04.12 + */ +public interface TypoScriptIcons { + Icon CONDITION_ICON = IconLoader.getIcon("/icons/condition_ts.png"); + Icon PROPERTY_ICON = IconLoader.getIcon("/icons/property_ts.png"); + Icon INCLUDE_ICON = IconLoader.getIcon("/icons/include_ts.png"); +} diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java b/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java new file mode 100644 index 000000000000..1e5eba9930db --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java @@ -0,0 +1,162 @@ +package com.jetbrains.typoscript.lang; + +import com.intellij.ide.structureView.*; +import com.intellij.ide.util.treeView.smartTree.TreeElement; +import com.intellij.lang.PsiStructureViewFactory; +import com.intellij.navigation.ItemPresentation; +import com.intellij.pom.Navigatable; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.PlatformIcons; +import com.jetbrains.typoscript.TypoScriptIcons; +import com.jetbrains.typoscript.lang.psi.*; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.util.ArrayList; + +/** + * @author lene + * Date: 20.04.12 + */ +public class TypoScriptStructureViewFactory implements PsiStructureViewFactory { + private static final Class[] SUITABLE_CLASSES = + new Class[]{Assignment.class, CodeBlock.class, ConditionElement.class, Copying.class, IncludeStatementElement.class, + MultilineValueAssignment.class, Unsetting.class, ValueModification.class}; + + @Override + public StructureViewBuilder getStructureViewBuilder(final PsiFile psiFile) { + + return new TreeBasedStructureViewBuilder() { + @NotNull + public StructureViewModel createStructureViewModel() { + return new Model(psiFile); + } + + @Override + public boolean isRootNodeShown() { + return false; + } + }; + } + + private static class Model extends StructureViewModelBase implements StructureViewModel.ElementInfoProvider { + + public Model(@NotNull PsiFile psiFile) { + super(psiFile, new Element(psiFile)); + withSuitableClasses(SUITABLE_CLASSES); + } + + @Override + public boolean isAlwaysShowsPlus(StructureViewTreeElement element) { + return false; + } + + @Override + public boolean isAlwaysLeaf(StructureViewTreeElement element) { + Object psi = element.getValue(); + return !(psi instanceof TypoScriptFile || psi instanceof CodeBlock); + } + } + + private static class Element implements StructureViewTreeElement, ItemPresentation { + private final PsiElement myElement; + + public Element(PsiElement element) { + this.myElement = element; + } + + @Override + public Object getValue() { + return myElement; + } + + @Override + public void navigate(boolean requestFocus) { + ((Navigatable)myElement).navigate(requestFocus); + } + + @Override + public boolean canNavigate() { + return ((Navigatable)myElement).canNavigate(); + } + + @Override + public boolean canNavigateToSource() { + return ((Navigatable)myElement).canNavigateToSource(); + } + + @Override + public ItemPresentation getPresentation() { + return this; + } + + @Override + public String getPresentableText() { + if (myElement instanceof TypoScriptFile) { + return myElement.getContainingFile().getName(); + } + else if (myElement instanceof IncludeStatementElement) { + return myElement.getText(); + } + else if (myElement instanceof ConditionElement) { + return myElement.getText(); + } + ObjectPath objectPath = PsiTreeUtil.getChildOfType(myElement, ObjectPath.class); + if (objectPath != null) { + return objectPath.getText(); + } + throw new AssertionError(myElement.getClass().getName() + " " + myElement.getText()); + } + + @Override + public String getLocationString() { + return null; + } + + @Override + public Icon getIcon(boolean open) { + if (myElement instanceof TypoScriptFile) { + return myElement.getIcon(0); + } + else if (myElement instanceof IncludeStatementElement) { + return TypoScriptIcons.INCLUDE_ICON; + } + else if (myElement instanceof ConditionElement) { + return TypoScriptIcons.CONDITION_ICON; + } + else if (myElement instanceof CodeBlock) { + return PlatformIcons.FOLDER_ICON; + } + return TypoScriptIcons.PROPERTY_ICON; + } + + @Override + public TreeElement[] getChildren() { + if (myElement instanceof TypoScriptFile || myElement instanceof CodeBlock) { + final ArrayList result = new ArrayList(); + for (PsiElement child : myElement.getChildren()) { + if (isSuitable(child)) { + result.add(new Element(child)); + } + } + return result.toArray(new TreeElement[result.size()]); + } + return new TreeElement[0]; + } + } + + + private static boolean isSuitable(PsiElement element) { + if (!(element instanceof TypoScriptCompositeElement)) { + return false; + } + for (Class aClass : SUITABLE_CLASSES) { + if (aClass.isInstance(element)) { + return true; + } + } + return false; + } +} From e26546b50c7cf24697a847d19e186950733d647c Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Tue, 24 Apr 2012 18:02:09 +0400 Subject: [PATCH 017/147] TypoScript: check ts extension and offer fix --- .../messages/TypoScriptBundle.properties | 5 +- src/META-INF/plugin.xml | 5 ++ .../TypoScriptExtensionMappingChecker.java | 76 +++++++++++++++++++ .../jetbrains/typoscript/lang/TypoScript.flex | 6 +- .../typoscript/lang/TypoScriptFileType.java | 15 +--- .../lang/TypoScriptParserDefinition.java | 2 +- .../TypoScriptColorsAndFontsPage.java | 1 - 7 files changed, 92 insertions(+), 18 deletions(-) create mode 100644 src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java diff --git a/resources/messages/TypoScriptBundle.properties b/resources/messages/TypoScriptBundle.properties index 857aa7b9a829..5f14d3710882 100644 --- a/resources/messages/TypoScriptBundle.properties +++ b/resources/messages/TypoScriptBundle.properties @@ -1,5 +1,4 @@ color.settings.name=TypoScript -color.settings.keyword=Keywords color.settings.one.line.comment=Line comment color.settings.multiline.comment=Block comment color.settings.operator=Operation @@ -10,4 +9,6 @@ color.settings.assigned.value=Assigned value color.settings.bad.character=Bad character color.settings.ignored.text=Ignored text color.settings.condition=Condition -color.settings.include=Include \ No newline at end of file +color.settings.include=Include +file.type.registration.warning=*.{0} files are not associated with TypoScript file type. Fix? +plugin.title=TypoScript Support \ No newline at end of file diff --git a/src/META-INF/plugin.xml b/src/META-INF/plugin.xml index 2a188f34d81b..40e201f8f7cb 100644 --- a/src/META-INF/plugin.xml +++ b/src/META-INF/plugin.xml @@ -27,4 +27,9 @@ + + + com.jetbrains.typoscript.TypoScriptExtensionMappingChecker + + diff --git a/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java b/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java new file mode 100644 index 000000000000..3489c5954685 --- /dev/null +++ b/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java @@ -0,0 +1,76 @@ +package com.jetbrains.typoscript; + +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationListener; +import com.intellij.notification.NotificationType; +import com.intellij.notification.Notifications; +import com.intellij.openapi.application.AccessToken; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.components.ApplicationComponent; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.FileTypeManager; +import com.jetbrains.typoscript.lang.TypoScriptFileType; +import org.jetbrains.annotations.NotNull; + +import javax.swing.event.HyperlinkEvent; + +/** + * @author lene + * Date: 24.04.12 + */ +public class TypoScriptExtensionMappingChecker implements ApplicationComponent { + private final FileTypeManager myFileTypeManager; + + public TypoScriptExtensionMappingChecker(final FileTypeManager fileTypeManager) { + myFileTypeManager = fileTypeManager; + } + + @NotNull + public String getComponentName() { + return getClass().getName(); + } + + public void initComponent() { + checkFileTypeAssociation(); + } + + public void disposeComponent() { } + + private void checkFileTypeAssociation() { + final FileType registered = myFileTypeManager.getFileTypeByExtension(TypoScriptFileType.DEFAULT_EXTENSION); + if (registered != TypoScriptFileType.INSTANCE) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + public void run() { + Notifications.Bus.notify( + new Notification("TypoScript", TypoScriptBundle.message("plugin.title"), + TypoScriptBundle.message("file.type.registration.warning", TypoScriptFileType.DEFAULT_EXTENSION), + NotificationType.WARNING, new NotificationListener() { + public void hyperlinkUpdate(@NotNull final Notification notification, @NotNull final HyperlinkEvent event) { + fixAssociation(); + notification.expire(); + } + })); + } + }); + } + } + + private void fixAssociation() { + final FileType registered = myFileTypeManager.getFileTypeByExtension(TypoScriptFileType.DEFAULT_EXTENSION); + if (registered != TypoScriptFileType.INSTANCE) { + final AccessToken token = ApplicationManager.getApplication().acquireWriteActionLock(getClass()); + try { + doFixAssociation(registered); + } + finally { + token.finish(); + } + } + } + + @SuppressWarnings("deprecation") + private void doFixAssociation(FileType registered) { + myFileTypeManager.removeAssociatedExtension(registered, TypoScriptFileType.DEFAULT_EXTENSION); + myFileTypeManager.registerFileType(TypoScriptFileType.INSTANCE, TypoScriptFileType.DEFAULT_EXTENSION); + } +} \ No newline at end of file diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.flex b/src/com/jetbrains/typoscript/lang/TypoScript.flex index 66a67f5cbd96..1604775484ea 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScript.flex +++ b/src/com/jetbrains/typoscript/lang/TypoScript.flex @@ -16,9 +16,9 @@ import java.io.Reader; %public %class _TypoScriptLexer %implements FlexLexer -%function advance //todo[lene] ? +%function advance %type IElementType -%unicode //todo[lene] ? doc says ascii only +%unicode %eof{ return; %eof} @@ -70,7 +70,7 @@ OBJECT_PATH_ENTITY = [A-Za-z0-9\-_]* ">" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.UNSETTING_OPERATOR; } "<" { yybegin(COPYING_OPERATOR_VALUE); return TypoScriptTokenTypes.COPYING_OPERATOR; } "<"{ENDTRIMMED_STRING_TAIL} { return TypoScriptTokenTypes.INCLUDE_STATEMENT; } - //todo[lene] create "=<" reference sign for typoscript templates; or handle < in assignment value + //todo create "=<" reference sign for typoscript templates; or handle < in assignment value "(" { yybegin(MULTILINE_AFTER_SIGN_ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.MULTILINE_VALUE_OPERATOR_BEGIN; } "{" { yybegin(ONE_LINE_IGNORED_ZONE); return TypoScriptTokenTypes.CODE_BLOCK_OPERATOR_BEGIN; } diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java b/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java index 179be96f8ba1..99ea28121da6 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java @@ -11,20 +11,13 @@ import javax.swing.*; * Date: 03.04.12 */ public class TypoScriptFileType extends LanguageFileType { - private static final Icon ICON = IconLoader.getIcon("/icons/typo3.png"); //todo[lene] + private static final Icon ICON = IconLoader.getIcon("/icons/typo3.png"); public static final TypoScriptFileType INSTANCE = new TypoScriptFileType(); + public static final String DEFAULT_EXTENSION = "ts"; private TypoScriptFileType() { super(TypoScriptLanguage.INSTANCE); - /* FileTypeEditorHighlighterProviders.INSTANCE.addExplicitExtension(this, new EditorHighlighterProvider() {//todo[lene] - @Override - public EditorHighlighter getEditorHighlighter(@Nullable Project project, - @NotNull FileType fileType, @Nullable VirtualFile virtualFile, - @NotNull EditorColorsScheme colors) { - return new TypoScriptEditorHighlighter(project, virtualFile, colors); - } - });*/ } @NotNull @@ -42,12 +35,12 @@ public class TypoScriptFileType extends LanguageFileType { @NotNull @Override public String getDefaultExtension() { - return "ts"; + return DEFAULT_EXTENSION; } @Override public Icon getIcon() { - return ICON;//todo[lene] + return ICON; } } diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java b/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java index 90ae0a4774bf..43992d409f59 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java @@ -66,6 +66,6 @@ public class TypoScriptParserDefinition implements ParserDefinition { @Override public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) { - return SpaceRequirements.MAY;//todo[lene] + return SpaceRequirements.MAY; } } diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java index fea2d726710c..699b9eb71e57 100644 --- a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java @@ -52,7 +52,6 @@ public class TypoScriptColorsAndFontsPage implements ColorSettingsPage, DisplayP new AttributesDescriptor(TypoScriptBundle.message("color.settings.ignored.text"), TypoScriptHighlightingData.IGNORED_TEXT), new AttributesDescriptor(TypoScriptBundle.message("color.settings.operator"), TypoScriptHighlightingData.OPERATOR_SIGN), new AttributesDescriptor(TypoScriptBundle.message("color.settings.string"), TypoScriptHighlightingData.STRING_VALUE), - //todo[lene] name? new AttributesDescriptor(TypoScriptBundle.message("color.settings.object.path"), TypoScriptHighlightingData.OBJECT_PATH_ENTITY), new AttributesDescriptor(TypoScriptBundle.message("color.settings.object.path.separator"), TypoScriptHighlightingData.OBJECT_PATH_SEPARATOR), From 853f2fdb598648326854c7e16601ceeb6fa4c1d4 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Thu, 3 May 2012 20:53:40 +0400 Subject: [PATCH 018/147] TypoScript syntax highlighter --- .../TypoScriptSyntaxHighlighter.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java new file mode 100644 index 000000000000..5165c254bbe9 --- /dev/null +++ b/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java @@ -0,0 +1,62 @@ +package com.jetbrains.typoscript.lang.highlighter; + +import com.intellij.lexer.Lexer; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.fileTypes.SyntaxHighlighterBase; +import com.intellij.psi.tree.IElementType; +import com.intellij.util.containers.hash.HashMap; +import com.jetbrains.typoscript.lang.TypoScriptLexer; +import com.jetbrains.typoscript.lang.TypoScriptTokenTypes; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +/** + * @author lene + * Date: 11.04.12 + */ +public class TypoScriptSyntaxHighlighter extends SyntaxHighlighterBase { + private static final Map ourMap; + + static { + ourMap = new HashMap(); + ourMap.put(TypoScriptTokenTypes.ONE_LINE_COMMENT, TypoScriptHighlightingData.ONE_LINE_COMMENT); + ourMap.put(TypoScriptTokenTypes.IGNORED_TEXT, TypoScriptHighlightingData.IGNORED_TEXT); + ourMap.put(TypoScriptTokenTypes.C_STYLE_COMMENT, TypoScriptHighlightingData.MULTILINE_COMMENT); + + fillMap(ourMap, TypoScriptTokenTypes.OPERATORS, TypoScriptHighlightingData.OPERATOR_SIGN); + + ourMap.put(TypoScriptTokenTypes.MULTILINE_VALUE, TypoScriptHighlightingData.ASSIGNED_VALUE); + ourMap.put(TypoScriptTokenTypes.ASSIGNMENT_VALUE, TypoScriptHighlightingData.ASSIGNED_VALUE); + + ourMap.put(TypoScriptTokenTypes.OBJECT_PATH_ENTITY, TypoScriptHighlightingData.OBJECT_PATH_ENTITY); + ourMap.put(TypoScriptTokenTypes.OBJECT_PATH_SEPARATOR, TypoScriptHighlightingData.OBJECT_PATH_SEPARATOR); + + ourMap.put(TypoScriptTokenTypes.CONDITION, TypoScriptHighlightingData.CONDITION); + ourMap.put(TypoScriptTokenTypes.INCLUDE_STATEMENT, TypoScriptHighlightingData.INCLUDE_STATEMENT); + + ourMap.put(TypoScriptTokenTypes.BAD_CHARACTER, TypoScriptHighlightingData.BAD_CHARACTER); + + /* + IElementType MODIFICATION_OPERATOR_FUNCTION = new TypoScriptTokenType("MODIFICATION_FUNCTION"); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_BEGIN = new TypoScriptTokenType("MODIFICATION_OPEN"); + IElementType MODIFICATION_OPERATOR_FUNCTION_PARAM_END = new TypoScriptTokenType("MODIFICATION_CLOSE"); + IElementType MODIFICATION_OPERATOR_FUNCTION_ARGUMENT = new TypoScriptTokenType("MODIFICATION_VALUE"); + + IElementType INCLUDE_STATEMENT = new TypoScriptTokenType("INCLUDE"); + IElementType CONDITION = new TypoScriptTokenType("CONDITION"); + */ + } + + @NotNull + @Override + public Lexer getHighlightingLexer() { + return new TypoScriptLexer(); + } + + @NotNull + @Override + public TextAttributesKey[] getTokenHighlights(IElementType tokenType) { + return pack(ourMap.get(tokenType)); + } +} From 679a177e97f91b68a56431e2f5563ace6ef01a2d Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Sat, 12 May 2012 18:10:53 +0400 Subject: [PATCH 019/147] Additional file names for TypoScript file type --- .../messages/TypoScriptBundle.properties | 2 +- .../typoscript/TypoScriptBundle.java | 1 + .../TypoScriptExtensionMappingChecker.java | 80 ++++++++++++++----- .../lang/TypoScriptFileTypeFactory.java | 18 ++++- 4 files changed, 78 insertions(+), 23 deletions(-) diff --git a/resources/messages/TypoScriptBundle.properties b/resources/messages/TypoScriptBundle.properties index 5f14d3710882..a81b4452d0ec 100644 --- a/resources/messages/TypoScriptBundle.properties +++ b/resources/messages/TypoScriptBundle.properties @@ -10,5 +10,5 @@ color.settings.bad.character=Bad character color.settings.ignored.text=Ignored text color.settings.condition=Condition color.settings.include=Include -file.type.registration.warning=*.{0} files are not associated with TypoScript file type. Fix? +file.type.registration.warning={0} files are not associated with TypoScript file type. Fix? plugin.title=TypoScript Support \ No newline at end of file diff --git a/src/com/jetbrains/typoscript/TypoScriptBundle.java b/src/com/jetbrains/typoscript/TypoScriptBundle.java index ecae99849782..dd0bfb8a1045 100644 --- a/src/com/jetbrains/typoscript/TypoScriptBundle.java +++ b/src/com/jetbrains/typoscript/TypoScriptBundle.java @@ -13,6 +13,7 @@ import java.util.ResourceBundle; * Date: 12.04.12 */ public class TypoScriptBundle { + @NonNls public static String NOTIFICATION_ID = "TypoScript"; private static Reference ourBundle; @NonNls public static final String TYPOSCRIPT_BUNDLE = "messages.TypoScriptBundle"; diff --git a/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java b/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java index 3489c5954685..66985dda3fcc 100644 --- a/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java +++ b/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java @@ -7,18 +7,24 @@ import com.intellij.notification.Notifications; import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; -import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.fileTypes.*; +import com.intellij.util.containers.hash.HashMap; import com.jetbrains.typoscript.lang.TypoScriptFileType; +import com.jetbrains.typoscript.lang.TypoScriptFileTypeFactory; import org.jetbrains.annotations.NotNull; import javax.swing.event.HyperlinkEvent; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; /** * @author lene * Date: 24.04.12 */ public class TypoScriptExtensionMappingChecker implements ApplicationComponent { + private static final Logger LOG = Logger.getInstance(TypoScriptExtensionMappingChecker.class); private final FileTypeManager myFileTypeManager; public TypoScriptExtensionMappingChecker(final FileTypeManager fileTypeManager) { @@ -34,33 +40,67 @@ public class TypoScriptExtensionMappingChecker implements ApplicationComponent { checkFileTypeAssociation(); } - public void disposeComponent() { } + public void disposeComponent() { + } private void checkFileTypeAssociation() { - final FileType registered = myFileTypeManager.getFileTypeByExtension(TypoScriptFileType.DEFAULT_EXTENSION); - if (registered != TypoScriptFileType.INSTANCE) { + final Map fileNames = getNonTSMatchers(TypoScriptFileTypeFactory.FILE_NAME_MATCHERS); + if (!fileNames.isEmpty()) { + StringBuilder sb = new StringBuilder(); + boolean addComma = false; + for (Map.Entry entry : fileNames.entrySet()) { + if (addComma) { + sb.append(", "); + } + sb.append(entry.getKey().getPresentableString()); + addComma |= true; + } + final String fileMatchers = sb.toString(); + ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { Notifications.Bus.notify( - new Notification("TypoScript", TypoScriptBundle.message("plugin.title"), - TypoScriptBundle.message("file.type.registration.warning", TypoScriptFileType.DEFAULT_EXTENSION), + new Notification(TypoScriptBundle.NOTIFICATION_ID, TypoScriptBundle.message("plugin.title"), + TypoScriptBundle.message("file.type.registration.warning", fileMatchers), NotificationType.WARNING, new NotificationListener() { - public void hyperlinkUpdate(@NotNull final Notification notification, @NotNull final HyperlinkEvent event) { - fixAssociation(); - notification.expire(); - } - })); + public void hyperlinkUpdate(@NotNull final Notification notification, @NotNull final HyperlinkEvent event) { + fixAssociation(fileNames.keySet()); + notification.expire(); + } + }), null); } }); } } - private void fixAssociation() { - final FileType registered = myFileTypeManager.getFileTypeByExtension(TypoScriptFileType.DEFAULT_EXTENSION); - if (registered != TypoScriptFileType.INSTANCE) { + @NotNull + private Map getNonTSMatchers(@NotNull Collection matchers) { + final Map fileNames = new HashMap(); + for (FileNameMatcher matcher : matchers) { + FileType registered; + if (matcher instanceof ExtensionFileNameMatcher) { + registered = myFileTypeManager.getFileTypeByExtension(((ExtensionFileNameMatcher)matcher).getExtension()); + } + else if (matcher instanceof ExactFileNameMatcher) { + registered = myFileTypeManager.getFileTypeByFileName(((ExactFileNameMatcher)matcher).getFileName()); + } + else { + LOG.error("Unexpected FileNameMatcher class " + matcher.getClass() + " for " + matcher.getPresentableString()); + break; + } + if (registered != TypoScriptFileType.INSTANCE) { + fileNames.put(matcher, registered); + } + } + return fileNames; + } + + private void fixAssociation(@NotNull Collection fileNameMatchers) { + final Map refreshedFileNames = getNonTSMatchers(fileNameMatchers); + if (!refreshedFileNames.isEmpty()) { final AccessToken token = ApplicationManager.getApplication().acquireWriteActionLock(getClass()); try { - doFixAssociation(registered); + doFixAssociation(refreshedFileNames); } finally { token.finish(); @@ -69,8 +109,10 @@ public class TypoScriptExtensionMappingChecker implements ApplicationComponent { } @SuppressWarnings("deprecation") - private void doFixAssociation(FileType registered) { - myFileTypeManager.removeAssociatedExtension(registered, TypoScriptFileType.DEFAULT_EXTENSION); - myFileTypeManager.registerFileType(TypoScriptFileType.INSTANCE, TypoScriptFileType.DEFAULT_EXTENSION); + private void doFixAssociation(@NotNull Map fileNames) { + for (Map.Entry entry : fileNames.entrySet()) { + myFileTypeManager.removeAssociation(entry.getValue(), entry.getKey()); + } + myFileTypeManager.registerFileType(TypoScriptFileType.INSTANCE, new ArrayList(fileNames.keySet())); } } \ No newline at end of file diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java b/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java index 8bb14b136343..2a2361a42d0f 100644 --- a/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java +++ b/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java @@ -1,16 +1,28 @@ package com.jetbrains.typoscript.lang; -import com.intellij.openapi.fileTypes.FileTypeConsumer; -import com.intellij.openapi.fileTypes.FileTypeFactory; +import com.intellij.openapi.fileTypes.*; import org.jetbrains.annotations.NotNull; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + /** * @author lene * Date: 11.04.12 */ public class TypoScriptFileTypeFactory extends FileTypeFactory { + + public static final List FILE_NAME_MATCHERS = + Collections.unmodifiableList(Arrays.asList(new ExtensionFileNameMatcher(TypoScriptFileType.DEFAULT_EXTENSION), + new ExactFileNameMatcher("setup.txt"), + new ExactFileNameMatcher("constants.txt"), + new ExactFileNameMatcher("ext_conf_template.txt"), + new ExactFileNameMatcher("ext_typoscript_setup.txt"), + new ExactFileNameMatcher("ext_typoscript_constants.txt"))); + @Override public void createFileTypes(@NotNull FileTypeConsumer consumer) { - consumer.consume(TypoScriptFileType.INSTANCE, TypoScriptFileType.INSTANCE.getDefaultExtension()); + consumer.consume(TypoScriptFileType.INSTANCE, FILE_NAME_MATCHERS.toArray(new FileNameMatcher[FILE_NAME_MATCHERS.size()])); } } \ No newline at end of file From bb171a35ec03725c1f5aa030873c43145a4fb5c8 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Thu, 24 May 2012 19:12:09 +0400 Subject: [PATCH 020/147] Collected TypoSctirp plugin data to move to community --- .../typoscript/lang/TypoScriptElementTypes.java | 0 .../typoscript/lang/TypoScriptGeneratedParser.java | 0 .../jetbrains/typoscript/lang/psi/Assignment.java | 0 .../jetbrains/typoscript/lang/psi/CodeBlock.java | 0 .../typoscript/lang/psi/ConditionElement.java | 0 .../com/jetbrains/typoscript/lang/psi/Copying.java | 0 .../lang/psi/IncludeStatementElement.java | 0 .../lang/psi/MultilineValueAssignment.java | 0 .../jetbrains/typoscript/lang/psi/ObjectPath.java | 0 .../jetbrains/typoscript/lang/psi/Unsetting.java | 0 .../typoscript/lang/psi/ValueModification.java | 0 .../com/jetbrains/typoscript/lang/psi/Visitor.java | 0 .../typoscript/lang/psi/impl/AssignmentImpl.java | 0 .../typoscript/lang/psi/impl/CodeBlockImpl.java | 0 .../lang/psi/impl/ConditionElementImpl.java | 0 .../typoscript/lang/psi/impl/CopyingImpl.java | 0 .../lang/psi/impl/IncludeStatementElementImpl.java | 0 .../lang/psi/impl/MultilineValueAssignmentImpl.java | 0 .../typoscript/lang/psi/impl/ObjectPathImpl.java | 0 .../typoscript/lang/psi/impl/UnsettingImpl.java | 0 .../lang/psi/impl/ValueModificationImpl.java | 0 .../typoScript/resources}/icons/condition_ts.png | Bin .../typoScript/resources}/icons/include_ts.png | Bin .../typoScript/resources}/icons/property_ts.png | Bin .../typoScript/resources}/icons/typo3.png | Bin .../resources}/messages/TypoScriptBundle.properties | 0 {src => plugins/typoScript/src}/META-INF/plugin.xml | 0 .../com/jetbrains/typoscript/TypoScriptBundle.java | 0 .../TypoScriptExtensionMappingChecker.java | 0 .../com/jetbrains/typoscript/TypoScriptIcons.java | 0 .../typoscript/lang/GeneratedParserUtilBase.java | 0 .../com/jetbrains/typoscript/lang/TypoScript.bnf | 0 .../com/jetbrains/typoscript/lang/TypoScript.flex | 0 .../typoscript/lang/TypoScriptBraceMatcher.java | 0 .../typoscript/lang/TypoScriptFileType.java | 0 .../typoscript/lang/TypoScriptFileTypeFactory.java | 0 .../typoscript/lang/TypoScriptFoldingBuilder.java | 0 .../typoscript/lang/TypoScriptLanguage.java | 0 .../jetbrains/typoscript/lang/TypoScriptLexer.java | 0 .../typoscript/lang/TypoScriptParserDefinition.java | 0 .../typoscript/lang/TypoScriptParserUtil.java | 0 .../lang/TypoScriptStructureViewFactory.java | 0 .../typoscript/lang/TypoScriptTokenType.java | 0 .../typoscript/lang/TypoScriptTokenTypes.java | 0 .../jetbrains/typoscript/lang/_TypoScriptLexer.java | 0 .../highlighter/TypoScriptColorsAndFontsPage.java | 0 .../highlighter/TypoScriptHighlightingData.java | 0 .../highlighter/TypoScriptSyntaxHighlighter.java | 0 .../lang/psi/TypoScriptCompositeElement.java | 0 .../lang/psi/TypoScriptCompositeElementImpl.java | 0 .../typoscript/lang/psi/TypoScriptFile.java | 0 .../typoscript/lexer/assignments.test.expected | 0 .../testData}/typoscript/lexer/assignments.test.ts | 0 .../typoscript/lexer/codeBlock.test.expected | 0 .../testData}/typoscript/lexer/codeBlock.test.ts | 0 .../typoscript/lexer/comments.test.expected | 0 .../testData}/typoscript/lexer/comments.test.ts | 0 .../typoscript/lexer/copyingOperator.test.expected | 0 .../typoscript/lexer/copyingOperator.test.ts | 0 .../typoscript/lexer/exampleFromTypo.test.expected | 0 .../typoscript/lexer/exampleFromTypo.test.ts | 0 .../typoscript/lexer/include.test.expected | 0 .../testData}/typoscript/lexer/include.test.ts | 0 .../typoscript/lexer/multilineValue.test.expected | 0 .../typoscript/lexer/multilineValue.test.ts | 0 .../typoscript/lexer/objectPaths.test.expected | 0 .../testData}/typoscript/lexer/objectPaths.test.ts | 0 .../typoscript/lexer/sharpComment.test.expected | 0 .../testData}/typoscript/lexer/sharpComment.test.ts | 0 .../typoscript/lexer/simpleAssignment.test.expected | 0 .../typoscript/lexer/simpleAssignment.test.ts | 0 .../lexer/singleLineComments.test.expected | 0 .../typoscript/lexer/singleLineComments.test.ts | 0 .../typoscript/lexer/slashComment.test.expected | 0 .../testData}/typoscript/lexer/slashComment.test.ts | 0 .../lexer/unsettingOperator.test.expected | 0 .../typoscript/lexer/unsettingOperator.test.ts | 0 .../lexer/valueModificationOperator.test.expected | 0 .../lexer/valueModificationOperator.test.ts | 0 .../jetbrains/typoscript/TypoScriptLexerTest.java | 0 typoScript.iml => plugins/typoScript/typoScript.iml | 0 81 files changed, 0 insertions(+), 0 deletions(-) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/Assignment.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/CodeBlock.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/ConditionElement.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/Copying.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/ObjectPath.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/Unsetting.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/ValueModification.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/Visitor.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java (100%) rename {gen => plugins/typoScript/gen}/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java (100%) rename {resources => plugins/typoScript/resources}/icons/condition_ts.png (100%) rename {resources => plugins/typoScript/resources}/icons/include_ts.png (100%) rename {resources => plugins/typoScript/resources}/icons/property_ts.png (100%) rename {resources => plugins/typoScript/resources}/icons/typo3.png (100%) rename {resources => plugins/typoScript/resources}/messages/TypoScriptBundle.properties (100%) rename {src => plugins/typoScript/src}/META-INF/plugin.xml (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/TypoScriptBundle.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/TypoScriptIcons.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScript.bnf (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScript.flex (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptFileType.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptLanguage.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptLexer.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptTokenType.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/_TypoScriptLexer.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java (100%) rename {src => plugins/typoScript/src}/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/assignments.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/assignments.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/codeBlock.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/codeBlock.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/comments.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/comments.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/copyingOperator.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/copyingOperator.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/exampleFromTypo.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/exampleFromTypo.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/include.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/include.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/multilineValue.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/multilineValue.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/objectPaths.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/objectPaths.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/sharpComment.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/sharpComment.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/simpleAssignment.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/simpleAssignment.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/singleLineComments.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/singleLineComments.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/slashComment.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/slashComment.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/unsettingOperator.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/unsettingOperator.test.ts (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/valueModificationOperator.test.expected (100%) rename {testData => plugins/typoScript/testData}/typoscript/lexer/valueModificationOperator.test.ts (100%) rename {tests => plugins/typoScript/tests}/com/jetbrains/typoscript/TypoScriptLexerTest.java (100%) rename typoScript.iml => plugins/typoScript/typoScript.iml (100%) diff --git a/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java diff --git a/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/Assignment.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Assignment.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/Assignment.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Assignment.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/Copying.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Copying.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/Copying.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Copying.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/Unsetting.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/ValueModification.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/Visitor.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Visitor.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/Visitor.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Visitor.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java diff --git a/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java similarity index 100% rename from gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java rename to plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java diff --git a/resources/icons/condition_ts.png b/plugins/typoScript/resources/icons/condition_ts.png similarity index 100% rename from resources/icons/condition_ts.png rename to plugins/typoScript/resources/icons/condition_ts.png diff --git a/resources/icons/include_ts.png b/plugins/typoScript/resources/icons/include_ts.png similarity index 100% rename from resources/icons/include_ts.png rename to plugins/typoScript/resources/icons/include_ts.png diff --git a/resources/icons/property_ts.png b/plugins/typoScript/resources/icons/property_ts.png similarity index 100% rename from resources/icons/property_ts.png rename to plugins/typoScript/resources/icons/property_ts.png diff --git a/resources/icons/typo3.png b/plugins/typoScript/resources/icons/typo3.png similarity index 100% rename from resources/icons/typo3.png rename to plugins/typoScript/resources/icons/typo3.png diff --git a/resources/messages/TypoScriptBundle.properties b/plugins/typoScript/resources/messages/TypoScriptBundle.properties similarity index 100% rename from resources/messages/TypoScriptBundle.properties rename to plugins/typoScript/resources/messages/TypoScriptBundle.properties diff --git a/src/META-INF/plugin.xml b/plugins/typoScript/src/META-INF/plugin.xml similarity index 100% rename from src/META-INF/plugin.xml rename to plugins/typoScript/src/META-INF/plugin.xml diff --git a/src/com/jetbrains/typoscript/TypoScriptBundle.java b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptBundle.java similarity index 100% rename from src/com/jetbrains/typoscript/TypoScriptBundle.java rename to plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptBundle.java diff --git a/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java similarity index 100% rename from src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java rename to plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java diff --git a/src/com/jetbrains/typoscript/TypoScriptIcons.java b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptIcons.java similarity index 100% rename from src/com/jetbrains/typoscript/TypoScriptIcons.java rename to plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptIcons.java diff --git a/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.bnf b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.bnf similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScript.bnf rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.bnf diff --git a/src/com/jetbrains/typoscript/lang/TypoScript.flex b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.flex similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScript.flex rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScript.flex diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptFileType.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptLexer.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java diff --git a/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java diff --git a/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java diff --git a/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java diff --git a/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java diff --git a/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java similarity index 100% rename from src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java rename to plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java diff --git a/testData/typoscript/lexer/assignments.test.expected b/plugins/typoScript/testData/typoscript/lexer/assignments.test.expected similarity index 100% rename from testData/typoscript/lexer/assignments.test.expected rename to plugins/typoScript/testData/typoscript/lexer/assignments.test.expected diff --git a/testData/typoscript/lexer/assignments.test.ts b/plugins/typoScript/testData/typoscript/lexer/assignments.test.ts similarity index 100% rename from testData/typoscript/lexer/assignments.test.ts rename to plugins/typoScript/testData/typoscript/lexer/assignments.test.ts diff --git a/testData/typoscript/lexer/codeBlock.test.expected b/plugins/typoScript/testData/typoscript/lexer/codeBlock.test.expected similarity index 100% rename from testData/typoscript/lexer/codeBlock.test.expected rename to plugins/typoScript/testData/typoscript/lexer/codeBlock.test.expected diff --git a/testData/typoscript/lexer/codeBlock.test.ts b/plugins/typoScript/testData/typoscript/lexer/codeBlock.test.ts similarity index 100% rename from testData/typoscript/lexer/codeBlock.test.ts rename to plugins/typoScript/testData/typoscript/lexer/codeBlock.test.ts diff --git a/testData/typoscript/lexer/comments.test.expected b/plugins/typoScript/testData/typoscript/lexer/comments.test.expected similarity index 100% rename from testData/typoscript/lexer/comments.test.expected rename to plugins/typoScript/testData/typoscript/lexer/comments.test.expected diff --git a/testData/typoscript/lexer/comments.test.ts b/plugins/typoScript/testData/typoscript/lexer/comments.test.ts similarity index 100% rename from testData/typoscript/lexer/comments.test.ts rename to plugins/typoScript/testData/typoscript/lexer/comments.test.ts diff --git a/testData/typoscript/lexer/copyingOperator.test.expected b/plugins/typoScript/testData/typoscript/lexer/copyingOperator.test.expected similarity index 100% rename from testData/typoscript/lexer/copyingOperator.test.expected rename to plugins/typoScript/testData/typoscript/lexer/copyingOperator.test.expected diff --git a/testData/typoscript/lexer/copyingOperator.test.ts b/plugins/typoScript/testData/typoscript/lexer/copyingOperator.test.ts similarity index 100% rename from testData/typoscript/lexer/copyingOperator.test.ts rename to plugins/typoScript/testData/typoscript/lexer/copyingOperator.test.ts diff --git a/testData/typoscript/lexer/exampleFromTypo.test.expected b/plugins/typoScript/testData/typoscript/lexer/exampleFromTypo.test.expected similarity index 100% rename from testData/typoscript/lexer/exampleFromTypo.test.expected rename to plugins/typoScript/testData/typoscript/lexer/exampleFromTypo.test.expected diff --git a/testData/typoscript/lexer/exampleFromTypo.test.ts b/plugins/typoScript/testData/typoscript/lexer/exampleFromTypo.test.ts similarity index 100% rename from testData/typoscript/lexer/exampleFromTypo.test.ts rename to plugins/typoScript/testData/typoscript/lexer/exampleFromTypo.test.ts diff --git a/testData/typoscript/lexer/include.test.expected b/plugins/typoScript/testData/typoscript/lexer/include.test.expected similarity index 100% rename from testData/typoscript/lexer/include.test.expected rename to plugins/typoScript/testData/typoscript/lexer/include.test.expected diff --git a/testData/typoscript/lexer/include.test.ts b/plugins/typoScript/testData/typoscript/lexer/include.test.ts similarity index 100% rename from testData/typoscript/lexer/include.test.ts rename to plugins/typoScript/testData/typoscript/lexer/include.test.ts diff --git a/testData/typoscript/lexer/multilineValue.test.expected b/plugins/typoScript/testData/typoscript/lexer/multilineValue.test.expected similarity index 100% rename from testData/typoscript/lexer/multilineValue.test.expected rename to plugins/typoScript/testData/typoscript/lexer/multilineValue.test.expected diff --git a/testData/typoscript/lexer/multilineValue.test.ts b/plugins/typoScript/testData/typoscript/lexer/multilineValue.test.ts similarity index 100% rename from testData/typoscript/lexer/multilineValue.test.ts rename to plugins/typoScript/testData/typoscript/lexer/multilineValue.test.ts diff --git a/testData/typoscript/lexer/objectPaths.test.expected b/plugins/typoScript/testData/typoscript/lexer/objectPaths.test.expected similarity index 100% rename from testData/typoscript/lexer/objectPaths.test.expected rename to plugins/typoScript/testData/typoscript/lexer/objectPaths.test.expected diff --git a/testData/typoscript/lexer/objectPaths.test.ts b/plugins/typoScript/testData/typoscript/lexer/objectPaths.test.ts similarity index 100% rename from testData/typoscript/lexer/objectPaths.test.ts rename to plugins/typoScript/testData/typoscript/lexer/objectPaths.test.ts diff --git a/testData/typoscript/lexer/sharpComment.test.expected b/plugins/typoScript/testData/typoscript/lexer/sharpComment.test.expected similarity index 100% rename from testData/typoscript/lexer/sharpComment.test.expected rename to plugins/typoScript/testData/typoscript/lexer/sharpComment.test.expected diff --git a/testData/typoscript/lexer/sharpComment.test.ts b/plugins/typoScript/testData/typoscript/lexer/sharpComment.test.ts similarity index 100% rename from testData/typoscript/lexer/sharpComment.test.ts rename to plugins/typoScript/testData/typoscript/lexer/sharpComment.test.ts diff --git a/testData/typoscript/lexer/simpleAssignment.test.expected b/plugins/typoScript/testData/typoscript/lexer/simpleAssignment.test.expected similarity index 100% rename from testData/typoscript/lexer/simpleAssignment.test.expected rename to plugins/typoScript/testData/typoscript/lexer/simpleAssignment.test.expected diff --git a/testData/typoscript/lexer/simpleAssignment.test.ts b/plugins/typoScript/testData/typoscript/lexer/simpleAssignment.test.ts similarity index 100% rename from testData/typoscript/lexer/simpleAssignment.test.ts rename to plugins/typoScript/testData/typoscript/lexer/simpleAssignment.test.ts diff --git a/testData/typoscript/lexer/singleLineComments.test.expected b/plugins/typoScript/testData/typoscript/lexer/singleLineComments.test.expected similarity index 100% rename from testData/typoscript/lexer/singleLineComments.test.expected rename to plugins/typoScript/testData/typoscript/lexer/singleLineComments.test.expected diff --git a/testData/typoscript/lexer/singleLineComments.test.ts b/plugins/typoScript/testData/typoscript/lexer/singleLineComments.test.ts similarity index 100% rename from testData/typoscript/lexer/singleLineComments.test.ts rename to plugins/typoScript/testData/typoscript/lexer/singleLineComments.test.ts diff --git a/testData/typoscript/lexer/slashComment.test.expected b/plugins/typoScript/testData/typoscript/lexer/slashComment.test.expected similarity index 100% rename from testData/typoscript/lexer/slashComment.test.expected rename to plugins/typoScript/testData/typoscript/lexer/slashComment.test.expected diff --git a/testData/typoscript/lexer/slashComment.test.ts b/plugins/typoScript/testData/typoscript/lexer/slashComment.test.ts similarity index 100% rename from testData/typoscript/lexer/slashComment.test.ts rename to plugins/typoScript/testData/typoscript/lexer/slashComment.test.ts diff --git a/testData/typoscript/lexer/unsettingOperator.test.expected b/plugins/typoScript/testData/typoscript/lexer/unsettingOperator.test.expected similarity index 100% rename from testData/typoscript/lexer/unsettingOperator.test.expected rename to plugins/typoScript/testData/typoscript/lexer/unsettingOperator.test.expected diff --git a/testData/typoscript/lexer/unsettingOperator.test.ts b/plugins/typoScript/testData/typoscript/lexer/unsettingOperator.test.ts similarity index 100% rename from testData/typoscript/lexer/unsettingOperator.test.ts rename to plugins/typoScript/testData/typoscript/lexer/unsettingOperator.test.ts diff --git a/testData/typoscript/lexer/valueModificationOperator.test.expected b/plugins/typoScript/testData/typoscript/lexer/valueModificationOperator.test.expected similarity index 100% rename from testData/typoscript/lexer/valueModificationOperator.test.expected rename to plugins/typoScript/testData/typoscript/lexer/valueModificationOperator.test.expected diff --git a/testData/typoscript/lexer/valueModificationOperator.test.ts b/plugins/typoScript/testData/typoscript/lexer/valueModificationOperator.test.ts similarity index 100% rename from testData/typoscript/lexer/valueModificationOperator.test.ts rename to plugins/typoScript/testData/typoscript/lexer/valueModificationOperator.test.ts diff --git a/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java b/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java similarity index 100% rename from tests/com/jetbrains/typoscript/TypoScriptLexerTest.java rename to plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java diff --git a/typoScript.iml b/plugins/typoScript/typoScript.iml similarity index 100% rename from typoScript.iml rename to plugins/typoScript/typoScript.iml From 74b1a82e4d3faf7f033d6700ca8351c7a3382d85 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Thu, 24 May 2012 22:54:06 +0400 Subject: [PATCH 021/147] Fixed copyright message for TypoScript --- .../lang/TypoScriptElementTypes.java | 16 +++++++++++++++ .../lang/TypoScriptGeneratedParser.java | 16 +++++++++++++++ .../typoscript/lang/psi/Assignment.java | 16 +++++++++++++++ .../typoscript/lang/psi/CodeBlock.java | 16 +++++++++++++++ .../typoscript/lang/psi/ConditionElement.java | 16 +++++++++++++++ .../typoscript/lang/psi/Copying.java | 16 +++++++++++++++ .../lang/psi/IncludeStatementElement.java | 16 +++++++++++++++ .../lang/psi/MultilineValueAssignment.java | 16 +++++++++++++++ .../typoscript/lang/psi/ObjectPath.java | 16 +++++++++++++++ .../typoscript/lang/psi/Unsetting.java | 16 +++++++++++++++ .../lang/psi/ValueModification.java | 16 +++++++++++++++ .../typoscript/lang/psi/Visitor.java | 16 +++++++++++++++ .../lang/psi/impl/AssignmentImpl.java | 16 +++++++++++++++ .../lang/psi/impl/CodeBlockImpl.java | 16 +++++++++++++++ .../lang/psi/impl/ConditionElementImpl.java | 16 +++++++++++++++ .../typoscript/lang/psi/impl/CopyingImpl.java | 16 +++++++++++++++ .../psi/impl/IncludeStatementElementImpl.java | 16 +++++++++++++++ .../impl/MultilineValueAssignmentImpl.java | 16 +++++++++++++++ .../lang/psi/impl/ObjectPathImpl.java | 16 +++++++++++++++ .../lang/psi/impl/UnsettingImpl.java | 16 +++++++++++++++ .../lang/psi/impl/ValueModificationImpl.java | 16 +++++++++++++++ .../typoscript/TypoScriptBundle.java | 20 +++++++++++++++---- .../TypoScriptExtensionMappingChecker.java | 20 +++++++++++++++---- .../jetbrains/typoscript/TypoScriptIcons.java | 20 +++++++++++++++---- .../lang/GeneratedParserUtilBase.java | 19 +++++++++++++++--- .../lang/TypoScriptBraceMatcher.java | 20 +++++++++++++++---- .../typoscript/lang/TypoScriptFileType.java | 20 +++++++++++++++---- .../lang/TypoScriptFileTypeFactory.java | 20 +++++++++++++++---- .../lang/TypoScriptFoldingBuilder.java | 20 +++++++++++++++---- .../typoscript/lang/TypoScriptLanguage.java | 20 +++++++++++++++---- .../typoscript/lang/TypoScriptLexer.java | 20 +++++++++++++++---- .../lang/TypoScriptParserDefinition.java | 20 +++++++++++++++---- .../typoscript/lang/TypoScriptParserUtil.java | 20 +++++++++++++++---- .../lang/TypoScriptStructureViewFactory.java | 20 +++++++++++++++---- .../typoscript/lang/TypoScriptTokenType.java | 20 +++++++++++++++---- .../typoscript/lang/TypoScriptTokenTypes.java | 20 +++++++++++++++---- .../typoscript/lang/_TypoScriptLexer.java | 16 +++++++++++++++ .../TypoScriptColorsAndFontsPage.java | 20 +++++++++++++++---- .../TypoScriptHighlightingData.java | 20 +++++++++++++++---- .../TypoScriptSyntaxHighlighter.java | 20 +++++++++++++++---- .../lang/psi/TypoScriptCompositeElement.java | 20 +++++++++++++++---- .../psi/TypoScriptCompositeElementImpl.java | 20 +++++++++++++++---- .../typoscript/lang/psi/TypoScriptFile.java | 20 +++++++++++++++---- .../typoscript/TypoScriptLexerTest.java | 20 +++++++++++++++---- 44 files changed, 704 insertions(+), 87 deletions(-) diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java index 1400cf65de1f..4b654a0cd4f9 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptElementTypes.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java index 528b6d1233f4..f8eff469bf07 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/TypoScriptGeneratedParser.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Assignment.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Assignment.java index a7ae1a2003ed..e3bb7d6960fa 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Assignment.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Assignment.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java index acc80db04428..e68a3fef4f19 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/CodeBlock.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java index d63ba4cc14b4..104acd1cf325 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ConditionElement.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Copying.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Copying.java index 4f2b03aeb0c7..1bfc672095c4 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Copying.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Copying.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java index 7a060927f2f1..49db0263a261 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/IncludeStatementElement.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java index 51a828c74412..c05ca9b6da56 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/MultilineValueAssignment.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java index ea3716877430..31d2d34a299c 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ObjectPath.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java index d3e403234251..f55f508bf4cb 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Unsetting.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java index 0ad6526deafc..7d14442a9985 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/ValueModification.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Visitor.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Visitor.java index 8d3745d7e364..72aa0bb3e37b 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Visitor.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/Visitor.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java index 96fb60604799..81692635d022 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/AssignmentImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java index 8faf50d32d51..e1f06021338d 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CodeBlockImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java index 62efff87a1e6..0fef0d2b04bf 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ConditionElementImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java index c0f0d9e7d3c8..3472cdb79dfc 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/CopyingImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java index f26afc882f75..47c6d80aa5cd 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/IncludeStatementElementImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java index 6ce99682ff3a..fce039283eb0 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/MultilineValueAssignmentImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java index 7f95ddb91b33..dfc37fc22e8c 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ObjectPathImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java index 4e6d268088a3..e6cdebee4928 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/UnsettingImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java index 10f42e3aee0f..8cf6a07d3640 100644 --- a/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java +++ b/plugins/typoScript/gen/com/jetbrains/typoscript/lang/psi/impl/ValueModificationImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + // This is a generated file. Not intended for manual editing. package com.jetbrains.typoscript.lang.psi.impl; diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptBundle.java b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptBundle.java index dd0bfb8a1045..c6b00b4322cd 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptBundle.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptBundle.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript; import com.intellij.CommonBundle; @@ -8,10 +23,7 @@ import java.lang.ref.Reference; import java.lang.ref.SoftReference; import java.util.ResourceBundle; -/** - * @author lene - * Date: 12.04.12 - */ + public class TypoScriptBundle { @NonNls public static String NOTIFICATION_ID = "TypoScript"; private static Reference ourBundle; diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java index 66985dda3fcc..770413ecc700 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript; import com.intellij.notification.Notification; @@ -19,10 +34,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; -/** - * @author lene - * Date: 24.04.12 - */ + public class TypoScriptExtensionMappingChecker implements ApplicationComponent { private static final Logger LOG = Logger.getInstance(TypoScriptExtensionMappingChecker.class); private final FileTypeManager myFileTypeManager; diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptIcons.java b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptIcons.java index c460cf24f4a2..30cd252c936b 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptIcons.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/TypoScriptIcons.java @@ -1,13 +1,25 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript; import com.intellij.openapi.util.IconLoader; import javax.swing.*; -/** - * @author lene - * Date: 20.04.12 - */ + public interface TypoScriptIcons { Icon CONDITION_ICON = IconLoader.getIcon("/icons/condition_ts.png"); Icon PROPERTY_ICON = IconLoader.getIcon("/icons/property_ts.png"); diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java index 460fc68f11dc..b49b253a747c 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/GeneratedParserUtilBase.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.lang.*; @@ -25,9 +40,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; -/** -* @author gregsh -*/ + @SuppressWarnings("StringEquality") public class GeneratedParserUtilBase { diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java index dca0ddcebfcc..886cc5cadbd2 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptBraceMatcher.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.lang.BracePair; @@ -12,10 +27,7 @@ import com.jetbrains.typoscript.lang.psi.TypoScriptFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -/** - * @author lene - * Date: 16.04.12 - */ + public class TypoScriptBraceMatcher implements PairedBraceMatcher { private static final BracePair[] PAIRS = new BracePair[]{ diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java index 99ea28121da6..b8a4ee9a70a8 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileType.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.openapi.fileTypes.LanguageFileType; @@ -6,10 +21,7 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; -/** - * @author lene - * Date: 03.04.12 - */ + public class TypoScriptFileType extends LanguageFileType { private static final Icon ICON = IconLoader.getIcon("/icons/typo3.png"); diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java index 2a2361a42d0f..78e0aef208d9 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.openapi.fileTypes.*; @@ -7,10 +22,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -/** - * @author lene - * Date: 11.04.12 - */ + public class TypoScriptFileTypeFactory extends FileTypeFactory { public static final List FILE_NAME_MATCHERS = diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java index 5f15c16586ae..10b3e24797e7 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptFoldingBuilder.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.lang.ASTNode; @@ -19,10 +34,7 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; -/** - * @author lene - * Date: 18.04.12 - */ + public class TypoScriptFoldingBuilder implements FoldingBuilder, DumbAware { @NotNull @Override diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java index 23edd4b0c4c8..1b82c2fa43ed 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLanguage.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.lang.Language; @@ -5,10 +20,7 @@ import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.PlainTextLanguage; import com.intellij.psi.templateLanguages.TemplateLanguage; -/** - * @author lene - * Date: 03.04.12 - */ + public class TypoScriptLanguage extends Language { public static final TypoScriptLanguage INSTANCE = new TypoScriptLanguage(); diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java index d6e0e37d852d..c7d787b0b379 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptLexer.java @@ -1,13 +1,25 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.lexer.FlexAdapter; import java.io.Reader; -/** - * @author lene - * Date: 03.04.12 - */ + public class TypoScriptLexer extends FlexAdapter { public TypoScriptLexer() { super(new _TypoScriptLexer((Reader)null)); diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java index 43992d409f59..2a9d0802aebc 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserDefinition.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.lang.ASTNode; @@ -14,10 +29,7 @@ import com.intellij.psi.tree.TokenSet; import com.jetbrains.typoscript.lang.psi.TypoScriptFile; import org.jetbrains.annotations.NotNull; -/** - * @author lene - * Date: 11.04.12 - */ + public class TypoScriptParserDefinition implements ParserDefinition { @NotNull @Override diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java index 437e06d06a31..f3a0e6121487 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptParserUtil.java @@ -1,12 +1,24 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.lang.PsiBuilder; import com.intellij.psi.tree.IElementType; -/** - * @author lene - * Date: 11.04.12 - */ + public class TypoScriptParserUtil extends GeneratedParserUtilBase { static boolean isAfterNewLine(PsiBuilder builder, int level) { diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java index 1e5eba9930db..73d2e5e5c57b 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptStructureViewFactory.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.ide.structureView.*; @@ -16,10 +31,7 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.ArrayList; -/** - * @author lene - * Date: 20.04.12 - */ + public class TypoScriptStructureViewFactory implements PsiStructureViewFactory { private static final Class[] SUITABLE_CLASSES = new Class[]{Assignment.class, CodeBlock.class, ConditionElement.class, Copying.class, IncludeStatementElement.class, diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java index 133e619b6ebb..137643b1a599 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenType.java @@ -1,13 +1,25 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -/** - * @author lene - * Date: 03.04.12 - */ + public class TypoScriptTokenType extends IElementType { public TypoScriptTokenType(@NotNull @NonNls final String debugName) { diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java index 0544a7ba8934..fcbfa8ee09c6 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/TypoScriptTokenTypes.java @@ -1,13 +1,25 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang; import com.intellij.psi.TokenType; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; -/** - * @author lene - * Date: 03.04.12 - */ + public interface TypoScriptTokenTypes extends TokenType { IElementType C_STYLE_COMMENT = new TypoScriptTokenType("C_STYLE_COMMENT"); IElementType ONE_LINE_COMMENT = new TypoScriptTokenType("ONE_LINE_COMMENT"); diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java index f3dbeeb4640c..1479544395b4 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/_TypoScriptLexer.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2012 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. + */ + /* The following code was generated by JFlex 1.4.3 on 17.04.12 19:23 */ package com.jetbrains.typoscript.lang; diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java index 699b9eb71e57..700bb545a673 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptColorsAndFontsPage.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang.highlighter; import com.intellij.openapi.editor.colors.TextAttributesKey; @@ -16,10 +31,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.Map; -/** - * @author lene - * Date: 12.04.12 - */ + public class TypoScriptColorsAndFontsPage implements ColorSettingsPage, DisplayPrioritySortable { @NonNls private static final String DEMO_TEXT = "/*\n" + diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java index 066ae7931356..a908b87a3d1d 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptHighlightingData.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang.highlighter; import com.intellij.ide.highlighter.custom.CustomHighlighterColors; @@ -5,10 +20,7 @@ import com.intellij.openapi.editor.HighlighterColors; import com.intellij.openapi.editor.SyntaxHighlighterColors; import com.intellij.openapi.editor.colors.TextAttributesKey; -/** - * @author lene - * Date: 11.04.12 - */ + public class TypoScriptHighlightingData { public static final TextAttributesKey ONE_LINE_COMMENT = TextAttributesKey.createTextAttributesKey("TS_ONE_LINE_COMMENT", SyntaxHighlighterColors.LINE_COMMENT.getDefaultAttributes()); diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java index 5165c254bbe9..e4943fb9d974 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/highlighter/TypoScriptSyntaxHighlighter.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang.highlighter; import com.intellij.lexer.Lexer; @@ -11,10 +26,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Map; -/** - * @author lene - * Date: 11.04.12 - */ + public class TypoScriptSyntaxHighlighter extends SyntaxHighlighterBase { private static final Map ourMap; diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java index 2081affba300..f7d59661c5fe 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElement.java @@ -1,12 +1,24 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang.psi; import com.intellij.psi.NavigatablePsiElement; import com.intellij.psi.tree.IElementType; -/** - * @author lene - * Date: 11.04.12 - */ + public interface TypoScriptCompositeElement extends NavigatablePsiElement { IElementType getTokenType(); } diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java index 9d5badb28311..2f83e95cd953 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptCompositeElementImpl.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang.psi; import com.intellij.extapi.psi.ASTWrapperPsiElement; @@ -5,10 +20,7 @@ import com.intellij.lang.ASTNode; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; -/** - * @author lene - * Date: 11.04.12 - */ + public class TypoScriptCompositeElementImpl extends ASTWrapperPsiElement implements TypoScriptCompositeElement { public TypoScriptCompositeElementImpl(@NotNull final ASTNode node) { diff --git a/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java index fd7bbec51acb..b1b328fe7886 100644 --- a/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java +++ b/plugins/typoScript/src/com/jetbrains/typoscript/lang/psi/TypoScriptFile.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript.lang.psi; import com.intellij.extapi.psi.PsiFileBase; @@ -7,10 +22,7 @@ import com.jetbrains.typoscript.lang.TypoScriptFileType; import com.jetbrains.typoscript.lang.TypoScriptLanguage; import org.jetbrains.annotations.NotNull; -/** - * @author lene - * Date: 11.04.12 - */ + public class TypoScriptFile extends PsiFileBase { public TypoScriptFile(@NotNull FileViewProvider viewProvider) { diff --git a/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java b/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java index c5375b6b0f83..dd8ff10217f7 100644 --- a/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java +++ b/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.jetbrains.typoscript; import com.intellij.lexer.Lexer; @@ -11,10 +26,7 @@ import org.jetbrains.annotations.NonNls; import java.io.File; import java.io.IOException; -/** - * @author lene - * Date: 04.04.12 - */ + public class TypoScriptLexerTest extends UsefulTestCase { @NonNls private static final String INPUT_DATA_FILE_EXT = "test.ts"; From f19b7410ead1f8926ccbde7a89f9d41fb5000bb0 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Thu, 24 May 2012 22:58:21 +0400 Subject: [PATCH 022/147] Fix of test --- .../tests/com/jetbrains/typoscript/TypoScriptLexerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java b/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java index dd8ff10217f7..4e52576a3616 100644 --- a/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java +++ b/plugins/typoScript/tests/com/jetbrains/typoscript/TypoScriptLexerTest.java @@ -131,6 +131,6 @@ public class TypoScriptLexerTest extends UsefulTestCase { @NonNls private static String getDataSubPath() { - return "/plugins/typoScript/testData/typoscript/lexer"; + return "/community/plugins/typoScript/testData/typoscript/lexer"; } } \ No newline at end of file From bb486a081bcb2a169ecd8e6dfcf4b0bf342e7cdd Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Fri, 25 May 2012 12:56:51 +0400 Subject: [PATCH 023/147] IDEA-86605 --- .../actions/CommonEditActionsProvider.java | 21 ++++++++++--------- .../designer/componentTree/ComponentTree.java | 15 ++++++++++++- .../componentTree/ComponentTreeBuilder.java | 2 ++ .../designer/designSurface/CaptionPanel.java | 2 +- .../designer/designSurface/EditableArea.java | 3 +++ .../designer/designSurface/GlassLayer.java | 10 ++------- .../designSurface/tools/SelectionTool.java | 4 ++-- .../intellij/designer/model/RadComponent.java | 2 ++ 8 files changed, 37 insertions(+), 22 deletions(-) diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/CommonEditActionsProvider.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/CommonEditActionsProvider.java index 7a6bf5ae69da..c81c9d5ffb4a 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/CommonEditActionsProvider.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/CommonEditActionsProvider.java @@ -53,8 +53,9 @@ public class CommonEditActionsProvider implements DeleteProvider, CopyProvider, myDesigner = designer; } - protected EditableArea getArea() { - return myDesigner.getActionsArea(); + protected EditableArea getArea(DataContext dataContext) { + EditableArea area = EditableArea.DATA_KEY.getData(dataContext); + return area == null ? myDesigner.getSurfaceArea() : area; } ////////////////////////////////////////////////////////////////////////////////////////// @@ -68,7 +69,7 @@ public class CommonEditActionsProvider implements DeleteProvider, CopyProvider, if (myDesigner.getInplaceEditingLayer().isEditing()) { return false; } - List selection = getArea().getSelection(); + List selection = getArea(dataContext).getSelection(); if (selection.isEmpty()) { return false; } @@ -81,11 +82,11 @@ public class CommonEditActionsProvider implements DeleteProvider, CopyProvider, } @Override - public void deleteElement(@NotNull DataContext dataContext) { + public void deleteElement(final @NotNull DataContext dataContext) { myDesigner.getToolProvider().execute(new ThrowableRunnable() { @Override public void run() throws Exception { - EditableArea area = getArea(); + EditableArea area = getArea(dataContext); List selection = area.getSelection(); if (selection.isEmpty()) { @@ -145,20 +146,20 @@ public class CommonEditActionsProvider implements DeleteProvider, CopyProvider, @Override public boolean isCopyEnabled(@NotNull DataContext dataContext) { - return !myDesigner.getInplaceEditingLayer().isEditing() && !getArea().getSelection().isEmpty(); + return !myDesigner.getInplaceEditingLayer().isEditing() && !getArea(dataContext).getSelection().isEmpty(); } @Override public void performCopy(@NotNull DataContext dataContext) { - doCopy(); + doCopy(dataContext); } - private boolean doCopy() { + private boolean doCopy(DataContext dataContext) { try { Element root = new Element("designer"); root.setAttribute("target", myDesigner.getPlatformTarget()); - List components = RadComponent.getPureSelection(getArea().getSelection()); + List components = RadComponent.getPureSelection(getArea(dataContext).getSelection()); for (RadComponent component : components) { component.copyTo(root); } @@ -243,7 +244,7 @@ public class CommonEditActionsProvider implements DeleteProvider, CopyProvider, @Override public void performCut(@NotNull DataContext dataContext) { - if (doCopy()) { + if (doCopy(dataContext)) { deleteElement(dataContext); } } diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java index e39eb730ca18..633ed1da333f 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java @@ -18,6 +18,7 @@ package com.intellij.designer.componentTree; import com.intellij.designer.actions.DesignerActionPanel; import com.intellij.designer.actions.StartInplaceEditing; import com.intellij.designer.designSurface.DesignerEditorPanel; +import com.intellij.designer.designSurface.EditableArea; import com.intellij.designer.designSurface.FeedbackTreeLayer; import com.intellij.designer.model.RadComponent; import com.intellij.openapi.actionSystem.DataProvider; @@ -40,6 +41,7 @@ public final class ComponentTree extends Tree implements DataProvider { private final StartInplaceEditing myInplaceEditingAction; private TreeComponentDecorator myDecorator; private DesignerActionPanel myActionPanel; + private EditableArea myArea; private RadComponent myMarkComponent; private int myMarkFeedback; @@ -75,9 +77,14 @@ public final class ComponentTree extends Tree implements DataProvider { myActionPanel = designer.getActionPanel(); } myMarkComponent = null; + myArea = null; myInplaceEditingAction.setDesignerPanel(designer); } + public void setArea(@Nullable EditableArea area) { + myArea = area; + } + public void mark(RadComponent component, int feedback) { myMarkComponent = component; myMarkFeedback = feedback; @@ -86,7 +93,13 @@ public final class ComponentTree extends Tree implements DataProvider { @Override public Object getData(@NonNls String dataId) { - return myActionPanel == null ? null : myActionPanel.getData(dataId); + if (EditableArea.DATA_KEY.is(dataId)) { + return myArea; + } + if (myActionPanel != null) { + return myActionPanel.getData(dataId); + } + return null; } @Nullable diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTreeBuilder.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTreeBuilder.java index e5fecc7c0cd3..e1e29059a39d 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTreeBuilder.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTreeBuilder.java @@ -49,6 +49,8 @@ public final class ComponentTreeBuilder extends AbstractTreeBuilder implements C myGlassLayer = new TreeGlassLayer(tree, designer.getToolProvider(), myTreeArea); myExpandStateHandler = new ExpandStateHandler(tree, designer, this); + tree.setArea(myTreeArea); + new TreeDropListener(tree, myTreeArea, designer.getToolProvider()); selectFromSurface(); diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/CaptionPanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/CaptionPanel.java index 19af11b3eb39..7eb831645f13 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/CaptionPanel.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/CaptionPanel.java @@ -150,7 +150,7 @@ public class CaptionPanel extends JLayeredPane implements DataProvider, DeletePr myActionsProvider = new CommonEditActionsProvider(designer) { @Override - protected EditableArea getArea() { + protected EditableArea getArea(DataContext dataContext) { return myArea; } }; diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/EditableArea.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/EditableArea.java index 285dfec7b781..ebc32a71ad76 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/EditableArea.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/EditableArea.java @@ -18,6 +18,7 @@ package com.intellij.designer.designSurface; import com.intellij.designer.designSurface.tools.InputTool; import com.intellij.designer.model.RadComponent; import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.DataKey; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,6 +30,8 @@ import java.util.List; * @author Alexander Lobas */ public interface EditableArea { + DataKey DATA_KEY = DataKey.create("EditableArea"); + ////////////////////////////////////////////////////////////////////////////////////////// // // Selection diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/GlassLayer.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/GlassLayer.java index 2d4719534750..f28b4c94f2c2 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/GlassLayer.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/GlassLayer.java @@ -17,7 +17,6 @@ package com.intellij.designer.designSurface; import com.intellij.designer.designSurface.tools.ToolProvider; import com.intellij.openapi.actionSystem.DataProvider; -import com.intellij.ui.popup.PopupOwner; import org.jetbrains.annotations.NonNls; import javax.swing.*; @@ -28,7 +27,7 @@ import java.awt.event.MouseEvent; /** * @author Alexander Lobas */ -public final class GlassLayer extends JComponent implements PopupOwner, DataProvider { +public final class GlassLayer extends JComponent implements DataProvider { private static final long EVENT_FLAGS = AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK; private final ToolProvider myToolProvider; @@ -74,13 +73,8 @@ public final class GlassLayer extends JComponent implements PopupOwner, DataProv myToolProvider.processMouseEvent(event, myArea); } - @Override - public Point getBestPopupPosition() { - return null; // TODO: Auto-generated method stub - } - @Override public Object getData(@NonNls String dataId) { - return null; // TODO: Auto-generated method stub + return EditableArea.DATA_KEY.is(dataId) ? myArea : null; } } \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/tools/SelectionTool.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/tools/SelectionTool.java index 7efcfb6c1f7c..077c881ebca9 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/tools/SelectionTool.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/tools/SelectionTool.java @@ -89,7 +89,7 @@ public class SelectionTool extends InputTool { @Override protected void handleDoubleClick(int button) { - if (button == MouseEvent.BUTTON1 && myToolProvider != null) { + if (button == MouseEvent.BUTTON1 && myToolProvider != null && !myArea.isTree()) { myToolProvider.startInplaceEditing(null); } } @@ -199,7 +199,7 @@ public class SelectionTool extends InputTool { if (myTracker != null) { myTracker.keyTyped(event, area); } - else if (myToolProvider != null && + else if (myToolProvider != null && !area.isTree() && Character.isLetterOrDigit(event.getKeyChar()) && (event.getModifiers() & (InputEvent.ALT_MASK | InputEvent.CTRL_MASK)) == 0) { myToolProvider.startInplaceEditing(new InplaceContext(event.getKeyChar())); diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/model/RadComponent.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/model/RadComponent.java index c43400d71452..ffd7f5ad3064 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/model/RadComponent.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/model/RadComponent.java @@ -111,6 +111,8 @@ public abstract class RadComponent { if (myLayout != null) { myLayout.removeComponentFromContainer(component); } + + component.setParent(null); } public void removeFromParent() { From b6d19048664f90256bbe838280a6484da41d4874 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Fri, 25 May 2012 13:02:23 +0400 Subject: [PATCH 024/147] IDEA-86397 Delete line (Ctrl+Y) moves caret to the 1st column position Don't restore caret position when it's not necessary --- .../com/intellij/openapi/editor/EditorModificationUtil.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java b/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java index e80150193419..260da03d04ce 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java @@ -45,11 +45,15 @@ public class EditorModificationUtil { int selectionEnd = selectionModel.getSelectionEnd(); final CaretModel caretModel = editor.getCaretModel(); + final int caretOffset = caretModel.getOffset(); + boolean restorePosition = caretOffset > selectionStart && caretOffset < selectionEnd; final VisualPosition position = caretModel.getVisualPosition(); caretModel.moveToOffset(selectionStart); selectionModel.removeSelection(); editor.getDocument().deleteString(selectionStart, selectionEnd); - caretModel.moveToVisualPosition(position); // Try to preserve visual caret position + if (restorePosition) { + caretModel.moveToVisualPosition(position); // Try to preserve visual caret position. + } editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); } From 40c8059e10bd3099f48b2d0894c72beaa0368719 Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Fri, 25 May 2012 13:13:08 +0400 Subject: [PATCH 025/147] Refactoring --- plugins/android-designer/src/META-INF/plugin.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/android-designer/src/META-INF/plugin.xml b/plugins/android-designer/src/META-INF/plugin.xml index e14f2545aae2..79c31c21e215 100644 --- a/plugins/android-designer/src/META-INF/plugin.xml +++ b/plugins/android-designer/src/META-INF/plugin.xml @@ -11,7 +11,8 @@ com.intellij.ui-designer-new - + + Date: Fri, 25 May 2012 13:12:31 +0400 Subject: [PATCH 026/147] PSI Viewer: click in editor does not select PSI element in the tree --- .../com/intellij/internal/psiView/ViewerTreeStructure.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java b/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java index ff65a900ea5a..48f1e2d4c506 100644 --- a/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java @@ -144,9 +144,7 @@ public class ViewerTreeStructure extends AbstractTreeStructure { return new Inject(InjectedLanguageManager.getInstance(((PsiFile)element).getProject()).getInjectionHost(((PsiFile)element)), (PsiElement)element); } - return element instanceof Inject - ? ((Inject)element).getParent() - : InjectedLanguageManager.getInstance(((PsiElement)element).getProject()).getInjectionHost(((PsiElement)element)); + return element instanceof Inject ? ((Inject)element).getParent() : ((PsiElement)element).getContext(); } @Override From 29eb460fba059291ccaab1103e747a7dcc752d0b Mon Sep 17 00:00:00 2001 From: Danila Ponomarenko Date: Thu, 24 May 2012 21:30:19 +0400 Subject: [PATCH 027/147] Magic qulified names replaced with constants from CommonClassNames --- ...iciousCollectionsMethodCallsInspection.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java b/java/java-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java index d16b8e0b0bdf..f780b9d10f62 100644 --- a/java/java-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java @@ -44,10 +44,10 @@ public class SuspiciousCollectionsMethodCallsInspection extends BaseLocalInspect } private static void setupPatternMethods(PsiManager manager, - GlobalSearchScope searchScope, - List patternMethods, - IntArrayList indices) { - final PsiClass collectionClass = JavaPsiFacade.getInstance(manager.getProject()).findClass("java.util.Collection", searchScope); + GlobalSearchScope searchScope, + List patternMethods, + IntArrayList indices) { + final PsiClass collectionClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(CommonClassNames.JAVA_UTIL_COLLECTION, searchScope); PsiType[] javaLangObject = {PsiType.getJavaLangObject(manager, searchScope)}; MethodSignature removeSignature = MethodSignatureUtil.createMethodSignature("remove", javaLangObject, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY); if (collectionClass != null) { @@ -58,7 +58,7 @@ public class SuspiciousCollectionsMethodCallsInspection extends BaseLocalInspect addMethod(contains, 0, patternMethods, indices); } - final PsiClass listClass = JavaPsiFacade.getInstance(manager.getProject()).findClass("java.util.List", searchScope); + final PsiClass listClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(CommonClassNames.JAVA_UTIL_LIST, searchScope); if (listClass != null) { MethodSignature indexofSignature = MethodSignatureUtil.createMethodSignature("indexOf", javaLangObject, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY); PsiMethod indexof = MethodSignatureUtil.findMethodBySignature(listClass, indexofSignature, false); @@ -68,7 +68,7 @@ public class SuspiciousCollectionsMethodCallsInspection extends BaseLocalInspect addMethod(lastindexof, 0, patternMethods, indices); } - final PsiClass mapClass = JavaPsiFacade.getInstance(manager.getProject()).findClass("java.util.Map", searchScope); + final PsiClass mapClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(CommonClassNames.JAVA_UTIL_MAP, searchScope); if (mapClass != null) { PsiMethod remove = MethodSignatureUtil.findMethodBySignature(mapClass, removeSignature, false); addMethod(remove, 0, patternMethods, indices); @@ -96,11 +96,13 @@ public class SuspiciousCollectionsMethodCallsInspection extends BaseLocalInspect final List patternMethods = new ArrayList(); final IntArrayList indices = new IntArrayList(); return new JavaElementVisitor() { - @Override public void visitReferenceExpression(final PsiReferenceExpression expression) { + @Override + public void visitReferenceExpression(final PsiReferenceExpression expression) { visitExpression(expression); } - @Override public void visitMethodCallExpression(PsiMethodCallExpression methodCall) { + @Override + public void visitMethodCallExpression(PsiMethodCallExpression methodCall) { super.visitMethodCallExpression(methodCall); final String message = getSuspiciousMethodCallMessage(methodCall, REPORT_CONVERTIBLE_METHOD_CALLS, patternMethods, indices ); From 2f9deb86ebad07ff29ab38acc72b2966b434904b Mon Sep 17 00:00:00 2001 From: Danila Ponomarenko Date: Fri, 25 May 2012 13:35:00 +0400 Subject: [PATCH 028/147] IDEA-36326 Quickfix for converting erroneous array access to list access implemented --- .../daemon/impl/analysis/HighlightUtil.java | 92 +++++++++++------- .../impl/analysis/HighlightVisitorImpl.java | 18 ++-- .../quickfix/ReplaceWithListAccessFix.java | 93 +++++++++++++++++++ .../afterExpression.java | 10 ++ .../afterIdexIsBoxedInteger.java | 10 ++ .../afterListOfLists.java | 9 ++ .../replaceWithListAccess/afterSimple.java | 9 ++ .../beforeExpression.java | 10 ++ .../beforeIdexIsBoxedInteger.java | 10 ++ .../beforeIndexNotInteger.java | 10 ++ .../beforeListOfLists.java | 9 ++ .../replaceWithListAccess/beforeNotLIst.java | 6 ++ .../replaceWithListAccess/beforeSimple.java | 9 ++ .../quickFix/ReplaceWithListAccessTest.java | 29 ++++++ .../src/messages/QuickFixBundle.properties | 4 +- 15 files changed, 281 insertions(+), 47 deletions(-) create mode 100644 java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceWithListAccessFix.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterExpression.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterIdexIsBoxedInteger.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterListOfLists.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterSimple.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeExpression.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeIdexIsBoxedInteger.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeIndexNotInteger.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeListOfLists.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeNotLIst.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeSimple.java create mode 100644 java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/ReplaceWithListAccessTest.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index ac3a5df3c7ad..81810fe6940a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -67,7 +67,7 @@ import static com.intellij.codeInsight.daemon.JavaHighlightingFilter.suppressed; /** * @author cdr - * Date: Jul 30, 2002 + * Date: Jul 30, 2002 */ public class HighlightUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil"); @@ -82,7 +82,8 @@ public class HighlightUtil { @NonNls private static final String SERIAL_PERSISTENT_FIELDS_FIELD_NAME = "serialPersistentFields"; private static final QuickFixFactory QUICK_FIX_FACTORY = QuickFixFactory.getInstance(); - private HighlightUtil() { } + private HighlightUtil() { + } static { ourClassIncompatibleModifiers = new THashMap>(8); @@ -534,14 +535,14 @@ public class HighlightUtil { IntentionAction fix = QUICK_FIX_FACTORY.createMethodReturnFix(method, valueType, true); QuickFixAction.registerQuickFixAction(errorResult, fix); } - } + } else { errorResult = checkAssignability(returnType, valueType, returnValue, statement); if (errorResult != null && valueType != null) { IntentionAction fix = QUICK_FIX_FACTORY.createMethodReturnFix(method, valueType, true); QuickFixAction.registerQuickFixAction(errorResult, fix); if (returnType instanceof PsiArrayType && TypeConversionUtil.isAssignable(((PsiArrayType)returnType).getComponentType(), valueType)) { - QuickFixAction.registerQuickFixAction(errorResult, new SurroundWithArrayFix(null){ + QuickFixAction.registerQuickFixAction(errorResult, new SurroundWithArrayFix(null) { @Override protected PsiExpression getExpression(final PsiElement element) { return returnValue.isValid() ? returnValue : null; @@ -580,7 +581,10 @@ public class HighlightUtil { private static String formatTypes(Collection unhandled) { return StringUtil.join(unhandled, new Function() { - @Override public String fun(PsiClassType type) { return formatType(type); } + @Override + public String fun(PsiClassType type) { + return formatType(type); + } }, ", "); } @@ -825,7 +829,8 @@ public class HighlightUtil { } else { if (PsiModifier.PUBLIC.equals(modifier)) { - isAllowed = modifierOwnerParent instanceof PsiJavaFile || (modifierOwnerParent instanceof PsiClass && (modifierOwnerParent instanceof JspClass || ((PsiClass)modifierOwnerParent).getQualifiedName() != null)); + isAllowed = modifierOwnerParent instanceof PsiJavaFile || + (modifierOwnerParent instanceof PsiClass && (modifierOwnerParent instanceof JspClass || ((PsiClass)modifierOwnerParent).getQualifiedName() != null)); } else if (PsiModifier.STATIC.equals(modifier) || PsiModifier.PRIVATE.equals(modifier) || PsiModifier.PROTECTED.equals(modifier) || PsiModifier.PACKAGE_LOCAL.equals(modifier)) { @@ -1071,7 +1076,7 @@ public class HighlightUtil { if (!TypeConversionUtil.isBooleanType(type)) { final HighlightInfo info = createIncompatibleTypeHighlightInfo(PsiType.BOOLEAN, type, expr.getTextRange()); if (expr instanceof PsiMethodCallExpression) { - final PsiMethodCallExpression methodCall = (PsiMethodCallExpression) expr; + final PsiMethodCallExpression methodCall = (PsiMethodCallExpression)expr; final PsiMethod method = methodCall.resolveMethod(); if (method != null && PsiType.VOID.equals(method.getReturnType())) { IntentionAction fix = QUICK_FIX_FACTORY.createMethodReturnFix(method, PsiType.BOOLEAN, true); @@ -1188,7 +1193,10 @@ public class HighlightUtil { // collect exceptions which are caught by this type Collection caught = ContainerUtil.findAll(thrownTypes, new Condition() { - @Override public boolean value(PsiClassType type) { return catchType.isAssignableFrom(type); } + @Override + public boolean value(PsiClassType type) { + return catchType.isAssignableFrom(type); + } }); if (caught.isEmpty()) continue; final Collection caughtCopy = Sets.newHashSet(caught); @@ -1247,7 +1255,8 @@ public class HighlightUtil { if (PsiType.LONG.equals(type) || PsiType.FLOAT.equals(type) || PsiType.DOUBLE.equals(type)) { QuickFixAction.registerQuickFixAction(errorResult, new AddTypeCastFix(PsiType.INT, expression)); } - } else { + } + else { final PsiClass member = PsiUtil.resolveClassInClassTypeOnly(type); if (member != null && !PsiUtil.isAccessible(member, expression, null)) { String message = PsiFormatUtil.formatClass(member, PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_FQ_NAME) + " is inaccessible here"; @@ -1285,8 +1294,8 @@ public class HighlightUtil { if (!TypeConversionUtil.isBinaryOperatorApplicable(operationSign, lType, rType, false)) { PsiJavaToken token = expression.getTokenBeforeOperand(operand); String message = JavaErrorMessages.message("binary.operator.not.applicable", token.getText(), - formatType(lType), - formatType(rType)); + formatType(lType), + formatType(rType)); return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, expression, message); } lType = TypeConversionUtil.calcTypeForBinaryExpression(lType, rType, operationSign, true); @@ -1406,13 +1415,19 @@ public class HighlightUtil { } @Nullable - static HighlightInfo checkValidArrayAccessExpression(@Nullable PsiExpression arrayExpression, PsiExpression indexExpression, PsiType type) { - PsiType arrayExpressionType = arrayExpression == null ? null : arrayExpression.getType(); + static HighlightInfo checkValidArrayAccessExpression(@NotNull PsiArrayAccessExpression arrayAccessExpression) { + final PsiExpression arrayExpression = arrayAccessExpression.getArrayExpression(); + final PsiType arrayExpressionType = arrayExpression.getType(); + if (arrayExpressionType != null && !(arrayExpressionType instanceof PsiArrayType)) { - String description = JavaErrorMessages.message("array.type.expected", formatType(arrayExpressionType)); - return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, arrayExpression, description); + final String description = JavaErrorMessages.message("array.type.expected", formatType(arrayExpressionType)); + final HighlightInfo info = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, arrayExpression, description); + QuickFixAction.registerQuickFixAction(info, new ReplaceWithListAccessFix(arrayAccessExpression)); + return info; } - return checkAssignability(PsiType.INT, indexExpression.getType(), indexExpression, indexExpression); + + final PsiExpression indexExpression = arrayAccessExpression.getIndexExpression(); + return indexExpression != null ? checkAssignability(PsiType.INT, indexExpression.getType(), indexExpression, indexExpression) : null; } @@ -1440,8 +1455,8 @@ public class HighlightUtil { if (!(initializer instanceof PsiArrayInitializerExpression)) return null; if (!(type instanceof PsiArrayType)) return null; - final PsiType componentType = ((PsiArrayType) type).getComponentType(); - final PsiArrayInitializerExpression arrayInitializer = (PsiArrayInitializerExpression) initializer; + final PsiType componentType = ((PsiArrayType)type).getComponentType(); + final PsiArrayInitializerExpression arrayInitializer = (PsiArrayInitializerExpression)initializer; boolean arrayTypeFixChecked = false; VariableArrayTypeFix fix = null; @@ -1617,7 +1632,7 @@ public class HighlightUtil { String description = JavaErrorMessages.message("switch.colon.expected.after.case.label"); CharSequence chars = statement.getContainingFile().getViewProvider().getContents(); boolean isAfterEndOfLine = end >= chars.length() || chars.charAt(start) == '\n' || chars.charAt(start) == '\r'; - return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, null,start, end, description, description,isAfterEndOfLine, null); + return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, null, start, end, description, description, isAfterEndOfLine, null); } return null; } @@ -1709,10 +1724,10 @@ public class HighlightUtil { if (((PsiMethod)typeOwner).getReturnTypeElement() == parent) return null; } else if (// like in Class c = void.class; - typeOwner instanceof PsiClassObjectAccessExpression && - TypeConversionUtil.isVoidType(((PsiClassObjectAccessExpression)typeOwner).getOperand().getType()) || - // do not highlight incomplete declarations - typeOwner != null && PsiUtilCore.hasErrorElementChild(typeOwner)) { + typeOwner instanceof PsiClassObjectAccessExpression && + TypeConversionUtil.isVoidType(((PsiClassObjectAccessExpression)typeOwner).getOperand().getType()) || + // do not highlight incomplete declarations + typeOwner != null && PsiUtilCore.hasErrorElementChild(typeOwner)) { return null; } else if (typeOwner instanceof JavaCodeFragment) { @@ -1733,7 +1748,9 @@ public class HighlightUtil { // redirected ctr if (PsiKeyword.THIS.equals(((PsiJavaCodeReferenceElement)expression).getReferenceName()) && resolved instanceof PsiMethod - && ((PsiMethod)resolved).isConstructor()) return null; + && ((PsiMethod)resolved).isConstructor()) { + return null; + } PsiElement qualifier = ((PsiJavaCodeReferenceElement)expression).getQualifier(); type = qualifier instanceof PsiExpression ? ((PsiExpression)qualifier).getType() : null; referencedClass = PsiUtil.resolveClassInType(type); @@ -1785,7 +1802,7 @@ public class HighlightUtil { resolvedName = qualifier.getText(); } } - else if (PsiKeyword.THIS.equals(name)) { + else if (PsiKeyword.THIS.equals(name)) { resolvedName = PsiKeyword.THIS; } else { @@ -1891,11 +1908,11 @@ public class HighlightUtil { PsiMethod[] constructors = aClass.getConstructors(); if (constructors.length == 0) { TextRange range = HighlightNamesUtil.getClassDeclarationTextRange(aClass); - return createMemberReferencedError(aClass.getName()+".this", range); + return createMemberReferencedError(aClass.getName() + ".this", range); } for (PsiMethod constructor : constructors) { if (!isSuperCalledInConstructor(constructor)) { - return createMemberReferencedError(aClass.getName()+".this", HighlightNamesUtil.getMethodDeclarationTextRange(constructor)); + return createMemberReferencedError(aClass.getName() + ".this", HighlightNamesUtil.getMethodDeclarationTextRange(constructor)); } } return null; @@ -1908,12 +1925,12 @@ public class HighlightUtil { if (statements.length == 0) return false; final PsiStatement statement = statements[0]; final PsiElement element = new PsiMatcherImpl(statement) - .dot(PsiMatchers.hasClass(PsiExpressionStatement.class)) - .firstChild(PsiMatchers.hasClass(PsiMethodCallExpression.class)) - .firstChild(PsiMatchers.hasClass(PsiReferenceExpression.class)) - .firstChild(PsiMatchers.hasClass(PsiKeyword.class)) - .dot(PsiMatchers.hasText(PsiKeyword.SUPER)) - .getElement(); + .dot(PsiMatchers.hasClass(PsiExpressionStatement.class)) + .firstChild(PsiMatchers.hasClass(PsiMethodCallExpression.class)) + .firstChild(PsiMatchers.hasClass(PsiReferenceExpression.class)) + .firstChild(PsiMatchers.hasClass(PsiKeyword.class)) + .dot(PsiMatchers.hasText(PsiKeyword.SUPER)) + .getElement(); return element != null; } @@ -1923,10 +1940,12 @@ public class HighlightUtil { PsiReferenceExpression methodExpression = ((PsiMethodCallExpression)element).getMethodExpression(); return methodExpression.getReferenceName(); } + public static boolean isSuperOrThisMethodCall(PsiElement element) { String name = getMethodExpressionName(element); return PsiKeyword.SUPER.equals(name) || PsiKeyword.THIS.equals(name); } + public static boolean isSuperMethodCall(PsiElement element) { String name = getMethodExpressionName(element); return PsiKeyword.SUPER.equals(name); @@ -2362,7 +2381,8 @@ public class HighlightUtil { } if ((resolved instanceof PsiLocalVariable || resolved instanceof PsiParameter) && !(resolved instanceof ImplicitVariable)) { highlightInfo = HighlightControlFlowUtil.checkVariableMustBeFinal((PsiVariable)resolved, ref); - } else if (resolved instanceof PsiClass) { + } + else if (resolved instanceof PsiClass) { if (Comparing.strEqual(((PsiClass)resolved).getQualifiedName(), ((PsiClass)resolved).getName())) { final PsiElement parent = ref.getParent(); if (parent instanceof PsiImportStaticReferenceElement || parent instanceof PsiImportStatementBase) { @@ -2391,8 +2411,8 @@ public class HighlightUtil { @Nullable public static HighlightInfo checkElementInReferenceList(PsiJavaCodeReferenceElement ref, - PsiReferenceList referenceList, - JavaResolveResult resolveResult) { + PsiReferenceList referenceList, + JavaResolveResult resolveResult) { PsiElement resolved = resolveResult.getElement(); HighlightInfo highlightInfo = null; PsiElement refGrandParent = referenceList.getParent(); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 4de3dad216db..23d6ccbfc79b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -79,7 +79,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } } }; - + public HighlightVisitorImpl(@NotNull PsiResolveHelper resolveHelper) { myResolveHelper = resolveHelper; } @@ -93,7 +93,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public int order() { return 0; - } + } @Override public boolean suitableForFile(@NotNull PsiFile file) { @@ -324,22 +324,20 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public void visitExpression(PsiExpression expression) { ProgressManager.checkCanceled(); // visitLiteralExpression is invoked very often in array initializers - + super.visitExpression(expression); PsiType type = expression.getType(); if (myHolder.add(HighlightUtil.checkMustBeBoolean(expression, type))) return; - PsiExpression indexExpression; - if (expression instanceof PsiArrayAccessExpression - && (indexExpression = ((PsiArrayAccessExpression)expression).getIndexExpression()) != null) { - PsiExpression arrayExpression = ((PsiArrayAccessExpression)expression).getArrayExpression(); - myHolder.add(HighlightUtil.checkValidArrayAccessExpression(arrayExpression, indexExpression, indexExpression.getType())); + if(expression instanceof PsiArrayAccessExpression) { + myHolder.add(HighlightUtil.checkValidArrayAccessExpression((PsiArrayAccessExpression)expression)); } + if (expression.getParent() instanceof PsiNewExpression && ((PsiNewExpression)expression.getParent()).getQualifier() != expression && ((PsiNewExpression)expression.getParent()).getArrayInitializer() != expression) { // like in 'new String["s"]' - myHolder.add(HighlightUtil.checkValidArrayAccessExpression(null, expression, type)); + myHolder.add(HighlightUtil.checkAssignability(PsiType.INT, expression.getType(), expression, expression)); } if (!myHolder.hasErrorResults()) myHolder.add(HighlightControlFlowUtil.checkCannotWriteToFinal(expression)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkVariableExpected(expression)); @@ -900,7 +898,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (!(parent instanceof PsiTypeParameter)) { myHolder.add(AnnotationsHighlightUtil.checkAnnotationDeclaration(parent, list)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkExtendsAllowed(list)); - if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkImplementsAllowed(list)); + if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkImplementsAllowed(list)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkClassExtendsOnlyOneClass(list)); if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkGenericCannotExtendException(list)); } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceWithListAccessFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceWithListAccessFix.java new file mode 100644 index 000000000000..7dc25034f41e --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceWithListAccessFix.java @@ -0,0 +1,93 @@ +/* + * Copyright 2000-2012 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.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.CodeInsightUtilBase; +import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; + +/** + * @author Danila Ponomarenko + */ +public class ReplaceWithListAccessFix implements IntentionAction { + private PsiArrayAccessExpression myArrayAccessExpression; + + public ReplaceWithListAccessFix(PsiArrayAccessExpression arrayAccessExpression) { + myArrayAccessExpression = arrayAccessExpression; + } + + @NotNull + @Override + public String getText() { + return QuickFixBundle.message("replace.with.list.access.text"); + } + + @NotNull + @Override + public String getFamilyName() { + return getText(); + } + + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + if (!myArrayAccessExpression.isValid()) return false; + if (!TypeConversionUtil.areTypesAssignmentCompatible(PsiType.INT, myArrayAccessExpression.getIndexExpression())){ + return false; + } + + final PsiExpression arrayExpression = myArrayAccessExpression.getArrayExpression(); + final PsiType type = arrayExpression.getType(); + + if (type == null) return false; + + final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); + final PsiClass listClass = JavaPsiFacade.getInstance(project).findClass(CommonClassNames.JAVA_UTIL_LIST, myArrayAccessExpression.getResolveScope()); + + if (listClass == null) return false; + + final PsiElementFactory factory = facade.getElementFactory(); + final PsiType listType = factory.createType(listClass); + + + + return listType.isAssignableFrom(type); + } + + @Override + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + if (!CodeInsightUtilBase.prepareFileForWrite(file)) return; + final PsiExpression arrayExpression = myArrayAccessExpression.getArrayExpression(); + final PsiExpression indexExpression = myArrayAccessExpression.getIndexExpression(); + + if (indexExpression == null) return; + + final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); + final PsiElement parent = myArrayAccessExpression.getParent(); + final PsiElement listAccess = factory.createExpressionFromText(arrayExpression.getText() + ".get(" + indexExpression.getText() + ")", parent); + myArrayAccessExpression.replace(listAccess); + } + + @Override + public boolean startInWriteAction() { + return true; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterExpression.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterExpression.java new file mode 100644 index 000000000000..a3c59d28b3da --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterExpression.java @@ -0,0 +1,10 @@ +// "Replace with list access" "true" + +import java.lang.Math; +import java.util.List; + +class A { + void test(List lists) { + System.out.println(lists.get(Math.max(Math.abs(-2), 3))); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterIdexIsBoxedInteger.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterIdexIsBoxedInteger.java new file mode 100644 index 000000000000..e51dad27bce2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterIdexIsBoxedInteger.java @@ -0,0 +1,10 @@ +// "Replace with list access" "true" + +import java.lang.Integer; +import java.util.ArrayList; + +class A { + void test(ArrayList list) { + System.out.println(list.get(new Integer(0))); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterListOfLists.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterListOfLists.java new file mode 100644 index 000000000000..88de14ce85d6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterListOfLists.java @@ -0,0 +1,9 @@ +// "Replace with list access" "true" + +import java.util.List; + +class A { + void test(List lists) { + System.out.println(lists.get(0).get(0)); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterSimple.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterSimple.java new file mode 100644 index 000000000000..b724741bac86 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/afterSimple.java @@ -0,0 +1,9 @@ +// "Replace with list access" "true" + +import java.util.ArrayList; + +class A { + void test(ArrayList list) { + System.out.println(list.get(0)); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeExpression.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeExpression.java new file mode 100644 index 000000000000..c24770fc7a26 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeExpression.java @@ -0,0 +1,10 @@ +// "Replace with list access" "true" + +import java.lang.Math; +import java.util.List; + +class A { + void test(List lists) { + System.out.println(lists[Math.max(Math.abs(-2),3)]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeIdexIsBoxedInteger.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeIdexIsBoxedInteger.java new file mode 100644 index 000000000000..5aa0912933b9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeIdexIsBoxedInteger.java @@ -0,0 +1,10 @@ +// "Replace with list access" "true" + +import java.lang.Integer; +import java.util.ArrayList; + +class A { + void test(ArrayList list) { + System.out.println(list[new Integer(0)]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeIndexNotInteger.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeIndexNotInteger.java new file mode 100644 index 000000000000..3e357134a984 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeIndexNotInteger.java @@ -0,0 +1,10 @@ +// "Replace with list access" "false" + +import java.lang.Object; +import java.util.ArrayList; + +class A { + void test(ArrayList list) { + System.out.println(list[new Object(3)]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeListOfLists.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeListOfLists.java new file mode 100644 index 000000000000..c657db61bce9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeListOfLists.java @@ -0,0 +1,9 @@ +// "Replace with list access" "true" + +import java.util.List; + +class A { + void test(List lists) { + System.out.println(lists[0].get(0)); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeNotLIst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeNotLIst.java new file mode 100644 index 000000000000..9b30417e9e57 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeNotLIst.java @@ -0,0 +1,6 @@ +// "Replace with list access" "false" +class A { + void test(Collection list) { + System.out.println(list[0]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeSimple.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeSimple.java new file mode 100644 index 000000000000..4e96417cd6aa --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess/beforeSimple.java @@ -0,0 +1,9 @@ +// "Replace with list access" "true" + +import java.util.ArrayList; + +class A { + void test(ArrayList list) { + System.out.println(list[0]); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/ReplaceWithListAccessTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/ReplaceWithListAccessTest.java new file mode 100644 index 000000000000..e5777643c4a8 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/ReplaceWithListAccessTest.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2012 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.codeInsight.daemon.quickFix; + +/** + * @author Danila Ponomarenko + */ +public class ReplaceWithListAccessTest extends LightQuickFixTestCase { + + public void test() throws Exception { doAllTests(); } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithListAccess"; + } +} diff --git a/resources-en/src/messages/QuickFixBundle.properties b/resources-en/src/messages/QuickFixBundle.properties index bd107e9cb0db..a5cda760fc2f 100644 --- a/resources-en/src/messages/QuickFixBundle.properties +++ b/resources-en/src/messages/QuickFixBundle.properties @@ -266,4 +266,6 @@ initialize.final.field.in.constructor.name=Initialize in constructor initialize.final.field.in.constructor.choose.dialog.title=Choose constructors to add initialization to remove.redundant.arguments.text=Remove redundant arguments to call ''{0}'' -remove.redundant.arguments.family=Remove redundant arguments \ No newline at end of file +remove.redundant.arguments.family=Remove redundant arguments + +replace.with.list.access.text=Replace with list access \ No newline at end of file From d3f73256108681b906cec40a46e2baf8236bab5d Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 25 May 2012 13:31:35 +0400 Subject: [PATCH 029/147] IDEA-86380 Batch inspections: previous results are not cleared --- .../inspection/globalContext/Foo.java | 1 + .../GlobalInspectionContextTest.java | 69 +++++++++++++++++++ .../codeInspection/InspectionProfileTest.java | 3 - .../ex/GlobalInspectionContextImpl.java | 20 +++--- .../ex/InspectionProfileImpl.java | 2 +- 5 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 java/java-tests/testData/inspection/globalContext/Foo.java create mode 100644 java/java-tests/testSrc/com/intellij/codeInspection/GlobalInspectionContextTest.java diff --git a/java/java-tests/testData/inspection/globalContext/Foo.java b/java/java-tests/testData/inspection/globalContext/Foo.java new file mode 100644 index 000000000000..4a2b44daf653 --- /dev/null +++ b/java/java-tests/testData/inspection/globalContext/Foo.java @@ -0,0 +1 @@ +public class Foo {} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/GlobalInspectionContextTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/GlobalInspectionContextTest.java new file mode 100644 index 000000000000..809f49672384 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInspection/GlobalInspectionContextTest.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2012 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.codeInspection; + +import com.intellij.JavaTestUtil; +import com.intellij.analysis.AnalysisScope; +import com.intellij.codeInsight.CodeInsightTestCase; +import com.intellij.codeInspection.ex.*; +import com.intellij.codeInspection.visibility.VisibilityInspection; + +/** + * @author Dmitry Avdeev + * Date: 5/24/12 + */ +public class GlobalInspectionContextTest extends CodeInsightTestCase { + + public void testProblemDuplication() throws Exception { + String shortName = new VisibilityInspection().getShortName(); + InspectionProfileImpl profile = new InspectionProfileImpl("Foo"); + profile.disableAllTools(); + profile.enableTool(shortName); + + GlobalInspectionContextImpl context = ((InspectionManagerEx)InspectionManager.getInstance(getProject())).createNewGlobalContext(false); + context.setExternalProfile(profile); + configureByFile("Foo.java"); + + AnalysisScope scope = new AnalysisScope(getFile()); + context.doInspections(scope, InspectionManager.getInstance(getProject())); + + Tools tools = context.getTools().get(shortName); + GlobalInspectionToolWrapper tool = (GlobalInspectionToolWrapper)tools.getTool(); + assertEquals(1, tool.getProblemDescriptors().size()); + + context.doInspections(scope, InspectionManager.getInstance(getProject())); + tools = context.getTools().get(shortName); + tool = (GlobalInspectionToolWrapper)tools.getTool(); + assertEquals(1, tool.getProblemDescriptors().size()); + } + + @Override + public void setUp() throws Exception { + super.setUp(); + InspectionProfileImpl.INIT_INSPECTIONS = true; + } + + @Override + public void tearDown() throws Exception { + InspectionProfileImpl.INIT_INSPECTIONS = false; + super.tearDown(); + } + + @Override + protected String getTestDataPath() { + return JavaTestUtil.getJavaTestDataPath() + "/inspection/globalContext/"; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/InspectionProfileTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/InspectionProfileTest.java index bb012a5b2665..94c1e9100a8c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/InspectionProfileTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/InspectionProfileTest.java @@ -28,7 +28,6 @@ import org.jdom.JDOMException; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; import static com.intellij.testFramework.PlatformTestUtil.assertElementsEqual; @@ -221,8 +220,6 @@ public class InspectionProfileTest extends LightIdeaTestCase { GlobalInspectionContextImpl context = ((InspectionManagerEx)InspectionManager.getInstance(getProject())).createNewGlobalContext(false); context.setExternalProfile(profile); context.initializeTools(new ArrayList(), new ArrayList(), new ArrayList()); - Map tools = context.getTools(); - assertEquals(1, tools.size()); } private static LocalInspectionToolWrapper createTool(String s) { diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java index 7a7c661e3dcd..87e76ffe3409 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java @@ -33,10 +33,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.progress.Task; +import com.intellij.openapi.progress.*; import com.intellij.openapi.progress.impl.ProgressManagerImpl; import com.intellij.openapi.progress.util.ProgressWrapper; import com.intellij.openapi.project.DumbService; @@ -271,12 +268,19 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G getContentManager().removeContent(myContent, true); } - ApplicationManager.getApplication().invokeLater(new Runnable() { + Runnable runnable = new Runnable() { public void run() { myCurrentScope = scope; launchInspections(scope, manager); } - }); + }; + + if (ApplicationManager.getApplication().isUnitTestMode()) { + runnable.run(); + } + else { + ApplicationManager.getApplication().invokeLater(runnable); + } } @@ -483,7 +487,7 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G public void performInspectionsWithProgress(@NotNull final AnalysisScope scope, @NotNull final InspectionManager manager) { final PsiManager psiManager = PsiManager.getInstance(myProject); - myProgressIndicator = ProgressManager.getInstance().getProgressIndicator(); + myProgressIndicator = ApplicationManager.getApplication().isUnitTestMode() ? new EmptyProgressIndicator() : ProgressManager.getInstance().getProgressIndicator(); //init manager in read action RefManagerImpl refManager = (RefManagerImpl)getRefManager(); try { @@ -714,7 +718,7 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G } protected List getUsedTools() { - InspectionProfileImpl profile = (InspectionProfileImpl)getCurrentProfile(); + InspectionProfileImpl profile = new InspectionProfileImpl((InspectionProfileImpl)getCurrentProfile()); List tools = profile.getAllEnabledInspectionTools(myProject); THashSet set = null; for (ToolsImpl tool : tools) { diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionProfileImpl.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionProfileImpl.java index a9698f2f37a9..f42c5b62f97e 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionProfileImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionProfileImpl.java @@ -92,7 +92,7 @@ public class InspectionProfileImpl extends ProfileEx implements ModifiableModel, private boolean myModified = false; private volatile boolean myInitialized; - private InspectionProfileImpl(@NotNull InspectionProfileImpl inspectionProfile) { + InspectionProfileImpl(@NotNull InspectionProfileImpl inspectionProfile) { super(inspectionProfile.getName()); myRegistrar = inspectionProfile.myRegistrar; From 997f409e1a78ae5afb042299ec29a9722dc22ec2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 25 May 2012 12:41:49 +0400 Subject: [PATCH 030/147] method type params should be excluded from signature when overriding from raw type (IDEA-67585;IDEA-67582) --- .../generation/OverrideImplementUtil.java | 16 +++++++++++- .../overrideImplement/afterRawSuper.java | 25 ++++++++++++++++++ ...afterSubstituteBoundInMethodTypeParam.java | 26 +++++++++++++++++++ .../overrideImplement/beforeRawSuper.java | 24 +++++++++++++++++ ...eforeSubstituteBoundInMethodTypeParam.java | 22 ++++++++++++++++ .../codeInsight/OverrideImplementTest.java | 2 ++ 6 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/overrideImplement/afterRawSuper.java create mode 100644 java/java-tests/testData/codeInsight/overrideImplement/afterSubstituteBoundInMethodTypeParam.java create mode 100644 java/java-tests/testData/codeInsight/overrideImplement/beforeRawSuper.java create mode 100644 java/java-tests/testData/codeInsight/overrideImplement/beforeSubstituteBoundInMethodTypeParam.java diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java index 6a52ec171673..f9314080f647 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java @@ -263,7 +263,7 @@ public class OverrideImplementUtil { } if (results.isEmpty()) { PsiMethod method1 = GenerateMembersUtil.substituteGenericMethod(method, substitutor, aClass); - + PsiElementFactory factory = JavaPsiFacade.getInstance(method.getProject()).getElementFactory(); PsiMethod result = (PsiMethod)factory.createClass("Dummy").add(method1); if (result instanceof PsiAnnotationMethod) { @@ -304,6 +304,20 @@ public class OverrideImplementUtil { } } + //method type params are not allowed when overriding from raw type + final PsiTypeParameterList list = result.getTypeParameterList(); + if (list != null) { + final PsiClass containingClass = method.getContainingClass(); + if (containingClass != null) { + for (PsiClassType classType : aClass.getSuperTypes()) { + if (InheritanceUtil.isInheritorOrSelf(PsiUtil.resolveClassInType(classType), containingClass, true) && classType.isRaw()) { + list.replace(JavaPsiFacade.getElementFactory(aClass.getProject()).createTypeParameterList()); + break; + } + } + } + } + annotateOnOverrideImplement(result, aClass, method, insertOverrideIfPossible); if (CodeStyleSettingsManager.getSettings(aClass.getProject()).REPEAT_SYNCHRONIZED && method.hasModifierProperty(PsiModifier.SYNCHRONIZED)) { diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterRawSuper.java b/java/java-tests/testData/codeInsight/overrideImplement/afterRawSuper.java new file mode 100644 index 000000000000..95912a1bd1da --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterRawSuper.java @@ -0,0 +1,25 @@ +/* + * Copyright 2000-2012 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. + */ +interface A { + void foo(); + } + + class B implements A + { + public void foo() { + //To change body of implemented methods use File | Settings | File Templates. + } + } diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterSubstituteBoundInMethodTypeParam.java b/java/java-tests/testData/codeInsight/overrideImplement/afterSubstituteBoundInMethodTypeParam.java new file mode 100644 index 000000000000..47816c480dca --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterSubstituteBoundInMethodTypeParam.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2012 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. + */ +abstract class A { + abstract void foo(S s); + } + + class B extends A{ // Implement methods + + @Override + void foo(S s) { + //To change body of implemented methods use File | Settings | File Templates. + } + } diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeRawSuper.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeRawSuper.java new file mode 100644 index 000000000000..aefe95c86643 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeRawSuper.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2012 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. + */ +interface A { + void foo(); + } + + class B implements A + { + + + } diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeSubstituteBoundInMethodTypeParam.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeSubstituteBoundInMethodTypeParam.java new file mode 100644 index 000000000000..0cccda1cebde --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeSubstituteBoundInMethodTypeParam.java @@ -0,0 +1,22 @@ +/* + * Copyright 2000-2012 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. + */ +abstract class A { + abstract void foo(S s); + } + + class B extends A{ // Implement methods + + } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java index 3d0a160e8094..5a4b795126df 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java @@ -37,6 +37,8 @@ public class OverrideImplementTest extends LightCodeInsightTestCase { public void testWildcard() throws Exception { doTest(false); } public void testTypeParam() throws Exception { doTest(false); } public void testInterfaceAndAbstractClass() throws Exception { doTest(false); } + public void testRawSuper() throws Exception { doTest(false); } + public void testSubstituteBoundInMethodTypeParam() throws Exception { doTest(false); } public void testLongFinalParameterList() throws Exception { CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(getProject()).clone(); From 523a16503802b1d08fb2ebda37e8bd6302fcced3 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 25 May 2012 13:04:53 +0400 Subject: [PATCH 031/147] quick doc: correct generics presentation --- .../lang/java/JavaDocumentationProvider.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java index 5529ed6c5332..ede0a8514603 100644 --- a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java +++ b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java @@ -72,25 +72,26 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext @Override public String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) { + String navigateInfo = null; if (element instanceof PsiClass) { - return generateClassInfo((PsiClass)element); + navigateInfo = generateClassInfo((PsiClass)element); } else if (element instanceof PsiMethod) { - return generateMethodInfo((PsiMethod)element, calcSubstitutor(originalElement)); + navigateInfo = generateMethodInfo((PsiMethod)element, calcSubstitutor(originalElement)); } else if (element instanceof PsiField) { - return generateFieldInfo((PsiField)element, calcSubstitutor(originalElement)); + navigateInfo = generateFieldInfo((PsiField)element, calcSubstitutor(originalElement)); } else if (element instanceof PsiVariable) { - return generateVariableInfo((PsiVariable)element); + navigateInfo = generateVariableInfo((PsiVariable)element); } else if (element instanceof PsiPackage) { - return generatePackageInfo((PsiPackage)element); + navigateInfo = generatePackageInfo((PsiPackage)element); } else if (element instanceof BeanPropertyElement) { - return generateMethodInfo(((BeanPropertyElement) element).getMethod(), PsiSubstitutor.EMPTY); + navigateInfo = generateMethodInfo(((BeanPropertyElement) element).getMethod(), PsiSubstitutor.EMPTY); } - return null; + return StringUtil.escapeXml(StringUtil.unescapeXml(navigateInfo)); } private static PsiSubstitutor calcSubstitutor(PsiElement originalElement) { From 4c730104a876c9e02679f1ce96e7c7a7e2d2c06f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 25 May 2012 14:14:53 +0400 Subject: [PATCH 032/147] inline superclass: correct super references in extends/implements lists without pushdown (IDEA-86639) --- .../InlineSuperClassRefactoringProcessor.java | 29 ++----------------- .../ReplaceExtendsListUsageInfo.java | 10 +++---- .../after/Super.java | 2 ++ .../after/Test.java | 2 ++ .../before/Super.java | 4 +++ .../before/Test.java | 2 ++ .../refactoring/InlineSuperClassTest.java | 4 +++ 7 files changed, 22 insertions(+), 31 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Super.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Test.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Super.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java index 3856c20bb935..c98e6b8da9d4 100644 --- a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java @@ -40,11 +40,11 @@ import com.intellij.refactoring.util.classMembers.MemberInfoStorage; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.Processor;import com.intellij.util.containers.HashMap; +import com.intellij.util.Processor; +import com.intellij.util.containers.HashMap; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -63,39 +63,16 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori myTargetClasses = targetClasses; MemberInfoStorage memberInfoStorage = new MemberInfoStorage(mySuperClass, new MemberInfo.Filter() { public boolean includeMember(PsiMember element) { - return true; + return !(element instanceof PsiClass) || PsiTreeUtil.isAncestor(mySuperClass, element, true); } }); List members = memberInfoStorage.getClassMemberInfos(mySuperClass); for (MemberInfo member : members) { member.setChecked(true); } - members = appendSuperRefs(members); myMemberInfos = members.toArray(new MemberInfo[members.size()]); } - private List appendSuperRefs(List members) { - if (!mySuperClass.isInterface()) { - PsiReferenceList extendsList = mySuperClass.getExtendsList(); - if (extendsList != null && extendsList.getReferenceElements().length > 0) { - PsiElement resolve = extendsList.getReferenceElements()[0].resolve(); - if (resolve instanceof PsiClass) { - members = new ArrayList(members); - - MemberInfo memberInfo = new MemberInfo((PsiMember)resolve, true, extendsList) { - { - overrides = false; - } - }; - - memberInfo.setChecked(true); - members.add(memberInfo); - } - } - } - return members; - } - @NotNull protected UsageViewDescriptor createUsageViewDescriptor(final UsageInfo[] usages) { return new InlineSuperClassUsageViewDescriptor(mySuperClass); diff --git a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java index 686950aaba32..f9d28ac491b7 100644 --- a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/usageInfo/ReplaceExtendsListUsageInfo.java @@ -21,22 +21,22 @@ package com.intellij.refactoring.inlineSuperClass.usageInfo; import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiJavaCodeReferenceElement; +import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteExtendsClassUsageInfo; import com.intellij.refactoring.util.FixableUsageInfo; import com.intellij.util.IncorrectOperationException; public class ReplaceExtendsListUsageInfo extends FixableUsageInfo { + private final SafeDeleteExtendsClassUsageInfo mySafeDeleteUsageInfo; public ReplaceExtendsListUsageInfo(PsiJavaCodeReferenceElement element, final PsiClass superClass, final PsiClass targetClass) { super(element); - + mySafeDeleteUsageInfo = new SafeDeleteExtendsClassUsageInfo(element, superClass, targetClass); } public void fixUsage() throws IncorrectOperationException { - final PsiElement element = getElement(); - if (element != null) { - element.delete(); + if (mySafeDeleteUsageInfo.isSafeDelete()) { + mySafeDeleteUsageInfo.deleteElement(); } } } diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Super.java b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Super.java new file mode 100644 index 000000000000..f0c2064481b6 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Super.java @@ -0,0 +1,2 @@ +interface Int { +} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Test.java new file mode 100644 index 000000000000..32dd1902afa5 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/after/Test.java @@ -0,0 +1,2 @@ +interface Test extends Int { +} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Super.java b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Super.java new file mode 100644 index 000000000000..35f223875043 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Super.java @@ -0,0 +1,4 @@ +interface Super extends Int { +} +interface Int { +} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Test.java new file mode 100644 index 000000000000..2eeeb5d5fe8a --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/interfaceHierarchyWithSubstitution/before/Test.java @@ -0,0 +1,2 @@ +interface Test extends Super{ +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java index 3370d5863e06..fb7d2a75a9a7 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java @@ -173,6 +173,10 @@ public class InlineSuperClassTest extends MultiFileTestCase { doTest(); } + public void testInterfaceHierarchyWithSubstitution() throws Exception { + doTest(); + } + private void doTestMultipleSubclasses() throws Exception { doTest(new PerformAction() { @Override From 5b2da4e4621450e2d59c83afbfc929452ee5835b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 21 May 2012 17:17:51 +0400 Subject: [PATCH 033/147] double register --- .../src/com/intellij/util/descriptors/impl/ConfigFileImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/idea-ui/src/com/intellij/util/descriptors/impl/ConfigFileImpl.java b/java/idea-ui/src/com/intellij/util/descriptors/impl/ConfigFileImpl.java index 2e37a5d60f1a..36d2ba4e529b 100644 --- a/java/idea-ui/src/com/intellij/util/descriptors/impl/ConfigFileImpl.java +++ b/java/idea-ui/src/com/intellij/util/descriptors/impl/ConfigFileImpl.java @@ -1,7 +1,6 @@ package com.intellij.util.descriptors.impl; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.openapi.vfs.pointers.VirtualFilePointerListener; @@ -43,7 +42,6 @@ public class ConfigFileImpl implements ConfigFile { } }); onChange(); - Disposer.register(container, this); myProject = myContainer.getProject(); } From 4af34daf984332ceaf03b215b5e51e7fcaafbf01 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 22 May 2012 16:23:24 +0400 Subject: [PATCH 034/147] NPE --- .../intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java index 1e0b36dfadcf..de48dedf80fe 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java @@ -548,7 +548,9 @@ public void addMessageToConsoleWindow(final String message, final TextAttributes public VcsShowConfirmationOption getStandardConfirmation(@NotNull VcsConfiguration.StandardConfirmation option, AbstractVcs vcs) { final VcsShowConfirmationOptionImpl result = getConfirmation(option); - result.addApplicableVcs(vcs); + if (vcs != null) { + result.addApplicableVcs(vcs); + } return result; } From 2eada83aef7cda970e3e04cc7c4feb93de8e5e20 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 23 May 2012 16:21:51 +0400 Subject: [PATCH 035/147] leak of LightVirtualFiles --- .../impl/DocumentReferenceByDocument.java | 2 + .../impl/DocumentReferenceByVirtualFile.java | 2 + .../impl/DocumentReferenceManagerImpl.java | 54 ++++++++++++------- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByDocument.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByDocument.java index 7aad7fd2998c..4c5ceab88a6e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByDocument.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByDocument.java @@ -28,11 +28,13 @@ public class DocumentReferenceByDocument implements DocumentReference { myDocument = document; } + @Override @NotNull public Document getDocument() { return myDocument; } + @Override @Nullable public VirtualFile getFile() { return null; diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByVirtualFile.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByVirtualFile.java index dc2c2643658f..271bf8f84c12 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByVirtualFile.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceByVirtualFile.java @@ -29,12 +29,14 @@ public class DocumentReferenceByVirtualFile implements DocumentReference { myFile = file; } + @Override @Nullable public Document getDocument() { assert myFile.isValid() : "should not be called on references to deleted file: " + myFile; return FileDocumentManager.getInstance().getDocument(myFile); } + @Override @NotNull public VirtualFile getFile() { return myFile; diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java index 620e57792cbc..a53830f241b7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java @@ -41,14 +41,16 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple private static final Key> DELETED_FILES = Key.create(DocumentReferenceManagerImpl.class.getName() + ".DELETED_FILES"); private final Map, DocumentReference> myDocToRef = new WeakValueHashMap, DocumentReference>(); - private final Map myFileToRef = new WeakValueHashMap(); + private final Map, DocumentReference> myFileToRef = new WeakValueHashMap, DocumentReference>(); private final Map myDeletedFilePathToRef = new WeakValueHashMap(); + @Override @NotNull public String getComponentName() { return getClass().getSimpleName(); } + @Override public void initComponent() { VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileAdapter() { @Override @@ -56,7 +58,7 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple VirtualFile f = event.getFile(); DocumentReference ref = myDeletedFilePathToRef.remove(new FilePath(f.getUrl())); if (ref != null) { - myFileToRef.put(f, ref); + myFileToRef.put(new WeakReferenceWithEquals(f), ref); ((DocumentReferenceByVirtualFile)ref).update(f); } } @@ -73,8 +75,10 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple List files = f.getUserData(DELETED_FILES); f.putUserData(DELETED_FILES, null); + assert files != null; for (VirtualFile each : files) { - DocumentReference ref = myFileToRef.remove(each); + Reference r = new WeakReferenceWithEquals(each); + DocumentReference ref = myFileToRef.remove(r); if (ref != null) { myDeletedFilePathToRef.put(new FilePath(each.getUrl()), ref); } @@ -83,7 +87,7 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple }); } - private List collectDeletedFiles(VirtualFile f, List files) { + private static List collectDeletedFiles(VirtualFile f, List files) { if (!(f instanceof NewVirtualFile)) return files; if (!f.isDirectory()) { @@ -97,6 +101,7 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple return files; } + @Override public void disposeComponent() { } @@ -110,19 +115,7 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple } private DocumentReference doCreate(@NotNull final Document document) { - final int hashCode = document.hashCode(); - Reference reference = new WeakReference(document) { - @Override - public int hashCode() { - return hashCode; - } - - @Override - public boolean equals(Object obj) { - Document mydoc = get(); - return mydoc != null && obj instanceof Reference && ((Reference)obj).get() == mydoc; - } - }; + Reference reference = new WeakReferenceWithEquals(document); DocumentReference result = myDocToRef.get(reference); if (result == null) { result = new DocumentReferenceByDocument(document); @@ -137,15 +130,36 @@ public class DocumentReferenceManagerImpl extends DocumentReferenceManager imple assertInDispatchThread(); assert file.isValid() : "file is invalid: " + file; - DocumentReference result = myFileToRef.get(file); + WeakReferenceWithEquals ref = new WeakReferenceWithEquals(file); + DocumentReference result = myFileToRef.get(ref); if (result == null) { result = new DocumentReferenceByVirtualFile(file); - myFileToRef.put(file, result); + myFileToRef.put(ref, result); } return result; } - private void assertInDispatchThread() { + private static void assertInDispatchThread() { ApplicationManager.getApplication().assertIsDispatchThread(); } + + private static class WeakReferenceWithEquals extends WeakReference { + final int hashCode; + + public WeakReferenceWithEquals(@NotNull T document) { + super(document); + hashCode = document.hashCode(); + } + + @Override + public int hashCode() { + return hashCode; + } + + @Override + public boolean equals(Object obj) { + T doc = get(); + return doc != null && obj instanceof Reference && ((Reference)obj).get() == doc; + } + } } From a26aa57fbee1b53b8a051a2da24de393c41f2ac1 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 24 May 2012 14:48:27 +0400 Subject: [PATCH 036/147] cleanup --- .../intellij/openapi/roots/impl/ModifiableModelCommitter.java | 3 +-- .../src/com/intellij/openapi/roots/impl/SourceFolderImpl.java | 4 +++- .../intellij/openapi/roots/impl/libraries/JarDirectories.java | 4 ++-- .../maven/importing/MavenDefaultModifiableModelsProvider.java | 3 +++ .../jetbrains/idea/maven/importing/MavenRootModelAdapter.java | 3 +-- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModifiableModelCommitter.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModifiableModelCommitter.java index 1ba173dfe919..9d0d766d6b9a 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModifiableModelCommitter.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModifiableModelCommitter.java @@ -34,8 +34,7 @@ import java.util.*; public class ModifiableModelCommitter { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.module.impl.ModifiableModelCommitter"); - public static void multiCommit(ModifiableRootModel[] rootModels, - ModifiableModuleModel moduleModel) { + public static void multiCommit(ModifiableRootModel[] rootModels, ModifiableModuleModel moduleModel) { ApplicationManager.getApplication().assertWriteAccessAllowed(); final List modelsToCommit = getSortedChangedModels(rootModels, moduleModel); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java index 049e7048b875..824a71d36ab4 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java @@ -100,7 +100,9 @@ public class SourceFolderImpl extends ContentFolderBaseImpl implements SourceFol @Override public ContentFolder cloneFolder(ContentEntry contentEntry) { - return new SourceFolderImpl(this, (ContentEntryImpl) contentEntry); + assert !((ContentEntryImpl)contentEntry).isDisposed() : "target entry already disposed: " + contentEntry; + assert !isDisposed() : "Already disposed: " + this; + return new SourceFolderImpl(this, (ContentEntryImpl)contentEntry); } @Override diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/JarDirectories.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/JarDirectories.java index e52129a9915b..b9334dd6685f 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/JarDirectories.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/JarDirectories.java @@ -33,8 +33,8 @@ import java.util.List; * @author nik */ public class JarDirectories implements JDOMExternalizable { - private MultiMap myDirectories = new MultiMap(); - private MultiMap myRecursivelyIncluded = new MultiMap(); + private final MultiMap myDirectories = new MultiMap(); + private final MultiMap myRecursivelyIncluded = new MultiMap(); @NonNls private static final String JAR_DIRECTORY_ELEMENT = "jarDirectory"; @NonNls private static final String URL_ATTR = "url"; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java index f9af5a08c854..81ddd7cbdc2b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java @@ -118,6 +118,9 @@ public class MavenDefaultModifiableModelsProvider extends MavenBaseModifiableMod Collection rootModels = myRootModels.values(); ModifiableRootModel[] rootModels1 = rootModels.toArray(new ModifiableRootModel[rootModels.size()]); + for (ModifiableRootModel model : rootModels1) { + assert !model.isDisposed() : "Already disposed: " + model; + } ModifiableModelCommitter.multiCommit(rootModels1, myModuleModel); for (ModifiableFacetModel each : myFacetModels.values()) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java index adee4cf84848..be944b5ff8fd 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java @@ -114,8 +114,7 @@ public class MavenRootModelAdapter { Url url = toUrl(path); ContentEntry e = getContentRootFor(url); if (e == null) return; - unregisterAll(path, true, true - ); + unregisterAll(path, true, true); unregisterAll(path, false, true); e.addSourceFolder(url.getUrl(), testSource); } From 70052abd0317c90ba072803f0acd50056731d1e1 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Fri, 25 May 2012 14:27:07 +0400 Subject: [PATCH 037/147] IDEA-86397 Delete line (Ctrl+Y) moves caret to the 1st column position Don't restore caret position when it's not necessary --- .../intellij/codeInsight/editorActions/CutHandler.java | 8 +++++++- .../intellij/openapi/editor/EditorModificationUtil.java | 9 +-------- .../openapi/editor/actions/DeleteLineAction.java | 2 ++ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CutHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CutHandler.java index 0dd4089b585f..83efc9586d8a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CutHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CutHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -23,6 +23,7 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorModificationUtil; import com.intellij.openapi.editor.SelectionModel; +import com.intellij.openapi.editor.VisualPosition; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionManager; import com.intellij.openapi.editor.actionSystem.EditorWriteActionHandler; @@ -55,8 +56,10 @@ public class CutHandler extends EditorWriteActionHandler { return; } + VisualPosition positionToRestore = null; SelectionModel selectionModel = editor.getSelectionModel(); if (!selectionModel.hasSelection() && !selectionModel.hasBlockSelection()) { + positionToRestore = editor.getCaretModel().getVisualPosition(); selectionModel.selectLineAtCaret(); if (!selectionModel.hasSelection()) return; } @@ -64,5 +67,8 @@ public class CutHandler extends EditorWriteActionHandler { EditorActionManager.getInstance().getActionHandler(IdeActions.ACTION_EDITOR_COPY).execute(editor, dataContext); EditorModificationUtil.deleteSelectedText(editor); + if (positionToRestore != null) { + editor.getCaretModel().moveToVisualPosition(positionToRestore); + } } } diff --git a/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java b/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java index 260da03d04ce..a2bd9b91ca8e 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java @@ -44,16 +44,9 @@ public class EditorModificationUtil { int selectionStart = selectionModel.getSelectionStart(); int selectionEnd = selectionModel.getSelectionEnd(); - final CaretModel caretModel = editor.getCaretModel(); - final int caretOffset = caretModel.getOffset(); - boolean restorePosition = caretOffset > selectionStart && caretOffset < selectionEnd; - final VisualPosition position = caretModel.getVisualPosition(); - caretModel.moveToOffset(selectionStart); + editor.getCaretModel().moveToOffset(selectionStart); selectionModel.removeSelection(); editor.getDocument().deleteString(selectionStart, selectionEnd); - if (restorePosition) { - caretModel.moveToVisualPosition(position); // Try to preserve visual caret position. - } editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/DeleteLineAction.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/DeleteLineAction.java index 4f29a9e4e2e2..ddf21185c915 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/DeleteLineAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/DeleteLineAction.java @@ -53,8 +53,10 @@ public class DeleteLineAction extends TextComponentEditorAction { document.deleteString(lineStartOffset, nextLineStartOffset); return; } + final VisualPosition position = editor.getCaretModel().getVisualPosition(); editor.getSelectionModel().selectLineAtCaret(); EditorModificationUtil.deleteSelectedText(editor); + editor.getCaretModel().moveToVisualPosition(position); } } } From 0533ecb4a24fc307d7a475b05688b142dc962e06 Mon Sep 17 00:00:00 2001 From: Oleg Sukhodolsky Date: Thu, 24 May 2012 15:29:45 +0400 Subject: [PATCH 038/147] RUBY-11125: we should not create folding if node's text is shorter than 2 symbols #RUBY-11125 fixed to create folding we must have at least two characters in the node we are going to fold --- .../src/com/intellij/indentation/IndentationFoldingBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/indentation/IndentationFoldingBuilder.java b/platform/lang-impl/src/com/intellij/indentation/IndentationFoldingBuilder.java index b084041e699a..63a86d696985 100644 --- a/platform/lang-impl/src/com/intellij/indentation/IndentationFoldingBuilder.java +++ b/platform/lang-impl/src/com/intellij/indentation/IndentationFoldingBuilder.java @@ -32,7 +32,7 @@ public abstract class IndentationFoldingBuilder implements FoldingBuilder, DumbA private void collectDescriptors(@NotNull final ASTNode node, @NotNull final List descriptors) { final ASTNode[] children = node.getChildren(myTokenSet); if (children.length > 0) { - if (node.getTreeParent() !=null && node.getTextLength() > 0) { + if (node.getTreeParent() !=null && node.getTextLength() > 1) { descriptors.add(new FoldingDescriptor(node, node.getTextRange())); } for (ASTNode child : children) { From fc6cb6a998c4abb612cc5f9dc27a2234dda5729f Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 25 May 2012 12:44:28 +0200 Subject: [PATCH 039/147] do not log empty lines --- .../impl/src/com/intellij/compiler/server/BuildManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index 5a0ba7439fb2..68b2e60781b8 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -412,7 +412,7 @@ public class BuildManager implements ApplicationComponent{ public void onTextAvailable(ProcessEvent event, Key outputType) { // re-translate builder's output to idea.log final String text = event.getText(); - if (!StringUtil.isEmpty(text)) { + if (!StringUtil.isEmptyOrSpaces(text)) { LOG.info("BUILDER_PROCESS [" + outputType.toString() + "]: " + text.trim()); if (stdErrOutput.length() < 1024 && ProcessOutputTypes.STDERR.equals(outputType)) { stdErrOutput.append(text); From 2bef429be2f22b5e532a4247cc162a716a46bcd8 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 25 May 2012 12:59:31 +0200 Subject: [PATCH 040/147] schedule automake after runProfile completion --- .../compiler/server/BuildManager.java | 93 ++++++++++--------- 1 file changed, 51 insertions(+), 42 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index 68b2e60781b8..5b88d0b428ea 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -19,12 +19,12 @@ import com.intellij.ProjectTopics; import com.intellij.application.options.PathMacrosImpl; import com.intellij.compiler.CompilerWorkspaceConfiguration; import com.intellij.compiler.server.impl.CompileServerClasspathManager; +import com.intellij.execution.ExecutionAdapter; import com.intellij.execution.ExecutionException; +import com.intellij.execution.ExecutionManager; import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.process.OSProcessHandler; -import com.intellij.execution.process.ProcessAdapter; -import com.intellij.execution.process.ProcessEvent; -import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.process.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.application.PathManager; @@ -114,9 +114,11 @@ public class BuildManager implements ApplicationComponent{ } }; private final SequentialTaskExecutor myEventsProcessor = new SequentialTaskExecutor(myPooledThreadExecutor); - private final Map myProjectDataMap = Collections.synchronizedMap(new HashMap()); + private final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD); + private final AtomicBoolean myAutoMakeInProgress = new AtomicBoolean(false); + private final ChannelGroup myAllOpenChannels = new DefaultChannelGroup("build-manager"); private final BuildMessageDispatcher myMessageDispatcher = new BuildMessageDispatcher(); private int myListenPort = -1; @@ -137,8 +139,6 @@ public class BuildManager implements ApplicationComponent{ projectManager.addProjectManagerListener(new ProjectWatcher()); final MessageBusConnection conn = ApplicationManager.getApplication().getMessageBus().connect(); conn.subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener() { - private final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD); - private final AtomicBoolean myAutoMakeInProgress = new AtomicBoolean(false); @Override public void before(@NotNull List events) { } @@ -146,44 +146,11 @@ public class BuildManager implements ApplicationComponent{ @Override public void after(@NotNull List events) { if (shouldTriggerMake(events)) { - scheduleMake(new Runnable() { - @Override - public void run() { - if (!myAutoMakeInProgress.getAndSet(true)) { - try { - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - @Override - public void run() { - try { - runAutoMake(); - } - finally { - myAutoMakeInProgress.set(false); - } - } - }); - } - catch (RejectedExecutionException ignored) { - // we were shut down - } - } - else { - scheduleMake(this); - } - } - }); + scheduleAutoMake(); } } - private void scheduleMake(Runnable runnable) { - myAlarm.cancelAllRequests(); - myAlarm.addRequest(runnable, MAKE_TRIGGER_DELAY); - } - private boolean shouldTriggerMake(List events) { - if (!CompilerWorkspaceConfiguration.useServerlessOutOfProcessBuild()) { - return false; - } for (VFileEvent event : events) { if (event.isFromRefresh() || event.getRequestor() instanceof SavingRequestor) { return true; @@ -265,10 +232,46 @@ public class BuildManager implements ApplicationComponent{ return vFile != null ? vFile.getPath() : null; } - private void runAutoMake() { + private void scheduleAutoMake() { if (ApplicationManager.getApplication().isUnitTestMode()) { return; } + if (CompilerWorkspaceConfiguration.useServerlessOutOfProcessBuild()) { + addMakeRequest(new Runnable() { + @Override + public void run() { + if (!myAutoMakeInProgress.getAndSet(true)) { + try { + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + @Override + public void run() { + try { + runAutoMake(); + } + finally { + myAutoMakeInProgress.set(false); + } + } + }); + } + catch (RejectedExecutionException ignored) { + // we were shut down + } + } + else { + addMakeRequest(this); + } + } + }); + } + } + + private void addMakeRequest(Runnable runnable) { + myAlarm.cancelAllRequests(); + myAlarm.addRequest(runnable, MAKE_TRIGGER_DELAY); + } + + private void runAutoMake() { final Project[] openProjects = myProjectManager.getOpenProjects(); if (openProjects.length > 0) { final List futures = new ArrayList(); @@ -819,6 +822,12 @@ public class BuildManager implements ApplicationComponent{ } } }); + conn.subscribe(ExecutionManager.EXECUTION_TOPIC, new ExecutionAdapter() { + @Override + public void processTerminated(@NotNull RunProfile runProfile, @NotNull ProcessHandler handler) { + scheduleAutoMake(); + } + }); } @Override From b82226d8436d8dc397bd847da4373e0e0a96e37b Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Fri, 25 May 2012 15:21:30 +0400 Subject: [PATCH 041/147] Inplace editing --- .../propertyTable/editors/ResourceEditor.java | 10 ++-- .../designSurface/InplaceEditingLayer.java | 54 +++++++++++++------ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java index d5c4269ed3d1..147d4c0638c3 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java +++ b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java @@ -132,7 +132,7 @@ public class ResourceEditor extends PropertyEditor { private Dimension getComponentPreferredSize() { Dimension size1 = myEditor.getChildComponent().getPreferredSize(); Dimension size2 = myEditor.getButton().getPreferredSize(); - return new Dimension(size1.width + size2.width + 5, size1.height); + return new Dimension(Math.max(size1.width, 25) + 5 + size2.width, size1.height); } private static ResourceType[] convertTypes(Set formats) { @@ -177,8 +177,12 @@ public class ResourceEditor extends PropertyEditor { myRootComponent = rootComponent; JTextField text = getComboText(); text.setText((String)value); - if (inplaceContext != null && inplaceContext.isStartChar()) { - text.setText(inplaceContext.getText(text.getText())); + if (inplaceContext != null) { + text.setColumns(0); + + if (inplaceContext.isStartChar()) { + text.setText(inplaceContext.getText(text.getText())); + } } return myEditor; } diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/InplaceEditingLayer.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/InplaceEditingLayer.java index 560619fce313..4fe64fd9ddc0 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/InplaceEditingLayer.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/InplaceEditingLayer.java @@ -15,6 +15,7 @@ */ package com.intellij.designer.designSurface; +import com.intellij.designer.DesignerBundle; import com.intellij.designer.designSurface.feedbacks.LineMarginBorder; import com.intellij.designer.model.RadComponent; import com.intellij.designer.propertyTable.InplaceContext; @@ -27,11 +28,13 @@ import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.wm.FocusWatcher; import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy; import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; +import com.intellij.util.ThrowableRunnable; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -87,6 +90,9 @@ public class InplaceEditingLayer extends JComponent { adjustInplaceComponentSize(); } }; + + private RadComponent myRadComponent; + private List myProperties; private List myEditors; private final DesignerEditorPanel myDesigner; @@ -104,13 +110,15 @@ public class InplaceEditingLayer extends JComponent { return; } - RadComponent radComponent = selection.get(0); - List inplaceProperties = radComponent.getInplaceProperties(); - if (inplaceProperties.isEmpty()) { + myRadComponent = selection.get(0); + myProperties = myRadComponent.getInplaceProperties(); + if (myProperties.isEmpty()) { + myRadComponent = null; + myProperties = null; return; } - myInplaceComponent = new JPanel(new GridLayoutManager(inplaceProperties.size(), 2)); + myInplaceComponent = new JPanel(new GridLayoutManager(myProperties.size(), 2)); myInplaceComponent.setBorder(new LineMarginBorder(5, 5, 5, 5)); new AnAction() { @Override @@ -119,8 +127,6 @@ public class InplaceEditingLayer extends JComponent { } }.registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)), myInplaceComponent); - int row = 0; - myEditors = new ArrayList(); JComponent componentToFocus = null; @@ -130,7 +136,8 @@ public class InplaceEditingLayer extends JComponent { inplaceContext = new InplaceContext(); } - for (Property property : inplaceProperties) { + int row = 0; + for (Property property : myProperties) { JLabel label = new JLabel(property.getName() + ":"); if (font == null) { font = label.getFont().deriveFont(Font.BOLD); @@ -144,11 +151,12 @@ public class InplaceEditingLayer extends JComponent { PropertyEditor editor = property.getEditor(); myEditors.add(editor); - JComponent component = editor.getComponent(radComponent.getRoot(), radComponent, property.getValue(radComponent), inplaceContext); + JComponent component = + editor.getComponent(myRadComponent.getRoot(), myRadComponent, property.getValue(myRadComponent), inplaceContext); myInplaceComponent.add(component, - new GridConstraints(row++, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, 0, 0, - null, null, null)); + new GridConstraints(row++, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, + GridConstraints.SIZEPOLICY_CAN_GROW, 0, null, null, null)); if (componentToFocus == null) { componentToFocus = editor.getPreferredFocusedComponent(); @@ -159,10 +167,10 @@ public class InplaceEditingLayer extends JComponent { editor.addPropertyEditorListener(myEditorListener); } - Rectangle bounds = radComponent.getBounds(this); + Rectangle bounds = myRadComponent.getBounds(this); Dimension size = myInplaceComponent.getPreferredSize(); - myPreferredWidth = size.width; - myInplaceComponent.setBounds(bounds.x, bounds.y, size.width, size.height); + myPreferredWidth = Math.max(size.width, bounds.width); + myInplaceComponent.setBounds(bounds.x, bounds.y, myPreferredWidth, size.height); add(myInplaceComponent); if (componentToFocus == null) { @@ -191,7 +199,22 @@ public class InplaceEditingLayer extends JComponent { if (myInplaceComponent != null) { if (commit) { - // TODO: Auto-generated method stub + myDesigner.getToolProvider().execute(new ThrowableRunnable() { + @Override + public void run() throws Exception { + int size = myProperties.size(); + + for (int i = 0; i < size; i++) { + Property property = myProperties.get(i); + Object oldValue = property.getValue(myRadComponent); + Object newValue = myEditors.get(i).getValue(); + + if (!Comparing.equal(oldValue, newValue)) { + property.setValue(myRadComponent, newValue); + } + } + } + }, DesignerBundle.message("command.set.property.value"), true); } for (PropertyEditor editor : myEditors) { @@ -203,6 +226,8 @@ public class InplaceEditingLayer extends JComponent { myInplaceComponent = null; } + myRadComponent = null; + myProperties = null; myEditors = null; myDesigner.getPreferredFocusedComponent().requestFocusInWindow(); @@ -218,7 +243,6 @@ public class InplaceEditingLayer extends JComponent { width = Math.min(width, getWidth() - myInplaceComponent.getX()); myInplaceComponent.setSize(width, myInplaceComponent.getHeight()); myInplaceComponent.revalidate(); - System.out.println("size: " + width); } private void removeInplaceComponent() { From 1c1b1acc1768e809676b6d0812f4e1678bed7d3c Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Thu, 24 May 2012 17:56:19 +0400 Subject: [PATCH 042/147] Revert: IDEA-81494 (Frequent "language level changed" notifications when re-importing maven projects) (02efd74) --- .../jetbrains/idea/maven/importing/MavenModuleImporter.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java index 4b11cb43148b..8379f2ea32eb 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java @@ -158,8 +158,6 @@ public class MavenModuleImporter { private void configLanguageLevel() { final LanguageLevel level = LanguageLevel.parse(myMavenProject.getSourceLevel()); - if (level != null) { - myRootModelAdapter.setLanguageLevel(level); - } + myRootModelAdapter.setLanguageLevel(level); } } From 922ccdd74b50cb3704a58916fcd9167e7162f578 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Fri, 25 May 2012 15:24:03 +0400 Subject: [PATCH 043/147] Replace Logger.getInstance("#com.jetbrains.idea.ClassName") to Logger.getInstance(ClassName.class) --- .../idea/maven/dom/MavenDomElementDescriptorHolder.java | 2 +- .../org/jetbrains/idea/maven/execution/MavenResumeAction.java | 2 +- .../java/org/jetbrains/idea/maven/execution/MavenRunner.java | 2 +- .../org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomElementDescriptorHolder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomElementDescriptorHolder.java index 5f4cf19f3724..a453fac165e7 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomElementDescriptorHolder.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomElementDescriptorHolder.java @@ -41,7 +41,7 @@ import java.net.URL; import java.util.Map; public class MavenDomElementDescriptorHolder { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.maven.dom.MavenDomElementDescriptorHolder"); + private static final Logger LOG = Logger.getInstance(MavenDomElementDescriptorHolder.class); private enum FileKind { PROJECT_FILE { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java index c4ac16e22f89..6371106883f2 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java @@ -49,7 +49,7 @@ import java.util.Set; */ public class MavenResumeAction extends AnAction { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.maven.execution.MavenResumeAction"); + private static final Logger LOG = Logger.getInstance(MavenResumeAction.class); private static final Set PARAMS_DISABLING_RESUME = CollectionFactory.newSet("-rf", "-resume-from", "-pl", "-projects", "-am", "-also-make", "-amd", "-also-make-dependents"); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java index 2496bfeff445..c92a70804daf 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java @@ -40,7 +40,7 @@ import java.util.List; @State(name = "MavenRunner", storages = {@Storage( file = StoragePathMacros.WORKSPACE_FILE)}) public class MavenRunner implements PersistentStateComponent { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.maven.execution.MavenRunner"); + private static final Logger LOG = Logger.getInstance(MavenRunner.class); private MavenRunnerSettings mySettings = new MavenRunnerSettings(); private final Project myProject; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java index 83a708c1147f..23229ede46c9 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java @@ -38,7 +38,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class MavenMergingUpdateQueue extends MergingUpdateQueue { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.maven.utils.MavenMergingUpdateQueue"); + private static final Logger LOG = Logger.getInstance(MavenMergingUpdateQueue.class); private final AtomicInteger mySuspendCounter = new AtomicInteger(0); From 4ff68f609c754249985c8e1bca0fb8c44dc75c3d Mon Sep 17 00:00:00 2001 From: irengrig Date: Fri, 25 May 2012 15:28:00 +0400 Subject: [PATCH 044/147] svnkit 9249 --- plugins/svn4idea/lib/svnkit-javahl.jar | Bin 329669 -> 329668 bytes plugins/svn4idea/lib/svnkit-javahl16.zip | Bin 165837 -> 165836 bytes plugins/svn4idea/lib/svnkit.jar | Bin 3328529 -> 3328982 bytes plugins/svn4idea/lib/svnkitsrc.zip | Bin 2099992 -> 2100235 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/svn4idea/lib/svnkit-javahl.jar b/plugins/svn4idea/lib/svnkit-javahl.jar index b19c1cef3f55f0eb5f51794f1e5e6c8cb9eb716b..2520dabae9bc24379299c6f592d6a2c97306bad8 100644 GIT binary patch delta 11895 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 delta 2896 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

yv)U(qT5A1g{c^@&HXXfqLgH)&WN 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�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 delta 233824 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

7?O0Hu-N;_Ar7J~6r4(xCy~;8);UG~q;e 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%0A6?mJ%>wI@}$ou+4;5<+oS!i&u#ay1H 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 diff --git a/plugins/svn4idea/lib/svnkitsrc.zip b/plugins/svn4idea/lib/svnkitsrc.zip index f5992f24a3e313f75a148570ea4de0cc9bc70250..87949bb3907cfb3ff37853ec475840b84bfb97eb 100644 GIT binary patch delta 146685 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

o!6hn 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%0DW|VD+17- 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≺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

42_(6lF^|;my&Z(O9U+8FMCscZ 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 Gum1tN9oUQj delta 147280 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