langtools/test/tools/javac/defaultMethods/syntax/TestDefaultMethodsSyntax.java
author akulyakh
Thu, 21 May 2015 11:41:04 -0700
changeset 30730 d3ce7619db2c
parent 29293 1583c6dd6df7
permissions -rw-r--r--
8076543: Add @modules as needed to the langtools tests Reviewed-by: jjg, shurailine
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
     1
/*
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
     2
 * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
     4
 *
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
     8
 *
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    13
 * accompanied this code).
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    14
 *
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    18
 *
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    21
 * questions.
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    22
 */
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    23
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    24
/*
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    25
 * @test
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
    26
 * @bug 7192245 8005851 8005166 8071453
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    27
 * @summary Automatic test for checking set of allowed modifiers on interface methods
30730
d3ce7619db2c 8076543: Add @modules as needed to the langtools tests
akulyakh
parents: 29293
diff changeset
    28
 * @modules jdk.compiler
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    29
 */
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    30
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    31
import com.sun.source.util.JavacTask;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    32
import java.net.URI;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    33
import java.util.Arrays;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    34
import java.util.List;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    35
import javax.tools.Diagnostic;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    36
import javax.tools.JavaCompiler;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    37
import javax.tools.JavaFileObject;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    38
import javax.tools.SimpleJavaFileObject;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    39
import javax.tools.StandardJavaFileManager;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    40
import javax.tools.ToolProvider;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    41
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    42
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    43
public class TestDefaultMethodsSyntax {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    44
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    45
    static int checkCount = 0;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    46
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    47
    enum VersionKind {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    48
        PRE_LAMBDA("7"),
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
    49
        LAMBDA("8"),
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
    50
        POST_LAMBDA("9");
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    51
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    52
        String versionString;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    53
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    54
        VersionKind(String versionString) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    55
            this.versionString = versionString;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    56
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    57
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    58
        List<String> getOptions() {
15377
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15376
diff changeset
    59
            return Arrays.asList("-XDallowStaticInterfaceMethods", "-source", versionString);
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    60
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    61
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    62
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    63
    enum ModifierKind {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    64
        NONE(""),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    65
        PUBLIC("public"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    66
        PROTECTED("protected"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    67
        PRIVATE("private"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    68
        ABSTRACT("abstract"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    69
        STATIC("static"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    70
        NATIVE("native"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    71
        SYNCHRONIZED("synchronized"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    72
        FINAL("final"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    73
        STRICTFP("strictfp"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    74
        DEFAULT("default");
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    75
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    76
        String modStr;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    77
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    78
        private ModifierKind(String modStr) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    79
            this.modStr = modStr;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    80
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    81
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    82
        static boolean intersect(ModifierKind mk, ModifierKind... mks) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    83
            for (ModifierKind mk2 : mks) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    84
                if (mk == mk2) return true;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    85
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    86
            return false;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    87
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    88
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    89
        static boolean compatible(MethodKind mk, ModifierKind mod1, ModifierKind mod2, EnclosingKind ek) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    90
            if (intersect(ABSTRACT, mod1, mod2) || intersect(NATIVE, mod1, mod2)) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    91
                return mk == MethodKind.NO_BODY;
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
    92
            } else if (intersect(DEFAULT, mod1, mod2) || intersect(STATIC, mod1, mod2)
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
    93
                    || intersect(PRIVATE, mod1, mod2)) {
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    94
                return mk == MethodKind.BODY;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    95
            } else {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    96
                return ek == EnclosingKind.INTERFACE ?
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    97
                        mk == MethodKind.NO_BODY : mk == MethodKind.BODY;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    98
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
    99
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   100
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   101
        boolean compatible(EnclosingKind ek) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   102
            switch (this) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   103
                case PROTECTED:
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   104
                    return ek != EnclosingKind.INTERFACE;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   105
                default:
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   106
                    return true;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   107
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   108
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   109
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   110
        static boolean compatible(ModifierKind m1, ModifierKind m2, EnclosingKind ek) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   111
            Result res1 = allowedModifierPairs[m1.ordinal()][m2.ordinal()];
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   112
            Result res2 = allowedModifierPairs[m2.ordinal()][m1.ordinal()];
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   113
            if (res1 != res2) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   114
                throw new AssertionError(String.format("Ill-formed table: [%s,%s] != [%s,%s]", m1, m2, m2, m1));
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   115
            } else {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   116
                return res1.compatible(ek, m1, m2);
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   117
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   118
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   119
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   120
        interface Result {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   121
            boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2);
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   122
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   123
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   124
        static final Result T = new Result() {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   125
            @Override
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   126
            public boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   127
                return true;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   128
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   129
        };
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   130
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   131
        static final Result F = new Result() {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   132
            @Override
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   133
            public boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   134
                return false;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   135
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   136
        };
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   137
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   138
        static final Result C = new Result() {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   139
            @Override
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   140
            public boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   141
                return ek != EnclosingKind.INTERFACE;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   142
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   143
        };
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   144
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   145
        static final Result I = new Result() {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   146
            @Override
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   147
            public boolean compatible(EnclosingKind ek, ModifierKind m1, ModifierKind m2) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   148
                return ek == EnclosingKind.INTERFACE;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   149
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   150
        };
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   151
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   152
        static Result[][] allowedModifierPairs = {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   153
            /*                     NONE  PUBLIC  PROTECTED  PRIVATE  ABSTRACT  STATIC  NATIVE  SYNCHRONIZED  FINAL  STRICTFP  DEFAULT */
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
   154
            /* NONE */           { T   , T    , C        , T       , T       , T     , C     , C           , C    , C       , I   },
15377
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15376
diff changeset
   155
            /* PUBLIC */         { T   , F    , F        , F       , T       , T     , C     , C           , C    , C       , I   },
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   156
            /* PROTECTED */      { C   , F    , F        , F       , C       , C     , C     , C           , C    , C       , F   },
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
   157
            /* PRIVATE */        { T   , F    , F        , F       , F       , T     , C     , C           , C    , T       , F   },
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   158
            /* ABSTRACT */       { T   , T    , C        , F       , F       , F     , F     , F           , F    , F       , F   },
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
   159
            /* STATIC */         { T   , T    , C        , T       , F       , F     , C     , C           , C    , T       , F   },
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   160
            /* NATIVE */         { C   , C    , C        , C       , F       , C     , F     , C           , C    , F       , F   },
15376
32b49791817d 8005851: Remove support for synchronized interface methods
mcimadamore
parents: 14547
diff changeset
   161
            /* SYNCHRONIZED */   { C   , C    , C        , C       , F       , C     , C     , F           , C    , C       , F   },
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   162
            /* FINAL */          { C   , C    , C        , C       , F       , C     , C     , C           , F    , C       , F   },
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
   163
            /* STRICTFP */       { C   , C    , C        , T       , F       , T     , F     , C           , C    , F       , I   },
15376
32b49791817d 8005851: Remove support for synchronized interface methods
mcimadamore
parents: 14547
diff changeset
   164
            /* DEFAULT */        { I   , I    , F        , F       , F       , F     , F     , F           , F    , I       , F   }};
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   165
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   166
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   167
    enum MethodKind {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   168
        NO_BODY("void m();"),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   169
        BODY("void m() { }");
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   170
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   171
        String methStr;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   172
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   173
        private MethodKind(String methStr) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   174
            this.methStr = methStr;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   175
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   176
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   177
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   178
    enum EnclosingKind {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   179
        ABSTRACT_CLASS("abstract class Test "),
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   180
        INTERFACE("interface Test ");
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   181
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   182
        String enclStr;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   183
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   184
        EnclosingKind(String enclStr) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   185
            this.enclStr = enclStr;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   186
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   187
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   188
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   189
    public static void main(String... args) throws Exception {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   190
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   191
        //create default shared JavaCompiler - reused across multiple compilations
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   192
        JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   193
        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   194
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   195
            for (VersionKind vk : VersionKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   196
                for (EnclosingKind ek : EnclosingKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   197
                    for (MethodKind mk : MethodKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   198
                        for (ModifierKind modk1 : ModifierKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   199
                            for (ModifierKind modk2 : ModifierKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   200
                                new TestDefaultMethodsSyntax(vk, ek, mk, modk1, modk2).run(comp, fm);
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   201
                            }
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   202
                        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   203
                    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   204
                }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   205
            }
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 22448
diff changeset
   206
            System.out.println("Total check executed: " + checkCount);
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   207
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   208
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   209
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   210
    VersionKind vk;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   211
    EnclosingKind ek;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   212
    MethodKind mk;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   213
    ModifierKind modk1, modk2;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   214
    JavaSource source;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   215
    DiagnosticChecker diagChecker;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   216
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   217
    TestDefaultMethodsSyntax(VersionKind vk, EnclosingKind ek, MethodKind mk, ModifierKind modk1, ModifierKind modk2) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   218
        this.vk = vk;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   219
        this.ek = ek;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   220
        this.mk = mk;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   221
        this.modk1 = modk1;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   222
        this.modk2 = modk2;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   223
        this.source = new JavaSource();
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   224
        this.diagChecker = new DiagnosticChecker();
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   225
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   226
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   227
    class JavaSource extends SimpleJavaFileObject {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   228
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   229
        String template = "#EK {\n" +
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   230
                          "   #MOD1 #MOD2 #METH\n" +
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   231
                          "}\n";
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   232
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   233
        String source;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   234
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   235
        public JavaSource() {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   236
            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   237
            source = template.replaceAll("#EK", ek.enclStr)
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   238
                    .replaceAll("#MOD1", modk1.modStr)
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   239
                    .replaceAll("#MOD2", modk2.modStr)
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   240
                    .replaceAll("#METH", mk.methStr);
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   241
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   242
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   243
        @Override
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   244
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   245
            return source;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   246
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   247
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   248
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   249
    void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   250
        JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker,
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   251
                vk.getOptions(), null, Arrays.asList(source));
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   252
        try {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   253
            ct.analyze();
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   254
        } catch (Throwable ex) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   255
            throw new AssertionError("Error thrown when analyzing the following source:\n" + source.getCharContent(true));
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   256
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   257
        check();
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   258
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   259
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   260
    void check() {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   261
        boolean errorExpected = !ModifierKind.compatible(modk1, modk2, ek);
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   262
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   263
        errorExpected |= !ModifierKind.compatible(mk, modk1, modk2, ek);
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   264
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   265
        errorExpected |= !modk1.compatible(ek) || !modk2.compatible(ek);
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   266
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   267
        errorExpected |= ModifierKind.intersect(ModifierKind.DEFAULT, modk1, modk2) &&
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   268
                vk == VersionKind.PRE_LAMBDA;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   269
15377
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15376
diff changeset
   270
        errorExpected |= ModifierKind.intersect(ModifierKind.STATIC, modk1, modk2) &&
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15376
diff changeset
   271
                ek == EnclosingKind.INTERFACE && vk == VersionKind.PRE_LAMBDA;
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15376
diff changeset
   272
29293
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
   273
        errorExpected |= ModifierKind.intersect(ModifierKind.PRIVATE, modk1, modk2) &&
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
   274
                ek == EnclosingKind.INTERFACE && (vk == VersionKind.LAMBDA || vk == VersionKind.PRE_LAMBDA);
1583c6dd6df7 8071453: Allow interface methods to be private
sadayapalam
parents: 27319
diff changeset
   275
14267
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   276
        checkCount++;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   277
        if (diagChecker.errorFound != errorExpected) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   278
            throw new AssertionError("Problem when compiling source:\n" + source.getCharContent(true) +
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   279
                    "\nfound error: " + diagChecker.errorFound);
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   280
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   281
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   282
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   283
    static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   284
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   285
        boolean errorFound;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   286
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   287
        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   288
            if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   289
                errorFound = true;
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   290
            }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   291
        }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   292
    }
6321fbe0cf50 7192245: Add parser support for default methods
mcimadamore
parents:
diff changeset
   293
}