# HG changeset patch # User darcy # Date 1266445817 28800 # Node ID 2fc03fb01efa81fef612d7b77a02bdbfc4ab4b19 # Parent abf1a22d9bcf07c5c04b3167d145b5577940c3df 6927061: Refactor apt implemenation to use code from JSR 269 Reviewed-by: jjg diff -r abf1a22d9bcf -r 2fc03fb01efa langtools/src/share/classes/com/sun/mirror/util/SourceOrderDeclScanner.java --- a/langtools/src/share/classes/com/sun/mirror/util/SourceOrderDeclScanner.java Mon Feb 15 20:17:57 2010 -0800 +++ b/langtools/src/share/classes/com/sun/mirror/util/SourceOrderDeclScanner.java Wed Feb 17 14:30:17 2010 -0800 @@ -102,7 +102,7 @@ @SuppressWarnings("cast") private int compareEqualPosition(Declaration d1, Declaration d2) { assert - (d1.getPosition() == d2.getPosition()) || // Handles d1 == d2 == null + (d1.getPosition() == d2.getPosition()) || // Handles two null positions. (d1.getPosition().file().compareTo(d2.getPosition().file()) == 0 && d1.getPosition().line() == d2.getPosition().line() && d1.getPosition().column() == d2.getPosition().column()); diff -r abf1a22d9bcf -r 2fc03fb01efa langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java --- a/langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java Mon Feb 15 20:17:57 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java Wed Feb 17 14:30:17 2010 -0800 @@ -496,57 +496,12 @@ * won't match anything. */ Pattern importStringToPattern(String s) { - if (s.equals("*")) { - return allMatches; + if (com.sun.tools.javac.processing.JavacProcessingEnvironment.isValidImportString(s)) { + return com.sun.tools.javac.processing.JavacProcessingEnvironment.validImportStringToPattern(s); } else { - String t = s; - boolean star = false; - - /* - * Validate string from factory is legal. If the string - * has more than one asterisks or the asterisks does not - * appear as the last character (preceded by a period), - * the string is not legal. - */ - - boolean valid = true; - int index = t.indexOf('*'); - if (index != -1) { - // '*' must be last character... - if (index == t.length() -1) { - // ... and preceeding character must be '.' - if ( index-1 >= 0 ) { - valid = t.charAt(index-1) == '.'; - // Strip off ".*$" for identifier checks - t = t.substring(0, t.length()-2); - } - } else - valid = false; - } - - // Verify string is off the form (javaId \.)+ or javaId - if (valid) { - String[] javaIds = t.split("\\.", t.length()+2); - for(String javaId: javaIds) - valid &= isJavaIdentifier(javaId); - } - - if (!valid) { - Bark bark = Bark.instance(context); - bark.aptWarning("MalformedSupportedString", s); - return noMatches; // won't match any valid identifier - } - - String s_prime = s.replaceAll("\\.", "\\\\."); - - if (s_prime.endsWith("*")) { - s_prime = s_prime.substring(0, s_prime.length() - 1) + ".+"; - } - - return Pattern.compile(s_prime); + Bark bark = Bark.instance(context); + bark.aptWarning("MalformedSupportedString", s); + return com.sun.tools.javac.processing.JavacProcessingEnvironment.noMatches; } } - - private static final Pattern allMatches = Pattern.compile(".*"); - private static final Pattern noMatches = Pattern.compile("(\\P{all})+"); } diff -r abf1a22d9bcf -r 2fc03fb01efa langtools/src/share/classes/com/sun/tools/apt/main/Main.java --- a/langtools/src/share/classes/com/sun/tools/apt/main/Main.java Mon Feb 15 20:17:57 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/main/Main.java Wed Feb 17 14:30:17 2010 -0800 @@ -56,6 +56,8 @@ import com.sun.tools.apt.util.Bark; import com.sun.mirror.apt.AnnotationProcessorFactory; +import static com.sun.tools.javac.file.Paths.pathToURLs; + /** This class provides a commandline interface to the apt build-time * tool. * @@ -1276,59 +1278,4 @@ } } } - - // Borrowed from DocletInvoker - /** - * Utility method for converting a search path string to an array - * of directory and JAR file URLs. - * - * @param path the search path string - * @return the resulting array of directory and JAR file URLs - */ - static URL[] pathToURLs(String path) { - StringTokenizer st = new StringTokenizer(path, File.pathSeparator); - URL[] urls = new URL[st.countTokens()]; - int count = 0; - while (st.hasMoreTokens()) { - URL url = fileToURL(new File(st.nextToken())); - if (url != null) { - urls[count++] = url; - } - } - if (urls.length != count) { - URL[] tmp = new URL[count]; - System.arraycopy(urls, 0, tmp, 0, count); - urls = tmp; - } - return urls; - } - - /** - * Returns the directory or JAR file URL corresponding to the specified - * local file name. - * - * @param file the File object - * @return the resulting directory or JAR file URL, or null if unknown - */ - static URL fileToURL(File file) { - String name; - try { - name = file.getCanonicalPath(); - } catch (IOException e) { - name = file.getAbsolutePath(); - } - name = name.replace(File.separatorChar, '/'); - if (!name.startsWith("/")) { - name = "/" + name; - } - // If the file does not exist, then assume that it's a directory - if (!file.isFile()) { - name = name + "/"; - } - try { - return new URL("file", "", name); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("file"); - } - } } diff -r abf1a22d9bcf -r 2fc03fb01efa langtools/src/share/classes/com/sun/tools/javac/file/Paths.java --- a/langtools/src/share/classes/com/sun/tools/javac/file/Paths.java Mon Feb 15 20:17:57 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/file/Paths.java Wed Feb 17 14:30:17 2010 -0800 @@ -27,6 +27,8 @@ import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -34,6 +36,7 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; +import java.util.StringTokenizer; import java.util.zip.ZipFile; import javax.tools.JavaFileManager.Location; @@ -449,4 +452,60 @@ return fsInfo.isFile(file) && (n.endsWith(".jar") || n.endsWith(".zip")); } + + /** + * Utility method for converting a search path string to an array + * of directory and JAR file URLs. + * + * Note that this method is called by apt and the DocletInvoker. + * + * @param path the search path string + * @return the resulting array of directory and JAR file URLs + */ + public static URL[] pathToURLs(String path) { + StringTokenizer st = new StringTokenizer(path, File.pathSeparator); + URL[] urls = new URL[st.countTokens()]; + int count = 0; + while (st.hasMoreTokens()) { + URL url = fileToURL(new File(st.nextToken())); + if (url != null) { + urls[count++] = url; + } + } + if (urls.length != count) { + URL[] tmp = new URL[count]; + System.arraycopy(urls, 0, tmp, 0, count); + urls = tmp; + } + return urls; + } + + /** + * Returns the directory or JAR file URL corresponding to the specified + * local file name. + * + * @param file the File object + * @return the resulting directory or JAR file URL, or null if unknown + */ + private static URL fileToURL(File file) { + String name; + try { + name = file.getCanonicalPath(); + } catch (IOException e) { + name = file.getAbsolutePath(); + } + name = name.replace(File.separatorChar, '/'); + if (!name.startsWith("/")) { + name = "/" + name; + } + // If the file does not exist, then assume that it's a directory + if (!file.isFile()) { + name = name + "/"; + } + try { + return new URL("file", "", name); + } catch (MalformedURLException e) { + throw new IllegalArgumentException(file.toString()); + } + } } diff -r abf1a22d9bcf -r 2fc03fb01efa langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Mon Feb 15 20:17:57 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Wed Feb 17 14:30:17 2010 -0800 @@ -25,7 +25,6 @@ package com.sun.tools.javac.processing; - import java.lang.reflect.*; import java.util.*; import java.util.regex.*; @@ -1355,115 +1354,62 @@ return specifiedPackages; } - // Borrowed from DocletInvoker and apt - // TODO: remove from apt's Main + private static final Pattern allMatches = Pattern.compile(".*"); + public static final Pattern noMatches = Pattern.compile("(\\P{all})+"); + /** - * Utility method for converting a search path string to an array - * of directory and JAR file URLs. - * - * @param path the search path string - * @return the resulting array of directory and JAR file URLs + * Convert import-style string for supported annotations into a + * regex matching that string. If the string is a valid + * import-style string, return a regex that won't match anything. */ - public static URL[] pathToURLs(String path) { - StringTokenizer st = new StringTokenizer(path, File.pathSeparator); - URL[] urls = new URL[st.countTokens()]; - int count = 0; - while (st.hasMoreTokens()) { - URL url = fileToURL(new File(st.nextToken())); - if (url != null) { - urls[count++] = url; - } + private static Pattern importStringToPattern(String s, Processor p, Log log) { + if (isValidImportString(s)) { + return validImportStringToPattern(s); + } else { + log.warning("proc.malformed.supported.string", s, p.getClass().getName()); + return noMatches; // won't match any valid identifier } - if (urls.length != count) { - URL[] tmp = new URL[count]; - System.arraycopy(urls, 0, tmp, 0, count); - urls = tmp; - } - return urls; } /** - * Returns the directory or JAR file URL corresponding to the specified - * local file name. - * - * @param file the File object - * @return the resulting directory or JAR file URL, or null if unknown + * Return true if the argument string is a valid import-style + * string specifying claimed annotations; return false otherwise. */ - private static URL fileToURL(File file) { - String name; - try { - name = file.getCanonicalPath(); - } catch (IOException e) { - name = file.getAbsolutePath(); + public static boolean isValidImportString(String s) { + if (s.equals("*")) + return true; + + boolean valid = true; + String t = s; + int index = t.indexOf('*'); + + if (index != -1) { + // '*' must be last character... + if (index == t.length() -1) { + // ... any and preceding character must be '.' + if ( index-1 >= 0 ) { + valid = t.charAt(index-1) == '.'; + // Strip off ".*$" for identifier checks + t = t.substring(0, t.length()-2); + } + } else + return false; } - name = name.replace(File.separatorChar, '/'); - if (!name.startsWith("/")) { - name = "/" + name; + + // Verify string is off the form (javaId \.)+ or javaId + if (valid) { + String[] javaIds = t.split("\\.", t.length()+2); + for(String javaId: javaIds) + valid &= SourceVersion.isIdentifier(javaId); } - // If the file does not exist, then assume that it's a directory - if (!file.isFile()) { - name = name + "/"; - } - try { - return new URL("file", "", name); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("file"); - } + return valid; } - - - private static final Pattern allMatches = Pattern.compile(".*"); - - private static final Pattern noMatches = Pattern.compile("(\\P{all})+"); - /** - * Convert import-style string to regex matching that string. If - * the string is a valid import-style string, return a regex that - * won't match anything. - */ - // TODO: remove version in Apt.java - public static Pattern importStringToPattern(String s, Processor p, Log log) { + public static Pattern validImportStringToPattern(String s) { if (s.equals("*")) { return allMatches; } else { - String t = s; - boolean star = false; - - /* - * Validate string from factory is legal. If the string - * has more than one asterisks or the asterisks does not - * appear as the last character (preceded by a period), - * the string is not legal. - */ - - boolean valid = true; - int index = t.indexOf('*'); - if (index != -1) { - // '*' must be last character... - if (index == t.length() -1) { - // ... and preceeding character must be '.' - if ( index-1 >= 0 ) { - valid = t.charAt(index-1) == '.'; - // Strip off ".*$" for identifier checks - t = t.substring(0, t.length()-2); - } - } else - valid = false; - } - - // Verify string is off the form (javaId \.)+ or javaId - if (valid) { - String[] javaIds = t.split("\\.", t.length()+2); - for(String javaId: javaIds) - valid &= SourceVersion.isIdentifier(javaId); - } - - if (!valid) { - log.warning("proc.malformed.supported.string", s, p.getClass().getName()); - return noMatches; // won't match any valid identifier - } - - String s_prime = s.replaceAll("\\.", "\\\\."); + String s_prime = s.replace(".", "\\."); if (s_prime.endsWith("*")) { s_prime = s_prime.substring(0, s_prime.length() - 1) + ".+"; diff -r abf1a22d9bcf -r 2fc03fb01efa langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Mon Feb 15 20:17:57 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Wed Feb 17 14:30:17 2010 -0800 @@ -81,7 +81,7 @@ cpString = appendPath(System.getProperty("env.class.path"), cpString); cpString = appendPath(System.getProperty("java.class.path"), cpString); cpString = appendPath(docletPath, cpString); - URL[] urls = pathToURLs(cpString); + URL[] urls = com.sun.tools.javac.file.Paths.pathToURLs(cpString); if (docletParentClassLoader == null) appClassLoader = new URLClassLoader(urls, getDelegationClassLoader(docletClassName)); else @@ -313,58 +313,4 @@ Thread.currentThread().setContextClassLoader(savedCCL); } } - - /** - * Utility method for converting a search path string to an array - * of directory and JAR file URLs. - * - * @param path the search path string - * @return the resulting array of directory and JAR file URLs - */ - static URL[] pathToURLs(String path) { - StringTokenizer st = new StringTokenizer(path, File.pathSeparator); - URL[] urls = new URL[st.countTokens()]; - int count = 0; - while (st.hasMoreTokens()) { - URL url = fileToURL(new File(st.nextToken())); - if (url != null) { - urls[count++] = url; - } - } - if (urls.length != count) { - URL[] tmp = new URL[count]; - System.arraycopy(urls, 0, tmp, 0, count); - urls = tmp; - } - return urls; - } - - /** - * Returns the directory or JAR file URL corresponding to the specified - * local file name. - * - * @param file the File object - * @return the resulting directory or JAR file URL, or null if unknown - */ - static URL fileToURL(File file) { - String name; - try { - name = file.getCanonicalPath(); - } catch (IOException e) { - name = file.getAbsolutePath(); - } - name = name.replace(File.separatorChar, '/'); - if (!name.startsWith("/")) { - name = "/" + name; - } - // If the file does not exist, then assume that it's a directory - if (!file.isFile()) { - name = name + "/"; - } - try { - return new URL("file", "", name); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("file"); - } - } }