Skip to content

Commit 89577e7

Browse files
authored
Allow a factory constructor with metadata before it to split. (#1580)
Prior to this PR, if there was metadata before a constructor, it would be attached to the "header" piece of the constructor -- the leading keywords and name -- instead of the entire constructor piece. That in turn meant that the newline after the metadata would lead the formatter to think a split had occurred inside the header itself, instead of before the entire constructor. That would in turn confuse the solver and it ended up trying to disallow splitting anywhere in the constructor, even if that led to an overflowing line. This fixes that so that the metadata is attached to the entire constructor piece, not just the nested header part.
1 parent 63caad3 commit 89577e7

File tree

2 files changed

+45
-32
lines changed

2 files changed

+45
-32
lines changed

lib/src/front_end/ast_node_visitor.dart

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -407,43 +407,45 @@ final class AstNodeVisitor extends ThrowingAstVisitor<void> with PieceFactory {
407407

408408
@override
409409
void visitConstructorDeclaration(ConstructorDeclaration node) {
410-
var header = pieces.build(metadata: node.metadata, () {
411-
pieces.modifier(node.externalKeyword);
412-
pieces.modifier(node.constKeyword);
413-
pieces.modifier(node.factoryKeyword);
414-
pieces.visit(node.returnType);
415-
pieces.token(node.period);
416-
pieces.token(node.name);
417-
});
410+
pieces.withMetadata(node.metadata, () {
411+
var header = pieces.build(() {
412+
pieces.modifier(node.externalKeyword);
413+
pieces.modifier(node.constKeyword);
414+
pieces.modifier(node.factoryKeyword);
415+
pieces.visit(node.returnType);
416+
pieces.token(node.period);
417+
pieces.token(node.name);
418+
});
418419

419-
var parameters = nodePiece(node.parameters);
420+
var parameters = nodePiece(node.parameters);
420421

421-
Piece? redirect;
422-
Piece? initializerSeparator;
423-
Piece? initializers;
424-
if (node.redirectedConstructor case var constructor?) {
425-
var separator = pieces.build(() {
426-
pieces.token(node.separator);
427-
pieces.space();
428-
});
422+
Piece? redirect;
423+
Piece? initializerSeparator;
424+
Piece? initializers;
425+
if (node.redirectedConstructor case var constructor?) {
426+
var separator = pieces.build(() {
427+
pieces.token(node.separator);
428+
pieces.space();
429+
});
429430

430-
redirect = AssignPiece(
431-
separator, nodePiece(constructor, context: NodeContext.assignment),
432-
canBlockSplitRight: false);
433-
} else if (node.initializers.isNotEmpty) {
434-
initializerSeparator = tokenPiece(node.separator!);
435-
initializers = createCommaSeparated(node.initializers);
436-
}
431+
redirect = AssignPiece(
432+
separator, nodePiece(constructor, context: NodeContext.assignment),
433+
canBlockSplitRight: false);
434+
} else if (node.initializers.isNotEmpty) {
435+
initializerSeparator = tokenPiece(node.separator!);
436+
initializers = createCommaSeparated(node.initializers);
437+
}
437438

438-
var body = nodePiece(node.body);
439+
var body = nodePiece(node.body);
439440

440-
pieces.add(ConstructorPiece(header, parameters, body,
441-
canSplitParameters: node.parameters.parameters
442-
.canSplit(node.parameters.rightParenthesis),
443-
hasOptionalParameter: node.parameters.rightDelimiter != null,
444-
redirect: redirect,
445-
initializerSeparator: initializerSeparator,
446-
initializers: initializers));
441+
pieces.add(ConstructorPiece(header, parameters, body,
442+
canSplitParameters: node.parameters.parameters
443+
.canSplit(node.parameters.rightParenthesis),
444+
hasOptionalParameter: node.parameters.rightDelimiter != null,
445+
redirect: redirect,
446+
initializerSeparator: initializerSeparator,
447+
initializers: initializers));
448+
});
447449
}
448450

449451
@override

test/tall/regression/other/dart.unit

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,15 @@ class Benchmark {
5454
// A rate of one run per 2s, with a millisecond of noise. Some variation is
5555
// needed for Golem's noise-based filtering and regression detection.
5656
double measure() => (2000 + Random().nextDouble() - 0.5) * 1000;
57+
}
58+
>>>
59+
class Uint8ClampedList {
60+
@patch
61+
factory Uint8ClampedList.fromList(List<int> elements) = NativeUint8ClampedList.fromList;
62+
}
63+
<<<
64+
class Uint8ClampedList {
65+
@patch
66+
factory Uint8ClampedList.fromList(List<int> elements) =
67+
NativeUint8ClampedList.fromList;
5768
}

0 commit comments

Comments
 (0)