Adjust formatting of qualified access chains (#1252)

This adjusts formatting of qualified access chains so that leading
dot calls are kept in the same line if possible.
This commit is contained in:
Daniel Chao
2025-10-24 16:48:21 -07:00
committed by GitHub
parent c7680aea1f
commit a8f76d6209
7 changed files with 275 additions and 53 deletions

View File

@@ -679,6 +679,10 @@ public class GenericParser {
ff(children);
expect(Token.RBRACK, children, "unexpectedToken", "]");
}
case DOT, QDOT -> {
nodeType = NodeType.QUALIFIED_ACCESS_EXPR;
children.add(parseUnqualifiedAccessExpr());
}
case NON_NULL -> nodeType = NodeType.NON_NULL_EXPR;
default -> children.add(parseExpr(expectation, nextMinPrec));
}
@@ -719,6 +723,16 @@ public class GenericParser {
};
}
private Node parseUnqualifiedAccessExpr() {
var children = new ArrayList<Node>();
children.add(parseIdentifier());
if (lookahead() == Token.LPAREN && noSemicolonInbetween() && _lookahead.newLinesBetween == 0) {
ff(children);
children.add(parseArgumentList());
}
return new Node(NodeType.UNQUALIFIED_ACCESS_EXPR, children);
}
private Node parseExprAtom(@Nullable String expectation) {
var expr =
switch (lookahead) {
@@ -884,16 +898,7 @@ public class GenericParser {
case FLOAT -> new Node(NodeType.FLOAT_LITERAL_EXPR, next().span);
case STRING_START -> parseSingleLineStringLiteralExpr();
case STRING_MULTI_START -> parseMultiLineStringLiteralExpr();
case IDENTIFIER -> {
var children = new ArrayList<Node>();
children.add(parseIdentifier());
if (lookahead == Token.LPAREN
&& noSemicolonInbetween()
&& _lookahead.newLinesBetween == 0) {
children.add(parseArgumentList());
}
yield new Node(NodeType.UNQUALIFIED_ACCESS_EXPR, children);
}
case IDENTIFIER -> parseUnqualifiedAccessExpr();
case EOF ->
throw parserError(
ErrorMessages.create("unexpectedEndOfFile"), prev().span.stopSpan());

View File

@@ -110,6 +110,7 @@ public enum NodeType {
SUPER_SUBSCRIPT_EXPR(NodeKind.EXPR),
SUPER_ACCESS_EXPR(NodeKind.EXPR),
SUBSCRIPT_EXPR(NodeKind.EXPR),
QUALIFIED_ACCESS_EXPR(NodeKind.EXPR),
IF_EXPR(NodeKind.EXPR),
IF_HEADER,
IF_CONDITION,

View File

@@ -34,10 +34,6 @@ class GenericSexpRenderer(code: String) {
renderUnionType(node)
return
}
if (node.type == NodeType.BINARY_OP_EXPR && binopName(node).endsWith("ualifiedAccessExpr")) {
renderQualifiedAccess(node)
return
}
doRender(name(node), collectChildren(node))
}
@@ -143,6 +139,10 @@ class GenericSexpRenderer(code: String) {
NodeType.AMENDS_CLAUSE -> "extendsOrAmendsClause"
NodeType.TYPEALIAS -> "typeAlias"
NodeType.STRING_ESCAPE -> "stringChars"
NodeType.QUALIFIED_ACCESS_EXPR -> {
val op = node.findChildByType(NodeType.OPERATOR)!!
if (op.text(source) == ".") "qualifiedAccessExpr" else "nullableQualifiedAccessExpr"
}
NodeType.READ_EXPR -> {
val terminal = node.children.find { it.type == NodeType.TERMINAL }!!.text(source)
when (terminal) {

View File

@@ -28,14 +28,14 @@ class SexpRenderer {
private var tab = ""
private var buf = StringBuilder()
fun render(mod: org.pkl.parser.syntax.Module): String {
fun render(mod: Module): String {
renderModule(mod)
val res = buf.toString()
reset()
return res
}
fun renderModule(mod: org.pkl.parser.syntax.Module) {
fun renderModule(mod: Module) {
buf.append(tab)
buf.append("(module")
val oldTab = increaseTab()
@@ -515,13 +515,11 @@ class SexpRenderer {
tab = oldTab
}
fun renderQualifiedAccessExpr(expr: QualifiedAccessExpr) {
fun renderUnqualifiedAccessExprOfQualified(expr: QualifiedAccessExpr) {
buf.append(tab)
buf.append(if (expr.isNullable) "(nullableQualifiedAccessExpr" else "(qualifiedAccessExpr")
buf.append("(unqualifiedAccessExpr")
val oldTab = increaseTab()
buf.append('\n')
renderExpr(expr.expr)
buf.append('\n')
buf.append(tab)
buf.append("(identifier)")
if (expr.argumentList !== null) {
@@ -532,6 +530,18 @@ class SexpRenderer {
tab = oldTab
}
fun renderQualifiedAccessExpr(expr: QualifiedAccessExpr) {
buf.append(tab)
buf.append(if (expr.isNullable) "(nullableQualifiedAccessExpr" else "(qualifiedAccessExpr")
val oldTab = increaseTab()
buf.append('\n')
renderExpr(expr.expr)
buf.append('\n')
renderUnqualifiedAccessExprOfQualified(expr)
buf.append(')')
tab = oldTab
}
fun renderSuperAccessExpr(expr: SuperAccessExpr) {
buf.append(tab)
buf.append("(superAccessExpr")