RFR: 8136583: Core libraries should use blessed modifier order
joe darcy
joe.darcy at oracle.com
Wed Sep 16 18:49:24 UTC 2015
FWIW, for a related possible future cleanup some modifiers by convention
can be omitted, such as abstract on normal interface methods. The
printModifiers method written annotation processing
http://hg.openjdk.java.net/jdk9/dev/langtools/file/286fc9270404/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/PrintingProcessor.java
tries to output the informative modifiers (in the suggested order).
-Joe
On 9/16/2015 11:20 AM, Martin Buchholz wrote:
> Peter, that Java program is awesome, but ...
> the original perl seems more readable to me (!)
> even if I apply some not-yet-done perl golf to it,
> and it seems to me that if we're rewriting in Java we can get the benefits
> of Java, i.e. correctness, which you can probably get by tapping into
> javac's conversion to AST. This would allow you to get modifiers split
> across lines correct, for example.
>
> In practice we want to change the order within e.g. javadoc comments as
> well, but we'll leave that to a bolder future code janitor.
>
> On Wed, Sep 16, 2015 at 8:19 AM, Peter Levart <peter.levart at gmail.com>
> wrote:
>
>> Hi Martin,
>>
>>
>> On 09/16/2015 02:42 AM, Martin Buchholz wrote:
>>
>> Hi, Chris and Paul,
>> I'd like you to do a very boring code review.
>>
>> This change is entirely machine generated. (the script is more interesting)http://cr.openjdk.java.net/~martin/webrevs/openjdk9/blessed-modifier-order/blessed-modifier-order.patchhttps://bugs.openjdk.java.net/browse/JDK-8136583
>>
>>
>> Reviewing the diff would be boring, yes. More interesting is trying to
>> understand the script.
>>
>> I re-implemented your script in some other language (called Java ;-) and
>> compared the results. Nothing can beat concise expressiveness of bash
>> instantiations of perl template, but Java lambdas and streams are not too
>> shabby either. Here's a re-implementation in 2 expressions and 1 statement:
>>
>> import java.io.IOException;
>> import java.io.UncheckedIOException;
>> import java.nio.file.Files;
>> import java.nio.file.Path;
>> import java.nio.file.Paths;
>> import java.util.Arrays;
>> import java.util.List;
>> import java.util.function.Function;
>> import java.util.regex.Pattern;
>> import java.util.stream.Collectors;
>> import java.util.stream.IntStream;
>> import java.util.stream.Stream;
>>
>> import static java.nio.file.StandardCopyOption.*;
>> import static java.nio.file.StandardOpenOption.*;
>>
>> public class BlessedModifierOrder {
>>
>> static final List<String> modifiers = Arrays.asList(
>> "public", "protected", "private",
>> "abstract", "static", "final", "transient",
>> "volatile", "synchronized", "native", "strictfp"
>> );
>>
>> static final Function<String, String> editor = IntStream
>> .range(3, modifiers.size())
>> .mapToObj(i -> Pattern.compile(
>> "^([A-Za-z@ ]*)\\b(" +
>> modifiers.subList(i,
>> modifiers.size()).stream().collect(Collectors.joining("|")) +
>> ") +(" +
>> modifiers.subList(0,
>> i).stream().collect(Collectors.joining("|")) +
>> ")\\b"
>> ))
>> .map(pattern -> (Function<String, String>) line -> {
>> String editedLine;
>> while (!line.equals(editedLine =
>> pattern.matcher(line).replaceFirst("$1$3 $2"))) {
>> line = editedLine;
>> }
>> return line;
>> })
>> .reduce(Function.identity(), (f1, f2) -> f1.andThen(f2));
>>
>> public static void main(String[] args) {
>> Stream.of(args)
>> .map(Paths::get)
>> .flatMap(dir -> {
>> try (Stream<Path> files = Files.find(
>> dir, Integer.MAX_VALUE,
>> (p, attr) -> attr.isRegularFile() &&
>> p.toString().endsWith(".java")
>> )) {
>> return files.collect(Collectors.toList()).stream();
>> } catch (IOException e) {
>> throw new UncheckedIOException(e);
>> }
>> })
>> .forEach(file -> {
>> try (Stream<String> linesStream = Files.lines(file)) {
>> List<String> lines = linesStream.map(editor)
>>
>> .collect(Collectors.toList());
>> Path newFile =
>> file.resolveSibling(file.getFileName() + ".new");
>> Files.write(newFile, lines, WRITE, CREATE,
>> TRUNCATE_EXISTING);
>> Files.move(newFile, file, ATOMIC_MOVE,
>> REPLACE_EXISTING);
>> } catch (IOException e) {
>> throw new UncheckedIOException(e);
>> }
>> });
>> }
>> }
>>
>>
>> Anyway, the result is exactly the same.
>>
>>
>> Regards, Peter
>>
>>
More information about the core-libs-dev
mailing list