in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/CodeFormatter/FSharpCodeFormatterInfoProvider.cs [59:165]
private void Wrapping()
{
Describe<WrapRule>()
.Name($"FieldPatKeepTogether")
.Where(Node().In(ElementType.FIELD_PAT))
.Return(WrapType.KeepTogether)
.Build();
var pattern = Node().In(ElementType.PAREN_PAT)
.Satisfies((node, _) => ((IParenPat)node.Node).Pattern is ITuplePat).Or().In(ElementType.PAREN_EXPR)
.Satisfies((node, _) => ((IParenExpr)node.Node).InnerExpression is ITupleExpr);
Describe<WrapRule>()
.Name($"ChopArguments")
.Where(pattern)
.Switch(key => key.WrapArguments,
When(WrapStyleSimple.CHOP_IF_LONG).Return(WrapType.Chop | WrapType.StartAtExternal))
.Build();
var blank = pattern.BuildBlank();
Describe<FormattingRule>()
.Name($"ChopArguments")
.Where(
Parent().Is(blank),
Left().In(FSharpTokenType.LPAREN))
.Switch(key => key.PreferLineBreakAfterMultilineLparen,
When(true)
.Switch(key => key.WrapArguments,
When(WrapStyleSimple.CHOP_IF_LONG)
.Return(IntervalFormatType.InsertNewLineConditionally),
When(WrapStyleSimple.WRAP_IF_LONG)
.Return(IntervalFormatType.ExcellentPlaceToWrap)))
.Build();
Describe<FormattingRule>()
.Name($"ChopArguments")
.Where(GrandParent().Is(blank), Left().In(FSharpTokenType.COMMA))
.Switch(key => key.WrapArguments, When(WrapStyleSimple.CHOP_IF_LONG).Return(IntervalFormatType.InsertNewLineConditionally))
.Build();
// WrapArguments
Describe<WrapRule>()
.Name("MultilineLambdaBody")
.Where(
Parent().In(ElementType.LAMBDA_EXPR),
Node().In(ElementBitsets.F_SHARP_EXPRESSION_BIT_SET)
)
.Return(WrapType.KeepTogether | WrapType.LineBreakBeforeIfMultiline)
.Build();
// todo: unify with the lambda rule?
Describe<WrapRule>()
.Name("BindingBody")
.Where(
Parent().In(ElementBitsets.BINDING_BIT_SET.Union(ElementType.DO_STATEMENT, ElementType.DO_EXPR)),
Node().In(ElementBitsets.F_SHARP_EXPRESSION_BIT_SET.Union(ElementType.CHAMELEON_EXPRESSION))
.Satisfies((node, _) => ForceInsertLineBreak(node.Node))
)
.Return(WrapType.KeepTogether | WrapType.LineBreakBeforeIfMultiline)
.Build();
// Describe<FormattingRule>()
// .Name("LambdaInBinding")
// .StageIdPredicate(FormattingStageAcceptanceType.AdditionalFormatStage)
// .Where(
// Parent().In(ElementBitsets.BINDING_BIT_SET),
// Node().In(ElementType.LAMBDA_EXPR).Satisfies((node, _) => node.ContainsLineBreak()))
// .Return(IntervalFormatType.NoLineBreaks)
// .Build();
Describe<WrapRule>()
.Name("MultilineMatchExpr")
.Where(
Node().In(ElementType.MATCH_EXPR, ElementType.MATCH_LAMBDA_EXPR)
)
.Return(WrapType.Chop | WrapType.StartAtExternal)
.Build();
Describe<FormattingRule>()
.Name("MultilineMatchExpr")
.Group(WrapRuleGroup)
.Where(
Parent().In(ElementType.MATCH_EXPR, ElementType.MATCH_LAMBDA_EXPR),
Right().In(ElementType.MATCH_CLAUSE)
)
.Return(IntervalFormatType.InsertNewLineConditionally)
.Build();
return;
bool ForceInsertLineBreak(ITreeNode treeNode)
{
var expr =
treeNode switch
{
IChameleonExpression chameleonExpression => chameleonExpression.Expression,
IExpression expression => expression,
_ => null
};
return expr switch
{
ILambdaExpr => false,
IPrefixAppExpr { ArgumentExpression: IComputationExpr } => false,
_ => true
};
}
}