test/tools/javac/processing/model/type/NoTypes.java

Tue, 14 May 2013 15:04:06 -0700

author
jjg
date
Tue, 14 May 2013 15:04:06 -0700
changeset 1755
ddb4a2bfcd82
parent 1466
b52a38d4536c
child 2525
2eb010b6cb22
permissions
-rw-r--r--

8013852: update reference impl for type-annotations
Reviewed-by: jjg
Contributed-by: wdietl@gmail.com, steve.sides@oracle.com, joel.franck@oracle.com, alex.buckley@oracle.com

     1 /*
     2  * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  */
    24 /*
    25  * @test
    26  * @bug     6418666 6423973 6453386 7025809
    27  * @summary Test the NoTypes: VOID, PACKAGE, NONE
    28  * @author  Scott Seligman
    29  * @library /tools/javac/lib
    30  * @build JavacTestingAbstractProcessor
    31  * @compile -g NoTypes.java
    32  * @compile -processor NoTypes -proc:only NoTypes.java
    33  */
    35 import java.util.Set;
    36 import javax.annotation.processing.*;
    37 import javax.lang.model.SourceVersion;
    38 import javax.lang.model.element.*;
    39 import javax.lang.model.type.*;
    40 import javax.lang.model.util.*;
    42 import static javax.lang.model.type.TypeKind.*;
    44 public class NoTypes extends JavacTestingAbstractProcessor {
    45     public boolean process(Set<? extends TypeElement> annoTypes,
    46                            RoundEnvironment round) {
    47         if (!round.processingOver())
    48             doit(annoTypes, round);
    49         return true;
    50     }
    52     private void doit(Set<? extends TypeElement> annoTypes,
    53                       RoundEnvironment round) {
    55         // The superclass of Object is NONE.
    56         TypeElement object = elements.getTypeElement("java.lang.Object");
    57         verifyKind(NONE, object.getSuperclass());
    59         // The enclosing type of a top-level class is NONE
    60         verifyKind(NONE, ((DeclaredType)object.asType()).getEnclosingType());
    62         // The superclass of an interface is NONE.
    63         TypeElement i = elements.getTypeElement("NoTypes.I");
    64         verifyKind(NONE, i.getSuperclass());
    66         // The type of a package is PACKAGE.
    67         Element pkg = i.getEnclosingElement().getEnclosingElement();
    68         verifyKind(PACKAGE, pkg.asType());
    70         // A package isn't enclosed.  Not yet, anyway.
    71         if (pkg.getEnclosingElement() != null)
    72             throw new AssertionError();
    74         verifyKind(VOID, types.getNoType(VOID));
    75         verifyKind(NONE, types.getNoType(NONE));
    77         // The return type of a constructor or void method is VOID.
    78         class Scanner extends ElementScanner<Void, Void> {
    79             @Override
    80             public Void visitExecutable(ExecutableElement e, Void p) {
    81                 verifyKind(VOID, e.getReturnType());
    82                 ExecutableType t = (ExecutableType) e.asType();
    83                 verifyKind(VOID, t.getReturnType());
    84                 return null;
    85             }
    86         }
    87         TypeElement c = elements.getTypeElement("NoTypes.C");
    88         new Scanner().scan(c);
    89     }
    91     /**
    92      * Verify that a NoType instance is of a particular kind, and that
    93      * the latest TypeKindVisitor properly dispatches on it.
    94      */
    95     private void verifyKind(TypeKind kind, TypeMirror type) {
    96         class Vis extends TypeKindVisitor<TypeKind, Void> {
    97             @Override
    98             public TypeKind visitNoTypeAsVoid(NoType t, Void p) {
    99                 return VOID;
   100             }
   101             @Override
   102             public TypeKind visitNoTypeAsPackage(NoType t, Void p) {
   103                 return PACKAGE;
   104             }
   105             @Override
   106             public TypeKind visitNoTypeAsNone(NoType t, Void p) {
   107                 return NONE;
   108             }
   109         }
   110         if (kind != type.getKind() || kind != new Vis().visit(type))
   111             throw new AssertionError();
   112     }
   114     // Fodder for the tests
   115     interface I {
   116     }
   118     class C {
   119         C() {}
   120         void m() {}
   121     }
   122 }

mercurial