samples/visitor/21-clientprovider/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 177 67d6dceb1002
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     private Language() { }
     5     
     6     public interface Expression {
     7         public abstract void visit(Visitor v);
     8     }
     9     public interface Plus extends Expression {
    10         public Expression getFirst();
    11         public Expression getSecond();
    12     }
    13     public interface Number extends Expression {
    14         public int getValue();
    15     }
    16     /** @since 2.0 */
    17     public interface Minus extends Expression {
    18         public Expression getFirst();
    19         public Expression getSecond();
    20     }
    21     
    22     // BEGIN: visitor.clientprovider.v3
    23     /** @since 3.0 */
    24     public interface Real extends Expression {
    25         public double getValue();
    26     }
    27     public static abstract class Visitor {
    28         Visitor() {}
    29         
    30         
    31         /** @since 3.0 */
    32         public static Visitor create(Version30 v) {
    33             return create30(v);
    34         }
    35 
    36         /** @since 3.0 */
    37         public interface Version30 {
    38             public boolean visitUnknown(Expression e);
    39             public void visitPlus(Plus s);
    40             public void visitMinus(Minus s);
    41             public void visitReal(Real r);
    42         }
    43 
    44         /** @since 3.0 */
    45         public abstract void dispatchReal(Real r);
    46         
    47     // FINISH: visitor.clientprovider.v3
    48         /** @since 2.0 */
    49         public static Visitor create(Version20 v) {
    50             return create20(v);
    51         }
    52 
    53         /** @since 2.0 */
    54         public interface Version20 extends Version10 {
    55             public void visitMinus(Minus m);
    56         }
    57 
    58 
    59         /** @since 2.0 */
    60         public abstract void dispatchNumber(Number n);
    61         
    62         public static Visitor create(Version10 v) {
    63             return create10(v);
    64         }
    65 
    66         public interface Version10 {
    67             public boolean visitUnknown(Expression e);
    68             public void visitPlus(Plus s);
    69             public void visitNumber(Number n);
    70         }
    71 
    72         public abstract void dispatchPlus(Plus p);
    73         public abstract void dispatchMinus(Minus m);
    74     }
    75     
    76     // BEGIN: visitor.clientprovider.dispatch.v3.l1
    77     static Visitor create10(final Visitor.Version10 v) {
    78         return new Visitor() {
    79             @Override
    80             public void dispatchPlus(Plus p) {
    81                 v.visitPlus(p);
    82             }
    83 
    84             @Override
    85             public void dispatchNumber(Number n) {
    86                 v.visitNumber(n);
    87             }
    88 
    89             @Override
    90             public void dispatchMinus(Minus m) {
    91                 if (v.visitUnknown(m)) {
    92                     m.getFirst().visit(this);
    93                     m.getSecond().visit(this);
    94                 }
    95             }
    96 
    97             @Override
    98             public void dispatchReal(Real r) {
    99                 v.visitUnknown(r);
   100             }
   101         };
   102     }
   103     // END: visitor.clientprovider.dispatch.v3.l1
   104     // BEGIN: visitor.clientprovider.dispatch.v3.l2
   105     static Visitor create20(final Visitor.Version20 v) {
   106         return new Visitor() {
   107             @Override
   108             public void dispatchPlus(Plus p) {
   109                 v.visitPlus(p);
   110             }
   111 
   112             @Override
   113             public void dispatchNumber(Number n) {
   114                 v.visitNumber(n);
   115             }
   116 
   117             @Override
   118             public void dispatchMinus(Minus m) {
   119                 v.visitMinus(m);
   120             }
   121 
   122             @Override
   123             public void dispatchReal(Real r) {
   124                 v.visitUnknown(r);
   125             }
   126         };
   127     }
   128     // END: visitor.clientprovider.dispatch.v3.l2
   129     // BEGIN: visitor.clientprovider.dispatch.v3.l3
   130     static Visitor create30(final Visitor.Version30 v) {
   131         return new Visitor() {
   132             @Override
   133             public void dispatchReal(Real r) {
   134                 v.visitReal(r);
   135             }
   136 
   137             @Override
   138             public void dispatchNumber(final Number n) {
   139                 class RealWrapper implements Real {
   140                     public double getValue() {
   141                         return n.getValue();
   142                     }
   143                     public void visit(Visitor v) {
   144                         n.visit(v);
   145                     }
   146                 }
   147                 v.visitReal(new RealWrapper());
   148             }
   149 
   150             @Override
   151             public void dispatchPlus(Plus p) {
   152                 v.visitPlus(p);
   153             }
   154 
   155             @Override
   156             public void dispatchMinus(Minus m) {
   157                 v.visitMinus(m);
   158             }
   159         };
   160     }
   161     // END: visitor.clientprovider.dispatch.v3.l3
   162 }