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.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