Skip to content

Commit

Permalink
Wip
Browse files Browse the repository at this point in the history
  • Loading branch information
DedSec256 committed Sep 27, 2022
1 parent 4866f85 commit 916adf4
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpParameterUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using System.Linq;
using FSharp.Compiler.Symbols;
using JetBrains.Annotations;
using JetBrains.DocumentModel;
using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl;
using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree;
using JetBrains.ReSharper.Plugins.FSharp.Psi.Util;
Expand Down Expand Up @@ -70,7 +69,7 @@ private static IDeclaredElement GetFieldDeclaredElement([NotNull] IReference ref
return field?.GetDeclaredElement(referenceOwner.GetPsiModule(), referenceOwner);
}

public static IReadOnlyList<IReadOnlyList<(string name, DocumentRange range)>> GetParametersGroupNames(ITreeNode node) =>
public static IReadOnlyList<IReadOnlyList<(string name, ITreeNode node)>> GetParametersGroupNames(ITreeNode node) =>
(node switch
{
IBinding binding => binding.Expression is ILambdaExpr lambda
Expand All @@ -91,12 +90,15 @@ private static IDeclaredElement GetFieldDeclaredElement([NotNull] IReference ref
IMemberSignature memberSignature => GetParameterNames(((IMemberSignatureOrDeclaration)memberSignature)
.ReturnTypeInfo.ReturnType),

IUnionCaseDeclaration ucDecl => new[] { ucDecl.Fields.Select(t => t.SourceName) },
IUnionCaseDeclaration ucDecl => new[] { ucDecl.Fields.Select(t => (t.SourceName, (ITreeNode)t)) },

IFSharpTypeDeclaration { TypeRepresentation: IDelegateRepresentation repr } =>
GetParameterNames(repr.TypeUsage),

_ => EmptyList<string[]>.Enumerable
IFSharpTypeDeclaration { PrimaryConstructorDeclaration: { } constructor } =>
GetParametersGroupNames(constructor),

_ => EmptyList<IEnumerable<(string, ITreeNode)>>.Enumerable
})
.Select(t => t.ToIReadOnlyList())
.ToIReadOnlyList();
Expand All @@ -109,7 +111,7 @@ private static IDeclaredElement GetFieldDeclaredElement([NotNull] IReference ref
_ => false
};

private static IEnumerable<IEnumerable<(string, DocumentRange)>> GetLambdaArgs(ILambdaExpr expr)
private static IEnumerable<IEnumerable<(string, ITreeNode)>> GetLambdaArgs(ILambdaExpr expr)
{
var lambdaParams = expr.Patterns;
var parameters = lambdaParams.Select(GetParameterNames);
Expand All @@ -118,28 +120,28 @@ private static IDeclaredElement GetFieldDeclaredElement([NotNull] IReference ref
return parameters;
}

public static IEnumerable<(string, DocumentRange)> GetParameterNames(this IFSharpPattern pattern)
public static IEnumerable<(string, ITreeNode)> GetParameterNames(this IFSharpPattern pattern)
{
IEnumerable<(string, DocumentRange)> GetParameterNamesInternal(IFSharpPattern pat, bool isTopLevelParameter)
IEnumerable<(string, ITreeNode)> GetParameterNamesInternal(IFSharpPattern pat, bool isTopLevelParameter)
{
pat = pat.IgnoreInnerParens();
return pat switch
{
ILocalReferencePat local => new[] { (local.SourceName, local.GetDocumentRange()) },
ILocalReferencePat local => new[] { (local.SourceName, (ITreeNode)local) },
IOptionalValPat opt => GetParameterNamesInternal(opt.Pattern, isTopLevelParameter),
ITypedPat typed => GetParameterNamesInternal(typed.Pattern, false),
IAttribPat attrib => GetParameterNamesInternal(attrib.Pattern, false),
IAsPat asPat => GetParameterNamesInternal(asPat.RightPattern, false),
ITuplePat tuplePat when isTopLevelParameter =>
tuplePat.PatternsEnumerable.SelectMany(t => GetParameterNamesInternal(t, false)),
_ => new[] { (SharedImplUtil.MISSING_DECLARATION_NAME, DocumentRange.InvalidRange) }
var x => new[] { (SharedImplUtil.MISSING_DECLARATION_NAME, (ITreeNode)x) }
};
}

return GetParameterNamesInternal(pattern, true);
}

public static IEnumerable<IEnumerable<(string, DocumentRange)>> GetParameterNames(this ITypeUsage pattern) =>
public static IEnumerable<IEnumerable<(string, ITreeNode)>> GetParameterNames(this ITypeUsage pattern) =>
pattern switch
{
IParenTypeUsage parenUsage => GetParameterNames(parenUsage.InnerTypeUsage),
Expand All @@ -150,17 +152,17 @@ private static IDeclaredElement GetFieldDeclaredElement([NotNull] IReference ref
new[]
{
local.Identifier is { } identifier
? (identifier.Name, local.GetDocumentRange())
: (SharedImplUtil.MISSING_DECLARATION_NAME, DocumentRange.InvalidRange)
? (identifier.Name, (ITreeNode)local)
: (SharedImplUtil.MISSING_DECLARATION_NAME, null)
}
},
IFunctionTypeUsage funPat =>
GetParameterNames(funPat.ArgumentTypeUsage).Union(GetParameterNames(funPat.ReturnTypeUsage)),
ITupleTypeUsage tuplePat => tuplePat.Items.SelectMany(GetParameterNames),
_ => EmptyList<IEnumerable<(string, DocumentRange)>>.Enumerable
_ => EmptyList<IEnumerable<(string, ITreeNode)>>.Enumerable
};

public static IReadOnlyList<IReadOnlyList<(string, DocumentRange)>> GetParametersGroups(this IBinding binding)
public static IReadOnlyList<IReadOnlyList<(string, ITreeNode)>> GetParametersGroups(this IBinding binding)
{
var parameters = binding.ParameterPatterns.Select(GetParameterNames);
var bodyExpr = binding.Expression;
Expand Down

0 comments on commit 916adf4

Please sign in to comment.