From 286268e0499cf1d61e3f0d0e93ad7930b6581902 Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Wed, 3 Jun 2020 14:27:22 +0200 Subject: [PATCH] Axiom: Removed statement from grammar, replaced with item / value Signed-off-by: Tony Tkacik --- .../com/evolveum/axiom/lang/antlr/Axiom.g4 | 8 ++++++- .../evolveum/axiom/api/AxiomComplexValue.java | 2 +- .../lang/antlr/AbstractAxiomAntlrVisitor.java | 9 +++---- .../lang/antlr/AxiomAntlrStatementSource.java | 14 +++++------ .../lang/antlr/AxiomModelStatementSource.java | 24 +++++++++---------- 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/infra/axiom/src/main/antlr4/com/evolveum/axiom/lang/antlr/Axiom.g4 b/infra/axiom/src/main/antlr4/com/evolveum/axiom/lang/antlr/Axiom.g4 index 1be95e8c61c..8c2b67724fe 100644 --- a/infra/axiom/src/main/antlr4/com/evolveum/axiom/lang/antlr/Axiom.g4 +++ b/infra/axiom/src/main/antlr4/com/evolveum/axiom/lang/antlr/Axiom.g4 @@ -17,7 +17,13 @@ fragment ESC : '\\'; STRING_SINGLEQUOTE: SQOUTE ((ESC SQOUTE) | ~[\n'])* SQOUTE; STRING_DOUBLEQUOTE: DQOUTE ((ESC DQOUTE) | ~[\n"])* DQOUTE; -statement : SEP* identifier SEP* (argument)? SEP* (SEMICOLON | LEFT_BRACE SEP* (statement)* SEP* RIGHT_BRACE SEP*) SEP*; + + +//statement : SEP* identifier SEP* (argument)? SEP* (SEMICOLON | LEFT_BRACE SEP* (statement)* SEP* RIGHT_BRACE SEP*) SEP*; + + +item : SEP* identifier SEP* value; +value: (argument)? SEP* (SEMICOLON | LEFT_BRACE SEP* (item)* SEP* RIGHT_BRACE SEP*) SEP*; identifier : (prefix COLON)? localIdentifier; prefix : IDENTIFIER; diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomComplexValue.java b/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomComplexValue.java index e18b252ef99..ddc2d76a2c8 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomComplexValue.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomComplexValue.java @@ -32,7 +32,7 @@ static AxiomValue from(AxiomTypeDefinition typeDefinition, V value) { default Optional> onlyValue(Class type, AxiomItemDefinition... components) { Optional> current = Optional.of(this); for(AxiomItemDefinition name : components) { - current = current.get().asComplex().flatMap(c -> c.item(name)).map(i -> i.onlyValue()); // map(v -> v.onlyValue().asComplex()); + current = current.get().asComplex().flatMap(c -> c.item(name)).map(i -> i.onlyValue()); if(!current.isPresent()) { return Optional.empty(); } diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AbstractAxiomAntlrVisitor.java b/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AbstractAxiomAntlrVisitor.java index 093a7037eff..e54efc555aa 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AbstractAxiomAntlrVisitor.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AbstractAxiomAntlrVisitor.java @@ -16,6 +16,7 @@ import com.evolveum.axiom.concepts.SourceLocation; import com.evolveum.axiom.lang.antlr.AxiomParser.ArgumentContext; import com.evolveum.axiom.lang.antlr.AxiomParser.IdentifierContext; +import com.evolveum.axiom.lang.antlr.AxiomParser.ItemContext; import com.evolveum.axiom.lang.antlr.AxiomParser.StatementContext; import com.evolveum.axiom.lang.antlr.AxiomParser.StringContext; @@ -44,14 +45,14 @@ private String nullableText(ParserRuleContext prefix) { return prefix != null ? prefix.getText() : ""; } + @Override - public final T visitStatement(StatementContext ctx) { + public T visitItem(ItemContext ctx) { AxiomName identifier = statementIdentifier(ctx.identifier()); if(canEmit(identifier)) { SourceLocation start = sourceLocation(ctx.identifier().start); delegate().startItem(identifier, start); - - ArgumentContext argument = ctx.argument(); + ArgumentContext argument = ctx.value().argument(); final Object value; final SourceLocation valueStart; if(argument != null) { @@ -62,7 +63,7 @@ public final T visitStatement(StatementContext ctx) { valueStart = start; } delegate().startValue(value, valueStart); - T ret = super.visitStatement(ctx); + T ret = super.visitItem(ctx); delegate().endValue(sourceLocation(ctx.stop)); delegate().endItem(sourceLocation(ctx.stop)); return ret; diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AxiomAntlrStatementSource.java b/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AxiomAntlrStatementSource.java index d8ada5079f3..67f7f269a68 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AxiomAntlrStatementSource.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AxiomAntlrStatementSource.java @@ -17,37 +17,37 @@ import com.evolveum.axiom.api.AxiomName; import com.evolveum.axiom.api.stream.AxiomItemStream; -import com.evolveum.axiom.lang.antlr.AxiomParser.StatementContext; +import com.evolveum.axiom.lang.antlr.AxiomParser.ItemContext; import com.evolveum.axiom.lang.spi.AxiomIdentifierResolver; import com.evolveum.axiom.lang.spi.AxiomSyntaxException; public class AxiomAntlrStatementSource { - private final StatementContext root; + private final ItemContext root; private final String sourceName; public static AxiomAntlrStatementSource from(String sourceName, InputStream stream) throws IOException, AxiomSyntaxException { return from(sourceName, CharStreams.fromStream(stream)); } - public static StatementContext contextFrom(String sourceName, CharStream stream) { + public static ItemContext contextFrom(String sourceName, CharStream stream) { AxiomLexer lexer = new AxiomLexer(stream); AxiomParser parser = new AxiomParser(new CommonTokenStream(lexer)); lexer.removeErrorListeners(); parser.removeErrorListeners(); AxiomErrorListener errorListener = new AxiomErrorListener(sourceName); parser.addErrorListener(errorListener); - StatementContext statement = parser.statement(); + ItemContext statement = parser.item(); errorListener.validate(); return statement; } public static AxiomAntlrStatementSource from(String sourceName, CharStream stream) throws AxiomSyntaxException { - StatementContext statement = contextFrom(sourceName, stream); + ItemContext statement = contextFrom(sourceName, stream); return new AxiomAntlrStatementSource(sourceName, statement); } - protected AxiomAntlrStatementSource(String sourceName, StatementContext statement) { + protected AxiomAntlrStatementSource(String sourceName, ItemContext statement) { this.sourceName = sourceName; this.root = statement; } @@ -56,7 +56,7 @@ public String sourceName() { return sourceName; } - protected final StatementContext root() { + protected final ItemContext root() { return root; } diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AxiomModelStatementSource.java b/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AxiomModelStatementSource.java index f34a115b3d0..49c16fd0378 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AxiomModelStatementSource.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/lang/antlr/AxiomModelStatementSource.java @@ -20,7 +20,7 @@ import com.evolveum.axiom.api.AxiomName; import com.evolveum.axiom.api.stream.AxiomItemStream; -import com.evolveum.axiom.lang.antlr.AxiomParser.StatementContext; +import com.evolveum.axiom.lang.antlr.AxiomParser.ItemContext; import com.evolveum.axiom.lang.spi.AxiomIdentifierResolver; import com.evolveum.axiom.lang.spi.AxiomSyntaxException; @@ -42,12 +42,12 @@ public static AxiomModelStatementSource from(String sourceName, InputStream stre } public static AxiomModelStatementSource from(String sourceName, CharStream stream) throws AxiomSyntaxException { - StatementContext statement = AxiomAntlrStatementSource.contextFrom(sourceName, stream); - String name = statement.argument().identifier().localIdentifier().getText(); - return new AxiomModelStatementSource(sourceName, statement, name, namespace(statement), imports(statement)); + ItemContext root = AxiomAntlrStatementSource.contextFrom(sourceName, stream); + String name = root.value().argument().identifier().localIdentifier().getText(); + return new AxiomModelStatementSource(sourceName, root, name, namespace(root.value()), imports(root.value())); } - private AxiomModelStatementSource(String sourceName, StatementContext statement, String namespace, String name, Map imports) { + private AxiomModelStatementSource(String sourceName, ItemContext statement, String namespace, String name, Map imports) { super(sourceName, statement); this.name = name; this.imports = imports; @@ -73,21 +73,21 @@ public Map imports() { return imports; } - public static Map imports(AxiomParser.StatementContext root) { + public static Map imports(AxiomParser.ValueContext root) { Map prefixMap = new HashMap<>(); - root.statement().stream().filter(s -> IMPORT.equals(s.identifier().getText())).forEach(c -> { - String prefix = c.argument().identifier().localIdentifier().getText(); - String namespace = namespace(c); + root.item().stream().filter(s -> IMPORT.equals(s.identifier().getText())).forEach(c -> { + String prefix = c.value().argument().identifier().localIdentifier().getText(); + String namespace = namespace(c.value()); prefixMap.put(prefix, namespace); }); prefixMap.put("",namespace(root)); return prefixMap; } - private static String namespace(StatementContext c) { - return AxiomAntlrVisitor.convert(c.statement() + private static String namespace(AxiomParser.ValueContext c) { + return AxiomAntlrVisitor.convert(c.item() .stream().filter(s -> NAMESPACE.equals(s.identifier().getText())) - .findFirst().get().argument().string()); + .findFirst().get().value().argument().string()); } @Override