From 4620992743727887c9ead987dc4684e228dcd9e0 Mon Sep 17 00:00:00 2001 From: odenix Date: Thu, 9 Apr 2026 08:05:34 -0700 Subject: [PATCH] pkl-parser: Represent "no children" as an empty list instead of null (#1513) Motivation: Facilitate the use of the NullAway checker as part of moving to JSpecify. Changes: - represent "no children" as `List.of()` instead of null - remove obsolete `children != null` assertions - NullAway intentionally ignores such assertions - remove "no children" special-casing where no longer necessary Result: - cleaner code with similar performance - removed a barrier to using the NullAway checker --- .../org/pkl/core/runtime/PowerAssertions.java | 3 - .../org/pkl/parser/BaseParserVisitor.java | 3 +- .../org/pkl/parser/syntax/AbstractNode.java | 24 ++++---- .../org/pkl/parser/syntax/Annotation.java | 2 - .../org/pkl/parser/syntax/ArgumentList.java | 1 - .../java/org/pkl/parser/syntax/Class.java | 9 --- .../java/org/pkl/parser/syntax/ClassBody.java | 2 - .../org/pkl/parser/syntax/ClassMethod.java | 8 --- .../org/pkl/parser/syntax/ClassProperty.java | 7 --- .../org/pkl/parser/syntax/DocComment.java | 2 +- .../main/java/org/pkl/parser/syntax/Expr.java | 55 +++---------------- .../parser/syntax/ExtendsOrAmendsClause.java | 1 - .../org/pkl/parser/syntax/Identifier.java | 3 +- .../org/pkl/parser/syntax/ImportClause.java | 2 - .../java/org/pkl/parser/syntax/Keyword.java | 3 +- .../java/org/pkl/parser/syntax/Modifier.java | 3 +- .../java/org/pkl/parser/syntax/Module.java | 8 +-- .../org/pkl/parser/syntax/ModuleDecl.java | 7 --- .../main/java/org/pkl/parser/syntax/Node.java | 3 +- .../org/pkl/parser/syntax/ObjectBody.java | 4 +- .../org/pkl/parser/syntax/ObjectMember.java | 30 +--------- .../java/org/pkl/parser/syntax/Parameter.java | 6 +- .../org/pkl/parser/syntax/ParameterList.java | 1 - .../parser/syntax/QualifiedIdentifier.java | 3 +- .../java/org/pkl/parser/syntax/ReplInput.java | 1 - .../org/pkl/parser/syntax/StringConstant.java | 3 +- .../org/pkl/parser/syntax/StringPart.java | 5 +- .../main/java/org/pkl/parser/syntax/Type.java | 18 ++---- .../java/org/pkl/parser/syntax/TypeAlias.java | 8 --- .../org/pkl/parser/syntax/TypeAnnotation.java | 1 - .../pkl/parser/syntax/TypeArgumentList.java | 1 - .../org/pkl/parser/syntax/TypeParameter.java | 1 - .../pkl/parser/syntax/TypeParameterList.java | 1 - 33 files changed, 42 insertions(+), 187 deletions(-) diff --git a/pkl-core/src/main/java/org/pkl/core/runtime/PowerAssertions.java b/pkl-core/src/main/java/org/pkl/core/runtime/PowerAssertions.java index aa1dbd79..76182d20 100644 --- a/pkl-core/src/main/java/org/pkl/core/runtime/PowerAssertions.java +++ b/pkl-core/src/main/java/org/pkl/core/runtime/PowerAssertions.java @@ -219,9 +219,6 @@ public class PowerAssertions { return parserNode; } var children = parserNode.children(); - if (children == null) { - return null; - } for (var child : children) { var found = findParserNode(node, child, offset); if (found != null) { diff --git a/pkl-parser/src/main/java/org/pkl/parser/BaseParserVisitor.java b/pkl-parser/src/main/java/org/pkl/parser/BaseParserVisitor.java index c23d9612..8e4a57e8 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/BaseParserVisitor.java +++ b/pkl-parser/src/main/java/org/pkl/parser/BaseParserVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved. + * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -465,7 +465,6 @@ public abstract class BaseParserVisitor implements ParserVisitor { private T visitChildren(Node node) { T result = defaultValue(); var children = node.children(); - if (children == null) return result; for (var child : children) { if (child != null) { result = aggregateResult(result, child.accept(this)); diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/AbstractNode.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/AbstractNode.java index ca60ff5e..07180fd0 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/AbstractNode.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/AbstractNode.java @@ -1,5 +1,5 @@ /* - * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved. + * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,22 +23,20 @@ import org.pkl.parser.util.Nullable; public abstract class AbstractNode implements Node { protected final Span span; - protected final @Nullable List children; + protected final List children; protected @Nullable Node parent; - public AbstractNode(Span span, @Nullable List children) { + public AbstractNode(Span span, List children) { this.span = span; - if (children != null) { - this.children = Collections.unmodifiableList(children); + if (children.isEmpty()) { + // optimization: always store an unwrapped List.of() + this.children = List.of(); } else { - this.children = null; + this.children = Collections.unmodifiableList(children); } - - if (children != null) { - for (var node : children) { - if (node != null) { - node.setParent(this); - } + for (var node : children) { + if (node != null) { + node.setParent(this); } } } @@ -59,7 +57,7 @@ public abstract class AbstractNode implements Node { } @Override - public @Nullable List children() { + public List children() { return children; } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Annotation.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Annotation.java index 5212767f..2f78b51a 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Annotation.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Annotation.java @@ -31,14 +31,12 @@ public final class Annotation extends AbstractNode { } public Type getType() { - assert children != null; var ret = (Type) children.get(0); assert ret != null; return ret; } public @Nullable ObjectBody getBody() { - assert children != null; return (ObjectBody) children.get(1); } } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ArgumentList.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ArgumentList.java index 52cf7b01..8c758f0d 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ArgumentList.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ArgumentList.java @@ -33,7 +33,6 @@ public final class ArgumentList extends AbstractNode { @SuppressWarnings("unchecked") public List getArguments() { - assert children != null; return (List) children; } } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Class.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Class.java index 5f86fe48..33426730 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Class.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Class.java @@ -36,55 +36,46 @@ public final class Class extends AbstractNode { } public @Nullable DocComment getDocComment() { - assert children != null; return (DocComment) children.get(0); } @SuppressWarnings("unchecked") public List getAnnotations() { - assert children != null; return (List) children.subList(1, modifiersOffset); } @SuppressWarnings("unchecked") public List getModifiers() { - assert children != null; return (List) children.subList(modifiersOffset, keywordOffset); } public Keyword getClassKeyword() { - assert children != null; var ret = (Keyword) children.get(keywordOffset); assert ret != null; return ret; } public Identifier getName() { - assert children != null; var ret = (Identifier) children.get(keywordOffset + 1); assert ret != null; return ret; } public @Nullable TypeParameterList getTypeParameterList() { - assert children != null; return (TypeParameterList) children.get(keywordOffset + 2); } public @Nullable Type getSuperClass() { - assert children != null; return (Type) children.get(keywordOffset + 3); } public @Nullable ClassBody getBody() { - assert children != null; return (ClassBody) children.get(keywordOffset + 4); } @SuppressWarnings("DuplicatedCode") public Span getHeaderSpan() { Span start = null; - assert children != null; for (var i = modifiersOffset; i < children.size(); i++) { var child = children.get(i); if (child != null) { diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassBody.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassBody.java index 4aeecb82..9209bbec 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassBody.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassBody.java @@ -34,7 +34,6 @@ public final class ClassBody extends AbstractNode { public List getProperties() { var props = new ArrayList(); - assert children != null; for (var child : children) { if (child instanceof ClassProperty prop) { props.add(prop); @@ -45,7 +44,6 @@ public final class ClassBody extends AbstractNode { public List getMethods() { var methods = new ArrayList(); - assert children != null; for (var child : children) { if (child instanceof ClassMethod method) { methods.add(method); diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassMethod.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassMethod.java index d830578e..6cd69fb9 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassMethod.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassMethod.java @@ -39,48 +39,40 @@ public final class ClassMethod extends AbstractNode { } public @Nullable DocComment getDocComment() { - assert children != null; return (DocComment) children.get(0); } @SuppressWarnings("unchecked") public List getAnnotations() { - assert children != null; return (List) children.subList(1, modifiersOffset); } @SuppressWarnings("unchecked") public List getModifiers() { - assert children != null; return (List) children.subList(modifiersOffset, nameOffset); } public Identifier getName() { - assert children != null; var ret = (Identifier) children.get(nameOffset); assert ret != null; return ret; } public @Nullable TypeParameterList getTypeParameterList() { - assert children != null; return (TypeParameterList) children.get(nameOffset + 1); } public ParameterList getParameterList() { - assert children != null; var ret = (ParameterList) children.get(nameOffset + 2); assert ret != null; return ret; } public @Nullable TypeAnnotation getTypeAnnotation() { - assert children != null; return (TypeAnnotation) children.get(nameOffset + 3); } public @Nullable Expr getExpr() { - assert children != null; return (Expr) children.get(nameOffset + 4); } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassProperty.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassProperty.java index 1ad3cfa1..0743ecc0 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassProperty.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ClassProperty.java @@ -36,42 +36,35 @@ public final class ClassProperty extends AbstractNode { } public @Nullable DocComment getDocComment() { - assert children != null; return (DocComment) children.get(0); } @SuppressWarnings("unchecked") public List getAnnotations() { - assert children != null; return (List) children.subList(1, modifiersOffset); } @SuppressWarnings("unchecked") public List getModifiers() { - assert children != null; return (List) children.subList(modifiersOffset, nameOffset); } public Identifier getName() { - assert children != null; var ret = (Identifier) children.get(nameOffset); assert ret != null; return ret; } public @Nullable TypeAnnotation getTypeAnnotation() { - assert children != null; return (TypeAnnotation) children.get(nameOffset + 1); } public @Nullable Expr getExpr() { - assert children != null; return (Expr) children.get(nameOffset + 2); } @SuppressWarnings("unchecked") public List getBodyList() { - assert children != null; return (List) children.subList(nameOffset + 3, children.size()); } } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/DocComment.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/DocComment.java index f2f52a01..84cb5025 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/DocComment.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/DocComment.java @@ -23,7 +23,7 @@ public final class DocComment extends AbstractNode { private final List spans; public DocComment(List spans) { - super(spans.get(0).endWith(spans.get(spans.size() - 1)), null); + super(spans.get(0).endWith(spans.get(spans.size() - 1)), List.of()); this.spans = spans; } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Expr.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Expr.java index d9a3ccb8..7ddec543 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Expr.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Expr.java @@ -25,13 +25,13 @@ import org.pkl.parser.util.Nullable; @SuppressWarnings("unused") public abstract sealed class Expr extends AbstractNode { - public Expr(Span span, @Nullable List children) { + public Expr(Span span, List children) { super(span, children); } public static final class ThisExpr extends Expr { public ThisExpr(Span span) { - super(span, null); + super(span, List.of()); } @Override @@ -42,7 +42,7 @@ public abstract sealed class Expr extends AbstractNode { public static final class OuterExpr extends Expr { public OuterExpr(Span span) { - super(span, null); + super(span, List.of()); } @Override @@ -53,7 +53,7 @@ public abstract sealed class Expr extends AbstractNode { public static final class ModuleExpr extends Expr { public ModuleExpr(Span span) { - super(span, null); + super(span, List.of()); } @Override @@ -64,7 +64,7 @@ public abstract sealed class Expr extends AbstractNode { public static final class NullLiteralExpr extends Expr { public NullLiteralExpr(Span span) { - super(span, null); + super(span, List.of()); } @Override @@ -77,7 +77,7 @@ public abstract sealed class Expr extends AbstractNode { private final boolean b; public BoolLiteralExpr(boolean b, Span span) { - super(span, null); + super(span, List.of()); this.b = b; } @@ -95,7 +95,7 @@ public abstract sealed class Expr extends AbstractNode { private final String number; public IntLiteralExpr(String number, Span span) { - super(span, null); + super(span, List.of()); this.number = number; } @@ -113,7 +113,7 @@ public abstract sealed class Expr extends AbstractNode { private final String number; public FloatLiteralExpr(String number, Span span) { - super(span, null); + super(span, List.of()); this.number = number; } @@ -137,7 +137,6 @@ public abstract sealed class Expr extends AbstractNode { public final boolean hasInterpolation() { var children = children(); - assert children != null; return children.size() > 1; } } @@ -160,7 +159,6 @@ public abstract sealed class Expr extends AbstractNode { @SuppressWarnings("unchecked") public List getParts() { - assert children != null; return (List) children; } @@ -191,7 +189,6 @@ public abstract sealed class Expr extends AbstractNode { @SuppressWarnings("unchecked") public List getParts() { - assert children != null; return (List) children; } @@ -215,7 +212,6 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -233,7 +229,6 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -254,7 +249,6 @@ public abstract sealed class Expr extends AbstractNode { } public StringConstant getImportStr() { - assert children != null; var ret = (StringConstant) children.get(0); assert ret != null; return ret; @@ -279,7 +273,6 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -308,14 +301,12 @@ public abstract sealed class Expr extends AbstractNode { } public Identifier getIdentifier() { - assert children != null; var ret = (Identifier) children.get(0); assert ret != null; return ret; } public @Nullable ArgumentList getArgumentList() { - assert children != null; return (ArgumentList) children.get(1); } } @@ -339,14 +330,12 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public Identifier getIdentifier() { - assert children != null; var ret = (Identifier) children.get(1); assert ret != null; return ret; @@ -357,7 +346,6 @@ public abstract sealed class Expr extends AbstractNode { } public @Nullable ArgumentList getArgumentList() { - assert children != null; return (ArgumentList) children.get(2); } } @@ -373,14 +361,12 @@ public abstract sealed class Expr extends AbstractNode { } public Identifier getIdentifier() { - assert children != null; var ret = (Identifier) children.get(0); assert ret != null; return ret; } public @Nullable ArgumentList getArgumentList() { - assert children != null; return (ArgumentList) children.get(1); } } @@ -396,7 +382,6 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getArg() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -414,14 +399,12 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public Expr getArg() { - assert children != null; var ret = (Expr) children.get(1); assert ret != null; return ret; @@ -439,21 +422,18 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getCond() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public Expr getThen() { - assert children != null; var ret = (Expr) children.get(1); assert ret != null; return ret; } public Expr getEls() { - assert children != null; var ret = (Expr) children.get(2); assert ret != null; return ret; @@ -471,21 +451,18 @@ public abstract sealed class Expr extends AbstractNode { } public Parameter getParameter() { - assert children != null; var ret = (Parameter) children.get(0); assert ret != null; return ret; } public Expr getBindingExpr() { - assert children != null; var ret = (Expr) children.get(1); assert ret != null; return ret; } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(2); assert ret != null; return ret; @@ -503,14 +480,12 @@ public abstract sealed class Expr extends AbstractNode { } public ParameterList getParameterList() { - assert children != null; var ret = (ParameterList) children.get(0); assert ret != null; return ret; } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(1); assert ret != null; return ret; @@ -528,7 +503,6 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -546,12 +520,10 @@ public abstract sealed class Expr extends AbstractNode { } public @Nullable Type getType() { - assert children != null; return (Type) children.get(0); } public ObjectBody getBody() { - assert children != null; var ret = (ObjectBody) children.get(1); assert ret != null; return ret; @@ -573,14 +545,12 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public ObjectBody getBody() { - assert children != null; var ret = (ObjectBody) children.get(1); assert ret != null; return ret; @@ -598,7 +568,6 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -616,7 +585,6 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -634,7 +602,6 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -655,14 +622,12 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getLeft() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public Expr getRight() { - assert children != null; var ret = (Expr) children.get(1); assert ret != null; return ret; @@ -709,14 +674,12 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public Type getType() { - assert children != null; var ret = (Type) children.get(1); assert ret != null; return ret; @@ -734,14 +697,12 @@ public abstract sealed class Expr extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public Type getType() { - assert children != null; var ret = (Type) children.get(1); assert ret != null; return ret; diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ExtendsOrAmendsClause.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ExtendsOrAmendsClause.java index 699e7f41..7790941a 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ExtendsOrAmendsClause.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ExtendsOrAmendsClause.java @@ -35,7 +35,6 @@ public final class ExtendsOrAmendsClause extends AbstractNode { } public StringConstant getUrl() { - assert children != null; var ret = (StringConstant) children.get(0); assert ret != null; return ret; diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Identifier.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Identifier.java index e7535308..33132859 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Identifier.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Identifier.java @@ -15,6 +15,7 @@ */ package org.pkl.parser.syntax; +import java.util.List; import java.util.Objects; import org.pkl.parser.ParserVisitor; import org.pkl.parser.Span; @@ -23,7 +24,7 @@ public final class Identifier extends AbstractNode { private final String value; public Identifier(String value, Span span) { - super(span, null); + super(span, List.of()); this.value = value; } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ImportClause.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ImportClause.java index 156e3f7c..21dab966 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ImportClause.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ImportClause.java @@ -36,7 +36,6 @@ public final class ImportClause extends AbstractNode { } public StringConstant getImportStr() { - assert children != null; var ret = (StringConstant) children.get(0); assert ret != null; return ret; @@ -47,7 +46,6 @@ public final class ImportClause extends AbstractNode { } public @Nullable Identifier getAlias() { - assert children != null; return (Identifier) children.get(1); } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Keyword.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Keyword.java index 1fc5a443..6d69b1b4 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Keyword.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Keyword.java @@ -15,13 +15,14 @@ */ package org.pkl.parser.syntax; +import java.util.List; import org.pkl.parser.ParserVisitor; import org.pkl.parser.Span; public final class Keyword extends AbstractNode { public Keyword(Span span) { - super(span, null); + super(span, List.of()); } @Override diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Modifier.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Modifier.java index 246624dc..5e8390cb 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Modifier.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Modifier.java @@ -15,6 +15,7 @@ */ package org.pkl.parser.syntax; +import java.util.List; import java.util.Objects; import org.pkl.parser.ParserVisitor; import org.pkl.parser.Span; @@ -23,7 +24,7 @@ public final class Modifier extends AbstractNode { private final ModifierValue value; public Modifier(ModifierValue value, Span span) { - super(span, null); + super(span, List.of()); this.value = value; } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Module.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Module.java index 8e8e4797..c5da7fd5 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Module.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Module.java @@ -1,5 +1,5 @@ /* - * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved. + * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,13 +32,11 @@ public final class Module extends AbstractNode { } public @Nullable ModuleDecl getDecl() { - assert children != null; // children can be empty when there was a parse error return children.isEmpty() ? null : (ModuleDecl) children.get(0); } public List getImports() { - assert children != null; if (children.size() < 2) return List.of(); var res = new ArrayList(); for (int i = 1; i < children.size(); i++) { @@ -55,7 +53,6 @@ public final class Module extends AbstractNode { public List getClasses() { var res = new ArrayList(); - assert children != null; for (var child : children) { if (child instanceof Class clazz) { res.add(clazz); @@ -66,7 +63,6 @@ public final class Module extends AbstractNode { public List getTypeAliases() { var res = new ArrayList(); - assert children != null; for (var child : children) { if (child instanceof TypeAlias typeAlias) { res.add(typeAlias); @@ -77,7 +73,6 @@ public final class Module extends AbstractNode { public List getProperties() { var res = new ArrayList(); - assert children != null; for (var child : children) { if (child instanceof ClassProperty classProperty) { res.add(classProperty); @@ -88,7 +83,6 @@ public final class Module extends AbstractNode { public List getMethods() { var res = new ArrayList(); - assert children != null; for (var child : children) { if (child instanceof ClassMethod classMethod) { res.add(classMethod); diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ModuleDecl.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ModuleDecl.java index 4491c838..44263357 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ModuleDecl.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ModuleDecl.java @@ -36,41 +36,34 @@ public final class ModuleDecl extends AbstractNode { } public @Nullable DocComment getDocComment() { - assert children != null; return (DocComment) children.get(0); } @SuppressWarnings("unchecked") public List getAnnotations() { - assert children != null; return (List) children.subList(1, modifiersOffset); } @SuppressWarnings("unchecked") public List getModifiers() { - assert children != null; return (List) children.subList(modifiersOffset, nameOffset); } public @Nullable Keyword getModuleKeyword() { - assert children != null; return (Keyword) children.get(nameOffset); } public @Nullable QualifiedIdentifier getName() { - assert children != null; return (QualifiedIdentifier) children.get(nameOffset + 1); } public @Nullable ExtendsOrAmendsClause getExtendsOrAmendsDecl() { - assert children != null; return (ExtendsOrAmendsClause) children.get(nameOffset + 2); } @SuppressWarnings("DuplicatedCode") public Span headerSpan() { Span start = null; - assert children != null; for (var i = modifiersOffset; i < children.size(); i++) { var child = children.get(i); if (child != null) { diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Node.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Node.java index 1f59596d..39dec453 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Node.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Node.java @@ -1,5 +1,5 @@ /* - * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved. + * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,6 @@ public interface Node { void setParent(Node parent); - @Nullable List children(); T accept(ParserVisitor visitor); diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectBody.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectBody.java index 677f2a04..a34c5592 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectBody.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectBody.java @@ -1,5 +1,5 @@ /* - * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved. + * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,13 +34,11 @@ public final class ObjectBody extends AbstractNode { @SuppressWarnings("unchecked") public List getParameters() { - assert children != null; return (List) children.subList(0, membersOffset); } @SuppressWarnings("unchecked") public List getMembers() { - assert children != null; return (List) children.subList(membersOffset, children.size()); } } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectMember.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectMember.java index 6dc85f28..105b50d1 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectMember.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectMember.java @@ -25,7 +25,7 @@ import org.pkl.parser.util.Nullable; @SuppressWarnings("unused") public abstract sealed class ObjectMember extends AbstractNode { - public ObjectMember(Span span, @Nullable List children) { + public ObjectMember(Span span, List children) { super(span, children); } @@ -40,7 +40,6 @@ public abstract sealed class ObjectMember extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -62,30 +61,25 @@ public abstract sealed class ObjectMember extends AbstractNode { @SuppressWarnings("unchecked") public List getModifiers() { - assert children != null; return (List) children.subList(0, identifierOffset); } public Identifier getIdentifier() { - assert children != null; var ret = (Identifier) children.get(identifierOffset); assert ret != null; return ret; } public @Nullable TypeAnnotation getTypeAnnotation() { - assert children != null; return (TypeAnnotation) children.get(identifierOffset + 1); } public @Nullable Expr getExpr() { - assert children != null; return (Expr) children.get(identifierOffset + 2); } @SuppressWarnings("unchecked") public List getBodyList() { - assert children != null; return (List) children.subList(identifierOffset + 3, children.size()); } } @@ -105,43 +99,36 @@ public abstract sealed class ObjectMember extends AbstractNode { @SuppressWarnings("unchecked") public List getModifiers() { - assert children != null; return (List) children.subList(0, identifierOffset); } public Keyword getFunctionKeyword() { - assert children != null; var ret = (Keyword) children.get(identifierOffset); assert ret != null; return ret; } public Identifier getIdentifier() { - assert children != null; var ret = (Identifier) children.get(identifierOffset + 1); assert ret != null; return ret; } public @Nullable TypeParameterList getTypeParameterList() { - assert children != null; return (TypeParameterList) children.get(identifierOffset + 2); } public ParameterList getParamList() { - assert children != null; var ret = (ParameterList) children.get(identifierOffset + 3); assert ret != null; return ret; } public @Nullable TypeAnnotation getTypeAnnotation() { - assert children != null; return (TypeAnnotation) children.get(identifierOffset + 4); } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(identifierOffset + 5); assert ret != null; return ret; @@ -150,7 +137,6 @@ public abstract sealed class ObjectMember extends AbstractNode { @SuppressWarnings("DuplicatedCode") public Span headerSpan() { Span start = null; - assert children != null; for (var child : children) { if (child != null) { start = child.span(); @@ -182,20 +168,17 @@ public abstract sealed class ObjectMember extends AbstractNode { } public Expr getPred() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public @Nullable Expr getExpr() { - assert children != null; return (Expr) children.get(1); } @SuppressWarnings("unchecked") public List getBodyList() { - assert children != null; return (List) children.subList(2, children.size()); } } @@ -211,20 +194,17 @@ public abstract sealed class ObjectMember extends AbstractNode { } public Expr getKey() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public @Nullable Expr getValue() { - assert children != null; return (Expr) children.get(1); } @SuppressWarnings("unchecked") public List getBodyList() { - assert children != null; return (List) children.subList(2, children.size()); } } @@ -243,7 +223,6 @@ public abstract sealed class ObjectMember extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; @@ -299,21 +278,18 @@ public abstract sealed class ObjectMember extends AbstractNode { } public Expr getPredicate() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; } public ObjectBody getThenClause() { - assert children != null; var ret = (ObjectBody) children.get(1); assert ret != null; return ret; } public @Nullable ObjectBody getElseClause() { - assert children != null; return (ObjectBody) children.get(2); } } @@ -330,26 +306,22 @@ public abstract sealed class ObjectMember extends AbstractNode { } public Parameter getP1() { - assert children != null; var ret = (Parameter) children.get(0); assert ret != null; return ret; } public @Nullable Parameter getP2() { - assert children != null; return (Parameter) children.get(1); } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(2); assert ret != null; return ret; } public ObjectBody getBody() { - assert children != null; var ret = (ObjectBody) children.get(3); assert ret != null; return ret; diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Parameter.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Parameter.java index 4cdcb3d8..52002005 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Parameter.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Parameter.java @@ -23,7 +23,7 @@ import org.pkl.parser.util.Nullable; public abstract sealed class Parameter extends AbstractNode { - public Parameter(Span span, @Nullable List children) { + public Parameter(Span span, List children) { super(span, children); } @@ -34,7 +34,7 @@ public abstract sealed class Parameter extends AbstractNode { public static final class Underscore extends Parameter { public Underscore(Span span) { - super(span, null); + super(span, List.of()); } } @@ -45,14 +45,12 @@ public abstract sealed class Parameter extends AbstractNode { } public Identifier getIdentifier() { - assert children != null; var ret = (Identifier) children.get(0); assert ret != null; return ret; } public @Nullable TypeAnnotation getTypeAnnotation() { - assert children != null; return (TypeAnnotation) children.get(1); } } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ParameterList.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ParameterList.java index b72f387b..da6aab7c 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ParameterList.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ParameterList.java @@ -32,7 +32,6 @@ public final class ParameterList extends AbstractNode { @SuppressWarnings("unchecked") public List getParameters() { - assert children != null; return (List) children; } } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/QualifiedIdentifier.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/QualifiedIdentifier.java index c857db5a..890ecfa2 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/QualifiedIdentifier.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/QualifiedIdentifier.java @@ -1,5 +1,5 @@ /* - * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved. + * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,6 @@ public final class QualifiedIdentifier extends AbstractNode { @SuppressWarnings("unchecked") public List getIdentifiers() { - assert children != null; return (List) children; } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/ReplInput.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/ReplInput.java index 7d2e6ca9..e254ef52 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/ReplInput.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/ReplInput.java @@ -32,7 +32,6 @@ public final class ReplInput extends AbstractNode { @SuppressWarnings("unchecked") public List getNodes() { - assert children != null; return (List) children; } } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/StringConstant.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/StringConstant.java index 689f1dd6..05af022c 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/StringConstant.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/StringConstant.java @@ -15,6 +15,7 @@ */ package org.pkl.parser.syntax; +import java.util.List; import java.util.Objects; import org.pkl.parser.ParserVisitor; import org.pkl.parser.Span; @@ -24,7 +25,7 @@ public final class StringConstant extends AbstractNode { private final String string; public StringConstant(String string, Span span) { - super(span, null); + super(span, List.of()); this.string = string; } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/StringPart.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/StringPart.java index 20c67068..d5647aba 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/StringPart.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/StringPart.java @@ -23,7 +23,7 @@ import org.pkl.parser.util.Nullable; public abstract sealed class StringPart extends AbstractNode { - public StringPart(Span span, @Nullable List children) { + public StringPart(Span span, List children) { super(span, children); } @@ -36,7 +36,7 @@ public abstract sealed class StringPart extends AbstractNode { private final String string; public StringChars(String string, Span span) { - super(span, null); + super(span, List.of()); this.string = string; } @@ -77,7 +77,6 @@ public abstract sealed class StringPart extends AbstractNode { } public Expr getExpr() { - assert children != null; var ret = (Expr) children.get(0); assert ret != null; return ret; diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/Type.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/Type.java index 6745763c..32f0e8f1 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/Type.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/Type.java @@ -24,13 +24,13 @@ import org.pkl.parser.util.Nullable; public abstract sealed class Type extends AbstractNode { - public Type(Span span, @Nullable List children) { + public Type(Span span, List children) { super(span, children); } public static final class UnknownType extends Type { public UnknownType(Span span) { - super(span, null); + super(span, List.of()); } @Override @@ -41,7 +41,7 @@ public abstract sealed class Type extends AbstractNode { public static final class NothingType extends Type { public NothingType(Span span) { - super(span, null); + super(span, List.of()); } @Override @@ -52,7 +52,7 @@ public abstract sealed class Type extends AbstractNode { public static final class ModuleType extends Type { public ModuleType(Span span) { - super(span, null); + super(span, List.of()); } @Override @@ -72,7 +72,6 @@ public abstract sealed class Type extends AbstractNode { } public StringConstant getStr() { - assert children != null; var ret = (StringConstant) children.get(0); assert ret != null; return ret; @@ -90,14 +89,12 @@ public abstract sealed class Type extends AbstractNode { } public QualifiedIdentifier getName() { - assert children != null; var ret = (QualifiedIdentifier) children.get(0); assert ret != null; return ret; } public @Nullable TypeArgumentList getArgs() { - assert children != null; return (TypeArgumentList) children.get(1); } } @@ -113,7 +110,6 @@ public abstract sealed class Type extends AbstractNode { } public Type getType() { - assert children != null; var ret = (Type) children.get(0); assert ret != null; return ret; @@ -131,7 +127,6 @@ public abstract sealed class Type extends AbstractNode { } public Type getType() { - assert children != null; var ret = (Type) children.get(0); assert ret != null; return ret; @@ -149,7 +144,6 @@ public abstract sealed class Type extends AbstractNode { } public Type getType() { - assert children != null; var ret = (Type) children.get(0); assert ret != null; return ret; @@ -157,7 +151,6 @@ public abstract sealed class Type extends AbstractNode { @SuppressWarnings("unchecked") public List getExprs() { - assert children != null; return (List) children.subList(1, children.size()); } } @@ -177,7 +170,6 @@ public abstract sealed class Type extends AbstractNode { @SuppressWarnings("unchecked") public List getTypes() { - assert children != null; return (List) children; } @@ -231,12 +223,10 @@ public abstract sealed class Type extends AbstractNode { @SuppressWarnings("unchecked") public List getArgs() { - assert children != null; return (List) children.subList(0, children.size() - 1); } public Type getRet() { - assert children != null; var ret = (Type) children.get(children.size() - 1); assert ret != null; return ret; diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAlias.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAlias.java index 240f4ef9..af7e63fb 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAlias.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAlias.java @@ -37,43 +37,36 @@ public final class TypeAlias extends AbstractNode { } public @Nullable DocComment getDocComment() { - assert children != null; return (DocComment) children.get(0); } @SuppressWarnings("unchecked") public List getAnnotations() { - assert children != null; return (List) children.subList(1, modifiersOffset); } @SuppressWarnings("unchecked") public List getModifiers() { - assert children != null; return (List) children.subList(modifiersOffset, nameOffset); } public Keyword getTypealiasKeyword() { - assert children != null; var ret = (Keyword) children.get(nameOffset); assert ret != null; return ret; } public Identifier getName() { - assert children != null; var ret = (Identifier) children.get(nameOffset + 1); assert ret != null; return ret; } public @Nullable TypeParameterList getTypeParameterList() { - assert children != null; return (TypeParameterList) children.get(nameOffset + 2); } public Type getType() { - assert children != null; var ret = (Type) children.get(nameOffset + 3); assert ret != null; return ret; @@ -82,7 +75,6 @@ public final class TypeAlias extends AbstractNode { @SuppressWarnings("DuplicatedCode") public Span getHeaderSpan() { Span start = null; - assert children != null; for (var i = modifiersOffset; i < children.size(); i++) { var child = children.get(i); if (child != null) { diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAnnotation.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAnnotation.java index 5991ce3d..ad4162a0 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAnnotation.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAnnotation.java @@ -31,7 +31,6 @@ public final class TypeAnnotation extends AbstractNode { } public Type getType() { - assert children != null; var ret = (Type) children.get(0); assert ret != null; return ret; diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeArgumentList.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeArgumentList.java index 930d1ff0..c4617073 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeArgumentList.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeArgumentList.java @@ -27,7 +27,6 @@ public final class TypeArgumentList extends AbstractNode { @SuppressWarnings("unchecked") public List getTypes() { - assert children != null; return (List) children; } diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameter.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameter.java index be176cd4..8b2dccee 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameter.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameter.java @@ -39,7 +39,6 @@ public final class TypeParameter extends AbstractNode { } public Identifier getIdentifier() { - assert children != null; var ret = (Identifier) children.get(0); assert ret != null; return ret; diff --git a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameterList.java b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameterList.java index b175b1e1..20f3bd50 100644 --- a/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameterList.java +++ b/pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameterList.java @@ -32,7 +32,6 @@ public final class TypeParameterList extends AbstractNode { @SuppressWarnings("unchecked") public List getParameters() { - assert children != null; return (List) children; } }