samples/visitor/11-cleanversion/src-api3.0/org/apidesign/visitor/Language.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:58:54 +0200
changeset 170 206cdfeefeec
child 171 2496512220b7
permissions -rw-r--r--
It always surprises me how things change when one really tries to implemente them. The whole approach with non-monotinic evolution was uncompilable. We need a common super type for all the visitors\!
     1 package org.apidesign.visitor;
     2 
     3 public final class Language {
     4     private Language() { }
     5     
     6     public static abstract class Expression {
     7         public abstract void visit(Visitor v);
     8     }
     9     public static final class Plus extends Expression {
    10         private final Expression first;
    11         private final Expression second;
    12         
    13         public Plus(Expression first, Expression second) {
    14             this.first = first;
    15             this.second = second;
    16         }
    17         public Expression getFirst() { return first; }
    18         public Expression getSecond() { return second; }
    19         @Override
    20         public void visit(Visitor v) { v.visitPlus(this); }
    21     }
    22     public static final class Number extends Expression {
    23         private final int value;
    24         public Number(int value) { this.value = value; }
    25         public int getValue() { return value; }
    26         @Override
    27         public void visit(Visitor v) { v.visitNumber(this); }
    28     }
    29     /** @since 2.0 */
    30     public static final class Minus extends Expression {
    31         private final Expression first;
    32         private final Expression second;
    33         
    34         public Minus(Expression first, Expression second) {
    35             this.first = first;
    36             this.second = second;
    37         }
    38         public Expression getFirst() { return first; }
    39         public Expression getSecond() { return second; }
    40         
    41         public void visit(Visitor v) { 
    42             if (v instanceof Visitor2_0) {
    43                 ((Visitor2_0)v).visitMinus(this);
    44             } else {
    45                 v.visitUnknown(this);
    46             }
    47         }
    48     }
    49     // BEGIN: visitor.nonmonotonic.real
    50     /** @since 3.0 */
    51     public final class Real extends Expression {
    52         private final double value;
    53         public Real(double value) {
    54             this.value = value;
    55         }
    56         public double getValue() {
    57             return value;
    58         }
    59         public void visit(Visitor v)
    60         // FINISH: visitor.nonmonotonic.real
    61         {
    62         }
    63     }
    64 
    65     
    66     public interface Visitor {
    67         public void visitUnknown(Expression e);
    68     }
    69     public interface Visitor1_0 extends Visitor {
    70         public void visitPlus(Plus s);
    71         public void visitNumber(Number n);
    72     }
    73     /** @since 2.0 */
    74     public interface Visitor2_0 extends Visitor {
    75         public void visitMinus(Minus s);
    76     }
    77     // BEGIN: visitor.nonmonotonic.visitor
    78     /** @since 3.0 */
    79     public interface Visitor3_0 extends Visitor {
    80         public void visitPlus(Plus s);
    81         public void visitMinus(Minus s);
    82         public void visitReal(Number n);
    83     }
    84     // END: visitor.nonmonotonic.visitor
    85 }