langtools/test/tools/javac/parser/ExtraSemiTest.java
author akulyakh
Thu, 21 May 2015 11:41:04 -0700
changeset 30730 d3ce7619db2c
parent 6585 189f53daed52
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:
6585
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
     1
/*
30730
d3ce7619db2c 8076543: Add @modules as needed to the langtools tests
akulyakh
parents: 6585
diff changeset
     2
 * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
6585
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
     4
 *
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
     8
 *
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    13
 * accompanied this code).
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    14
 *
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    18
 *
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    21
 * questions.
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    22
 */
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    23
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    24
/*
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    25
 * @test
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    26
 * @bug 6921495
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    27
 * @summary spurious semicolons in class def cause empty NOPOS blocks
30730
d3ce7619db2c 8076543: Add @modules as needed to the langtools tests
akulyakh
parents: 6585
diff changeset
    28
 * @modules jdk.compiler
6585
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    29
 */
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    30
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    31
import java.io.*;
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    32
import java.net.*;
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    33
import java.util.*;
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    34
import javax.tools.*;
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    35
import com.sun.source.util.*;
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    36
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    37
public class ExtraSemiTest {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    38
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    39
    static class JavaSource extends SimpleJavaFileObject {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    40
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    41
        final static String source =
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    42
                        "class C {\n" +
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    43
                        "    int x;;\n" +
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    44
                        "    class X { int i;; };\n" +
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    45
                        "}";
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    46
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    47
        JavaSource() {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    48
            super(URI.create("myfo:/C.java"), JavaFileObject.Kind.SOURCE);
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    49
        }
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    50
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    51
        @Override
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    52
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    53
            return source;
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    54
        }
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    55
    }
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    56
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    57
    public static void main(String... args) throws IOException {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    58
        new ExtraSemiTest().run();
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    59
    }
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    60
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    61
    void run() throws IOException {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    62
        File destDir = new File("classes"); destDir.mkdir();
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    63
        final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    64
        JavaSource source = new JavaSource();
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    65
        JavacTask ct = (JavacTask)tool.getTask(null, null, null,
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    66
                Arrays.asList("-d", destDir.getPath(), "-XD-printsource"),
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    67
                null,
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    68
                Arrays.asList(source));
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    69
        Boolean ok = ct.call();
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    70
        if (!ok) throw new AssertionError("compilation failed");
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    71
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    72
        String text = readFile(new File(destDir, "C.java"));
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    73
        System.out.println(text);
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    74
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    75
        // compress/canonicalize all whitespace
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    76
        String canon = text.replaceAll("\\s+", " ");
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    77
        System.out.println("canon: " + canon);
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    78
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    79
        // There are no empty blocks in the original text.
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    80
        // C will be given a default constructor "C() { super(); }" which
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    81
        // does not have any empty blocks.
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    82
        // The bug is that spurious semicolons in the class defn are parsed
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    83
        // into redundant empty blocks in the tree, so verify there are
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    84
        // no empty blocks in the -printsource output
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    85
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    86
        if (canon.contains("{ }"))
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    87
            throw new AssertionError("unexpected empty block found");
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    88
    }
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    89
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    90
    String readFile(File f) throws IOException {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    91
        int len = (int) f.length();
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    92
        byte[] data = new byte[len];
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    93
        DataInputStream in = new DataInputStream(new FileInputStream(f));
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    94
        try {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    95
            in.readFully(data);
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    96
            return new String(data);
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    97
        } finally {
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    98
            in.close();
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
    99
        }
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
   100
    }
189f53daed52 6921495: spurious semicolons in class def cause empty NOPOS blocks
jjg
parents:
diff changeset
   101
}