TestVisitorDefaults.java revision 3895:4a937fde7b91
1131476Spjd/*
2142727Spjd * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3131476Spjd * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4131476Spjd *
5131476Spjd * This code is free software; you can redistribute it and/or modify it
6131476Spjd * under the terms of the GNU General Public License version 2 only, as
7131476Spjd * published by the Free Software Foundation.
8131476Spjd *
9131476Spjd * This code is distributed in the hope that it will be useful, but WITHOUT
10131476Spjd * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11131476Spjd * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12131476Spjd * version 2 for more details (a copy is included in the LICENSE file that
13155175Spjd * accompanied this code).
14131476Spjd *
15131476Spjd * You should have received a copy of the GNU General Public License version
16131476Spjd * 2 along with this work; if not, write to the Free Software Foundation,
17131476Spjd * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18131476Spjd *
19131476Spjd * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20131476Spjd * or visit www.oracle.com if you need additional information or have any
21131476Spjd * questions.
22131476Spjd */
23131476Spjd
24131476Spjd/*
25131476Spjd * @test
26131476Spjd * @bug 8172910
27131476Spjd * @summary Test behavior of default methods on visitors.
28131476Spjd * @modules java.compiler
29131476Spjd */
30131476Spjd
31131476Spjdimport java.util.List;
32131476Spjdimport javax.lang.model.SourceVersion;
33131476Spjdimport javax.lang.model.element.*;
34131476Spjdimport javax.lang.model.type.*;
35131476Spjdimport javax.lang.model.util.*;
36131476Spjd
37131476Spjd/**
38131476Spjd * Verify expected behavior of default methods on visitors.
39131476Spjd */
40131476Spjdpublic class TestVisitorDefaults {
41131476Spjd    public static void main(String... args) {
42131476Spjd        DirectElementVisitorChild dvc = new DirectElementVisitorChild();
43179550Smarcel        if (!"visitUnknown".equals(dvc.visitModule(null, null))) {
44176852Sdelphij            throw new RuntimeException("Problem with DirectElementVisitorChild");
45176852Sdelphij        }
46176852Sdelphij        if (!"visit".equals(dvc.visit(null))) {
47176852Sdelphij            throw new RuntimeException("Problem with DirectElementVisitorChild");
48131476Spjd        }
49176852Sdelphij
50176852Sdelphij        IndirectElementVisitorChild ivc = new IndirectElementVisitorChild();
51131476Spjd        if (!"visitUnknown".equals(ivc.visitModule(null, null))) {
52131476Spjd            throw new RuntimeException("Problem with IndirectElementVisitorChild");
53132344Spjd        }
54132344Spjd
55131476Spjd        DirectTypeVisitorChild dtvc = new DirectTypeVisitorChild();
56131476Spjd        if (!"visit".equals(dtvc.visit(null))) {
57176852Sdelphij            throw new RuntimeException("Problem with DirectTypeVisitorChild");
58212554Spjd        }
59143586Spjd
60143586Spjd        DirectAnnotationVisitorChild davc = new DirectAnnotationVisitorChild();
61143586Spjd        if (!"visit".equals(davc.visit(null))) {
62212554Spjd            throw new RuntimeException("Problem with DirectAnnotationVisitorChild");
63143586Spjd        }
64131476Spjd    }
65131476Spjd
66162868Spjd    private static class DirectElementVisitorChild
67131476Spjd        implements ElementVisitor<String, Object> {
68143586Spjd
69212554Spjd        public DirectElementVisitorChild() {
70131476Spjd            super();
71212554Spjd        }
72143586Spjd
73143586Spjd        @Override
74143586Spjd        public String visitModule(ModuleElement e, Object o) {
75212554Spjd            return ElementVisitor.super.visitModule(e, null);
76143586Spjd        }
77131649Spjd
78131649Spjd        @Override
79162868Spjd        public String visitUnknown(Element e, Object o) {
80131649Spjd            return "visitUnknown";
81143586Spjd        }
82212554Spjd
83131649Spjd        @Override
84131476Spjd        public String visit(Element e) {
85131476Spjd            return ElementVisitor.super.visit(e);
86131476Spjd        }
87131476Spjd
88131476Spjd        @Override
89131476Spjd        public String visit(Element e, Object o) {
90131476Spjd            return "visit";
91131476Spjd        }
92131476Spjd
93131476Spjd        @Override
94131476Spjd        public String visitExecutable(ExecutableElement e, Object o)       { return throwUOE(); }
95131476Spjd        @Override
96131476Spjd        public String visitPackage(PackageElement e, Object o)             { return throwUOE(); }
97153190Spjd        @Override
98131476Spjd        public String visitType(TypeElement e, Object o)                   { return throwUOE(); }
99131476Spjd        @Override
100131476Spjd        public String visitTypeParameter(TypeParameterElement e, Object o) { return throwUOE(); }
101131476Spjd        @Override
102131476Spjd        public String visitVariable(VariableElement e, Object o)           { return throwUOE(); }
103131476Spjd    }
104131476Spjd
105131476Spjd    private static class IndirectElementVisitorChild
106132344Spjd        extends AbstractElementVisitor6<String, Object> {
107132344Spjd
108131476Spjd        public IndirectElementVisitorChild() {
109131476Spjd            super();
110131476Spjd        }
111131476Spjd
112131476Spjd        @Override
113131476Spjd        public String visitModule(ModuleElement e, Object o) {
114131476Spjd            return super.visitModule(e, o);
115131476Spjd        }
116131476Spjd
117131476Spjd
118153190Spjd        @Override
119131476Spjd        public String visitUnknown(Element e, Object o) {
120153190Spjd            return "visitUnknown";
121153190Spjd        }
122131476Spjd
123131476Spjd        @Override
124131476Spjd        public String visitExecutable(ExecutableElement e, Object o)       { return throwUOE(); }
125131476Spjd        @Override
126131476Spjd        public String visitPackage(PackageElement e, Object o)             { return throwUOE(); }
127131476Spjd        @Override
128131476Spjd        public String visitType(TypeElement e, Object o)                   { return throwUOE(); }
129153190Spjd        @Override
130131476Spjd        public String visitTypeParameter(TypeParameterElement e, Object o) { return throwUOE(); }
131131476Spjd        @Override
132131476Spjd        public String visitVariable(VariableElement e, Object o)           { return throwUOE(); }
133131476Spjd    }
134131476Spjd
135131476Spjd
136131476Spjd    private static class DirectTypeVisitorChild
137131476Spjd        implements TypeVisitor<String, Object> {
138131476Spjd
139153190Spjd        public DirectTypeVisitorChild() {
140131476Spjd            super();
141142727Spjd        }
142142727Spjd
143142727Spjd        @Override
144142727Spjd        public String visit(TypeMirror t) {
145142727Spjd            return TypeVisitor.super.visit(t);
146142727Spjd        }
147131476Spjd
148131476Spjd        @Override
149131476Spjd        public String visit(TypeMirror t, Object o) {
150131476Spjd            return "visit";
151131476Spjd        }
152131476Spjd
153131476Spjd        @Override
154131476Spjd        public String visitUnknown(TypeMirror t, Object o)            { return throwUOE(); }
155131476Spjd        @Override
156131476Spjd        public String visitArray(ArrayType t, Object o)               { return throwUOE(); }
157131476Spjd        @Override
158131476Spjd        public String visitDeclared(DeclaredType t, Object o)         { return throwUOE(); }
159131476Spjd        @Override
160131476Spjd        public String visitError(ErrorType t, Object o)               { return throwUOE(); }
161131476Spjd        @Override
162131476Spjd        public String visitExecutable(ExecutableType t, Object o)     { return throwUOE(); }
163131476Spjd        @Override
164131476Spjd        public String visitIntersection(IntersectionType t, Object o) { return throwUOE(); }
165131476Spjd        @Override
166153190Spjd        public String visitNoType(NoType t, Object o)                 { return throwUOE(); }
167131476Spjd        @Override
168153190Spjd        public String visitNull(NullType t, Object o)                 { return throwUOE(); }
169153190Spjd        @Override
170131476Spjd        public String visitPrimitive(PrimitiveType t, Object o)       { return throwUOE(); }
171131476Spjd        @Override
172131476Spjd        public String visitTypeVariable(TypeVariable t, Object o)     { return throwUOE(); }
173131476Spjd        @Override
174153190Spjd        public String visitUnion(UnionType t, Object o)               { return throwUOE(); }
175153190Spjd        @Override
176131476Spjd        public String visitWildcard(WildcardType t, Object o)         { return throwUOE(); }
177131476Spjd    }
178131476Spjd
179131476Spjd    private static class DirectAnnotationVisitorChild
180131476Spjd        implements AnnotationValueVisitor<String, Object> {
181131476Spjd
182131476Spjd        @Override
183131476Spjd        public String visit(AnnotationValue av) {
184155175Spjd            return AnnotationValueVisitor.super.visit(av);
185131476Spjd        }
186131476Spjd
187132344Spjd        @Override
188155175Spjd        public String visit(AnnotationValue av, Object o) {
189132344Spjd            return "visit";
190132344Spjd        }
191132344Spjd
192155175Spjd        @Override
193132344Spjd        public String visitAnnotation(AnnotationMirror a, Object o)    { return throwUOE(); }
194132344Spjd        @Override
195132344Spjd        public String visitArray(List<? extends AnnotationValue> vals,
196132344Spjd                                   Object o)                           { return throwUOE(); }
197132344Spjd        @Override
198132344Spjd        public String visitBoolean(boolean b, Object o)                { return throwUOE(); }
199132344Spjd        @Override
200132344Spjd        public String visitByte(byte b, Object o)                      { return throwUOE(); }
201132344Spjd        @Override
202153190Spjd        public String visitChar(char c, Object o)                      { return throwUOE(); }
203132344Spjd        @Override
204153190Spjd        public String visitDouble(double d, Object o)                  { return throwUOE(); }
205153190Spjd        @Override
206132344Spjd        public String visitEnumConstant(VariableElement c, Object o)   { return throwUOE(); }
207132344Spjd        @Override
208132344Spjd        public String visitFloat(float f, Object o)                    { return throwUOE(); }
209132344Spjd        @Override
210153190Spjd        public String visitInt(int i, Object o)                        { return throwUOE(); }
211153190Spjd        @Override
212132344Spjd        public String visitLong(long i, Object o)                      { return throwUOE(); }
213132344Spjd        @Override
214132344Spjd        public String visitShort(short s, Object o)                    { return throwUOE(); }
215132344Spjd        @Override
216132344Spjd        public String visitString(String s, Object o)                  { return throwUOE(); }
217132344Spjd        @Override
218132344Spjd        public String visitType(TypeMirror t, Object o)                { return throwUOE(); }
219132344Spjd        @Override
220132344Spjd        public String visitUnknown(AnnotationValue av, Object o)       { return throwUOE(); }
221132344Spjd    }
222132344Spjd
223132344Spjd    private static String throwUOE() {
224132344Spjd        throw new UnsupportedOperationException();
225132344Spjd    }
226}
227