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
This commit is contained in:
odenix
2026-04-09 08:05:34 -07:00
committed by GitHub
parent 2cfd0a0d28
commit 4620992743
33 changed files with 42 additions and 187 deletions

View File

@@ -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) {

View File

@@ -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<T> implements ParserVisitor<T> {
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));

View File

@@ -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<? extends @Nullable Node> children;
protected final List<? extends @Nullable Node> children;
protected @Nullable Node parent;
public AbstractNode(Span span, @Nullable List<? extends @Nullable Node> children) {
public AbstractNode(Span span, List<? extends @Nullable Node> 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<? extends @Nullable Node> children() {
public List<? extends @Nullable Node> children() {
return children;
}

View File

@@ -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);
}
}

View File

@@ -33,7 +33,6 @@ public final class ArgumentList extends AbstractNode {
@SuppressWarnings("unchecked")
public List<Expr> getArguments() {
assert children != null;
return (List<Expr>) children;
}
}

View File

@@ -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<Annotation> getAnnotations() {
assert children != null;
return (List<Annotation>) children.subList(1, modifiersOffset);
}
@SuppressWarnings("unchecked")
public List<Modifier> getModifiers() {
assert children != null;
return (List<Modifier>) 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) {

View File

@@ -34,7 +34,6 @@ public final class ClassBody extends AbstractNode {
public List<ClassProperty> getProperties() {
var props = new ArrayList<ClassProperty>();
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<ClassMethod> getMethods() {
var methods = new ArrayList<ClassMethod>();
assert children != null;
for (var child : children) {
if (child instanceof ClassMethod method) {
methods.add(method);

View File

@@ -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<Annotation> getAnnotations() {
assert children != null;
return (List<Annotation>) children.subList(1, modifiersOffset);
}
@SuppressWarnings("unchecked")
public List<Modifier> getModifiers() {
assert children != null;
return (List<Modifier>) 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);
}

View File

@@ -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<Annotation> getAnnotations() {
assert children != null;
return (List<Annotation>) children.subList(1, modifiersOffset);
}
@SuppressWarnings("unchecked")
public List<Modifier> getModifiers() {
assert children != null;
return (List<Modifier>) 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<ObjectBody> getBodyList() {
assert children != null;
return (List<ObjectBody>) children.subList(nameOffset + 3, children.size());
}
}

View File

@@ -23,7 +23,7 @@ public final class DocComment extends AbstractNode {
private final List<Span> spans;
public DocComment(List<Span> 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;
}

View File

@@ -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<? extends @Nullable Node> children) {
public Expr(Span span, List<? extends @Nullable Node> 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<StringPart> getParts() {
assert children != null;
return (List<StringPart>) children;
}
@@ -191,7 +189,6 @@ public abstract sealed class Expr extends AbstractNode {
@SuppressWarnings("unchecked")
public List<StringPart> getParts() {
assert children != null;
return (List<StringPart>) 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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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<ImportClause> getImports() {
assert children != null;
if (children.size() < 2) return List.of();
var res = new ArrayList<ImportClause>();
for (int i = 1; i < children.size(); i++) {
@@ -55,7 +53,6 @@ public final class Module extends AbstractNode {
public List<org.pkl.parser.syntax.Class> getClasses() {
var res = new ArrayList<org.pkl.parser.syntax.Class>();
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<TypeAlias> getTypeAliases() {
var res = new ArrayList<TypeAlias>();
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<ClassProperty> getProperties() {
var res = new ArrayList<ClassProperty>();
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<ClassMethod> getMethods() {
var res = new ArrayList<ClassMethod>();
assert children != null;
for (var child : children) {
if (child instanceof ClassMethod classMethod) {
res.add(classMethod);

View File

@@ -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<Annotation> getAnnotations() {
assert children != null;
return (List<Annotation>) children.subList(1, modifiersOffset);
}
@SuppressWarnings("unchecked")
public List<Modifier> getModifiers() {
assert children != null;
return (List<Modifier>) 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) {

View File

@@ -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<? extends @Nullable Node> children();
<T> T accept(ParserVisitor<? extends T> visitor);

View File

@@ -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<Parameter> getParameters() {
assert children != null;
return (List<Parameter>) children.subList(0, membersOffset);
}
@SuppressWarnings("unchecked")
public List<ObjectMember> getMembers() {
assert children != null;
return (List<ObjectMember>) children.subList(membersOffset, children.size());
}
}

View File

@@ -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<? extends @Nullable Node> children) {
public ObjectMember(Span span, List<? extends @Nullable Node> 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<Modifier> getModifiers() {
assert children != null;
return (List<Modifier>) 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<ObjectBody> getBodyList() {
assert children != null;
return (List<ObjectBody>) children.subList(identifierOffset + 3, children.size());
}
}
@@ -105,43 +99,36 @@ public abstract sealed class ObjectMember extends AbstractNode {
@SuppressWarnings("unchecked")
public List<Modifier> getModifiers() {
assert children != null;
return (List<Modifier>) 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<ObjectBody> getBodyList() {
assert children != null;
return (List<ObjectBody>) 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<ObjectBody> getBodyList() {
assert children != null;
return (List<ObjectBody>) 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;

View File

@@ -23,7 +23,7 @@ import org.pkl.parser.util.Nullable;
public abstract sealed class Parameter extends AbstractNode {
public Parameter(Span span, @Nullable List<? extends @Nullable Node> children) {
public Parameter(Span span, List<? extends @Nullable Node> 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);
}
}

View File

@@ -32,7 +32,6 @@ public final class ParameterList extends AbstractNode {
@SuppressWarnings("unchecked")
public List<Parameter> getParameters() {
assert children != null;
return (List<Parameter>) children;
}
}

View File

@@ -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<Identifier> getIdentifiers() {
assert children != null;
return (List<Identifier>) children;
}

View File

@@ -32,7 +32,6 @@ public final class ReplInput extends AbstractNode {
@SuppressWarnings("unchecked")
public List<Node> getNodes() {
assert children != null;
return (List<Node>) children;
}
}

View File

@@ -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;
}

View File

@@ -23,7 +23,7 @@ import org.pkl.parser.util.Nullable;
public abstract sealed class StringPart extends AbstractNode {
public StringPart(Span span, @Nullable List<? extends @Nullable Node> children) {
public StringPart(Span span, List<? extends @Nullable Node> 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;

View File

@@ -24,13 +24,13 @@ import org.pkl.parser.util.Nullable;
public abstract sealed class Type extends AbstractNode {
public Type(Span span, @Nullable List<? extends @Nullable Node> children) {
public Type(Span span, List<? extends @Nullable Node> 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<Expr> getExprs() {
assert children != null;
return (List<Expr>) children.subList(1, children.size());
}
}
@@ -177,7 +170,6 @@ public abstract sealed class Type extends AbstractNode {
@SuppressWarnings("unchecked")
public List<Type> getTypes() {
assert children != null;
return (List<Type>) children;
}
@@ -231,12 +223,10 @@ public abstract sealed class Type extends AbstractNode {
@SuppressWarnings("unchecked")
public List<Type> getArgs() {
assert children != null;
return (List<Type>) 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;

View File

@@ -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<Annotation> getAnnotations() {
assert children != null;
return (List<Annotation>) children.subList(1, modifiersOffset);
}
@SuppressWarnings("unchecked")
public List<Modifier> getModifiers() {
assert children != null;
return (List<Modifier>) 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) {

View File

@@ -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;

View File

@@ -27,7 +27,6 @@ public final class TypeArgumentList extends AbstractNode {
@SuppressWarnings("unchecked")
public List<Type> getTypes() {
assert children != null;
return (List<Type>) children;
}

View File

@@ -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;

View File

@@ -32,7 +32,6 @@ public final class TypeParameterList extends AbstractNode {
@SuppressWarnings("unchecked")
public List<TypeParameter> getParameters() {
assert children != null;
return (List<TypeParameter>) children;
}
}