Mercurial > hg > icedtea7-forest > langtools
changeset 1580:61d5b73ae0ac jdk7u45-b02
8016653: javadoc should ignore ignoreable characters in names
Reviewed-by: jjg
author | robm |
---|---|
date | Tue, 09 Jul 2013 03:31:34 +0100 |
parents | d27b39c92849 |
children | b9f4c87abb35 |
files | src/share/classes/com/sun/tools/javac/parser/Scanner.java test/tools/javac/7144981/IgnoreIgnorableCharactersInInput.java |
diffstat | 2 files changed, 118 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/parser/Scanner.java Wed Jul 03 17:45:42 2013 -0700 +++ b/src/share/classes/com/sun/tools/javac/parser/Scanner.java Tue Jul 09 03:31:34 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -501,11 +501,10 @@ private void scanIdent() { boolean isJavaIdentifierPart; char high; + if (sp == sbuf.length) putChar(ch); else sbuf[sp++] = ch; + // optimization, was: putChar(ch); + scanChar(); do { - if (sp == sbuf.length) putChar(ch); else sbuf[sp++] = ch; - // optimization, was: putChar(ch); - - scanChar(); switch (ch) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': @@ -522,6 +521,7 @@ case '$': case '_': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + break; case '\u0000': case '\u0001': case '\u0002': case '\u0003': case '\u0004': case '\u0005': case '\u0006': case '\u0007': case '\u0008': case '\u000E': case '\u000F': case '\u0010': @@ -529,30 +529,37 @@ case '\u0015': case '\u0016': case '\u0017': case '\u0018': case '\u0019': case '\u001B': case '\u007F': - break; + scanChar(); + continue; case '\u001A': // EOI is also a legal identifier part if (bp >= buflen) { name = names.fromChars(sbuf, 0, sp); token = keywords.key(name); return; } - break; + scanChar(); + continue; default: if (ch < '\u0080') { // all ASCII range chars already handled, above isJavaIdentifierPart = false; } else { - high = scanSurrogates(); - if (high != 0) { - if (sp == sbuf.length) { - putChar(high); + if (Character.isIdentifierIgnorable(ch)) { + scanChar(); + continue; + } else { + high = scanSurrogates(); + if (high != 0) { + if (sp == sbuf.length) { + putChar(high); + } else { + sbuf[sp++] = high; + } + isJavaIdentifierPart = Character.isJavaIdentifierPart( + Character.toCodePoint(high, ch)); } else { - sbuf[sp++] = high; + isJavaIdentifierPart = Character.isJavaIdentifierPart(ch); } - isJavaIdentifierPart = Character.isJavaIdentifierPart( - Character.toCodePoint(high, ch)); - } else { - isJavaIdentifierPart = Character.isJavaIdentifierPart(ch); } } if (!isJavaIdentifierPart) { @@ -561,6 +568,9 @@ return; } } + if (sp == sbuf.length) putChar(ch); else sbuf[sp++] = ch; + // optimization, was: putChar(ch); + scanChar(); } while (true); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/7144981/IgnoreIgnorableCharactersInInput.java Tue Jul 09 03:31:34 2013 +0100 @@ -0,0 +1,92 @@ + +/* + * @test /nodynamiccopyright/ + * @bug 7144981 + * @summary javac should ignore ignorable characters in input + * @run main IgnoreIgnorableCharactersInInput + */ + +import com.sun.source.util.JavacTask; +import java.io.File; +import java.net.URI; +import java.util.Arrays; +import java.util.Set; +import java.util.TreeSet; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; +import javax.tools.ToolProvider; + +public class IgnoreIgnorableCharactersInInput { + + public static void main(String... args) throws Exception { + new IgnoreIgnorableCharactersInInput().run(); + } + + void run() throws Exception { + JavaCompiler comp = ToolProvider.getSystemJavaCompiler(); + File classesDir = new File(System.getProperty("user.dir"), "classes"); + classesDir.mkdirs(); + JavaSource[] sources = new JavaSource[]{ + new JavaSource("TestOneIgnorableChar", "AA\\u0000BB"), + new JavaSource("TestMultipleIgnorableChar", "AA\\u0000\\u0000\\u0000BB")}; + JavacTask ct = (JavacTask)comp.getTask(null, null, null, + Arrays.asList("-d", classesDir.getPath()), + null, Arrays.asList(sources)); + try { + if (!ct.call()) { + throw new AssertionError("Error thrown when compiling test cases"); + } + } catch (Throwable ex) { + throw new AssertionError("Error thrown when compiling test cases"); + } + check(classesDir, + "TestOneIgnorableChar.class", + "TestOneIgnorableChar$AABB.class", + "TestMultipleIgnorableChar.class", + "TestMultipleIgnorableChar$AABB.class"); + if (errors > 0) + throw new AssertionError("There are some errors in the test check the error output"); + } + + /** + * Check that a directory contains the expected files. + */ + void check(File dir, String... paths) { + Set<String> found = new TreeSet<String>(Arrays.asList(dir.list())); + Set<String> expect = new TreeSet<String>(Arrays.asList(paths)); + if (found.equals(expect)) + return; + for (String f: found) { + if (!expect.contains(f)) + error("Unexpected file found: " + f); + } + for (String e: expect) { + if (!found.contains(e)) + error("Expected file not found: " + e); + } + } + + int errors; + + void error(String msg) { + System.err.println(msg); + errors++; + } + + class JavaSource extends SimpleJavaFileObject { + + String internalSource = + "public class #O {public class #I {} }"; + public JavaSource(String outerClassName, String innerClassName) { + super(URI.create(outerClassName + ".java"), JavaFileObject.Kind.SOURCE); + internalSource = + internalSource.replace("#O", outerClassName).replace("#I", innerClassName); + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return internalSource; + } + } +}