Commit 4c66078e authored by Vladislav Rassokhin's avatar Vladislav Rassokhin Committed by intellij-monorepo-bot
Browse files

[xml] fix incremental lexing in unfinished doctype elements

GitOrigin-RevId: 5a0b5097503cf568a36c6142799fc8afb326fa9d
parent ef5a50f2
Showing with 158 additions and 86 deletions
+158 -86
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.daemon;
import com.intellij.application.options.XmlSettings;
......@@ -1048,8 +1048,8 @@ public class XmlHighlightingTest extends DaemonAnalyzerTestCase {
text = "<!DOCTYPE schema [ <!ENTITY RelativeURL \"[^:#/\\?]*(:{0,0}|[#/\\?].*)\">";
xmlHighlighter.setText(text);
iterator = xmlHighlighter.createIterator(53);
assertSame("Xml attribute value", XmlTokenType.XML_DATA_CHARACTERS, iterator.getTokenType());
assertEquals(41, iterator.getStart());
assertSame("Xml unfinished markup declaration", XmlElementType.XML_MARKUP_DECL, iterator.getTokenType());
assertEquals(17, iterator.getStart());
assertEquals(70, iterator.getEnd());
// 10 20 30 40 50 60
......
......@@ -76,13 +76,27 @@ public class XmlHighlighterTest extends LightJavaCodeInsightTestCase {
// Found by XmlCodeInsightSanityTest.testIncrementalHighlighterUpdate
configure("<idea-plugin><name>Remote", " Interpreter</name></idea-plugin>", XmlFileType.INSTANCE);
Runnable action = () -> {
runConsistencyTest( () -> {
// Wrapping ' Interpreter'. Note space in front
doc.insertString(offset, "${");
doc.insertString(offset + 14, "}");
};
CommandProcessor.getInstance().executeCommand(getProject(), () -> ApplicationManager.getApplication().runWriteAction(action), "", null);
CheckHighlighterConsistency.performCheck(editor);
});
}
public void testUnfinishedStringInDoctype() {
// Found by XmlCodeInsightSanityTest.testIncrementalHighlighterUpdate
//noinspection TextBlockMigration
configure("<!DOCTYPE faces-config PUBLIC\n" +
" \"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN",
"\"\n" +
" \"http://java.sun.com/dtd/web-facesconfig_1_1.dtd\">\n" +
"<faces-config>\n" +
"</faces-config>\n", XmlFileType.INSTANCE);
runConsistencyTest( () -> {
doc.deleteString(offset, doc.getTextLength()); // Remove everything after 'EN', leave string unfinished
doc.insertString(offset - 25, "\""); // Close string in the middle
});
}
public void testUnclosedCommentAtEnd() {
......@@ -99,4 +113,9 @@ public class XmlHighlighterTest extends LightJavaCodeInsightTestCase {
List<IElementType> newTokens = EditorTestUtil.getAllTokens(highlighter);
assertEquals(oldTokens, newTokens);
}
private void runConsistencyTest(Runnable action) {
CommandProcessor.getInstance().executeCommand(getProject(), () -> ApplicationManager.getApplication().runWriteAction(action), "", null);
CheckHighlighterConsistency.performCheck(editor);
}
}
......@@ -29,6 +29,22 @@ public class XmlLexerTest extends LexerTestCase {
return PlatformTestUtil.getCommunityPath().replace(File.separatorChar, '/') + "/" + getDirPath() + "/" + getTestName(true) + extension;
}
public void testWrappedEL() {
doTest("<idea-plugin><name>Remote${ Interpreter}</name></idea-plugin>");
}
public void testUnfinishedEL() {
doTest("<idea-plugin><name>Remote${ Interpreter</name></idea-plugin>");
}
public void testUnfinishedStringInDoctype() {
doTest("<!DOCTYPE faces-config PUBLIC \"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config1.0//EN");
}
public void testUnfinishedMarkupDeclarationInDoctype() {
doTest("<!DOCTYPE schema [ <!ENTITY RelativeURL \"[^:#/\\?]*(:{0,0}|[#/\\?].*)\">");
}
public void testPerformance1() throws IOException {
doTestPerformance("pallada.xml", 200);
......
XML_START_TAG_START ('<')
XML_NAME ('idea-plugin')
XML_TAG_END ('>')
XML_START_TAG_START ('<')
XML_NAME ('name')
XML_TAG_END ('>')
XML_DATA_CHARACTERS ('Remote${ Interpreter')
XML_END_TAG_START ('</')
XML_NAME ('name')
XML_TAG_END ('>')
XML_END_TAG_START ('</')
XML_NAME ('idea-plugin')
XML_TAG_END ('>')
XML_DOCTYPE_START ('<!DOCTYPE')
WHITE_SPACE (' ')
XML_NAME ('schema')
WHITE_SPACE (' ')
XML_MARKUP_DECL ('[ <!ENTITY RelativeURL "[^:#/\?]*(:{0,0}|[#/\?].*)">')
XML_DOCTYPE_START ('<!DOCTYPE')
WHITE_SPACE (' ')
XML_NAME ('faces-config')
WHITE_SPACE (' ')
XML_DOCTYPE_PUBLIC ('PUBLIC')
WHITE_SPACE (' ')
XML_ATTRIBUTE_VALUE_TOKEN ('"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config1.0//EN')
XML_START_TAG_START ('<')
XML_NAME ('idea-plugin')
XML_TAG_END ('>')
XML_START_TAG_START ('<')
XML_NAME ('name')
XML_TAG_END ('>')
XML_DATA_CHARACTERS ('Remote${ Interpreter}')
XML_END_TAG_START ('</')
XML_NAME ('name')
XML_TAG_END ('>')
XML_END_TAG_START ('</')
XML_NAME ('idea-plugin')
XML_TAG_END ('>')
......@@ -292,17 +292,17 @@ public class __XmlLexer implements FlexLexer {
"\1\2\1\3\1\5\1\3\1\6\1\3\1\7\1\10"+
"\1\3\1\10\4\11\1\12\1\13\1\14\1\13\1\15"+
"\1\16\1\17\1\20\1\17\1\21\1\17\1\22\1\17"+
"\1\23\1\24\2\23\1\14\3\23\2\3\1\25\2\12"+
"\1\3\2\1\4\26\1\13\1\26\1\27\1\30\7\0"+
"\1\31\1\32\1\33\1\6\1\0\1\10\1\34\1\10"+
"\1\12\2\0\1\16\1\35\1\0\1\35\3\0\2\12"+
"\2\0\1\36\1\0\1\37\1\30\3\0\1\40\10\0"+
"\1\41\1\42\1\43\1\35\1\44\2\12\1\45\1\46"+
"\2\0\1\47\2\0\2\12\2\0\2\12\2\0\1\50"+
"\1\51\4\0\1\52\1\53";
"\1\23\1\24\2\23\1\14\5\23\1\25\2\12\1\26"+
"\2\1\4\27\1\13\1\27\1\30\1\31\7\0\1\32"+
"\1\33\1\34\1\6\1\0\1\10\1\35\1\10\1\12"+
"\2\0\1\16\1\36\1\0\1\36\1\0\2\12\1\0"+
"\1\26\1\0\1\37\1\31\3\0\1\40\10\0\1\41"+
"\1\42\1\43\1\36\1\44\2\12\1\45\1\46\2\0"+
"\1\47\2\0\2\12\2\0\2\12\2\0\1\50\1\51"+
"\4\0\1\52\1\53";
private static int [] zzUnpackAction() {
int [] result = new int[147];
int [] result = new int[144];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
......@@ -338,17 +338,16 @@ public class __XmlLexer implements FlexLexer {
"\0\u04d0\0\u03f0\0\u09a0\0\u05b0\0\u09d8\0\u0a10\0\u04d0\0\u0a48"+
"\0\u0a80\0\u0ab8\0\u0af0\0\u0b28\0\u0b60\0\u0b98\0\u0bd0\0\u04d0"+
"\0\u04d0\0\u04d0\0\u0c08\0\u0c40\0\u0c78\0\u04d0\0\u0cb0\0\u0ce8"+
"\0\u0d20\0\u0d58\0\u0d90\0\u0dc8\0\u0e00\0\u0e38\0\u0e70\0\u0850"+
"\0\u0888\0\u0ea8\0\u0ee0\0\u0930\0\u0f18\0\u04d0\0\u0f50\0\u04d0"+
"\0\u04d0\0\u0f88\0\u0fc0\0\u0ff8\0\u04d0\0\u1030\0\u1068\0\u10a0"+
"\0\u10d8\0\u1110\0\u1148\0\u1180\0\u11b8\0\u05e8\0\u04d0\0\u04d0"+
"\0\u04d0\0\u04d0\0\u11f0\0\u1228\0\u04d0\0\u04d0\0\u1260\0\u1298"+
"\0\u04d0\0\u12d0\0\u1308\0\u1340\0\u1378\0\u13b0\0\u13e8\0\u1420"+
"\0\u1458\0\u1490\0\u14c8\0\u0690\0\u0690\0\u1500\0\u1538\0\u1570"+
"\0\u15a8\0\u04d0\0\u04d0";
"\0\u0d20\0\u0d58\0\u0d90\0\u0dc8\0\u0e00\0\u0e38\0\u0e70\0\u0ea8"+
"\0\u0ee0\0\u0f18\0\u04d0\0\u0f50\0\u04d0\0\u04d0\0\u0f88\0\u0fc0"+
"\0\u0ff8\0\u04d0\0\u1030\0\u1068\0\u10a0\0\u10d8\0\u1110\0\u1148"+
"\0\u1180\0\u11b8\0\u05e8\0\u04d0\0\u04d0\0\u04d0\0\u04d0\0\u11f0"+
"\0\u1228\0\u04d0\0\u04d0\0\u1260\0\u1298\0\u04d0\0\u12d0\0\u1308"+
"\0\u1340\0\u1378\0\u13b0\0\u13e8\0\u1420\0\u1458\0\u1490\0\u14c8"+
"\0\u0690\0\u0690\0\u1500\0\u1538\0\u1570\0\u15a8\0\u04d0\0\u04d0";
private static int [] zzUnpackRowMap() {
int [] result = new int[147];
int [] result = new int[144];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
......@@ -409,59 +408,59 @@ public class __XmlLexer implements FlexLexer {
"\16\44\3\0\12\45\1\131\55\45\2\0\1\132\77\0"+
"\2\51\1\0\1\51\1\133\5\0\20\51\3\0\16\51"+
"\70\0\1\134\23\0\1\135\133\0\1\136\23\0\1\137"+
"\46\0\3\140\1\61\64\140\10\141\1\61\57\141\12\0"+
"\2\44\1\0\1\44\1\130\5\0\16\44\1\142\1\44"+
"\46\0\3\71\1\61\64\71\10\72\1\61\57\72\12\0"+
"\2\44\1\0\1\44\1\130\5\0\16\44\1\140\1\44"+
"\3\0\16\44\15\0\2\44\1\0\1\44\1\130\5\0"+
"\17\44\1\143\3\0\16\44\3\0\3\144\1\145\42\144"+
"\1\146\21\144\46\0\1\147\33\0\1\131\56\0\2\105"+
"\17\44\1\141\3\0\16\44\3\0\3\76\1\142\42\76"+
"\1\143\21\76\46\0\1\144\33\0\1\131\56\0\2\105"+
"\4\0\1\105\1\0\1\105\1\0\1\105\1\0\1\105"+
"\6\0\20\105\4\0\15\105\2\0\1\105\22\0\1\150"+
"\45\0\20\110\1\0\45\110\1\151\1\110\15\0\1\152"+
"\46\0\1\153\15\0\2\112\1\0\1\112\1\154\1\155"+
"\6\0\20\105\4\0\15\105\2\0\1\105\22\0\1\145"+
"\45\0\20\110\1\0\45\110\1\146\1\110\15\0\1\147"+
"\46\0\1\150\15\0\2\112\1\0\1\112\1\151\1\152"+
"\4\0\20\112\3\0\16\112\15\0\2\112\1\0\1\112"+
"\1\154\1\155\4\0\20\112\3\0\5\112\1\156\2\112"+
"\1\157\5\112\15\0\2\112\1\0\1\112\1\154\1\155"+
"\4\0\20\112\3\0\13\112\1\160\2\112\15\0\2\112"+
"\1\0\1\112\1\154\1\155\4\0\20\112\3\0\2\112"+
"\1\161\13\112\15\0\2\112\1\0\1\112\1\154\1\155"+
"\4\0\20\112\3\0\14\112\1\162\1\112\15\0\1\163"+
"\14\0\1\164\14\0\1\165\35\0\2\123\1\0\1\123"+
"\6\0\20\123\3\0\16\123\15\0\1\163\31\0\1\165"+
"\1\151\1\152\4\0\20\112\3\0\5\112\1\153\2\112"+
"\1\154\5\112\15\0\2\112\1\0\1\112\1\151\1\152"+
"\4\0\20\112\3\0\13\112\1\155\2\112\15\0\2\112"+
"\1\0\1\112\1\151\1\152\4\0\20\112\3\0\2\112"+
"\1\156\13\112\15\0\2\112\1\0\1\112\1\151\1\152"+
"\4\0\20\112\3\0\14\112\1\157\1\112\15\0\1\160"+
"\14\0\1\161\14\0\1\162\35\0\2\123\1\0\1\123"+
"\6\0\20\123\3\0\16\123\15\0\1\160\31\0\1\162"+
"\35\0\2\125\1\0\1\125\6\0\20\125\3\0\16\125"+
"\15\0\2\35\1\0\1\35\1\125\5\0\20\35\3\0"+
"\4\35\1\166\11\35\15\0\2\130\1\0\1\130\6\0"+
"\20\130\3\0\16\130\25\0\1\167\111\0\1\170\35\0"+
"\4\35\1\163\11\35\15\0\2\130\1\0\1\130\6\0"+
"\20\130\3\0\16\130\25\0\1\164\111\0\1\165\35\0"+
"\2\133\1\0\1\133\6\0\20\133\3\0\16\133\3\0"+
"\3\134\1\0\62\134\1\171\1\134\3\135\1\0\2\135"+
"\1\172\61\135\10\136\1\0\55\136\1\171\1\136\6\137"+
"\1\172\1\137\1\0\57\137\12\0\2\44\1\0\1\44"+
"\1\130\5\0\1\44\1\173\16\44\3\0\16\44\15\0"+
"\2\44\1\0\1\44\1\130\5\0\14\44\1\174\3\44"+
"\3\0\16\44\3\0\3\145\1\144\64\145\22\0\1\175"+
"\62\0\1\152\1\0\1\176\65\0\1\177\6\0\6\177"+
"\16\0\2\177\30\0\2\154\1\0\1\154\1\0\1\155"+
"\4\0\20\154\3\0\16\154\15\0\2\112\1\0\1\112"+
"\1\154\1\155\4\0\20\112\3\0\10\112\1\160\5\112"+
"\15\0\2\112\1\0\1\112\1\154\1\155\4\0\20\112"+
"\3\0\7\112\1\200\6\112\15\0\2\112\1\0\1\112"+
"\1\154\1\176\4\0\20\112\3\0\16\112\15\0\2\112"+
"\1\0\1\112\1\154\1\155\4\0\20\112\3\0\12\112"+
"\1\156\3\112\15\0\2\112\1\0\1\112\1\154\1\155"+
"\4\0\20\112\3\0\7\112\1\114\6\112\15\0\1\201"+
"\113\0\1\202\57\0\1\203\53\0\2\44\1\0\1\44"+
"\1\130\5\0\10\44\1\204\7\44\3\0\16\44\15\0"+
"\2\44\1\0\1\44\1\130\5\0\15\44\1\205\2\44"+
"\3\0\16\44\20\0\1\177\1\0\1\176\4\0\6\177"+
"\16\0\2\177\30\0\2\112\1\0\1\112\1\154\1\155"+
"\4\0\20\112\3\0\12\112\1\160\3\112\31\0\1\206"+
"\70\0\1\207\52\0\2\44\1\0\1\44\1\130\5\0"+
"\7\44\1\210\10\44\3\0\16\44\15\0\2\44\1\0"+
"\1\44\1\130\5\0\4\44\1\211\13\44\3\0\16\44"+
"\44\0\1\212\52\0\1\213\55\0\2\44\1\0\1\44"+
"\1\130\5\0\2\44\1\214\15\44\3\0\16\44\15\0"+
"\2\44\1\0\1\44\1\130\5\0\11\44\1\215\6\44"+
"\3\0\16\44\46\0\1\216\65\0\1\217\65\0\1\220"+
"\54\0\1\221\73\0\1\222\103\0\1\223\23\0";
"\3\134\1\0\62\134\1\166\1\134\3\135\1\0\2\135"+
"\1\167\61\135\10\136\1\0\55\136\1\166\1\136\6\137"+
"\1\167\1\137\1\0\57\137\12\0\2\44\1\0\1\44"+
"\1\130\5\0\1\44\1\170\16\44\3\0\16\44\15\0"+
"\2\44\1\0\1\44\1\130\5\0\14\44\1\171\3\44"+
"\3\0\16\44\3\0\3\142\1\76\64\142\22\0\1\172"+
"\62\0\1\147\1\0\1\173\65\0\1\174\6\0\6\174"+
"\16\0\2\174\30\0\2\151\1\0\1\151\1\0\1\152"+
"\4\0\20\151\3\0\16\151\15\0\2\112\1\0\1\112"+
"\1\151\1\152\4\0\20\112\3\0\10\112\1\155\5\112"+
"\15\0\2\112\1\0\1\112\1\151\1\152\4\0\20\112"+
"\3\0\7\112\1\175\6\112\15\0\2\112\1\0\1\112"+
"\1\151\1\173\4\0\20\112\3\0\16\112\15\0\2\112"+
"\1\0\1\112\1\151\1\152\4\0\20\112\3\0\12\112"+
"\1\153\3\112\15\0\2\112\1\0\1\112\1\151\1\152"+
"\4\0\20\112\3\0\7\112\1\114\6\112\15\0\1\176"+
"\113\0\1\177\57\0\1\200\53\0\2\44\1\0\1\44"+
"\1\130\5\0\10\44\1\201\7\44\3\0\16\44\15\0"+
"\2\44\1\0\1\44\1\130\5\0\15\44\1\202\2\44"+
"\3\0\16\44\20\0\1\174\1\0\1\173\4\0\6\174"+
"\16\0\2\174\30\0\2\112\1\0\1\112\1\151\1\152"+
"\4\0\20\112\3\0\12\112\1\155\3\112\31\0\1\203"+
"\70\0\1\204\52\0\2\44\1\0\1\44\1\130\5\0"+
"\7\44\1\205\10\44\3\0\16\44\15\0\2\44\1\0"+
"\1\44\1\130\5\0\4\44\1\206\13\44\3\0\16\44"+
"\44\0\1\207\52\0\1\210\55\0\2\44\1\0\1\44"+
"\1\130\5\0\2\44\1\211\15\44\3\0\16\44\15\0"+
"\2\44\1\0\1\44\1\130\5\0\11\44\1\212\6\44"+
"\3\0\16\44\46\0\1\213\65\0\1\214\65\0\1\215"+
"\54\0\1\216\73\0\1\217\103\0\1\220\23\0";
private static int [] zzUnpacktrans() {
int [] result = new int[5600];
......@@ -507,12 +506,12 @@ public class __XmlLexer implements FlexLexer {
"\1\1\1\11\1\1\2\11\10\1\1\11\3\1\1\11"+
"\1\1\1\11\5\1\1\11\1\1\7\0\3\11\1\1"+
"\1\0\1\1\1\11\2\1\2\0\2\1\1\0\1\1"+
"\3\0\2\1\2\0\1\11\1\0\2\11\3\0\1\11"+
"\1\0\2\1\1\0\1\11\1\0\2\11\3\0\1\11"+
"\10\0\1\1\4\11\2\1\2\11\2\0\1\11\2\0"+
"\2\1\2\0\2\1\2\0\2\1\4\0\2\11";
private static int [] zzUnpackAttribute() {
int [] result = new int[147];
int [] result = new int[144];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
......@@ -968,47 +967,47 @@ public class __XmlLexer implements FlexLexer {
// fall through
case 64: break;
case 22:
{ yybegin(COMMENT); return XmlTokenType.XML_COMMENT_CHARACTERS;
{ return XmlElementType.XML_MARKUP_DECL;
}
// fall through
case 65: break;
case 23:
{ yybegin(COMMENT); return XmlTokenType.XML_CONDITIONAL_COMMENT_END;
{ yybegin(COMMENT); return XmlTokenType.XML_COMMENT_CHARACTERS;
}
// fall through
case 66: break;
case 24:
{ return elTokenType;
{ yybegin(COMMENT); return XmlTokenType.XML_CONDITIONAL_COMMENT_END;
}
// fall through
case 67: break;
case 25:
{ yybegin(END_TAG); return XmlTokenType.XML_END_TAG_START;
{ return elTokenType;
}
// fall through
case 68: break;
case 26:
{ yybegin(PROCESSING_INSTRUCTION); return XmlTokenType.XML_PI_START;
{ yybegin(END_TAG); return XmlTokenType.XML_END_TAG_START;
}
// fall through
case 69: break;
case 27:
{ yybegin(YYINITIAL); return XmlTokenType.XML_EMPTY_ELEMENT_END;
{ yybegin(PROCESSING_INSTRUCTION); return XmlTokenType.XML_PI_START;
}
// fall through
case 70: break;
case 28:
{ yybegin(YYINITIAL); return XmlTokenType.XML_PI_END;
{ yybegin(YYINITIAL); return XmlTokenType.XML_EMPTY_ELEMENT_END;
}
// fall through
case 71: break;
case 29:
{ return elTokenType2;
{ yybegin(YYINITIAL); return XmlTokenType.XML_PI_END;
}
// fall through
case 72: break;
case 30:
{ return XmlElementType.XML_MARKUP_DECL;
{ return elTokenType2;
}
// fall through
case 73: break;
......
......@@ -119,9 +119,9 @@ CONDITIONAL_COMMENT_CONDITION=({ALPHA})({ALPHA}|{S}|{DIGIT}|"."|"("|")"|"|"|"!"|
<DOCTYPE> "SYSTEM" { return XmlTokenType.XML_DOCTYPE_SYSTEM; }
<DOCTYPE> "PUBLIC" { return XmlTokenType.XML_DOCTYPE_PUBLIC; }
<DOCTYPE> {NAME} { return XmlTokenType.XML_NAME; }
<DOCTYPE> "\""[^\"]*"\"" { return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN;}
<DOCTYPE> "'"[^']*"'" { return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN;}
<DOCTYPE> "["(([^\]\"]*)|(\"[^\"]*\"))*"]" { return XmlElementType.XML_MARKUP_DECL;}
<DOCTYPE> "\"" [^\"]* "\""? { return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN;}
<DOCTYPE> "'" [^']* "'"? { return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN;}
<DOCTYPE> "[" (([^\]\"]*)|(\"[^\"]*\"))* "]"? { return XmlElementType.XML_MARKUP_DECL;}
<DOCTYPE> ">" { yybegin(YYINITIAL); return XmlTokenType.XML_DOCTYPE_END; }
<YYINITIAL> "<?" { yybegin(PROCESSING_INSTRUCTION); return XmlTokenType.XML_PI_START; }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment