28
28
import com .intellij .util .Function ;
29
29
import com .intellij .util .ObjectUtils ;
30
30
import com .intellij .util .containers .ContainerUtil ;
31
+ import com .intellij .util .containers .JBIterable ;
31
32
import com .intellij .util .containers .MultiMap ;
32
33
import gnu .trove .THashMap ;
33
34
import gnu .trove .THashSet ;
@@ -246,13 +247,16 @@ private void generateVisitor(String psiClass, Map<String, BnfRule> sortedRules)
246
247
for (BnfRule rule : sortedRules .values ()) {
247
248
imports .addAll (getSuperInterfaceNames (myFile , rule , StringUtil .getPackageName (psiClass ), myRuleClassPrefix ));
248
249
}
249
- generateClassHeader (psiClass , imports , "" , false , BnfConstants .PSI_ELEMENT_VISITOR_CLASS );
250
+ String r = G .visitorValue != null ? "<" + G .visitorValue + ">" : "" ;
251
+ String t = G .visitorValue != null ? G .visitorValue : "void" ;
252
+ String ret = G .visitorValue != null ? "return " : "" ;
253
+ generateClassHeader (psiClass + r , imports , "" , false , BnfConstants .PSI_ELEMENT_VISITOR_CLASS );
250
254
Set <String > visited = new HashSet <String >();
251
255
Set <String > all = new TreeSet <String >();
252
256
for (BnfRule rule : sortedRules .values ()) {
253
257
String methodName = getRulePsiClassName (rule , "" );
254
258
visited .add (methodName );
255
- out ("public void visit" + methodName + "(@NotNull " + getRulePsiClassName (rule , myRuleClassPrefix ) + " o) {" );
259
+ out ("public " + t + " visit" + methodName + "(@NotNull " + getRulePsiClassName (rule , myRuleClassPrefix ) + " o) {" );
256
260
boolean first = true ;
257
261
for (String top : getSuperInterfaceNames (myFile , rule , "" , myRuleClassPrefix )) {
258
262
if (!first && top .equals (superIntf )) continue ;
@@ -264,7 +268,7 @@ private void generateVisitor(String psiClass, Map<String, BnfRule> sortedRules)
264
268
}
265
269
String text = "visit" + top + "(o);" ;
266
270
if (first ) {
267
- out (text );
271
+ out (ret + text );
268
272
}
269
273
else {
270
274
out ("// " + text );
@@ -275,15 +279,16 @@ private void generateVisitor(String psiClass, Map<String, BnfRule> sortedRules)
275
279
newLine ();
276
280
}
277
281
all .remove (shortSuperIntf );
278
- for (String top : ContainerUtil . concat (all , Arrays . asList (shortSuperIntf ) )) {
282
+ for (String top : JBIterable . from (all ). append (shortSuperIntf )) {
279
283
String methodName = top .startsWith (myRuleClassPrefix ) ? top .substring (myRuleClassPrefix .length ()) : top ;
280
284
if (visited .contains (methodName )) continue ;
281
- out ("public void visit" + methodName + "(@NotNull " + myShortener .fun (top ) + " o) {" );
285
+ out ("public " + t + " visit" + methodName + "(@NotNull " + myShortener .fun (top ) + " o) {" );
282
286
if (!methodName .equals (top ) && !top .equals (shortSuperIntf )) {
283
- out ("visit" + (shortSuperIntf .startsWith (myRuleClassPrefix ) ? shortSuperIntf .substring (myRuleClassPrefix .length ()) : shortSuperIntf ) + "(o);" );
287
+ out (ret + "visit" + (shortSuperIntf .startsWith (myRuleClassPrefix ) ? shortSuperIntf .substring (myRuleClassPrefix .length ()) : shortSuperIntf ) + "(o);" );
284
288
}
285
289
else {
286
290
out ("visitElement(o);" );
291
+ if (G .visitorValue != null ) out (ret + "null;" );
287
292
}
288
293
out ("}" );
289
294
newLine ();
@@ -471,34 +476,8 @@ private void generateClassHeader(String className,
471
476
String shortClassName = StringUtil .getShortName (className );
472
477
out ("package %s;" , packageName );
473
478
newLine ();
474
- final Set <String > realImports = new HashSet <String >();
475
- realImports .add (packageName + ".*" );
476
- Function <String , String > shortener = new Function <String , String >() {
477
- @ Override
478
- public String fun (String s ) {
479
- boolean changed = false ;
480
- StringBuilder sb = new StringBuilder ();
481
- boolean vararg = s .endsWith ("..." );
482
- for (String part : StringUtil .tokenize (new StringTokenizer (StringUtil .trimEnd (s , "..." ), TYPE_TEXT_SEPARATORS , true ))) {
483
- String pkg ;
484
- String wildcard = part .startsWith ("? super " ) ? "? super " : part .startsWith ("? extends " ) ? "? extends " : "" ;
485
- part = StringUtil .trimStart (part , wildcard );
486
- if (TYPE_TEXT_SEPARATORS .contains (part )) {
487
- sb .append (part ).append (part .equals ("," ) ? " " : "" );
488
- }
489
- else if (realImports .contains (part ) ||
490
- "java.lang" .equals (pkg = StringUtil .getPackageName (part )) ||
491
- realImports .contains (pkg + ".*" )) {
492
- sb .append (wildcard ).append (StringUtil .getShortName (part ));
493
- changed = true ;
494
- }
495
- else {
496
- sb .append (wildcard ).append (part );
497
- }
498
- }
499
- return changed ? sb .append (vararg ? "..." : "" ).toString () : s ;
500
- }
501
- };
479
+ Set <String > realImports = ContainerUtil .newLinkedHashSet (packageName + ".*" );
480
+ Function <String , String > shortener = newClassNameShortener (realImports );
502
481
for (String item : imports ) {
503
482
for (String s : StringUtil .tokenize (item .replaceAll ("\\ s+" , " " ), TYPE_TEXT_SEPARATORS )) {
504
483
s = StringUtil .trimStart (StringUtil .trimStart (s , "? super " ), "? extends " );
@@ -534,6 +513,36 @@ else if (!intf && i == 1) {
534
513
myShortener = shortener ;
535
514
}
536
515
516
+ @ NotNull
517
+ private static Function <String , String > newClassNameShortener (final Set <String > realImports ) {
518
+ return new Function <String , String >() {
519
+ @ Override
520
+ public String fun (String s ) {
521
+ boolean changed = false ;
522
+ StringBuilder sb = new StringBuilder ();
523
+ boolean vararg = s .endsWith ("..." );
524
+ for (String part : StringUtil .tokenize (new StringTokenizer (StringUtil .trimEnd (s , "..." ), TYPE_TEXT_SEPARATORS , true ))) {
525
+ String pkg ;
526
+ String wildcard = part .startsWith ("? super " ) ? "? super " : part .startsWith ("? extends " ) ? "? extends " : "" ;
527
+ part = StringUtil .trimStart (part , wildcard );
528
+ if (TYPE_TEXT_SEPARATORS .contains (part )) {
529
+ sb .append (part ).append (part .equals ("," ) ? " " : "" );
530
+ }
531
+ else if (realImports .contains (part ) ||
532
+ "java.lang" .equals (pkg = StringUtil .getPackageName (part )) ||
533
+ realImports .contains (pkg + ".*" )) {
534
+ sb .append (wildcard ).append (StringUtil .getShortName (part ));
535
+ changed = true ;
536
+ }
537
+ else {
538
+ sb .append (wildcard ).append (part );
539
+ }
540
+ }
541
+ return changed ? sb .append (vararg ? "..." : "" ).toString () : s ;
542
+ }
543
+ };
544
+ }
545
+
537
546
private void generateFileHeader (String className ) {
538
547
final String classHeader = getStringOrFile (getRootAttribute (myFile , KnownAttribute .CLASS_HEADER , className ));
539
548
out (classHeader );
@@ -1307,8 +1316,15 @@ private void generatePsiImpl(BnfRule rule,
1307
1316
newLine ();
1308
1317
}
1309
1318
if (visitorClassName != null ) {
1319
+ String r = G .visitorValue != null ? "<" + G .visitorValue + ">" : "" ;
1320
+ String t = G .visitorValue != null ? " " + G .visitorValue : "void" ;
1321
+ String ret = G .visitorValue != null ? "return " : "" ;
1322
+ out ("public " + r + t + " accept(@NotNull " + visitorClassName + r + " visitor) {" );
1323
+ out (ret + "visitor.visit" + getRulePsiClassName (rule , "" ) + "(this);" );
1324
+ out ("}" );
1325
+ newLine ();
1310
1326
out ("public void accept(@NotNull " + myShortener .fun (BnfConstants .PSI_ELEMENT_VISITOR_CLASS ) + " visitor) {" );
1311
- out ("if (visitor instanceof " + visitorClassName + ") ((" + visitorClassName + ")visitor).visit" + getRulePsiClassName ( rule , "" ) + "(this );" );
1327
+ out ("if (visitor instanceof " + visitorClassName + ") accept ((" + visitorClassName + ")visitor);" );
1312
1328
out ("else super.accept(visitor);" );
1313
1329
out ("}" );
1314
1330
newLine ();
0 commit comments