Skip to content

Commit

Permalink
Fix parsing of module-info requires static (#1030)
Browse files Browse the repository at this point in the history
  • Loading branch information
romain-grecourt committed Mar 12, 2024
1 parent 281f52f commit 45a0511
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2023 Oracle and/or its affiliates.
* Copyright (c) 2023, 2024 Oracle and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -24,12 +24,12 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import io.helidon.build.javadoc.JavaTokenizer.Keyword;
import io.helidon.build.javadoc.JavaTokenizer.Symbol;
Expand All @@ -44,8 +44,6 @@
class JavaParser {

private static final Symbol TO = Symbol.keyword(Keyword.TO);
private static final Symbol STATIC = Symbol.keyword(Keyword.STATIC);
private static final Symbol TRANSITIVE = Symbol.keyword(Keyword.TRANSITIVE);
private static final Symbol WITH = Symbol.keyword(Keyword.WITH);
private static final Symbol SEMI_COLON = Symbol.token(Token.SEMI_COLON);
private static final Symbol COMMA = Symbol.token(Token.COMMA);
Expand Down Expand Up @@ -168,6 +166,23 @@ private Symbol nextSymbol(Predicate<Symbol> predicate) {
throw new IllegalStateException("Unexpected EOF");
}

private List<Symbol> nextSymbols(Predicate<Symbol> predicate) {
List<Symbol> symbols = new ArrayList<>();
while (tokenizer.hasNext()) {
Symbol symbol = tokenizer.peek();
if (symbol.isConcrete()) {
if (predicate.test(symbol)) {
tokenizer.skip();
symbols.add(symbol);
} else {
return symbols;
}
}
tokenizer.skip();
}
throw new IllegalStateException("Unexpected EOF");
}

private String parseName() {
StringBuilder sb = new StringBuilder();
Symbol previous = WHITESPACE;
Expand Down Expand Up @@ -204,20 +219,16 @@ private List<String> parseNames() {
}

private void parseModuleRequires(ModuleDescriptor.Builder builder) {
Symbol symbol = nextSymbol(Symbol::isKeyword);
if (symbol == null || symbol == STATIC || symbol == TRANSITIVE) {
String source = parseName();
Set<Requires.Modifier> modifiers = new HashSet<>();
if (symbol == STATIC) {
modifiers.add(Requires.Modifier.STATIC);
} else if (symbol == TRANSITIVE) {
modifiers.add(Requires.Modifier.TRANSITIVE);
}
builder.requires(modifiers, source);
} else {
throw new IllegalStateException(String.format(
"Invalid directive at %s", tokenizer.cursor()));
}
List<Symbol> symbols = nextSymbols(Symbol::isKeyword);
Set<Requires.Modifier> modifiers = symbols.stream()
.map(symbol -> switch (symbol.keyword()) {
case STATIC -> Requires.Modifier.STATIC;
case TRANSITIVE -> Requires.Modifier.TRANSITIVE;
default -> throw new IllegalStateException(String.format(
"Invalid directive at %s", tokenizer.cursor()));
}).collect(Collectors.toSet());
String source = parseName();
builder.requires(modifiers, source);
}

private void parseModuleExports(ModuleDescriptor.Builder builder) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2023 Oracle and/or its affiliates.
* Copyright (c) 2023, 2024 Oracle and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -164,6 +164,27 @@ void testRequiresTransitive() {
assertThat(requires[1].modifiers(), is(empty()));
}

@Test
void testRequiresTransitiveStatic() {
String src = """
module com.acme1 {
requires transitive static com.acme2;
requires static transitive com.acme3;
}
""";
ModuleDescriptor module = parse(src);
Requires[] requires = module.requires()
.stream()
.sorted(Comparator.comparing(Requires::name))
.filter(r -> !r.modifiers().contains(Requires.Modifier.MANDATED))
.toArray(Requires[]::new);
assertThat(requires.length, is(2));
assertThat(requires[0].name(), is("com.acme2"));
assertThat(requires[0].modifiers(), containsInAnyOrder(Requires.Modifier.TRANSITIVE, Requires.Modifier.STATIC));
assertThat(requires[1].name(), is("com.acme3"));
assertThat(requires[1].modifiers(), containsInAnyOrder(Requires.Modifier.TRANSITIVE, Requires.Modifier.STATIC));
}

@Test
void testUses1() {
String src = """
Expand Down

0 comments on commit 45a0511

Please sign in to comment.