Skip to content

Commit

Permalink
Merge pull request #7286 from lkishalmi/languages.hcl-npe-improvements
Browse files Browse the repository at this point in the history
HCL: fix possible NPE-s, in List.of() and asString()
  • Loading branch information
ebarboni committed Apr 29, 2024
2 parents c415fad + 68591ff commit 41b0a86
Show file tree
Hide file tree
Showing 20 changed files with 363 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
package org.netbeans.modules.languages.hcl.ast;

import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

/**
*
Expand Down Expand Up @@ -64,24 +66,26 @@ public String toString() {
public record Binary(Operator op, HCLExpression left, HCLExpression right) implements HCLArithmeticOperation {
@Override
public String asString() {
return left.toString() + op.toString() + right.toString();
return HCLExpression.asString(left) + op.toString() + HCLExpression.asString(right);
}

@Override
public List<? extends HCLExpression> elements() {
return List.of(left, right);
return Stream.of(left, right)
.filter(Objects::nonNull)
.toList();
}
}

public record Unary(Operator op, HCLExpression operand) implements HCLArithmeticOperation {
@Override
public String asString() {
return op.toString() + operand.toString();
return op.toString() + HCLExpression.asString(operand);
}

@Override
public List<? extends HCLExpression> elements() {
return List.of(operand);
return operand != null ? List.of(operand) : List.of();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package org.netbeans.modules.languages.hcl.ast;

import java.util.List;
import java.util.Objects;


/**
Expand All @@ -27,6 +28,10 @@
*/
public record HCLAttribute(HCLIdentifier name, HCLExpression value) implements HCLElement {

public HCLAttribute {
Objects.requireNonNull(name, "name cannot be null");
}

public String id() {
return name.id();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ public final class HCLBlock extends HCLContainer {

public HCLBlock(List<HCLIdentifier> declaration, List<HCLElement> elements) {
super(elements);
Objects.requireNonNull(declaration, "declaration cannot be null");
if (declaration.isEmpty()) {
throw new IllegalArgumentException("declaration cannot be empty");
}
this.declaration = List.copyOf(declaration);
this.id = declaration.stream().map(d -> d.id()).collect(Collectors.joining("."));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
package org.netbeans.modules.languages.hcl.ast;

import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.stream.Stream;

/**
*
Expand All @@ -37,7 +39,7 @@ public record Tuple(List<HCLExpression> elements) implements HCLCollection<HCLE
public String asString() {
StringJoiner sj = new StringJoiner(",", "[", "]");
for (HCLExpression element : elements) {
sj.add(element.asString());
sj.add(HCLExpression.asString(element));
}
return sj.toString();
}
Expand All @@ -47,12 +49,14 @@ public String asString() {
public record ObjectElement(HCLExpression key, HCLExpression value) implements HCLExpression {
@Override
public String asString() {
return key.asString() + "=" + value.asString();
return HCLExpression.asString(key) + "=" + HCLExpression.asString(value);
}

@Override
public List<? extends HCLExpression> elements() {
return List.of(key, value);
return Stream.of(key, value)
.filter(Objects::nonNull)
.toList();
}
}

Expand All @@ -66,7 +70,7 @@ public record Object(List<ObjectElement> elements) implements HCLCollection<Obje
public String asString() {
StringJoiner sj = new StringJoiner(",", "{", "}");
for (ObjectElement element : elements) {
sj.add(element.toString());
sj.add(HCLExpression.asString(element));
}
return sj.toString();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
*/
package org.netbeans.modules.languages.hcl.ast;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

/**
*
Expand All @@ -29,12 +30,14 @@ public record HCLConditionalOperation(HCLExpression condition, HCLExpression tru

@Override
public String asString() {
return condition.toString() + "?" + trueValue.toString() + ":" + falseValue.toString();
return HCLExpression.asString(condition) + "?" + HCLExpression.asString(trueValue) + ":" + HCLExpression.asString(falseValue);
}

@Override
public List<? extends HCLExpression> elements() {
return Arrays.asList(condition, trueValue, falseValue);
return Stream.of(condition, trueValue, falseValue)
.filter(Objects::nonNull)
.toList();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package org.netbeans.modules.languages.hcl.ast;

import java.util.List;
import java.util.Objects;

/**
*
Expand All @@ -31,6 +32,7 @@ public sealed abstract class HCLContainer implements HCLElement permits HCLBlock
private final List<HCLAttribute> attributes;

protected HCLContainer(List<HCLElement> elements) {
Objects.requireNonNull(elements, "elements can be empty, but cannot be null");
this.elements = List.copyOf(elements);
this.blocks = elements.stream().filter(HCLBlock.class::isInstance).map(HCLBlock.class::cast).toList();
this.attributes = elements.stream().filter(HCLAttribute.class::isInstance).map(HCLAttribute.class::cast).toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@
*
* @author Laszlo Kishalmi
*/
public sealed interface HCLElement permits HCLExpression, HCLIdentifier, HCLContainer, HCLAttribute {
public sealed interface HCLElement permits HCLExpression, HCLContainer, HCLAttribute {
List<? extends HCLElement> elements();
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,18 @@ public sealed interface HCLExpression extends HCLElement permits
HCLConditionalOperation,
HCLForExpression,
HCLFunction,
HCLIdentifier,
HCLLiteral,
HCLResolveOperation,
HCLTemplate,
HCLVariable {

public static HCLExpression parse(String expr) {
HCLLexer lexer = new HCLLexer(CharStreams.fromString(expr));
HCLParser parser = new HCLParser(new CommonTokenStream(lexer));
return new HCLExpressionFactory().process(parser.expression());

public static String asString(HCLExpression expr) {
return expr != null ? expr.asString() : "";
}

@Override
default List<? extends HCLExpression> elements() {
return Collections.emptyList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,14 @@
*/
package org.netbeans.modules.languages.hcl.ast;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import org.antlr.v4.runtime.NoViableAltException;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.netbeans.modules.languages.hcl.grammar.HCLLexer;
import static org.netbeans.modules.languages.hcl.grammar.HCLLexer.*;
import org.netbeans.modules.languages.hcl.grammar.HCLParser;
Expand Down Expand Up @@ -150,7 +148,10 @@ protected HCLExpression expr(HCLParser.CollectionValueContext ctx) throws Unsupp
HCLParser.TupleContext tuple = ctx.tuple();
List<HCLExpression> elements = new LinkedList<>();
for (HCLParser.ExpressionContext ec : tuple.expression()) {
elements.add(expr(ec));
HCLExpression e = expr(ec);
if (e != null) {
elements.add(created(e, ec));
}
}
return new HCLCollection.Tuple(elements);
}
Expand Down Expand Up @@ -184,6 +185,7 @@ protected HCLExpression expr(HCLParser.FunctionCallContext ctx) {
if (ctx.arguments() != null) {
args = ctx.arguments().expression().stream()
.map(this::expr)
.filter(Objects::nonNull)
.toList();
expand = ctx.arguments().ELLIPSIS() != null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
package org.netbeans.modules.languages.hcl.ast;

import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

/**
*
Expand All @@ -39,10 +41,10 @@ public String asString() {
StringBuilder sb = new StringBuilder();
sb.append("[for ");
if (keyVar != null) {
sb.append(keyVar).append(',');
sb.append(keyVar.asString()).append(',');
}
sb.append(valueVar).append(" in ").append(iterable.asString()).append(':');
sb.append(result.asString());
sb.append(HCLExpression.asString(valueVar)).append(" in ").append(HCLExpression.asString(iterable)).append(':');
sb.append(HCLExpression.asString(result));
if (condition != null) {
sb.append(" if ").append(condition.asString());
}
Expand All @@ -52,7 +54,9 @@ public String asString() {

@Override
public List<? extends HCLExpression> elements() {
return List.of(iterable, result, condition);
return Stream.of(iterable, result, condition)
.filter(Objects::nonNull)
.toList();
}
}

Expand All @@ -62,10 +66,10 @@ public String asString() {
StringBuilder sb = new StringBuilder();
sb.append("{for ");
if (keyVar != null) {
sb.append(keyVar).append(',');
sb.append(keyVar.asString()).append(',');
}
sb.append(valueVar).append(" in ").append(iterable.asString()).append(':');
sb.append(resultKey.asString()).append("=>").append(resultValue.asString());
sb.append(HCLExpression.asString(valueVar)).append(" in ").append(HCLExpression.asString(iterable)).append(':');
sb.append(HCLExpression.asString(resultKey)).append("=>").append(HCLExpression.asString(resultValue));
if (grouping) {
sb.append("...");
}
Expand All @@ -78,7 +82,9 @@ public String asString() {

@Override
public List<? extends HCLExpression> elements() {
return List.of(iterable, resultKey, resultValue, condition);
return Stream.of(iterable, resultKey, resultValue, condition)
.filter(Objects::nonNull)
.toList();
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package org.netbeans.modules.languages.hcl.ast;

import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;

/**
Expand All @@ -28,14 +29,16 @@
public record HCLFunction(HCLIdentifier name, List<HCLExpression> args, boolean expand) implements HCLExpression {

public HCLFunction {
Objects.requireNonNull(name, "name cannot be null");
Objects.requireNonNull(args, "args can be empty, but cannot be null");
args = List.copyOf(args);
}

@Override
public String asString() {
StringJoiner sargs = new StringJoiner(",", "(", expand ? "...)" : ")");
args.forEach((arg) -> sargs.add(arg.toString()));
return name + sargs.toString();
args.forEach((arg) -> sargs.add(arg.asString()));
return name.asString() + sargs.toString();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,36 @@
*
* @author Laszlo Kishalmi
*/
public sealed interface HCLIdentifier extends HCLElement {
public sealed interface HCLIdentifier extends HCLExpression {

String id();

@Override
default List<? extends HCLElement> elements() {
default List<? extends HCLExpression> elements() {
return List.of();
}

public record SimpleId(String id) implements HCLIdentifier {}
public record SimpleId(String id) implements HCLIdentifier {

public record StringId(String id) implements HCLIdentifier {}
@Override
public String asString() {
return id;
}
}

public record StringId(String id) implements HCLIdentifier {

@Override
public String asString() {
return id;
}
}

public record ScopedId(HCLIdentifier parent, String id) implements HCLIdentifier {

public record ScopedId(HCLIdentifier parent, String id) implements HCLIdentifier {}
@Override
public String asString() {
return HCLExpression.asString(parent) + "::" + id;
}
}
}
Loading

0 comments on commit 41b0a86

Please sign in to comment.