• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.turbine.tree;
18 
19 import com.google.common.base.Optional;
20 import com.google.common.collect.ImmutableList;
21 import com.google.common.collect.ImmutableSet;
22 import com.google.turbine.diag.SourceFile;
23 import com.google.turbine.model.Const;
24 import com.google.turbine.model.TurbineConstantTypeKind;
25 import com.google.turbine.model.TurbineTyKind;
26 import java.util.Set;
27 
28 /** An AST node. */
29 public abstract class Tree {
30 
kind()31   public abstract Kind kind();
32 
accept(Visitor<I, O> visitor, I input)33   public abstract <I, O> O accept(Visitor<I, O> visitor, I input);
34 
35   private final int position;
36 
Tree(int position)37   protected Tree(int position) {
38     this.position = position;
39   }
40 
position()41   public int position() {
42     return position;
43   }
44 
45   @Override
toString()46   public String toString() {
47     return Pretty.pretty(this);
48   }
49 
50   /** Tree kind. */
51   public enum Kind {
52     WILD_TY,
53     ARR_TY,
54     PRIM_TY,
55     VOID_TY,
56     CLASS_TY,
57     LITERAL,
58     TYPE_CAST,
59     UNARY,
60     BINARY,
61     CONST_VAR_NAME,
62     CLASS_LITERAL,
63     ASSIGN,
64     CONDITIONAL,
65     ARRAY_INIT,
66     COMP_UNIT,
67     IMPORT_DECL,
68     VAR_DECL,
69     METH_DECL,
70     ANNO,
71     ANNO_EXPR,
72     TY_DECL,
73     TY_PARAM,
74     PKG_DECL
75   }
76 
77   /** A type use. */
78   public abstract static class Type extends Tree {
79     private final ImmutableList<Anno> annos;
80 
Type(int position, ImmutableList<Anno> annos)81     public Type(int position, ImmutableList<Anno> annos) {
82       super(position);
83       this.annos = annos;
84     }
85 
annos()86     public ImmutableList<Anno> annos() {
87       return annos;
88     }
89   }
90 
91   /** An expression. */
92   public abstract static class Expression extends Tree {
Expression(int position)93     public Expression(int position) {
94       super(position);
95     }
96   }
97 
98   /** A wildcard type, possibly with an upper or lower bound. */
99   public static class WildTy extends Type {
100     private final Optional<Type> upper;
101     private final Optional<Type> lower;
102 
WildTy( int position, ImmutableList<Anno> annos, Optional<Type> upper, Optional<Type> lower)103     public WildTy(
104         int position, ImmutableList<Anno> annos, Optional<Type> upper, Optional<Type> lower) {
105       super(position, annos);
106       this.upper = upper;
107       this.lower = lower;
108     }
109 
110     @Override
kind()111     public Kind kind() {
112       return Kind.WILD_TY;
113     }
114 
115     @Override
accept(Visitor<I, O> visitor, I input)116     public <I, O> O accept(Visitor<I, O> visitor, I input) {
117       return visitor.visitWildTy(this, input);
118     }
119 
120     /**
121      * An optional upper (extends) bound.
122      *
123      * <p>At most one of {@link #upper} and {@link #lower} will be set.
124      */
upper()125     public Optional<Type> upper() {
126       return upper;
127     }
128 
129     /**
130      * An optional lower (super) bound.
131      *
132      * <p>At most one of {@link #upper} and {@link #lower} will be set.
133      */
lower()134     public Optional<Type> lower() {
135       return lower;
136     }
137   }
138 
139   /** An array type. */
140   public static class ArrTy extends Type {
141     private final Type elem;
142 
ArrTy(int position, ImmutableList<Anno> annos, Type elem)143     public ArrTy(int position, ImmutableList<Anno> annos, Type elem) {
144       super(position, annos);
145       this.elem = elem;
146     }
147 
148     @Override
kind()149     public Kind kind() {
150       return Kind.ARR_TY;
151     }
152 
153     @Override
accept(Visitor<I, O> visitor, I input)154     public <I, O> O accept(Visitor<I, O> visitor, I input) {
155       return visitor.visitArrTy(this, input);
156     }
157 
158     /**
159      * The element type of the array.
160      *
161      * <p>Multi-dimensional arrays are represented as nested {@link ArrTy}s.
162      */
elem()163     public Type elem() {
164       return elem;
165     }
166   }
167 
168   /** A primitive type. */
169   public static class PrimTy extends Type {
170     private final TurbineConstantTypeKind tykind;
171 
PrimTy(int position, ImmutableList<Anno> annos, TurbineConstantTypeKind tykind)172     public PrimTy(int position, ImmutableList<Anno> annos, TurbineConstantTypeKind tykind) {
173       super(position, annos);
174       this.tykind = tykind;
175     }
176 
177     @Override
kind()178     public Kind kind() {
179       return Kind.PRIM_TY;
180     }
181 
182     @Override
accept(Visitor<I, O> visitor, I input)183     public <I, O> O accept(Visitor<I, O> visitor, I input) {
184       return visitor.visitPrimTy(this, input);
185     }
186 
187     /** The primtiive type. */
tykind()188     public TurbineConstantTypeKind tykind() {
189       return tykind;
190     }
191   }
192 
193   /** The void type, used only for void-returning methods. */
194   public static class VoidTy extends Type {
195 
196     @Override
kind()197     public Kind kind() {
198       return Kind.VOID_TY;
199     }
200 
201     @Override
accept(Visitor<I, O> visitor, I input)202     public <I, O> O accept(Visitor<I, O> visitor, I input) {
203       return visitor.visitVoidTy(this, input);
204     }
205 
VoidTy(int position)206     public VoidTy(int position) {
207       super(position, ImmutableList.of());
208     }
209   }
210 
211   /** A class, enum, interface, or annotation {@link Type}. */
212   public static class ClassTy extends Type {
213     private final Optional<ClassTy> base;
214     private final String name;
215     private final ImmutableList<Type> tyargs;
216 
ClassTy( int position, Optional<ClassTy> base, String name, ImmutableList<Type> tyargs, ImmutableList<Anno> annos)217     public ClassTy(
218         int position,
219         Optional<ClassTy> base,
220         String name,
221         ImmutableList<Type> tyargs,
222         ImmutableList<Anno> annos) {
223       super(position, annos);
224       this.base = base;
225       this.name = name;
226       this.tyargs = tyargs;
227     }
228 
229     @Override
kind()230     public Kind kind() {
231       return Kind.CLASS_TY;
232     }
233 
234     @Override
accept(Visitor<I, O> visitor, I input)235     public <I, O> O accept(Visitor<I, O> visitor, I input) {
236       return visitor.visitClassTy(this, input);
237     }
238 
239     /**
240      * The base type, for qualified type uses.
241      *
242      * <p>For example, {@code Map.Entry}.
243      */
base()244     public Optional<ClassTy> base() {
245       return base;
246     }
247 
248     /** The simple name of the type. */
name()249     public String name() {
250       return name;
251     }
252 
253     /** A possibly empty list of type arguments. */
tyargs()254     public ImmutableList<Type> tyargs() {
255       return tyargs;
256     }
257   }
258 
259   /** A JLS 3.10 literal expression. */
260   public static class Literal extends Expression {
261     private final TurbineConstantTypeKind tykind;
262     private final Const value;
263 
Literal(int position, TurbineConstantTypeKind tykind, Const value)264     public Literal(int position, TurbineConstantTypeKind tykind, Const value) {
265       super(position);
266       this.tykind = tykind;
267       this.value = value;
268     }
269 
270     @Override
kind()271     public Kind kind() {
272       return Kind.LITERAL;
273     }
274 
275     @Override
accept(Visitor<I, O> visitor, I input)276     public <I, O> O accept(Visitor<I, O> visitor, I input) {
277       return visitor.visitLiteral(this, input);
278     }
279 
tykind()280     public TurbineConstantTypeKind tykind() {
281       return tykind;
282     }
283 
value()284     public Const value() {
285       return value;
286     }
287   }
288 
289   /** A JLS 15.16 cast expression. */
290   public static class TypeCast extends Expression {
291     private final Type ty;
292     private final Expression expr;
293 
TypeCast(int position, Type ty, Expression expr)294     public TypeCast(int position, Type ty, Expression expr) {
295       super(position);
296       this.ty = ty;
297       this.expr = expr;
298     }
299 
300     @Override
kind()301     public Kind kind() {
302       return Kind.TYPE_CAST;
303     }
304 
305     @Override
accept(Visitor<I, O> visitor, I input)306     public <I, O> O accept(Visitor<I, O> visitor, I input) {
307       return visitor.visitTypeCast(this, input);
308     }
309 
ty()310     public Type ty() {
311       return ty;
312     }
313 
expr()314     public Expression expr() {
315       return expr;
316     }
317   }
318 
319   /** A JLS 15.14 - 14.15 unary expression. */
320   public static class Unary extends Expression {
321     private final Expression expr;
322     private final TurbineOperatorKind op;
323 
Unary(int position, Expression expr, TurbineOperatorKind op)324     public Unary(int position, Expression expr, TurbineOperatorKind op) {
325       super(position);
326       this.expr = expr;
327       this.op = op;
328     }
329 
330     @Override
kind()331     public Kind kind() {
332       return Kind.UNARY;
333     }
334 
335     @Override
accept(Visitor<I, O> visitor, I input)336     public <I, O> O accept(Visitor<I, O> visitor, I input) {
337       return visitor.visitUnary(this, input);
338     }
339 
expr()340     public Expression expr() {
341       return expr;
342     }
343 
op()344     public TurbineOperatorKind op() {
345       return op;
346     }
347   }
348 
349   /** A JLS 15.17 - 14.24 binary expression. */
350   public static class Binary extends Expression {
351     private final Expression lhs;
352     private final Expression rhs;
353     private final TurbineOperatorKind op;
354 
Binary(int position, Expression lhs, Expression rhs, TurbineOperatorKind op)355     public Binary(int position, Expression lhs, Expression rhs, TurbineOperatorKind op) {
356       super(position);
357       this.lhs = lhs;
358       this.rhs = rhs;
359       this.op = op;
360     }
361 
362     @Override
kind()363     public Kind kind() {
364       return Kind.BINARY;
365     }
366 
367     @Override
accept(Visitor<I, O> visitor, I input)368     public <I, O> O accept(Visitor<I, O> visitor, I input) {
369       return visitor.visitBinary(this, input);
370     }
371 
lhs()372     public Expression lhs() {
373       return lhs;
374     }
375 
rhs()376     public Expression rhs() {
377       return rhs;
378     }
379 
op()380     public TurbineOperatorKind op() {
381       return op;
382     }
383   }
384 
385   /** A JLS 6.5.6.1 simple name that refers to a JSL 4.12.4 constant variable. */
386   public static class ConstVarName extends Expression {
387     private final ImmutableList<String> name;
388 
ConstVarName(int position, ImmutableList<String> name)389     public ConstVarName(int position, ImmutableList<String> name) {
390       super(position);
391       this.name = name;
392     }
393 
394     @Override
kind()395     public Kind kind() {
396       return Kind.CONST_VAR_NAME;
397     }
398 
399     @Override
accept(Visitor<I, O> visitor, I input)400     public <I, O> O accept(Visitor<I, O> visitor, I input) {
401       return visitor.visitConstVarName(this, input);
402     }
403 
name()404     public ImmutableList<String> name() {
405       return name;
406     }
407   }
408 
409   /** A JLS 15.8.2 class literal. */
410   public static class ClassLiteral extends Expression {
411 
412     private final Type type;
413 
ClassLiteral(int position, Type type)414     public ClassLiteral(int position, Type type) {
415       super(position);
416       this.type = type;
417     }
418 
419     @Override
kind()420     public Kind kind() {
421       return Kind.CLASS_LITERAL;
422     }
423 
424     @Override
accept(Visitor<I, O> visitor, I input)425     public <I, O> O accept(Visitor<I, O> visitor, I input) {
426       return visitor.visitClassLiteral(this, input);
427     }
428 
type()429     public Type type() {
430       return type;
431     }
432   }
433 
434   /** A JLS 15.26 assignment expression. */
435   public static class Assign extends Expression {
436     private final String name;
437     private final Expression expr;
438 
Assign(int position, String name, Expression expr)439     public Assign(int position, String name, Expression expr) {
440       super(position);
441       this.name = name;
442       this.expr = expr;
443     }
444 
445     @Override
kind()446     public Kind kind() {
447       return Kind.ASSIGN;
448     }
449 
450     @Override
accept(Visitor<I, O> visitor, I input)451     public <I, O> O accept(Visitor<I, O> visitor, I input) {
452       return visitor.visitAssign(this, input);
453     }
454 
name()455     public String name() {
456       return name;
457     }
458 
expr()459     public Expression expr() {
460       return expr;
461     }
462   }
463 
464   /** A JLS 15.25 conditional expression. */
465   public static class Conditional extends Expression {
466     private final Expression cond;
467     private final Expression iftrue;
468     private final Expression iffalse;
469 
Conditional(int position, Expression cond, Expression iftrue, Expression iffalse)470     public Conditional(int position, Expression cond, Expression iftrue, Expression iffalse) {
471       super(position);
472       this.cond = cond;
473       this.iftrue = iftrue;
474       this.iffalse = iffalse;
475     }
476 
477     @Override
kind()478     public Kind kind() {
479       return Kind.CONDITIONAL;
480     }
481 
482     @Override
accept(Visitor<I, O> visitor, I input)483     public <I, O> O accept(Visitor<I, O> visitor, I input) {
484       return visitor.visitConditional(this, input);
485     }
486 
cond()487     public Expression cond() {
488       return cond;
489     }
490 
iftrue()491     public Expression iftrue() {
492       return iftrue;
493     }
494 
iffalse()495     public Expression iffalse() {
496       return iffalse;
497     }
498   }
499 
500   /** JLS 10.6 array initializer. */
501   public static class ArrayInit extends Expression {
502     private final ImmutableList<Expression> exprs;
503 
ArrayInit(int position, ImmutableList<Expression> exprs)504     public ArrayInit(int position, ImmutableList<Expression> exprs) {
505       super(position);
506       this.exprs = exprs;
507     }
508 
509     @Override
kind()510     public Kind kind() {
511       return Kind.ARRAY_INIT;
512     }
513 
514     @Override
accept(Visitor<I, O> visitor, I input)515     public <I, O> O accept(Visitor<I, O> visitor, I input) {
516       return visitor.visitArrayInit(this, input);
517     }
518 
exprs()519     public ImmutableList<Expression> exprs() {
520       return exprs;
521     }
522   }
523 
524   /** A JLS 7.3 compilation unit. */
525   public static class CompUnit extends Tree {
526     private final Optional<PkgDecl> pkg;
527     private final ImmutableList<ImportDecl> imports;
528     private final ImmutableList<TyDecl> decls;
529     private final SourceFile source;
530 
CompUnit( int position, Optional<PkgDecl> pkg, ImmutableList<ImportDecl> imports, ImmutableList<TyDecl> decls, SourceFile source)531     public CompUnit(
532         int position,
533         Optional<PkgDecl> pkg,
534         ImmutableList<ImportDecl> imports,
535         ImmutableList<TyDecl> decls,
536         SourceFile source) {
537       super(position);
538       this.pkg = pkg;
539       this.imports = imports;
540       this.decls = decls;
541       this.source = source;
542     }
543 
544     @Override
kind()545     public Kind kind() {
546       return Kind.COMP_UNIT;
547     }
548 
549     @Override
accept(Visitor<I, O> visitor, I input)550     public <I, O> O accept(Visitor<I, O> visitor, I input) {
551       return visitor.visitCompUnit(this, input);
552     }
553 
pkg()554     public Optional<PkgDecl> pkg() {
555       return pkg;
556     }
557 
imports()558     public ImmutableList<ImportDecl> imports() {
559       return imports;
560     }
561 
decls()562     public ImmutableList<TyDecl> decls() {
563       return decls;
564     }
565 
source()566     public SourceFile source() {
567       return source;
568     }
569   }
570 
571   /** A JLS 7.5 import declaration. */
572   public static class ImportDecl extends Tree {
573     private final ImmutableList<String> type;
574     private final boolean stat;
575     private final boolean wild;
576 
ImportDecl(int position, ImmutableList<String> type, boolean stat, boolean wild)577     public ImportDecl(int position, ImmutableList<String> type, boolean stat, boolean wild) {
578       super(position);
579       this.type = type;
580       this.stat = stat;
581       this.wild = wild;
582     }
583 
584     @Override
kind()585     public Kind kind() {
586       return Kind.IMPORT_DECL;
587     }
588 
589     @Override
accept(Visitor<I, O> visitor, I input)590     public <I, O> O accept(Visitor<I, O> visitor, I input) {
591       return visitor.visitImportDecl(this, input);
592     }
593 
type()594     public ImmutableList<String> type() {
595       return type;
596     }
597 
598     /** Returns true for static member imports. */
stat()599     public boolean stat() {
600       return stat;
601     }
602 
603     /** Returns true for wildcard imports. */
wild()604     public boolean wild() {
605       return wild;
606     }
607   }
608 
609   /** A JLS 8.3 field declaration, JLS 8.4.1 formal method parameter, or JLS 14.4 variable. */
610   public static class VarDecl extends Tree {
611     private final ImmutableSet<TurbineModifier> mods;
612     private final ImmutableList<Anno> annos;
613     private final Tree ty;
614     private final String name;
615     private final Optional<Expression> init;
616 
VarDecl( int position, Set<TurbineModifier> mods, ImmutableList<Anno> annos, Tree ty, String name, Optional<Expression> init)617     public VarDecl(
618         int position,
619         Set<TurbineModifier> mods,
620         ImmutableList<Anno> annos,
621         Tree ty,
622         String name,
623         Optional<Expression> init) {
624       super(position);
625       this.mods = ImmutableSet.copyOf(mods);
626       this.annos = annos;
627       this.ty = ty;
628       this.name = name;
629       this.init = init;
630     }
631 
632     @Override
kind()633     public Kind kind() {
634       return Kind.VAR_DECL;
635     }
636 
637     @Override
accept(Visitor<I, O> visitor, I input)638     public <I, O> O accept(Visitor<I, O> visitor, I input) {
639       return visitor.visitVarDecl(this, input);
640     }
641 
mods()642     public ImmutableSet<TurbineModifier> mods() {
643       return mods;
644     }
645 
annos()646     public ImmutableList<Anno> annos() {
647       return annos;
648     }
649 
ty()650     public Tree ty() {
651       return ty;
652     }
653 
name()654     public String name() {
655       return name;
656     }
657 
init()658     public Optional<Expression> init() {
659       return init;
660     }
661   }
662 
663   /** A JLS 8.4 method declaration. */
664   public static class MethDecl extends Tree {
665     private final ImmutableSet<TurbineModifier> mods;
666     private final ImmutableList<Anno> annos;
667     private final ImmutableList<TyParam> typarams;
668     private final Optional<Tree> ret;
669     private final String name;
670     private final ImmutableList<VarDecl> params;
671     private final ImmutableList<ClassTy> exntys;
672     private final Optional<Tree> defaultValue;
673 
MethDecl( int position, Set<TurbineModifier> mods, ImmutableList<Anno> annos, ImmutableList<TyParam> typarams, Optional<Tree> ret, String name, ImmutableList<VarDecl> params, ImmutableList<ClassTy> exntys, Optional<Tree> defaultValue)674     public MethDecl(
675         int position,
676         Set<TurbineModifier> mods,
677         ImmutableList<Anno> annos,
678         ImmutableList<TyParam> typarams,
679         Optional<Tree> ret,
680         String name,
681         ImmutableList<VarDecl> params,
682         ImmutableList<ClassTy> exntys,
683         Optional<Tree> defaultValue) {
684       super(position);
685       this.mods = ImmutableSet.copyOf(mods);
686       this.annos = annos;
687       this.typarams = typarams;
688       this.ret = ret;
689       this.name = name;
690       this.params = params;
691       this.exntys = exntys;
692       this.defaultValue = defaultValue;
693     }
694 
695     @Override
kind()696     public Kind kind() {
697       return Kind.METH_DECL;
698     }
699 
700     @Override
accept(Visitor<I, O> visitor, I input)701     public <I, O> O accept(Visitor<I, O> visitor, I input) {
702       return visitor.visitMethDecl(this, input);
703     }
704 
mods()705     public ImmutableSet<TurbineModifier> mods() {
706       return mods;
707     }
708 
annos()709     public ImmutableList<Anno> annos() {
710       return annos;
711     }
712 
typarams()713     public ImmutableList<TyParam> typarams() {
714       return typarams;
715     }
716 
ret()717     public Optional<Tree> ret() {
718       return ret;
719     }
720 
name()721     public String name() {
722       return name;
723     }
724 
params()725     public ImmutableList<VarDecl> params() {
726       return params;
727     }
728 
exntys()729     public ImmutableList<ClassTy> exntys() {
730       return exntys;
731     }
732 
defaultValue()733     public Optional<Tree> defaultValue() {
734       return defaultValue;
735     }
736   }
737 
738   /** A JLS 9.7 annotation. */
739   public static class Anno extends Tree {
740     private final ImmutableList<String> name;
741     private final ImmutableList<Expression> args;
742 
Anno(int position, ImmutableList<String> name, ImmutableList<Expression> args)743     public Anno(int position, ImmutableList<String> name, ImmutableList<Expression> args) {
744       super(position);
745       this.name = name;
746       this.args = args;
747     }
748 
749     @Override
kind()750     public Kind kind() {
751       return Kind.ANNO;
752     }
753 
754     @Override
accept(Visitor<I, O> visitor, I input)755     public <I, O> O accept(Visitor<I, O> visitor, I input) {
756       return visitor.visitAnno(this, input);
757     }
758 
name()759     public ImmutableList<String> name() {
760       return name;
761     }
762 
args()763     public ImmutableList<Expression> args() {
764       return args;
765     }
766   }
767 
768   /**
769    * An annotation in an expression context, e.g. an annotation literal nested inside another
770    * annotation.
771    */
772   public static class AnnoExpr extends Expression {
773 
774     private final Anno value;
775 
AnnoExpr(int position, Anno value)776     public AnnoExpr(int position, Anno value) {
777       super(position);
778       this.value = value;
779     }
780 
781     /** The annotation. */
value()782     public Anno value() {
783       return value;
784     }
785 
786     @Override
kind()787     public Kind kind() {
788       return Kind.ANNO_EXPR;
789     }
790 
791     @Override
accept(Visitor<I, O> visitor, I input)792     public <I, O> O accept(Visitor<I, O> visitor, I input) {
793       return visitor.visitAnno(value, input);
794     }
795   }
796 
797   /** A JLS 7.6 or 8.5 type declaration. */
798   public static class TyDecl extends Tree {
799     private final ImmutableSet<TurbineModifier> mods;
800     private final ImmutableList<Anno> annos;
801     private final String name;
802     private final ImmutableList<TyParam> typarams;
803     private final Optional<ClassTy> xtnds;
804     private final ImmutableList<ClassTy> impls;
805     private final ImmutableList<Tree> members;
806     private final TurbineTyKind tykind;
807 
TyDecl( int position, Set<TurbineModifier> mods, ImmutableList<Anno> annos, String name, ImmutableList<TyParam> typarams, Optional<ClassTy> xtnds, ImmutableList<ClassTy> impls, ImmutableList<Tree> members, TurbineTyKind tykind)808     public TyDecl(
809         int position,
810         Set<TurbineModifier> mods,
811         ImmutableList<Anno> annos,
812         String name,
813         ImmutableList<TyParam> typarams,
814         Optional<ClassTy> xtnds,
815         ImmutableList<ClassTy> impls,
816         ImmutableList<Tree> members,
817         TurbineTyKind tykind) {
818       super(position);
819       this.mods = ImmutableSet.copyOf(mods);
820       this.annos = annos;
821       this.name = name;
822       this.typarams = typarams;
823       this.xtnds = xtnds;
824       this.impls = impls;
825       this.members = members;
826       this.tykind = tykind;
827     }
828 
829     @Override
kind()830     public Kind kind() {
831       return Kind.TY_DECL;
832     }
833 
834     @Override
accept(Visitor<I, O> visitor, I input)835     public <I, O> O accept(Visitor<I, O> visitor, I input) {
836       return visitor.visitTyDecl(this, input);
837     }
838 
mods()839     public ImmutableSet<TurbineModifier> mods() {
840       return mods;
841     }
842 
annos()843     public ImmutableList<Anno> annos() {
844       return annos;
845     }
846 
name()847     public String name() {
848       return name;
849     }
850 
typarams()851     public ImmutableList<TyParam> typarams() {
852       return typarams;
853     }
854 
xtnds()855     public Optional<ClassTy> xtnds() {
856       return xtnds;
857     }
858 
impls()859     public ImmutableList<ClassTy> impls() {
860       return impls;
861     }
862 
members()863     public ImmutableList<Tree> members() {
864       return members;
865     }
866 
tykind()867     public TurbineTyKind tykind() {
868       return tykind;
869     }
870   }
871 
872   /** A JLS 4.4. type variable declaration. */
873   public static class TyParam extends Tree {
874     private final String name;
875     private final ImmutableList<Tree> bounds;
876     private final ImmutableList<Anno> annos;
877 
TyParam( int position, String name, ImmutableList<Tree> bounds, ImmutableList<Anno> annos)878     public TyParam(
879         int position, String name, ImmutableList<Tree> bounds, ImmutableList<Anno> annos) {
880       super(position);
881       this.name = name;
882       this.bounds = bounds;
883       this.annos = annos;
884     }
885 
886     @Override
kind()887     public Kind kind() {
888       return Kind.TY_PARAM;
889     }
890 
891     @Override
accept(Visitor<I, O> visitor, I input)892     public <I, O> O accept(Visitor<I, O> visitor, I input) {
893       return visitor.visitTyParam(this, input);
894     }
895 
name()896     public String name() {
897       return name;
898     }
899 
bounds()900     public ImmutableList<Tree> bounds() {
901       return bounds;
902     }
903 
annos()904     public ImmutableList<Anno> annos() {
905       return annos;
906     }
907   }
908 
909   /** A JLS 7.4 package declaration. */
910   public static class PkgDecl extends Tree {
911     private final ImmutableList<String> name;
912     private final ImmutableList<Anno> annos;
913 
PkgDecl(int position, ImmutableList<String> name, ImmutableList<Anno> annos)914     public PkgDecl(int position, ImmutableList<String> name, ImmutableList<Anno> annos) {
915       super(position);
916       this.name = name;
917       this.annos = annos;
918     }
919 
920     @Override
kind()921     public Kind kind() {
922       return Kind.PKG_DECL;
923     }
924 
925     @Override
accept(Visitor<I, O> visitor, I input)926     public <I, O> O accept(Visitor<I, O> visitor, I input) {
927       return visitor.visitPkgDecl(this, input);
928     }
929 
name()930     public ImmutableList<String> name() {
931       return name;
932     }
933 
annos()934     public ImmutableList<Anno> annos() {
935       return annos;
936     }
937   }
938 
939   /** A visitor for {@link Tree}s. */
940   public interface Visitor<I, O> {
visitWildTy(WildTy visitor, I input)941     O visitWildTy(WildTy visitor, I input);
942 
visitArrTy(ArrTy arrTy, I input)943     O visitArrTy(ArrTy arrTy, I input);
944 
visitPrimTy(PrimTy primTy, I input)945     O visitPrimTy(PrimTy primTy, I input);
946 
visitVoidTy(VoidTy primTy, I input)947     O visitVoidTy(VoidTy primTy, I input);
948 
visitClassTy(ClassTy visitor, I input)949     O visitClassTy(ClassTy visitor, I input);
950 
visitLiteral(Literal literal, I input)951     O visitLiteral(Literal literal, I input);
952 
visitTypeCast(TypeCast typeCast, I input)953     O visitTypeCast(TypeCast typeCast, I input);
954 
visitUnary(Unary unary, I input)955     O visitUnary(Unary unary, I input);
956 
visitBinary(Binary binary, I input)957     O visitBinary(Binary binary, I input);
958 
visitConstVarName(ConstVarName constVarName, I input)959     O visitConstVarName(ConstVarName constVarName, I input);
960 
visitClassLiteral(ClassLiteral classLiteral, I input)961     O visitClassLiteral(ClassLiteral classLiteral, I input);
962 
visitAssign(Assign assign, I input)963     O visitAssign(Assign assign, I input);
964 
visitConditional(Conditional conditional, I input)965     O visitConditional(Conditional conditional, I input);
966 
visitArrayInit(ArrayInit arrayInit, I input)967     O visitArrayInit(ArrayInit arrayInit, I input);
968 
visitCompUnit(CompUnit compUnit, I input)969     O visitCompUnit(CompUnit compUnit, I input);
970 
visitImportDecl(ImportDecl importDecl, I input)971     O visitImportDecl(ImportDecl importDecl, I input);
972 
visitVarDecl(VarDecl varDecl, I input)973     O visitVarDecl(VarDecl varDecl, I input);
974 
visitMethDecl(MethDecl methDecl, I input)975     O visitMethDecl(MethDecl methDecl, I input);
976 
visitAnno(Anno anno, I input)977     O visitAnno(Anno anno, I input);
978 
visitTyDecl(TyDecl tyDecl, I input)979     O visitTyDecl(TyDecl tyDecl, I input);
980 
visitTyParam(TyParam tyParam, I input)981     O visitTyParam(TyParam tyParam, I input);
982 
visitPkgDecl(PkgDecl pkgDecl, I input)983     O visitPkgDecl(PkgDecl pkgDecl, I input);
984   }
985 }
986