diff -r ddd110646d21 -r 609fb59657b4 src/share/classes/com/sun/tools/javac/code/Symbol.java --- a/src/share/classes/com/sun/tools/javac/code/Symbol.java Mon Sep 29 11:34:43 2008 +0100 +++ b/src/share/classes/com/sun/tools/javac/code/Symbol.java Mon Sep 29 11:48:09 2008 +0100 @@ -132,6 +132,10 @@ throw new AssertionError(); } + public R accept(Symbol.Visitor v, P p) { + return v.visitSymbol(this, p); + } + /** The Java source which this symbol represents. * A description of this symbol; overrides Object. */ @@ -477,6 +481,10 @@ public R accept(ElementVisitor v, P p) { return other.accept(v, p); } + + public R accept(Symbol.Visitor v, P p) { + return v.visitSymbol(other, p); + } } /** A class for type symbols. Type variables are represented by instances @@ -570,6 +578,10 @@ return v.visitTypeParameter(this, p); } + public R accept(Symbol.Visitor v, P p) { + return v.visitTypeSymbol(this, p); + } + public List getBounds() { TypeVar t = (TypeVar)type; Type bound = t.getUpperBound(); @@ -653,6 +665,10 @@ public R accept(ElementVisitor v, P p) { return v.visitPackage(this, p); } + + public R accept(Symbol.Visitor v, P p) { + return v.visitPackageSymbol(this, p); + } } /** A class for class symbols @@ -843,6 +859,10 @@ public R accept(ElementVisitor v, P p) { return v.visitType(this, p); } + + public R accept(Symbol.Visitor v, P p) { + return v.visitClassSymbol(this, p); + } } @@ -969,6 +989,10 @@ assert !(data instanceof Env) : this; this.data = data; } + + public R accept(Symbol.Visitor v, P p) { + return v.visitVarSymbol(this, p); + } } /** A class for method symbols. @@ -1232,6 +1256,10 @@ return v.visitExecutable(this, p); } + public R accept(Symbol.Visitor v, P p) { + return v.visitMethodSymbol(this, p); + } + public Type getReturnType() { return asType().getReturnType(); } @@ -1251,6 +1279,10 @@ super(PUBLIC | STATIC, name, type, owner); this.opcode = opcode; } + + public R accept(Symbol.Visitor v, P p) { + return v.visitOperatorSymbol(this, p); + } } /** Symbol completer interface. @@ -1308,4 +1340,28 @@ } } + + /** + * A visitor for symbols. A visitor is used to implement operations + * (or relations) on symbols. Most common operations on types are + * binary relations and this interface is designed for binary + * relations, that is, operations on the form + * Symbol × P → R. + * + * + * @param the return type of the operation implemented by this + * visitor; use Void if no return type is needed. + * @param

the type of the second argument (the first being the + * symbol itself) of the operation implemented by this visitor; use + * Void if a second argument is not needed. + */ + public interface Visitor { + R visitClassSymbol(ClassSymbol s, P arg); + R visitMethodSymbol(MethodSymbol s, P arg); + R visitPackageSymbol(PackageSymbol s, P arg); + R visitOperatorSymbol(OperatorSymbol s, P arg); + R visitVarSymbol(VarSymbol s, P arg); + R visitTypeSymbol(TypeSymbol s, P arg); + R visitSymbol(Symbol s, P arg); + } }