diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpMethodInvocationUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpMethodInvocationUtil.fs index 3099e08b65..3ee18605bf 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpMethodInvocationUtil.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpMethodInvocationUtil.fs @@ -1,44 +1,84 @@ module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpMethodInvocationUtil +open FSharp.Compiler.SourceCodeServices open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.Tree -let tryGetNamedArg (expr: IFSharpExpression) = + +let tryGetNamedRef (expr: IFSharpExpression) = let binaryAppExpr = expr.As() - if isNull binaryAppExpr then null else + if isNull binaryAppExpr then None else + + if binaryAppExpr.Operator.Reference.GetName() <> "=" then None else + + match binaryAppExpr.LeftArgument with + | :? IReferenceExpr as refExpr -> Some refExpr + | _ -> None + + +let tryGetNamedArg (expr: IFSharpExpression) = + match tryGetNamedRef expr with + | None -> null + | Some refExpr -> refExpr.Reference.Resolve().DeclaredElement.As() + + +let getMatchingParameter (expr: IFSharpExpression) = + let argsOwner = + let tupleExpr = TupleExprNavigator.GetByExpression(expr.IgnoreParentParens()) + let exprContext = if isNull tupleExpr then expr else tupleExpr :> _ + FSharpArgumentOwnerNavigator.GetByArgumentExpression(exprContext.IgnoreParentParens()) + + if isNull argsOwner then null else - if binaryAppExpr.Operator.Reference.GetName() <> "=" then null else + let namedRefOpt = tryGetNamedRef expr + let namedParam = + match namedRefOpt with + | None -> null + | Some namedRef -> namedRef.Reference.Resolve().DeclaredElement.As() + if isNotNull namedParam then namedParam else - let refExpr = binaryAppExpr.LeftArgument.As() - if isNull refExpr then null else + let symbolReference = argsOwner.Reference + if isNull symbolReference then null else - refExpr.Reference.Resolve().DeclaredElement.As() + let mfv = + symbolReference.TryGetFSharpSymbol() + |> Option.bind (function + | :? FSharpMemberOrFunctionOrValue as mfv -> Some mfv + | _ -> None) -let getMatchingParameter (initialExpr: IFSharpExpression) = - let expr = initialExpr.IgnoreInnerParens() - let tupleExpr = TupleExprNavigator.GetByExpression(expr) - let tupleExprContext = tupleExpr.IgnoreParentParens() + match mfv with + | None -> null + | Some mfv -> - let appExpr = PrefixAppExprNavigator.GetByArgumentExpression(if isNull tupleExpr then expr else tupleExprContext) - if isNull appExpr then null else + let paramOwner = symbolReference.Resolve().DeclaredElement.As() + if isNull paramOwner then null else - let refExpr = appExpr.FunctionExpression.As() - if isNull refExpr then null else + let param = + match namedRefOpt with + | Some namedRef -> + // If this is a named argument, but FCS couldn't match it, try matching ourselves by name + paramOwner.Parameters + |> Seq.tryFind (fun param -> param.ShortName = namedRef.Reference.GetName()) + | None -> - use compilationContextCookie = CompilationContextCookie.OverrideOrCreate(expr.GetResolveContext()) + let args = argsOwner.ParameterArguments - let parameter = tryGetNamedArg initialExpr - if isNotNull parameter then parameter else + match args |> Seq.tryFindIndex (fun argExpr -> expr.Equals(argExpr)) with + | None -> None + | Some paramIndex -> - let method = refExpr.Reference.Resolve().DeclaredElement.As() - let parameters = method.Parameters - if parameters.Count = 1 then parameters.[0] else + let invokingExtensionMethod = mfv.IsExtensionMember && Some mfv.ApparentEnclosingEntity <> mfv.DeclaringEntity + let offset = if invokingExtensionMethod then 1 else 0 + Some paramOwner.Parameters.[paramIndex + offset] - let index = tupleExpr.Expressions.IndexOf(expr) - if index < parameters.Count then parameters.[index] else null + // Skip unnamed parameters + match param with + | Some param when param.ShortName <> SharedImplUtil.MISSING_DECLARATION_NAME -> param + | _ -> null [)>] type FSharpMethodInvocationUtil() = diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpArgumentsOwnerUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpArgumentsOwnerUtil.cs new file mode 100644 index 0000000000..fa84c3fdee --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpArgumentsOwnerUtil.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Linq; +using FSharp.Compiler.SourceCodeServices; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl +{ + public static class FSharpArgumentsOwnerUtil + { + public static IList CalculateParameterArguments(IFSharpReferenceOwner referenceOwner, + IEnumerable appliedExpressions) + { + if (!(referenceOwner.Reference?.GetFSharpSymbol() is FSharpMemberOrFunctionOrValue mfv)) + return EmptyList.Instance; + + var paramGroups = mfv.CurriedParameterGroups; + var isVoidReturn = paramGroups.Count == 1 && paramGroups[0].Count == 1 && paramGroups[0][0].Type.IsUnit; + + if (isVoidReturn) + return EmptyArray.Instance; + + return paramGroups + .Zip(appliedExpressions, (paramGroup, argExpr) => (paramGroup, argExpr.IgnoreInnerParens())) + .SelectMany(pair => + { + var (paramGroup, argExpr) = pair; + + // e.g. F# extension methods with 0 parameters + if (paramGroup.Count == 0) + return EmptyList.Instance; + + if (paramGroup.Count == 1) + return new[] {argExpr as IArgument}; + + var tupleExprs = argExpr is ITupleExpr tupleExpr + ? (IReadOnlyList) tupleExpr.Expressions + : EmptyList.Instance; + + return Enumerable.Range(0, paramGroup.Count) + .Select(i => i < tupleExprs.Count ? tupleExprs[i] as IArgument : null); + }).ToList(); + } + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/Attribute.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/Attribute.cs index 88a7df94f5..76c8f0d96f 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/Attribute.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/Attribute.cs @@ -1,14 +1,25 @@ +using System.Collections.Generic; +using System.Linq; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { internal partial class Attribute { + private readonly CachedPsiValue> myParameterArguments = new FileCachedPsiValue>(); + protected override FSharpSymbolReference CreateReference() => new CtorReference(this); public override IFSharpIdentifier FSharpIdentifier => ReferenceName?.Identifier; + + public IList ParameterArguments => myParameterArguments.GetValue(this, () => + FSharpArgumentsOwnerUtil.CalculateParameterArguments(this, new[] {ArgExpression?.Expression})); + + public IList Arguments => ParameterArguments.WhereNotNull().ToList(); } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/NewExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/NewExpr.cs new file mode 100644 index 0000000000..a38c2efa78 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/NewExpr.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.Linq; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; +using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; +using JetBrains.ReSharper.Psi; +using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree +{ + internal partial class NewExpr + { + private readonly CachedPsiValue> myParameterArguments = new FileCachedPsiValue>(); + public FSharpSymbolReference Reference { get; private set; } + + protected override void PreInit() + { + base.PreInit(); + Reference = new CtorReference(this); + } + + public IFSharpIdentifier FSharpIdentifier => TypeName?.Identifier; + + public IFSharpReferenceOwner SetName(string name) => this; + + public override ReferenceCollection GetFirstClassReferences() => + new ReferenceCollection(Reference); + + public IList ParameterArguments => myParameterArguments.GetValue(this, + () => FSharpArgumentsOwnerUtil.CalculateParameterArguments(this, new[] {ArgumentExpression})); + + public IList Arguments => ParameterArguments.WhereNotNull().ToList(); + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/PrefixAppExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/PrefixAppExpr.cs index 2640e2ccb7..f79d63329e 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/PrefixAppExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/PrefixAppExpr.cs @@ -1,31 +1,51 @@ using System.Collections.Generic; +using System.Linq; using FSharp.Compiler.SourceCodeServices; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Plugins.FSharp.Psi.Util; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Tree; +using JetBrains.Util; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { internal partial class PrefixAppExpr { - public FSharpSymbolReference InvokedFunctionReference + private readonly CachedPsiValue> myParameterArguments = new FileCachedPsiValue>(); + + public FSharpSymbolReference Reference => InvokedReferenceExpression?.Reference; + + public IReferenceExpr InvokedReferenceExpression { get { - var argsCount = 0; var funExpr = (IPrefixAppExpr) this; while (funExpr.FunctionExpression.IgnoreInnerParens() is IPrefixAppExpr appExpr) { funExpr = appExpr; - argsCount++; } if (!(funExpr.FunctionExpression.IgnoreInnerParens() is IReferenceExpr referenceExpr)) + { return null; + } + + return referenceExpr; + } + } + + public IFSharpIdentifier FSharpIdentifier => InvokedReferenceExpression?.Identifier; - argsCount++; + public IFSharpReferenceOwner SetName(string name) => this; + + public FSharpSymbolReference InvokedFunctionReference + { + get + { + var referenceExpr = InvokedReferenceExpression; + if (referenceExpr == null) + return null; var reference = referenceExpr.Reference; var fsSymbol = reference.GetFSharpSymbol(); @@ -35,15 +55,15 @@ public FSharpSymbolReference InvokedFunctionReference return null; var paramGroups = mfv.CurriedParameterGroups; - return paramGroups.Count >= argsCount ? reference : null; + return paramGroups.Count >= AppliedExpressions.Count ? reference : null; } } - public IList Arguments + public IList AppliedExpressions { get { - var args = new List(); + var args = new List(); var funExpr = (IPrefixAppExpr) this; while (funExpr.FunctionExpression.IgnoreInnerParens() is IPrefixAppExpr appExpr) { @@ -57,6 +77,11 @@ public IList Arguments } } + public IList Arguments => ParameterArguments.Where(arg => arg != null).ToList(); + + public IList ParameterArguments => myParameterArguments.GetValue(this, + () => FSharpArgumentsOwnerUtil.CalculateParameterArguments(this, AppliedExpressions)); + public override IType Type() { var reference = InvokedFunctionReference; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/CtorTypeReference.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/CtorReference.cs similarity index 100% rename from ReSharper.FSharp/src/FSharp.Psi/src/Resolve/CtorTypeReference.cs rename to ReSharper.FSharp/src/FSharp.Psi/src/Resolve/CtorReference.cs diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpSymbolReference.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpSymbolReference.cs index 3897d60f21..cb06f90284 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpSymbolReference.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpSymbolReference.cs @@ -12,6 +12,7 @@ using JetBrains.ReSharper.Resources.Shell; using JetBrains.Util; using JetBrains.Util.DataStructures; +using Microsoft.FSharp.Core; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve { @@ -34,6 +35,9 @@ public FSharpSymbolUse GetSymbolUse() => public virtual FSharpSymbol GetFSharpSymbol() => GetSymbolUse()?.Symbol; + public FSharpOption TryGetFSharpSymbol() => + OptionModule.OfObj(GetFSharpSymbol()); + public override ResolveResultWithInfo ResolveWithoutCache() { if (!myOwner.IsValid()) diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpArgumentsOwnerNavigator.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpArgumentsOwnerNavigator.cs new file mode 100644 index 0000000000..235affd42f --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/FSharpArgumentsOwnerNavigator.cs @@ -0,0 +1,11 @@ +using JetBrains.Annotations; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public class FSharpArgumentOwnerNavigator + { + public static IFSharpArgumentsOwner GetByArgumentExpression([CanBeNull] IFSharpExpression param) => + (IFSharpArgumentsOwner)AppLikeExprNavigator.GetByArgumentExpression(param) ?? + AttributeNavigator.GetByExpression(param); + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppLikeExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppLikeExpr.cs new file mode 100644 index 0000000000..73d2f51ca9 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAppLikeExpr.cs @@ -0,0 +1,6 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public partial interface IAppLikeExpr : IFSharpArgumentsOwner + { + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAttribute.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAttribute.cs index 3abd063839..71f7f78a02 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAttribute.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IAttribute.cs @@ -1,6 +1,6 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { - public partial interface IAttribute : IFSharpReferenceOwner + public partial interface IAttribute : IFSharpArgumentsOwner { } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpArgumentsOwner.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpArgumentsOwner.cs new file mode 100644 index 0000000000..46a805ab59 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IFSharpArgumentsOwner.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using JetBrains.ReSharper.Psi.Tree; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public interface IFSharpArgumentsOwner : IArgumentsOwner, IFSharpReferenceOwner + { + /// List of arguments aligned with their matching parameter. + /// e.g. index #2 is the argument that matches with param #2 on the invoked reference. + /// A null element at a given index means there is no argument matching that parameter. + IList ParameterArguments { get; } + } +} diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IPrefixAppExpr.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IPrefixAppExpr.cs index e4759ccec4..4ed02014f7 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IPrefixAppExpr.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IPrefixAppExpr.cs @@ -1,13 +1,15 @@ -using System.Collections.Generic; +using System; using JetBrains.Annotations; using JetBrains.ReSharper.Plugins.FSharp.Psi.Resolve; +using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Tree; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree { public partial interface IPrefixAppExpr { + [CanBeNull] IReferenceExpr InvokedReferenceExpression { get; } + [CanBeNull] FSharpSymbolReference InvokedFunctionReference { get; } - [NotNull] IList Arguments { get; } } } diff --git a/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 03 - New.gold b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 03 - New.gold index e6779552ac..917a7d6a34 100644 --- a/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 03 - New.gold +++ b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 03 - New.gold @@ -1,10 +1,11 @@ -New instance creation +Other --- TO: [O] new System.|String|(' ', 1) RANGE: (28,34) @ New instance 03 - New.fs +TO: [O] new |System|.String(' ', 1) RANGE: (21,27) @ New instance 03 - New.fs -Other +New instance creation --- -TO: [O] new |System|.String(' ', 1) RANGE: (21,27) @ New instance 03 - New.fs +TO: [O] new System.|String|(' ', 1) RANGE: (28,34) @ New instance 03 - New.fs diff --git a/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 04 - Attribute.fs b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 04 - Attribute.fs new file mode 100644 index 0000000000..e8ad02113b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/findUsages/occurenceKinds/New instance 04 - Attribute.fs @@ -0,0 +1,4 @@ +module Module + +[, "hi"){selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.gold new file mode 100644 index 0000000000..7a735b238b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 01 - Multiple args.gold @@ -0,0 +1,8 @@ +open System.ComponentModel + +[|(arg #0), |"hi"|(arg #1))>] +let x = "" + +--------------------------------------------------------- +(arg #0) => type +(arg #1) => value diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.fs new file mode 100644 index 0000000000..89a6a4b615 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}Description "hi"{selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.gold new file mode 100644 index 0000000000..87901fd3df --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 02 - Single arg - no parens.gold @@ -0,0 +1,7 @@ +open System.ComponentModel + +[] +let x = "" + +--------------------------------------------------------- +(arg #0) => description diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.fs new file mode 100644 index 0000000000..25af20c869 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}Description("hi"){selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.gold new file mode 100644 index 0000000000..d57d2f1744 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 03 - Single arg - parens.gold @@ -0,0 +1,7 @@ +open System.ComponentModel + +[] +let x = "" + +--------------------------------------------------------- +(arg #0) => description diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.fs new file mode 100644 index 0000000000..addd98758c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}Description{selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.gold new file mode 100644 index 0000000000..5e7c9322ff --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 04 - No args - no parens.gold @@ -0,0 +1,6 @@ +open System.ComponentModel + +[] +let x = "" + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.fs new file mode 100644 index 0000000000..9cf9c2d56f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.fs @@ -0,0 +1,4 @@ +open System.ComponentModel + +[<{selstart}Description(){selend}>] +let x = "" diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.gold new file mode 100644 index 0000000000..118f726273 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Attribute 05 - No args - parens.gold @@ -0,0 +1,6 @@ +open System.ComponentModel + +[] +let x = "" + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.fs b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.fs new file mode 100644 index 0000000000..8e8628e594 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.fs @@ -0,0 +1 @@ +{selstart}List.length ["hi"; "there"]{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.gold b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.gold new file mode 100644 index 0000000000..8eff7257a4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 01 - FSharpCore.gold @@ -0,0 +1,4 @@ +List.length |["hi"; "there"]|(arg #0) + +--------------------------------------------------------- +(arg #0) => list diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.fs b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.fs new file mode 100644 index 0000000000..6320cc70f2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.fs @@ -0,0 +1,2 @@ +open System.Drawing +{selstart}Color.FromArgb (123, 100, 50){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.gold b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.gold new file mode 100644 index 0000000000..e31db3ba8c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Compiled 02 - BCL.gold @@ -0,0 +1,7 @@ +open System.Drawing +Color.FromArgb (|123|(arg #0), |100|(arg #1), |50|(arg #2)) + +--------------------------------------------------------- +(arg #0) => red +(arg #1) => green +(arg #2) => blue diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.fs new file mode 100644 index 0000000000..d9f76f8a95 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.fs @@ -0,0 +1,4 @@ +type MyType () = + class end + +{selstart}MyType(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.gold new file mode 100644 index 0000000000..da7e636f2e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 01 - No args.gold @@ -0,0 +1,6 @@ +type MyType () = + class end + +MyType() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.fs new file mode 100644 index 0000000000..918e6c5cf3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.fs @@ -0,0 +1,4 @@ +type MyType (foo: string) = + class end + +{selstart}MyType("test"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.gold new file mode 100644 index 0000000000..cf4d65e601 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 02 - Single arg.gold @@ -0,0 +1,7 @@ +type MyType (|foo|(param #0): string) = + class end + +MyType(|"test"|(arg #0)) + +--------------------------------------------------------- +(arg #0) => foo diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.fs new file mode 100644 index 0000000000..b5a7f83bfb --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.fs @@ -0,0 +1,4 @@ +type MyType (foo: string, i: int) = + class end + +{selstart}MyType("test", 15){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.gold new file mode 100644 index 0000000000..d7d3cfec5f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Constructor 03 - Multiple args.gold @@ -0,0 +1,8 @@ +type MyType (|foo|(param #0): string, |i|(param #1): int) = + class end + +MyType(|"test"|(arg #0), |15|(arg #1)) + +--------------------------------------------------------- +(arg #0) => foo +(arg #1) => i diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.fs new file mode 100644 index 0000000000..b752668921 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}x.Single(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.gold new file mode 100644 index 0000000000..fe06259674 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 01 - No args.gold @@ -0,0 +1,8 @@ +module Mod + +open System.Linq + +let x = Seq.empty +x.Single() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.fs new file mode 100644 index 0000000000..1b4e57b40f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}x.Single (fun x -> true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.gold new file mode 100644 index 0000000000..66b4dd75b7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 02 - Single arg.gold @@ -0,0 +1,9 @@ +module Mod + +open System.Linq + +let x = Seq.empty +x.Single (|fun x -> true|(arg #0)) + +--------------------------------------------------------- +(arg #0) => predicate diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.fs new file mode 100644 index 0000000000..6ce13cbb1c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}x.ToDictionary((fun (x, y) -> x), (fun (x, y) -> y)){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.gold new file mode 100644 index 0000000000..f22fc35882 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL 03 - Tupled args.gold @@ -0,0 +1,10 @@ +module Mod + +open System.Linq + +let x = Seq.empty +x.ToDictionary(|(fun (x, y) -> x)|(arg #0), |(fun (x, y) -> y)|(arg #1)) + +--------------------------------------------------------- +(arg #0) => keySelector +(arg #1) => elementSelector diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.fs new file mode 100644 index 0000000000..1c550bb865 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}Enumerable.Single(x){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.gold new file mode 100644 index 0000000000..16790b947a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 01 - No args.gold @@ -0,0 +1,9 @@ +module Mod + +open System.Linq + +let x = Seq.empty +Enumerable.Single(|x|(arg #0)) + +--------------------------------------------------------- +(arg #0) => source diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.fs new file mode 100644 index 0000000000..45a15b0e28 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}Enumerable.Single (x, fun x -> true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.gold new file mode 100644 index 0000000000..49ff479e68 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 02 - Single arg.gold @@ -0,0 +1,10 @@ +module Mod + +open System.Linq + +let x = Seq.empty +Enumerable.Single (|x|(arg #0), |fun x -> true|(arg #1)) + +--------------------------------------------------------- +(arg #0) => source +(arg #1) => predicate diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.fs new file mode 100644 index 0000000000..bce63d1a57 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.fs @@ -0,0 +1,6 @@ +module Mod + +open System.Linq + +let x = Seq.empty +{selstart}Enumerable.ToDictionary(x, (fun (x, y) -> x), (fun (x, y) -> y)){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.gold new file mode 100644 index 0000000000..be28989eb8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension BCL Direct 03 - Tupled args.gold @@ -0,0 +1,11 @@ +module Mod + +open System.Linq + +let x = Seq.empty +Enumerable.ToDictionary(|x|(arg #0), |(fun (x, y) -> x)|(arg #1), |(fun (x, y) -> y)|(arg #2)) + +--------------------------------------------------------- +(arg #0) => source +(arg #1) => keySelector +(arg #2) => elementSelector diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.fs new file mode 100644 index 0000000000..12d4e09225 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.gold new file mode 100644 index 0000000000..ec5822bea3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 01 - No args.gold @@ -0,0 +1,15 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.fs new file mode 100644 index 0000000000..41e5ea13a0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, safe: bool) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory (true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.gold new file mode 100644 index 0000000000..797b73f85b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 02 - Single arg.gold @@ -0,0 +1,16 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, |safe|(param #0): bool) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory (|true|(arg #0)) + +--------------------------------------------------------- +(arg #0) => safe diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.fs new file mode 100644 index 0000000000..caa8403cc6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, safe: bool, s: string) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory (true, "hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.gold new file mode 100644 index 0000000000..7b66704c1f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp 03 - Tupled args.gold @@ -0,0 +1,17 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, |safe|(param #0): bool, |s|(param #1): string) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory (|true|(arg #0), |"hi"|(arg #1)) + +--------------------------------------------------------- +(arg #0) => safe +(arg #1) => s diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.fs new file mode 100644 index 0000000000..7ccc3b90c4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}FileExt.CreateDirectory(x){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.gold new file mode 100644 index 0000000000..55871bf76c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 01 - No args.gold @@ -0,0 +1,16 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (|fileInfo|(param #0): FileInfo) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +FileExt.CreateDirectory(|x|(arg #0)) + +--------------------------------------------------------- +(arg #0) => fileInfo diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.fs new file mode 100644 index 0000000000..9dc2139615 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, safe: bool) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}FileExt.CreateDirectory (x, true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.gold new file mode 100644 index 0000000000..7a598b511f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 02 - Single arg.gold @@ -0,0 +1,17 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (|fileInfo|(param #0): FileInfo, |safe|(param #1): bool) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +FileExt.CreateDirectory (|x|(arg #0), |true|(arg #1)) + +--------------------------------------------------------- +(arg #0) => fileInfo +(arg #1) => safe diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.fs new file mode 100644 index 0000000000..90c6ed4185 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.fs @@ -0,0 +1,13 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (fileInfo: FileInfo, safe: bool, x: string) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}FileExt.CreateDirectory (x, true, "hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.gold new file mode 100644 index 0000000000..64b81a84d1 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension CSharp Direct 03 - Tupled args.gold @@ -0,0 +1,18 @@ +module Mod + +open System.IO +open System.Runtime.CompilerServices + +[] +type FileExt = + [] + static member CreateDirectory (|fileInfo|(param #0): FileInfo, |safe|(param #1): bool, |x|(param #2): string) = + Directory.CreateDirectory fileInfo.Directory.FullName + +let x = FileInfo "abc.txt" +FileExt.CreateDirectory (|x|(arg #0), |true|(arg #1), |"hi"|(arg #2)) + +--------------------------------------------------------- +(arg #0) => fileInfo +(arg #1) => safe +(arg #2) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.fs new file mode 100644 index 0000000000..39ad7572a3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.fs @@ -0,0 +1,12 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory () = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.gold new file mode 100644 index 0000000000..b92dd1e30a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 01 - No args.gold @@ -0,0 +1,14 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory () = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.fs new file mode 100644 index 0000000000..15c89912fc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.fs @@ -0,0 +1,12 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (safe: bool) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory (true){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.gold new file mode 100644 index 0000000000..d62de54c08 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 02 - Single arg.gold @@ -0,0 +1,15 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (|safe|(param #0): bool) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory (|true|(arg #0)) + +--------------------------------------------------------- +(arg #0) => safe diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.fs new file mode 100644 index 0000000000..be75ea0274 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.fs @@ -0,0 +1,12 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (safe: bool) (x: string) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory true "hi"{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.gold new file mode 100644 index 0000000000..36b2c9b6c3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 03 - Curried args.gold @@ -0,0 +1,16 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (|safe|(param #0): bool) (|x|(param #1): string) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory |true|(arg #0) |"hi"|(arg #1) + +--------------------------------------------------------- +(arg #0) => safe +(arg #1) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.fs new file mode 100644 index 0000000000..56e000a147 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.fs @@ -0,0 +1,12 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (safe: bool, x: string) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +{selstart}x.CreateDirectory (true, "hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.gold new file mode 100644 index 0000000000..5ef78d531d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Extension FSharp 04 - Tupled args.gold @@ -0,0 +1,16 @@ +module Mod + +open System.IO + +[] +module FileExt = + type FileInfo with + member this.CreateDirectory (|safe|(param #0): bool, |x|(param #1): string) = + Directory.CreateDirectory this.Directory.FullName + +let x = FileInfo "abc.txt" +x.CreateDirectory (|true|(arg #0), |"hi"|(arg #1)) + +--------------------------------------------------------- +(arg #0) => safe +(arg #1) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.fs b/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.fs new file mode 100644 index 0000000000..4fa7c8f841 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.fs @@ -0,0 +1,4 @@ +module Mod = + let log<'a> (x : 'a) = sprintf "%O" x + +{selstart}Mod.log "hello"{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.gold b/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.gold new file mode 100644 index 0000000000..da6ad3cad3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Generic 01 - Module.gold @@ -0,0 +1,7 @@ +module Mod = + let log<'a> (|x|(param #0) : 'a) = sprintf "%O" x + +Mod.log |"hello"|(arg #0) + +--------------------------------------------------------- +(arg #0) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.fs b/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.fs new file mode 100644 index 0000000000..12f811a893 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.fs @@ -0,0 +1,4 @@ +type C () = + static member Log<'a> (x : 'a) = sprintf "%O" x + +{selstart}C.Log "hello"{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.gold b/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.gold new file mode 100644 index 0000000000..3428c1bf91 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Generic 02 - Static method.gold @@ -0,0 +1,7 @@ +type C () = + static member Log<'a> (|x|(param #0) : 'a) = sprintf "%O" x + +C.Log |"hello"|(arg #0) + +--------------------------------------------------------- +(arg #0) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.fs new file mode 100644 index 0000000000..04b55b7bcf --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.fs @@ -0,0 +1,2 @@ +let f () = () +{selstart}f (){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.gold new file mode 100644 index 0000000000..376ae7330d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Misc 01 - No args.gold @@ -0,0 +1,4 @@ +let f () = () +f () + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.fs b/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.fs new file mode 100644 index 0000000000..8cd20ef0ba --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.fs @@ -0,0 +1,2 @@ +let f () = () +{selstart}f 123{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.gold b/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.gold new file mode 100644 index 0000000000..5b0d1001c9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Misc 02 - Too many args.gold @@ -0,0 +1,4 @@ +let f () = () +f 123 + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.fs new file mode 100644 index 0000000000..2c5dee18d3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}f 1 2 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.gold new file mode 100644 index 0000000000..6301954511 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 01 - Curried.gold @@ -0,0 +1,8 @@ +let f |a|(param #0) |b|(param #1) |c|(param #2) = a + b + c + +f |1|(arg #0) |2|(arg #1) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.fs new file mode 100644 index 0000000000..250013b081 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.fs @@ -0,0 +1,5 @@ +module Module + +let f (a, b, c) = a + b + c + +{selstart}f(1, 2, 3){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.gold new file mode 100644 index 0000000000..4eeb01c686 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 02 - Tupled.gold @@ -0,0 +1,10 @@ +module Module + +let f (|a|(param #0), |b|(param #1), |c|(param #2)) = a + b + c + +f(|1|(arg #0), |2|(arg #1), |3|(arg #2)) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.fs new file mode 100644 index 0000000000..4566fbff67 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}(f 1) 2 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.gold new file mode 100644 index 0000000000..fb7aedba9c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 03 - Curried fun in paren.gold @@ -0,0 +1,8 @@ +let f |a|(param #0) |b|(param #1) |c|(param #2) = a + b + c + +(f |1|(arg #0)) |2|(arg #1) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.fs new file mode 100644 index 0000000000..c72f26bde3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}f (1) 2 (3){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.gold new file mode 100644 index 0000000000..94b6d958ba --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 04 - Curried arg in paren.gold @@ -0,0 +1,8 @@ +let f |a|(param #0) |b|(param #1) |c|(param #2) = a + b + c + +f (|1|(arg #0)) |2|(arg #1) (|3|(arg #2)) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.fs new file mode 100644 index 0000000000..d3bef82ce6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.fs @@ -0,0 +1,5 @@ +module Module + +let f (a, b, c) = a + b + c + +{selstart}f(1, 2){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.gold new file mode 100644 index 0000000000..adac191e3d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 05 - Tupled - too few.gold @@ -0,0 +1,9 @@ +module Module + +let f (|a|(param #0), |b|(param #1), c) = a + b + c + +f(|1|(arg #0), |2|(arg #1)) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.fs new file mode 100644 index 0000000000..4cde5368f7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.fs @@ -0,0 +1,5 @@ +module Module + +let f (a, b, c) = a + b + c + +{selstart}f(1, 2, 3, 4){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.gold new file mode 100644 index 0000000000..24d8dc7d45 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 06 - Tupled - too many.gold @@ -0,0 +1,10 @@ +module Module + +let f (|a|(param #0), |b|(param #1), |c|(param #2)) = a + b + c + +f(|1|(arg #0), |2|(arg #1), |3|(arg #2), 4) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.fs new file mode 100644 index 0000000000..f42b38b37f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}f 1 2{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.gold new file mode 100644 index 0000000000..9c0cbca957 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 07 - Curried - partial.gold @@ -0,0 +1,7 @@ +let f |a|(param #0) |b|(param #1) c = a + b + c + +f |1|(arg #0) |2|(arg #1) + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.fs b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.fs new file mode 100644 index 0000000000..530d9161af --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.fs @@ -0,0 +1,3 @@ +let f a b c = a + b + c + +{selstart}f 1 2 3 4{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.gold b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.gold new file mode 100644 index 0000000000..4ead544dc9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Multiple 08 - Curried - too many.gold @@ -0,0 +1,8 @@ +let f |a|(param #0) |b|(param #1) |c|(param #2) = a + b + c + +f |1|(arg #0) |2|(arg #1) |3|(arg #2) 4 + +--------------------------------------------------------- +(arg #0) => a +(arg #1) => b +(arg #2) => c diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.fs new file mode 100644 index 0000000000..badeee7991 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.fs @@ -0,0 +1,3 @@ +open System.Drawing + +{selstart}Color.FromArgb(120, blue=60, green=70){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.gold new file mode 100644 index 0000000000..95731bfbd4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 01 - BCL.gold @@ -0,0 +1,8 @@ +open System.Drawing + +Color.FromArgb(|120|(arg #0), |blue=60|(arg #1), |green=70|(arg #2)) + +--------------------------------------------------------- +(arg #0) => red +(arg #1) => blue +(arg #2) => green diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.fs new file mode 100644 index 0000000000..cf8ee5c698 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.fs @@ -0,0 +1,4 @@ +type Foo () = + static member F (first: int, second, third) = first + second + third + +{selstart}Foo.F (10, third=15){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.gold new file mode 100644 index 0000000000..ab745ca767 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 02 - Partial.gold @@ -0,0 +1,8 @@ +type Foo () = + static member F (|first|(param #0): int, second, |third|(param #1)) = first + second + third + +Foo.F (|10|(arg #0), |third=15|(arg #1)) + +--------------------------------------------------------- +(arg #0) => first +(arg #1) => third diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.fs new file mode 100644 index 0000000000..7aaf3797d3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.fs @@ -0,0 +1,4 @@ +type Foo () = + static member F (first: int, second, third) = first + second + third + +{selstart}Foo.F (second=15, third=25, first=1){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.gold new file mode 100644 index 0000000000..81ccf9eab7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 03 - Unordered.gold @@ -0,0 +1,9 @@ +type Foo () = + static member F (|first|(param #2): int, |second|(param #0), |third|(param #1)) = first + second + third + +Foo.F (|second=15|(arg #0), |third=25|(arg #1), |first=1|(arg #2)) + +--------------------------------------------------------- +(arg #0) => second +(arg #1) => third +(arg #2) => first diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.fs new file mode 100644 index 0000000000..8a59390722 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.fs @@ -0,0 +1,4 @@ +type Foo () = + static member F (first: int, second, third) = first + second + third + +{selstart}Foo.F (first=15, second=23, what=56){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.gold new file mode 100644 index 0000000000..bcb565553f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 04 - Invalid name.gold @@ -0,0 +1,9 @@ +type Foo () = + static member F (|first|(param #0): int, |second|(param #1), third) = first + second + third + +Foo.F (|first=15|(arg #0), |second=23|(arg #1), |what=56|(arg #2)) + +--------------------------------------------------------- +(arg #0) => first +(arg #1) => second +(arg #2) => diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.fs b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.fs new file mode 100644 index 0000000000..3eebcfad07 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.fs @@ -0,0 +1,5 @@ +type Foo () = + static member F (first: bool, second, third) = second + third + +let someInt = 15 +{selstart}Foo.F ((someInt=15), third=56, second=23){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.gold b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.gold new file mode 100644 index 0000000000..d08ea168ec --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Named arg 05 - Boolean.gold @@ -0,0 +1,10 @@ +type Foo () = + static member F (|first|(param #0): bool, |second|(param #2), |third|(param #1)) = second + third + +let someInt = 15 +Foo.F (|(someInt=15)|(arg #0), |third=56|(arg #1), |second=23|(arg #2)) + +--------------------------------------------------------- +(arg #0) => first +(arg #1) => third +(arg #2) => second diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.fs b/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.fs new file mode 100644 index 0000000000..a092e64d93 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.fs @@ -0,0 +1,4 @@ +type MyType (x: string, i: int) = + class end + +{selstart}new MyType("", 15){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.gold b/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.gold new file mode 100644 index 0000000000..818475aa08 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 01 - Multiple args.gold @@ -0,0 +1,8 @@ +type MyType (|x|(param #0): string, |i|(param #1): int) = + class end + +new MyType(|""|(arg #0), |15|(arg #1)) + +--------------------------------------------------------- +(arg #0) => x +(arg #1) => i diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.fs new file mode 100644 index 0000000000..135f87389d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.fs @@ -0,0 +1,4 @@ +type MyType () = + class end + +{selstart}new MyType(){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.gold new file mode 100644 index 0000000000..de43b0ea5d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 02 - No args - parens.gold @@ -0,0 +1,6 @@ +type MyType () = + class end + +new MyType() + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.fs new file mode 100644 index 0000000000..f967009235 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.fs @@ -0,0 +1,4 @@ +type MyType (x: string) = + class end + +{selstart}new MyType ""{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.gold new file mode 100644 index 0000000000..27ddbd912d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 03 - Single arg - no paren.gold @@ -0,0 +1,7 @@ +type MyType (|x|(param #0): string) = + class end + +new MyType |""|(arg #0) + +--------------------------------------------------------- +(arg #0) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.fs b/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.fs new file mode 100644 index 0000000000..4130201794 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.fs @@ -0,0 +1,4 @@ +type MyType (x: string) = + class end + +{selstart}new MyType(""){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.gold b/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.gold new file mode 100644 index 0000000000..148b39aeda --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/New 04 - Single arg - parens.gold @@ -0,0 +1,7 @@ +type MyType (|x|(param #0): string) = + class end + +new MyType(|""|(arg #0)) + +--------------------------------------------------------- +(arg #0) => x diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.fs b/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.fs new file mode 100644 index 0000000000..657de4e154 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.fs @@ -0,0 +1,5 @@ +open System + +let dispose (disp: IDisposable) = disp.Dispose() + +{selstart}dispose { new IDisposable with override __.Dispose () = () }{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.gold b/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.gold new file mode 100644 index 0000000000..b6032ba974 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Non IArgument 01 - Obj expression.gold @@ -0,0 +1,7 @@ +open System + +let dispose (disp: IDisposable) = disp.Dispose() + +dispose { new IDisposable with override __.Dispose () = () } + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.fs new file mode 100644 index 0000000000..1f6084fb2d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.fs @@ -0,0 +1,3 @@ +let f a = a + "" + +{selstart}f("hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.gold new file mode 100644 index 0000000000..8603b1d7e2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 01 - Paren.gold @@ -0,0 +1,6 @@ +let f |a|(param #0) = a + "" + +f(|"hi"|(arg #0)) + +--------------------------------------------------------- +(arg #0) => a diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.fs b/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.fs new file mode 100644 index 0000000000..0d00ad111f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.fs @@ -0,0 +1,3 @@ +let f a = a + "" + +{selstart}f ("hi"){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.gold b/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.gold new file mode 100644 index 0000000000..827cc41c11 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 02 - Space paren.gold @@ -0,0 +1,6 @@ +let f |a|(param #0) = a + "" + +f (|"hi"|(arg #0)) + +--------------------------------------------------------- +(arg #0) => a diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.fs b/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.fs new file mode 100644 index 0000000000..4fd8062142 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.fs @@ -0,0 +1,3 @@ +let f a = a + "" + +{selstart}f "hi"{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.gold b/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.gold new file mode 100644 index 0000000000..1631122f49 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Single 03 - Bare.gold @@ -0,0 +1,6 @@ +let f |a|(param #0) = a + "" + +f |"hi"|(arg #0) + +--------------------------------------------------------- +(arg #0) => a diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.fs new file mode 100644 index 0000000000..771d3317ef --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.fs @@ -0,0 +1,3 @@ +module M = let f (x, y) z = x + y + z + +{selstart}M.f (1, 2) 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.gold new file mode 100644 index 0000000000..4e13602288 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 01 - Deconstructed.gold @@ -0,0 +1,8 @@ +module M = let f (|x|(param #0), |y|(param #1)) |z|(param #2) = x + y + z + +M.f (|1|(arg #0), |2|(arg #1)) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => x +(arg #1) => y +(arg #2) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.fs new file mode 100644 index 0000000000..30eab9cf81 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.fs @@ -0,0 +1,4 @@ +module M = let f (x, y) z = x + y + z + +let x = 1, 2 +{selstart}M.f x 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.gold new file mode 100644 index 0000000000..d95932fd26 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 02 - Variable tuple in arg.gold @@ -0,0 +1,7 @@ +module M = let f (x, y) |z|(param #0) = x + y + z + +let x = 1, 2 +M.f x |3|(arg #0) + +--------------------------------------------------------- +(arg #0) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.fs new file mode 100644 index 0000000000..cc9ec97874 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.fs @@ -0,0 +1,6 @@ +module M = + let f a z = + let x, y = a + x + y + z + +{selstart}M.f (1, 2) 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.gold new file mode 100644 index 0000000000..1472b2df06 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 03 - Param not deconstructed.gold @@ -0,0 +1,11 @@ +module M = + let f a |z|(param #2) = + let x, y = a + x + y + z + +M.f (|1|(arg #0), |2|(arg #1)) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => +(arg #1) => +(arg #2) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.fs new file mode 100644 index 0000000000..c272f80445 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.fs @@ -0,0 +1,5 @@ +module M = + let f (w, x, y) z = + w + x + y + z + +{selstart}M.f (1, 2) 3{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.gold new file mode 100644 index 0000000000..a008fe577d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 04 - Mismatch - too few.gold @@ -0,0 +1,10 @@ +module M = + let f (|w|(param #0), |x|(param #1), y) |z|(param #2) = + w + x + y + z + +M.f (|1|(arg #0), |2|(arg #1)) |3|(arg #2) + +--------------------------------------------------------- +(arg #0) => w +(arg #1) => x +(arg #2) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.fs b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.fs new file mode 100644 index 0000000000..0524f857ee --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.fs @@ -0,0 +1,5 @@ +module M = + let f (w, x, y) z = + w + x + y + z + +{selstart}M.f (1, 2, 3, 4) 5{selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.gold b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.gold new file mode 100644 index 0000000000..dbb99d0328 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Tuple param 05 - Mismatch - too many.gold @@ -0,0 +1,11 @@ +module M = + let f (|w|(param #0), |x|(param #1), |y|(param #2)) |z|(param #3) = + w + x + y + z + +M.f (|1|(arg #0), |2|(arg #1), |3|(arg #2), 4) |5|(arg #3) + +--------------------------------------------------------- +(arg #0) => w +(arg #1) => x +(arg #2) => y +(arg #3) => z diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.fs b/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.fs new file mode 100644 index 0000000000..a4799c5fd0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.fs @@ -0,0 +1,4 @@ +type T() = + static member M(u: unit) = () + +{selstart}T.M(u = ()){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.gold b/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.gold new file mode 100644 index 0000000000..9297d6af0d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Unit 01 - Named.gold @@ -0,0 +1,6 @@ +type T() = + static member M(u: unit) = () + +T.M(u = ()) + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.fs b/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.fs new file mode 100644 index 0000000000..5b7c2a2e29 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.fs @@ -0,0 +1,5 @@ +type T() = + static member M(u: unit) = () + +let u = () +{selstart}T.M(u){selend} diff --git a/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.gold b/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.gold new file mode 100644 index 0000000000..05fb9c7d96 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/service/arguments/Unit 02 - Unnamed.gold @@ -0,0 +1,7 @@ +type T() = + static member M(u: unit) = () + +let u = () +T.M(u) + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj b/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj index 67b2ad7438..4cf468a5f3 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj +++ b/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj @@ -21,6 +21,7 @@ + diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/FSharpOccurenceKindTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/FSharpOccurenceKindTest.fs index b556654958..2208d6450c 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/FSharpOccurenceKindTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/FSharpOccurenceKindTest.fs @@ -15,6 +15,7 @@ type FSharpOccurenceKindTest() = [] member x.``New instance 01``() = x.DoNamedTest() [] member x.``New instance 02``() = x.DoNamedTest() [] member x.``New instance 03 - New``() = x.DoNamedTest() + [] member x.``New instance 04 - Attribute``() = x.DoNamedTest() [] member x.``Unions 01``() = x.DoNamedTest() [] member x.``Unions 02 - Single empty case``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Service/ArgumentsOwnerTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Service/ArgumentsOwnerTest.fs new file mode 100644 index 0000000000..82a5387af2 --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Service/ArgumentsOwnerTest.fs @@ -0,0 +1,151 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features + +open System +open JetBrains.Diagnostics +open JetBrains.ProjectModel +open JetBrains.ReSharper.FeaturesTestFramework.Utils +open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement +open JetBrains.ReSharper.Plugins.FSharp.Psi.Util +open JetBrains.ReSharper.Plugins.FSharp.Tests.Common +open JetBrains.ReSharper.Plugins.FSharp.Util +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.Tree +open JetBrains.ReSharper.TestFramework +open JetBrains.TextControl +open NUnit.Framework + +[] +[] +[] +type ArgumentsOwnerTest() = + inherit BaseTestWithTextControl() + + let treeNodeSelection = FSharpTreeNodeSelectionProvider.Instance + + override x.RelativeTestDataPath = "features/service/arguments" + + override x.DoTest(lifetime, _) = + let textControl = x.OpenTextControl(lifetime) + let fsFile = textControl.GetFSharpFile(x.Solution) + + let document = textControl.Document + let filePath = fsFile.GetSourceFile().GetLocation() + + let selection = textControl.Selection.OneDocumentRangeWithCaret() + let expr = + treeNodeSelection + .GetExpressionInRange(fsFile, selection, true, null) + .NotNull("Failed to find IArgumentsOwner at selection") + + x.ExecuteWithGold(fun writer -> + let args = Array.ofSeq expr.Arguments + + let endTexts, ranges = + args + |> Array.indexed + |> Array.collect (fun (i, expr) -> + let matchingParam = expr.MatchingParameter + + let declRange = + if isNull matchingParam then None else + + match matchingParam.Element with + | :? FSharpMethodParameter as param when + FileSystemPath.TryParse(param.FSharpSymbol.DeclarationLocation.FileName) = filePath -> + Some (FSharpRangeUtil.getTextRange document param.FSharpSymbol.DeclarationLocation) + | _ -> + None + + let argRange = sprintf "|(arg #%d)" i, expr.GetDocumentRange().TextRange + match declRange with + | None -> [| argRange |] + | Some declRange -> [| argRange; sprintf "|(param #%d)" i, declRange |]) + |> Array.unzip + + let endText rangeIdx = endTexts.[rangeIdx] + + DocumentRangeUtil.DumpRanges(textControl.Document, ranges, (fun _ -> "|"), Func<_,_>(endText)).ToString() + |> writer.WriteLine + + writer.WriteLine("---------------------------------------------------------") + for i, arg in Seq.indexed args do + writer.Write(sprintf "(arg #%d) => " i) + let param = arg.MatchingParameter + if isNull param then writer.WriteLine("") else + writer.WriteLine(param.Element.ShortName)) |> ignore + + [] member x.``Attribute 01 - Multiple args``() = x.DoNamedTest() + [] member x.``Attribute 02 - Single arg - no parens``() = x.DoNamedTest() + [] member x.``Attribute 03 - Single arg - parens``() = x.DoNamedTest() + [] member x.``Attribute 04 - No args - no parens``() = x.DoNamedTest() + [] member x.``Attribute 05 - No args - parens``() = x.DoNamedTest() + + [] member x.``Compiled 01 - FSharpCore``() = x.DoNamedTest() + [] member x.``Compiled 02 - BCL``() = x.DoNamedTest() + + [] member x.``Constructor 01 - No args``() = x.DoNamedTest() + [] member x.``Constructor 02 - Single arg``() = x.DoNamedTest() + [] member x.``Constructor 03 - Multiple args``() = x.DoNamedTest() + + [] member x.``New 01 - Multiple args``() = x.DoNamedTest() + [] member x.``New 02 - No args - parens``() = x.DoNamedTest() + [] member x.``New 03 - Single arg - no paren``() = x.DoNamedTest() + [] member x.``New 04 - Single arg - parens``() = x.DoNamedTest() + + [] member x.``Extension BCL 01 - No args``() = x.DoNamedTest() + [] member x.``Extension BCL 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension BCL 03 - Tupled args``() = x.DoNamedTest() + + [] member x.``Extension BCL Direct 01 - No args``() = x.DoNamedTest() + [] member x.``Extension BCL Direct 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension BCL Direct 03 - Tupled args``() = x.DoNamedTest() + + [] member x.``Extension CSharp 01 - No args``() = x.DoNamedTest() + [] member x.``Extension CSharp 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension CSharp 03 - Tupled args``() = x.DoNamedTest() + + [] member x.``Extension CSharp Direct 01 - No args``() = x.DoNamedTest() + [] member x.``Extension CSharp Direct 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension CSharp Direct 03 - Tupled args``() = x.DoNamedTest() + + [] member x.``Extension FSharp 01 - No args``() = x.DoNamedTest() + [] member x.``Extension FSharp 02 - Single arg``() = x.DoNamedTest() + [] member x.``Extension FSharp 03 - Curried args``() = x.DoNamedTest() + [] member x.``Extension FSharp 04 - Tupled args``() = x.DoNamedTest() + + [] member x.``Generic 01 - Module``() = x.DoNamedTest() + [] member x.``Generic 02 - Static method``() = x.DoNamedTest() + + [] member x.``Misc 01 - No args``() = x.DoNamedTest() + [] member x.``Misc 02 - Too many args``() = x.DoNamedTest() + + [] member x.``Multiple 01 - Curried``() = x.DoNamedTest() + [] member x.``Multiple 02 - Tupled``() = x.DoNamedTest() + [] member x.``Multiple 03 - Curried fun in paren``() = x.DoNamedTest() + [] member x.``Multiple 04 - Curried arg in paren``() = x.DoNamedTest() + [] member x.``Multiple 05 - Tupled - too few``() = x.DoNamedTest() + [] member x.``Multiple 06 - Tupled - too many``() = x.DoNamedTest() + [] member x.``Multiple 07 - Curried - partial``() = x.DoNamedTest() + [] member x.``Multiple 08 - Curried - too many``() = x.DoNamedTest() + + [] member x.``Named arg 01 - BCL``() = x.DoNamedTest() + [] member x.``Named arg 02 - Partial``() = x.DoNamedTest() + [] member x.``Named arg 03 - Unordered``() = x.DoNamedTest() + [] member x.``Named arg 04 - Invalid name``() = x.DoNamedTest() + [] member x.``Named arg 05 - Boolean``() = x.DoNamedTest() + + [] member x.``Non IArgument 01 - Obj expression``() = x.DoNamedTest() + + [] member x.``Single 01 - Paren``() = x.DoNamedTest() + [] member x.``Single 02 - Space paren``() = x.DoNamedTest() + [] member x.``Single 03 - Bare``() = x.DoNamedTest() + + [] member x.``Tuple param 01 - Deconstructed``() = x.DoNamedTest() + [] member x.``Tuple param 02 - Variable tuple in arg``() = x.DoNamedTest() + [] member x.``Tuple param 03 - Param not deconstructed``() = x.DoNamedTest() + + [] member x.``Tuple param 04 - Mismatch - too few``() = x.DoNamedTest() + [] member x.``Tuple param 05 - Mismatch - too many``() = x.DoNamedTest() + + [] member x.``Unit 01 - Named``() = x.DoNamedTest() + [] member x.``Unit 02 - Unnamed``() = x.DoNamedTest()