2424import lombok .Getter ;
2525import lombok .SneakyThrows ;
2626import lombok .experimental .Accessors ;
27+ import org .antlr .v4 .runtime .IncrementalParser ;
28+ import org .antlr .v4 .runtime .IncrementalTokenStream ;
2729import org .antlr .v4 .runtime .Lexer ;
2830import org .antlr .v4 .runtime .Parser ;
2931import org .antlr .v4 .runtime .TokenStream ;
3335import java .util .Collections ;
3436import java .util .List ;
3537
36- public class TestParser <P extends Parser , L extends Lexer > {
38+ public class TestParser <PARSER extends Parser , LEXER extends Lexer > {
3739
3840 private final List <String > ruleNames ;
3941
4042 @ Getter
41- private final TestLexer <L > lexer ;
43+ private final TestLexer <LEXER > lexer ;
4244
4345 @ Getter
44- private final Class <P > parserClazz ;
46+ private final Class <PARSER > parserClazz ;
4547
4648 @ Getter
47- private final Class <L > lexerClazz ;
49+ private final Class <LEXER > lexerClazz ;
4850
4951 @ Getter
5052 @ Accessors (fluent = true )
51- private P parser ;
53+ private PARSER parser ;
54+
55+ private final boolean supportRebuild ;
5256
5357 @ SneakyThrows
54- public TestParser (Class <P > parserClazz , Class <L > lexerClazz ) {
58+ public TestParser (Class <PARSER > parserClazz , Class <LEXER > lexerClazz ) {
5559 this .lexer = new TestLexer <>(lexerClazz );
5660 this .parserClazz = parserClazz ;
5761 this .lexerClazz = lexerClazz ;
@@ -64,6 +68,8 @@ public TestParser(Class<P> parserClazz, Class<L> lexerClazz) {
6468 } else {
6569 ruleNames = Collections .emptyList ();
6670 }
71+
72+ this .supportRebuild = IncrementalParser .class .isAssignableFrom (parserClazz );
6773 }
6874
6975 /**
@@ -87,14 +93,14 @@ public String ruleName(Integer type) {
8793 * @return служебный класс для замыкания
8894 */
8995 public ParserAsserts assertThat (String inputString ) {
90- parser = createParser (L .DEFAULT_MODE , inputString );
96+ parser = createParser (LEXER .DEFAULT_MODE , inputString );
9197 return new ParserAsserts (this , parser );
9298 }
9399
94100 /**
95101 * Настраивает и запоминает тестируемый контекст. Использует дефолтное channel
96102 *
97- * @param mode Режим
103+ * @param mode Режим
98104 * @param inputString анализируемая строка
99105 * @return служебный класс для замыкания
100106 */
@@ -110,15 +116,20 @@ public ParserAsserts assertThat(int mode, String inputString) {
110116 * @return служебный класс для замыкания
111117 */
112118 public ParserAsserts assertThatFile (String sourcePath ) {
113- parser = createParser (L .DEFAULT_MODE , ResourceUtils .byName (sourcePath ));
119+ parser = createParser (LEXER .DEFAULT_MODE , ResourceUtils .byName (sourcePath ));
114120 return new ParserAsserts (this , parser );
115121 }
116122
117- private P createParser (int mode , String inputString ) {
123+ private PARSER createParser (int mode , String inputString ) {
118124 var tokenStream = getLexer ().getTokensStream (mode , inputString );
119125 try {
120- return parserClazz .getDeclaredConstructor (TokenStream .class )
121- .newInstance (tokenStream );
126+ if (supportRebuild ) {
127+ return parserClazz .getDeclaredConstructor (IncrementalTokenStream .class )
128+ .newInstance (tokenStream );
129+ } else {
130+ return parserClazz .getDeclaredConstructor (TokenStream .class )
131+ .newInstance (tokenStream );
132+ }
122133 } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e ) {
123134 throw new RuntimeException (e );
124135 }
0 commit comments