samples/visitor/11-cleanversion/src-api3.0/org/apidesign/visitor/Language.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 30 Oct 2014 21:30:10 +0100
changeset 409 40cabcdcd2be
parent 175 7aaa7b256c7e
permissions -rw-r--r--
Updating to NBMs from NetBeans 8.0.1 as some of them are required to run on JDK8
     1 package org.apidesign.visitor;
     2 
     3 public final class Language {
     4 
     5     private Language() {
     6     }
     7 
     8     public static abstract class Expression {
     9 
    10         Expression() {
    11         }
    12 
    13         public abstract void visit(Visitor v);
    14     }
    15 
    16     public static final class Plus extends Expression {
    17 
    18         private final Expression first;
    19         private final Expression second;
    20 
    21         public Plus(Expression first, Expression second) {
    22             this.first = first;
    23             this.second = second;
    24         }
    25 
    26         public Expression getFirst() {
    27             return first;
    28         }
    29 
    30         public Expression getSecond() {
    31             return second;
    32         }
    33 
    34         @Override
    35         public void visit(Visitor v) {
    36             if (v instanceof Visitor10) {
    37                 ((Visitor10) v).visitPlus(this);
    38             } else if (v instanceof Visitor30) {
    39                 ((Visitor30) v).visitPlus(this);
    40             } else {
    41                 v.visitUnknown(this);
    42             }
    43         }
    44     }
    45 
    46     public static final class Number extends Expression {
    47 
    48         private final int value;
    49 
    50         public Number(int value) {
    51             this.value = value;
    52         }
    53 
    54         public int getValue() {
    55             return value;
    56         }
    57 
    58         @Override
    59         public void visit(Visitor v) {
    60             if (v instanceof Visitor10) {
    61                 ((Visitor10) v).visitNumber(this);
    62             } else if (v instanceof Visitor30) {
    63                 Real wrapper = new Real(getValue());
    64                 ((Visitor30) v).visitReal(wrapper);
    65             } else {
    66                 v.visitUnknown(this);
    67             }
    68         }
    69     }
    70     // BEGIN: visitor.nonmonotonic.Minus3
    71     /** @since 2.0 */
    72     public static final class Minus/*3.0*/ extends Expression {
    73         private final Expression first;
    74         private final Expression second;
    75         
    76         public Minus(Expression first, Expression second) {
    77             this.first = first;
    78             this.second = second;
    79         }
    80         public Expression getFirst() { return first; }
    81         public Expression getSecond() { return second; }
    82         
    83         public void visit(Visitor v) { 
    84             if (v instanceof Visitor20) {
    85                 ((Visitor20)v).visitMinus(this);
    86             } else if (v instanceof Visitor30) {
    87                 ((Visitor30)v).visitMinus(this);
    88             } else {
    89                 v.visitUnknown(this);
    90             }
    91         }
    92     }
    93     // END: visitor.nonmonotonic.Minus3
    94     // BEGIN: visitor.nonmonotonic.real
    95     /** @since 3.0 */
    96     public static final class Real extends Expression {
    97         private final double value;
    98         public Real(double value) {
    99             this.value = value;
   100         }
   101         public double getValue() {
   102             return value;
   103         }
   104         public void visit(Visitor v)
   105         // FINISH: visitor.nonmonotonic.real
   106         {
   107             if (v instanceof Visitor30) {
   108                 ((Visitor30)v).visitReal(this);
   109             } else {
   110                 v.visitUnknown(this);
   111             }
   112         }
   113     }
   114 
   115     
   116     public interface Visitor {
   117         public void visitUnknown(Expression e);
   118     }
   119     public interface Visitor10 extends Visitor {
   120         public void visitPlus(Plus s);
   121         public void visitNumber(Number n);
   122     }
   123     /** @since 2.0 */
   124     public interface Visitor20 extends Visitor {
   125         public void visitMinus(Minus s);
   126     }
   127     // BEGIN: visitor.nonmonotonic.visitor
   128     /** @since 3.0 */
   129     public interface Visitor30 extends Visitor {
   130         public void visitPlus(Plus s);
   131         public void visitMinus(Minus s);
   132         public void visitReal(Real r);
   133     }
   134     // END: visitor.nonmonotonic.visitor
   135 }