langtools/test/tools/javac/lambda/TestSelfRef.java
author jjg
Wed, 29 Oct 2014 17:25:23 -0700
changeset 27319 030080f03e4f
parent 21479 e11e5b3aec3d
child 30730 d3ce7619db2c
permissions -rw-r--r--
8062348: langtools tests should close file manager (group 1) Reviewed-by: darcy
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
     1
/*
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
     2
 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
     4
 *
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
     8
 *
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    13
 * accompanied this code).
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    14
 *
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    18
 *
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    21
 * questions.
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    22
 */
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    23
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    24
/*
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    25
 * @test
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    26
 * @bug 8003280
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    27
 * @summary Add lambda tests
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    28
 *  Check that self/forward references from lambda expressions behave
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    29
 *          consistently w.r.t. local inner classes
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    30
 */
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    31
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    32
import java.net.URI;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    33
import java.util.Arrays;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    34
import javax.tools.Diagnostic;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    35
import javax.tools.JavaCompiler;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    36
import javax.tools.JavaFileObject;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    37
import javax.tools.SimpleJavaFileObject;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    38
import javax.tools.StandardJavaFileManager;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    39
import javax.tools.ToolProvider;
21479
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
    40
import com.sun.source.util.JavacTask;
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    41
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    42
public class TestSelfRef {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    43
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    44
    static int checkCount = 0;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    45
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    46
    enum RefKind {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    47
        SELF_LAMBDA("SAM s = x->{ System.out.println(s); };", true, false),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    48
        FORWARD_LAMBDA("SAM s = x->{ System.out.println(f); };\nObject f = null;", false, true),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    49
        SELF_ANON("Object s = new Object() { void test() { System.out.println(s); } };", true, false),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    50
        FORWARD_ANON("Object s = new Object() { void test() { System.out.println(f); } }; Object f = null;", false, true);
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    51
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    52
        String refStr;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    53
        boolean selfRef;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    54
        boolean forwardRef;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    55
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    56
        private RefKind(String refStr, boolean selfRef, boolean forwardRef) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    57
            this.refStr = refStr;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    58
            this.selfRef = selfRef;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    59
            this.forwardRef = forwardRef;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    60
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    61
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    62
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    63
    enum EnclosingKind {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    64
        TOPLEVEL("class C { #S }"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    65
        MEMBER_INNER("class Outer { class C { #S } }"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    66
        NESTED_INNER("class Outer { static class C { #S } }");
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    67
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    68
        String enclStr;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    69
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    70
        private EnclosingKind(String enclStr) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    71
            this.enclStr = enclStr;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    72
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    73
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    74
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    75
    enum InnerKind {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    76
        NONE("#R"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    77
        LOCAL_NONE("class Local { #R }"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    78
        LOCAL_MTH("class Local { void test() { #R } }"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    79
        ANON_NONE("new Object() { #R };"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    80
        ANON_MTH("new Object() { void test() { #R } };");
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    81
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    82
        String innerStr;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    83
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    84
        private InnerKind(String innerStr) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    85
            this.innerStr = innerStr;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    86
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    87
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    88
        boolean inMethodContext(SiteKind sk) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    89
            switch (this) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    90
                case LOCAL_MTH:
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    91
                case ANON_MTH: return true;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    92
                case NONE: return sk != SiteKind.NONE;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    93
                default:
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    94
                    return false;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    95
            }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    96
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    97
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    98
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
    99
    enum SiteKind {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   100
        NONE("#I"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   101
        STATIC_INIT("static { #I }"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   102
        INSTANCE_INIT("{ #I }"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   103
        CONSTRUCTOR("C() { #I }"),
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   104
        METHOD("void test() { #I }");
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   105
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   106
        String siteStr;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   107
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   108
        private SiteKind(String siteStr) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   109
            this.siteStr = siteStr;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   110
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   111
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   112
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   113
    public static void main(String... args) throws Exception {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   114
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   115
        //create default shared JavaCompiler - reused across multiple compilations
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   116
        JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   117
        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   118
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   119
            for (EnclosingKind ek : EnclosingKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   120
                for (SiteKind sk : SiteKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   121
                    if (sk == SiteKind.STATIC_INIT && ek == EnclosingKind.MEMBER_INNER)
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   122
                        continue;
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   123
                    for (InnerKind ik : InnerKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   124
                        if (ik != InnerKind.NONE && sk == SiteKind.NONE)
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   125
                            break;
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   126
                        for (RefKind rk : RefKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   127
                            new TestSelfRef(ek, sk, ik, rk).run(comp, fm);
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   128
                        }
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   129
                    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   130
                }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   131
            }
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 21479
diff changeset
   132
            System.out.println("Total check executed: " + checkCount);
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   133
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   134
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   135
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   136
    EnclosingKind ek;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   137
    SiteKind sk;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   138
    InnerKind ik;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   139
    RefKind rk;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   140
    JavaSource source;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   141
    DiagnosticChecker diagChecker;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   142
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   143
    TestSelfRef(EnclosingKind ek, SiteKind sk, InnerKind ik, RefKind rk) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   144
        this.ek = ek;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   145
        this.sk = sk;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   146
        this.ik = ik;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   147
        this.rk = rk;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   148
        this.source = new JavaSource();
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   149
        this.diagChecker = new DiagnosticChecker();
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   150
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   151
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   152
    class JavaSource extends SimpleJavaFileObject {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   153
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   154
        String bodyTemplate = "interface SAM { void test(Object o); }\n#B";
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   155
        String source;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   156
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   157
        public JavaSource() {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   158
            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   159
            source = bodyTemplate.replace("#B",
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   160
                    ek.enclStr.replace("#S", sk.siteStr.replace("#I", ik.innerStr.replace("#R", rk.refStr))));
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   161
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   162
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   163
        @Override
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   164
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   165
            return source;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   166
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   167
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   168
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   169
    void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   170
        JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker,
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   171
                null, null, Arrays.asList(source));
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   172
        try {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   173
            ct.analyze();
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   174
        } catch (Throwable ex) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   175
            throw new AssertionError("Error thron when compiling the following code:\n" + source.getCharContent(true));
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   176
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   177
        check();
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   178
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   179
21479
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   180
    boolean isErrorExpected() {
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   181
        //illegal forward ref
21479
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   182
        boolean result = ik.inMethodContext(sk) && (rk.selfRef || rk.forwardRef);
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   183
        result |= (rk == RefKind.SELF_LAMBDA || rk == RefKind.FORWARD_LAMBDA);
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   184
        return result;
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   185
    }
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   186
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   187
    void check() {
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   188
        checkCount++;
e11e5b3aec3d 8024809: javac, some lambda programs are rejected by flow analysis
vromero
parents: 14547
diff changeset
   189
        boolean errorExpected = isErrorExpected();
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   190
        if (diagChecker.errorFound != errorExpected) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   191
            throw new Error("invalid diagnostics for source:\n" +
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   192
                source.getCharContent(true) +
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   193
                "\nFound error: " + diagChecker.errorFound +
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   194
                "\nExpected error: " + errorExpected);
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   195
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   196
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   197
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   198
    static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   199
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   200
        boolean errorFound;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   201
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   202
        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   203
            if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   204
                errorFound = true;
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   205
            }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   206
        }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   207
    }
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents:
diff changeset
   208
}