Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions src/slang-nodes/ConditionalExpression.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ const { group, hardline, ifBreak, indent, line } = doc.builders;

function experimentalTernaries(
node: ConditionalExpression,
path: AstPath<ConditionalExpression>,
path: AstPath<StrictAstNode>,
print: PrintFunction,
{ useTabs, tabWidth }: ParserOptions<AstNode>
): Doc {
const parent = path.parent as StrictAstNode;
const parent = path.parent!;
const isNested = parent.kind === NonterminalKind.ConditionalExpression;
const isNestedAsTrueExpression = isNested && parent.trueExpression === node;
const falseExpressionVariantKind = node.falseExpression.kind;
Expand Down Expand Up @@ -77,16 +77,15 @@ function experimentalTernaries(
}

function traditionalTernaries(
path: AstPath<ConditionalExpression>,
path: AstPath<StrictAstNode>,
print: PrintFunction
): Doc {
return group([
path.call(print, 'operand'),
indent([
// Nested trueExpression and falseExpression are always printed in a new
// line
(path.parent as StrictAstNode).kind ===
NonterminalKind.ConditionalExpression
path.parent!.kind === NonterminalKind.ConditionalExpression
? hardline
: line,
'? ',
Expand Down
4 changes: 2 additions & 2 deletions src/slang-nodes/MemberAccessExpression.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ import { TerminalNode } from './TerminalNode.js';
import type * as ast from '@nomicfoundation/slang/ast';
import type { AstPath, Doc, ParserOptions } from 'prettier';
import type { CollectedMetadata, PrintFunction } from '../types.d.ts';
import type { AstNode, ChainableExpression } from './types.d.ts';
import type { AstNode, ChainableExpression, StrictAstNode } from './types.d.ts';

const { group, indent, label, softline } = doc.builders;

function isEndOfChain(
node: ChainableExpression,
path: AstPath<Expression['variant']>
path: AstPath<StrictAstNode>
): boolean {
for (let i = 1, current = node, parent; ; i++, current = parent) {
parent = path.getNode(i)!;
Expand Down
5 changes: 1 addition & 4 deletions src/slang-nodes/TupleValues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { printSeparatedList } from '../slang-printers/print-separated-list.js';
import { isBinaryOperation } from '../slang-utils/is-binary-operation.js';
import { SlangNode } from './SlangNode.js';
import { TupleValue } from './TupleValue.js';
import { TerminalNode } from './TerminalNode.js';

import type * as ast from '@nomicfoundation/slang/ast';
import type { AstPath, Doc, ParserOptions } from 'prettier';
Expand Down Expand Up @@ -36,9 +35,7 @@ export class TupleValues extends SlangNode {
print(path: AstPath<TupleValues>, print: PrintFunction): Doc {
const singleExpression = this.getSingleExpression();
const items = path.map(print, 'items');
return singleExpression &&
!(singleExpression instanceof TerminalNode) &&
isBinaryOperation(singleExpression)
return singleExpression && isBinaryOperation(singleExpression)
? items
: printSeparatedList(items);
}
Expand Down
1 change: 1 addition & 0 deletions src/slang-nodes/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ export type LineComment = SingleLineComment | SingleLineNatSpecComment;
export type Comment = BlockComment | LineComment;

export type StrictAstNode =
| TerminalNode
| SourceUnit
| PragmaDirective
| AbicoderPragma
Expand Down
13 changes: 5 additions & 8 deletions src/slang-printers/create-binary-operation-printer.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { doc } from 'prettier';
import { isBinaryOperation } from '../slang-utils/is-binary-operation.js';
import { TerminalNode } from '../slang-nodes/TerminalNode.js';

import type { AstPath, Doc, ParserOptions } from 'prettier';
import type {
Expand All @@ -15,7 +14,7 @@ const { group, line } = doc.builders;

function rightOperandPrint(
{ operator, leftOperand }: BinaryOperation,
path: AstPath<BinaryOperation>,
path: AstPath<StrictAstNode>,
print: PrintFunction,
options: ParserOptions<AstNode>
): Doc {
Expand All @@ -27,9 +26,9 @@ function rightOperandPrint(

// If there's only a single binary expression, we want to create a group in
// order to avoid having a small right part like -1 be on its own line.
const parent = path.parent as StrictAstNode;
const parent = path.parent!;
const shouldGroup =
(leftOperand instanceof TerminalNode || !isBinaryOperation(leftOperand)) &&
!isBinaryOperation(leftOperand) &&
(!isBinaryOperation(parent) ||
parent.kind === NonterminalKind.AssignmentExpression);

Expand All @@ -38,17 +37,15 @@ function rightOperandPrint(

export const createBinaryOperationPrinter =
(
groupRulesBuilder: (
path: AstPath<BinaryOperation>
) => (document: Doc) => Doc,
groupRulesBuilder: (path: AstPath<StrictAstNode>) => (document: Doc) => Doc,
indentRulesBuilder: (
node: BinaryOperation,
path: AstPath<StrictAstNode>
) => (document: Doc) => Doc
) =>
(
node: BinaryOperation,
path: AstPath<BinaryOperation>,
path: AstPath<StrictAstNode>,
print: PrintFunction,
options: ParserOptions<AstNode>
): Doc => {
Expand Down
11 changes: 5 additions & 6 deletions src/slang-printers/print-binary-operation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ const { group, indent } = doc.builders;

export const binaryGroupRulesBuilder =
(shouldGroup: (node: BinaryOperation) => boolean) =>
(path: AstPath<BinaryOperation>) =>
(path: AstPath<StrictAstNode>) =>
(document: Doc): Doc => {
const parent = path.parent as StrictAstNode;
const parent = path.parent!;
if (!isBinaryOperation(parent)) return group(document);
if (shouldGroup(parent)) return group(document);
return document;
Expand All @@ -37,8 +37,7 @@ export const shouldNotIndent = (
): boolean =>
isStatementWithoutIndentedOperation(node) ||
(node.kind === NonterminalKind.ExpressionStatement &&
(path.getNode(index + 1) as StrictAstNode).kind ===
NonterminalKind.ForStatement);
path.getNode(index + 1)!.kind === NonterminalKind.ForStatement);

export const binaryIndentRulesBuilder =
(shouldIndent: (node: BinaryOperation) => boolean) =>
Expand All @@ -55,10 +54,10 @@ export const binaryIndentRulesBuilder =
};

export const printBinaryOperation = (
shouldGroupAndIndent: (node: StrictAstNode) => boolean
shouldGroupAndIndent: (node: BinaryOperation) => boolean
): ((
node: BinaryOperation,
path: AstPath<BinaryOperation>,
path: AstPath<StrictAstNode>,
print: PrintFunction,
options: ParserOptions<AstNode>
) => Doc) =>
Expand Down
7 changes: 1 addition & 6 deletions src/slang-utils/create-hug-function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { TupleExpression } from '../slang-nodes/TupleExpression.js';
import { TupleValues } from '../slang-nodes/TupleValues.js';
import { TupleValue } from '../slang-nodes/TupleValue.js';
import { TerminalNode } from '../slang-nodes/TerminalNode.js';
import { isBinaryOperation } from './is-binary-operation.js';

import type { Expression } from '../slang-nodes/Expression.ts';
Expand All @@ -12,11 +11,7 @@ export function createHugFunction(
): (node: Expression['variant']) => Expression['variant'] {
const operators = new Set(huggableOperators);
return (node: Expression['variant']): Expression['variant'] => {
if (
!(node instanceof TerminalNode) &&
isBinaryOperation(node) &&
operators.has(node.operator)
) {
if (isBinaryOperation(node) && operators.has(node.operator)) {
const loc = node.loc;
return Object.assign(
Object.create(TupleExpression.prototype) as TupleExpression,
Expand Down
8 changes: 5 additions & 3 deletions src/slang-utils/is-chainable-expression.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { createKindCheckFunction } from './create-kind-check-function.js';

import type { ChainableExpression } from '../slang-nodes/types.js';
import type { Expression } from '../slang-nodes/Expression.js';
import type {
ChainableExpression,
StrictAstNode
} from '../slang-nodes/types.js';

export const isChainableExpression = createKindCheckFunction([
NonterminalKind.FunctionCallExpression,
NonterminalKind.IndexAccessExpression,
NonterminalKind.MemberAccessExpression
]) as (node: Expression['variant']) => node is ChainableExpression;
]) as (node: StrictAstNode) => node is ChainableExpression;