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\!
authorJaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:58:54 +0200
changeset 170206cdfeefeec
parent 169 3be14291c9f8
child 171 2496512220b7
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\!
samples/visitor/11-cleanversion/nbproject/project.xml
samples/visitor/11-cleanversion/src-api1.0/org/apidesign/visitor/Language.java
samples/visitor/11-cleanversion/src-api2.0/org/apidesign/visitor/Language.java
samples/visitor/11-cleanversion/src-api3.0/org/apidesign/visitor/Language.java
samples/visitor/11-cleanversion/src-test/org/apidesign/test/visitor/PrintTest.java
samples/visitor/11-cleanversion/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java
     1.1 --- a/samples/visitor/11-cleanversion/nbproject/project.xml	Sat Jun 14 09:58:52 2008 +0200
     1.2 +++ b/samples/visitor/11-cleanversion/nbproject/project.xml	Sat Jun 14 09:58:54 2008 +0200
     1.3 @@ -23,6 +23,12 @@
     1.4                      <encoding>UTF-8</encoding>
     1.5                  </source-folder>
     1.6                  <source-folder>
     1.7 +                    <label>src-api3.0</label>
     1.8 +                    <type>java</type>
     1.9 +                    <location>src-api3.0</location>
    1.10 +                    <encoding>UTF-8</encoding>
    1.11 +                </source-folder>
    1.12 +                <source-folder>
    1.13                      <label>test</label>
    1.14                      <type>java</type>
    1.15                      <location>src-test</location>
    1.16 @@ -64,11 +70,15 @@
    1.17                          <location>src-api2.0</location>
    1.18                      </source-folder>
    1.19                      <source-folder style="packages">
    1.20 +                        <label>API Version 3.0</label>
    1.21 +                        <location>src-api3.0</location>
    1.22 +                    </source-folder>
    1.23 +                    <source-folder style="packages">
    1.24                          <label>Usage of the API</label>
    1.25                          <location>src-test</location>
    1.26                      </source-folder>
    1.27                      <source-folder style="packages">
    1.28 -                        <label>Usage of new structures with old visitor</label>
    1.29 +                        <label>Usage of 2.0 elements with 1.0 visitor</label>
    1.30                          <location>src-test2.0</location>
    1.31                      </source-folder>
    1.32                      <source-file>
    1.33 @@ -93,6 +103,10 @@
    1.34                  <source-level>1.5</source-level>
    1.35              </compilation-unit>
    1.36              <compilation-unit>
    1.37 +                <package-root>src-api3.0</package-root>
    1.38 +                <source-level>1.5</source-level>
    1.39 +            </compilation-unit>
    1.40 +            <compilation-unit>
    1.41                  <package-root>src-test</package-root>
    1.42                  <classpath mode="compile">src-api1.0:../../libs/dist/junit-4.4.jar</classpath>
    1.43                  <source-level>1.5</source-level>
     2.1 --- a/samples/visitor/11-cleanversion/src-api1.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:58:52 2008 +0200
     2.2 +++ b/samples/visitor/11-cleanversion/src-api1.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:58:54 2008 +0200
     2.3 @@ -18,18 +18,33 @@
     2.4          public Expression getFirst() { return first; }
     2.5          public Expression getSecond() { return second; }
     2.6          @Override
     2.7 -        public void visit(Visitor v) { v.visitPlus(this); }
     2.8 +        public void visit(Visitor v) { 
     2.9 +            if (v instanceof Visitor1_0) {
    2.10 +                ((Visitor1_0)v).visitPlus(this);
    2.11 +            } else {
    2.12 +                v.visitUnknown(this);
    2.13 +            }
    2.14 +        }
    2.15      }
    2.16      public static final class Number extends Expression {
    2.17          private final int value;
    2.18          public Number(int value) { this.value = value; }
    2.19          public int getValue() { return value; }
    2.20          @Override
    2.21 -        public void visit(Visitor v) { v.visitNumber(this); }
    2.22 +        public void visit(Visitor v) { 
    2.23 +            if (v instanceof Visitor1_0) {
    2.24 +                ((Visitor1_0)v).visitNumber(this);
    2.25 +            } else {
    2.26 +                v.visitUnknown(this);
    2.27 +            }
    2.28 +        }
    2.29      }
    2.30  
    2.31      public interface Visitor {
    2.32          public void visitUnknown(Expression e);
    2.33 +    }
    2.34 +    
    2.35 +    public interface Visitor1_0 extends Visitor {
    2.36          public void visitPlus(Plus s);
    2.37          public void visitNumber(Number n);
    2.38      }
     3.1 --- a/samples/visitor/11-cleanversion/src-api2.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:58:52 2008 +0200
     3.2 +++ b/samples/visitor/11-cleanversion/src-api2.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:58:54 2008 +0200
     3.3 @@ -1,31 +1,68 @@
     3.4  package org.apidesign.visitor;
     3.5  
     3.6  public final class Language {
     3.7 -    private Language() { }
     3.8 -    
     3.9 +
    3.10 +    private Language() {
    3.11 +    }
    3.12 +
    3.13      public static abstract class Expression {
    3.14 +
    3.15 +        Expression() {
    3.16 +        }
    3.17 +
    3.18          public abstract void visit(Visitor v);
    3.19      }
    3.20 +
    3.21      public static final class Plus extends Expression {
    3.22 +
    3.23          private final Expression first;
    3.24          private final Expression second;
    3.25 -        
    3.26 +
    3.27          public Plus(Expression first, Expression second) {
    3.28              this.first = first;
    3.29              this.second = second;
    3.30          }
    3.31 -        public Expression getFirst() { return first; }
    3.32 -        public Expression getSecond() { return second; }
    3.33 +
    3.34 +        public Expression getFirst() {
    3.35 +            return first;
    3.36 +        }
    3.37 +
    3.38 +        public Expression getSecond() {
    3.39 +            return second;
    3.40 +        }
    3.41 +
    3.42          @Override
    3.43 -        public void visit(Visitor v) { v.visitPlus(this); }
    3.44 +        public void visit(Visitor v) {
    3.45 +            if (v instanceof Visitor1_0) {
    3.46 +                ((Visitor1_0) v).visitPlus(this);
    3.47 +            } else {
    3.48 +                v.visitUnknown(this);
    3.49 +            }
    3.50 +        }
    3.51      }
    3.52 +
    3.53      public static final class Number extends Expression {
    3.54 +
    3.55          private final int value;
    3.56 -        public Number(int value) { this.value = value; }
    3.57 -        public int getValue() { return value; }
    3.58 +
    3.59 +        public Number(int value) {
    3.60 +            this.value = value;
    3.61 +        }
    3.62 +
    3.63 +        public int getValue() {
    3.64 +            return value;
    3.65 +        }
    3.66 +
    3.67          @Override
    3.68 -        public void visit(Visitor v) { v.visitNumber(this); }
    3.69 +        public void visit(Visitor v) {
    3.70 +            if (v instanceof Visitor1_0) {
    3.71 +                ((Visitor1_0) v).visitNumber(this);
    3.72 +            } else {
    3.73 +                v.visitUnknown(this);
    3.74 +            }
    3.75 +        }
    3.76      }
    3.77 +
    3.78      /** @since 2.0 */
    3.79      public static final class Minus extends Expression {
    3.80          private final Expression first;
    3.81 @@ -52,11 +89,13 @@
    3.82      // BEGIN: visitor.cleanversion.v2
    3.83      public interface Visitor {
    3.84          public void visitUnknown(Expression e);
    3.85 +    }
    3.86 +    public interface Visitor1_0 extends Visitor {
    3.87          public void visitPlus(Plus s);
    3.88          public void visitNumber(Number n);
    3.89      }
    3.90      /** @since 2.0 */
    3.91 -    public interface Visitor2_0 extends Visitor {
    3.92 +    public interface Visitor2_0 extends Visitor1_0 {
    3.93          public void visitMinus(Minus s);
    3.94      }
    3.95      // END: visitor.cleanversion.v2
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/samples/visitor/11-cleanversion/src-api3.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:58:54 2008 +0200
     4.3 @@ -0,0 +1,85 @@
     4.4 +package org.apidesign.visitor;
     4.5 +
     4.6 +public final class Language {
     4.7 +    private Language() { }
     4.8 +    
     4.9 +    public static abstract class Expression {
    4.10 +        public abstract void visit(Visitor v);
    4.11 +    }
    4.12 +    public static final class Plus extends Expression {
    4.13 +        private final Expression first;
    4.14 +        private final Expression second;
    4.15 +        
    4.16 +        public Plus(Expression first, Expression second) {
    4.17 +            this.first = first;
    4.18 +            this.second = second;
    4.19 +        }
    4.20 +        public Expression getFirst() { return first; }
    4.21 +        public Expression getSecond() { return second; }
    4.22 +        @Override
    4.23 +        public void visit(Visitor v) { v.visitPlus(this); }
    4.24 +    }
    4.25 +    public static final class Number extends Expression {
    4.26 +        private final int value;
    4.27 +        public Number(int value) { this.value = value; }
    4.28 +        public int getValue() { return value; }
    4.29 +        @Override
    4.30 +        public void visit(Visitor v) { v.visitNumber(this); }
    4.31 +    }
    4.32 +    /** @since 2.0 */
    4.33 +    public static final class Minus extends Expression {
    4.34 +        private final Expression first;
    4.35 +        private final Expression second;
    4.36 +        
    4.37 +        public Minus(Expression first, Expression second) {
    4.38 +            this.first = first;
    4.39 +            this.second = second;
    4.40 +        }
    4.41 +        public Expression getFirst() { return first; }
    4.42 +        public Expression getSecond() { return second; }
    4.43 +        
    4.44 +        public void visit(Visitor v) { 
    4.45 +            if (v instanceof Visitor2_0) {
    4.46 +                ((Visitor2_0)v).visitMinus(this);
    4.47 +            } else {
    4.48 +                v.visitUnknown(this);
    4.49 +            }
    4.50 +        }
    4.51 +    }
    4.52 +    // BEGIN: visitor.nonmonotonic.real
    4.53 +    /** @since 3.0 */
    4.54 +    public final class Real extends Expression {
    4.55 +        private final double value;
    4.56 +        public Real(double value) {
    4.57 +            this.value = value;
    4.58 +        }
    4.59 +        public double getValue() {
    4.60 +            return value;
    4.61 +        }
    4.62 +        public void visit(Visitor v)
    4.63 +        // FINISH: visitor.nonmonotonic.real
    4.64 +        {
    4.65 +        }
    4.66 +    }
    4.67 +
    4.68 +    
    4.69 +    public interface Visitor {
    4.70 +        public void visitUnknown(Expression e);
    4.71 +    }
    4.72 +    public interface Visitor1_0 extends Visitor {
    4.73 +        public void visitPlus(Plus s);
    4.74 +        public void visitNumber(Number n);
    4.75 +    }
    4.76 +    /** @since 2.0 */
    4.77 +    public interface Visitor2_0 extends Visitor {
    4.78 +        public void visitMinus(Minus s);
    4.79 +    }
    4.80 +    // BEGIN: visitor.nonmonotonic.visitor
    4.81 +    /** @since 3.0 */
    4.82 +    public interface Visitor3_0 extends Visitor {
    4.83 +        public void visitPlus(Plus s);
    4.84 +        public void visitMinus(Minus s);
    4.85 +        public void visitReal(Number n);
    4.86 +    }
    4.87 +    // END: visitor.nonmonotonic.visitor
    4.88 +}
     5.1 --- a/samples/visitor/11-cleanversion/src-test/org/apidesign/test/visitor/PrintTest.java	Sat Jun 14 09:58:52 2008 +0200
     5.2 +++ b/samples/visitor/11-cleanversion/src-test/org/apidesign/test/visitor/PrintTest.java	Sat Jun 14 09:58:54 2008 +0200
     5.3 @@ -5,12 +5,13 @@
     5.4  import org.apidesign.visitor.Language.Number;
     5.5  import org.apidesign.visitor.Language.Plus;
     5.6  import org.apidesign.visitor.Language.Visitor;
     5.7 +import org.apidesign.visitor.Language.Visitor1_0;
     5.8  import org.junit.Test;
     5.9  
    5.10  public class PrintTest {
    5.11  
    5.12      // BEGIN: visitor.notevolutionready.print
    5.13 -    public static class PrintVisitor implements Visitor {
    5.14 +    public static class PrintVisitor implements Visitor1_0 {
    5.15          StringBuffer sb = new StringBuffer();
    5.16          
    5.17          public void visitUnknown(Expression exp) {
     6.1 --- a/samples/visitor/11-cleanversion/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java	Sat Jun 14 09:58:52 2008 +0200
     6.2 +++ b/samples/visitor/11-cleanversion/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java	Sat Jun 14 09:58:54 2008 +0200
     6.3 @@ -6,7 +6,6 @@
     6.4  import org.apidesign.visitor.Language.Minus;
     6.5  import org.apidesign.visitor.Language.Number;
     6.6  import org.apidesign.visitor.Language.Plus;
     6.7 -import org.apidesign.visitor.Language.Visitor;
     6.8  import org.apidesign.visitor.Language.Visitor2_0;
     6.9  import org.junit.Test;
    6.10