Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
DedSec256 committed Sep 5, 2022
1 parent e193b4c commit 12ef383
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 12 deletions.
33 changes: 21 additions & 12 deletions ReSharper.FSharp/src/FSharp.Psi/src/Resolve/FSharpParameterUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
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 @@ -69,7 +70,7 @@ private static IDeclaredElement GetFieldDeclaredElement([NotNull] IReference ref
return field?.GetDeclaredElement(referenceOwner.GetPsiModule(), referenceOwner);
}

public static IReadOnlyList<IReadOnlyList<string>> GetParametersGroupNames(ITreeNode node) =>
public static IReadOnlyList<IReadOnlyList<(string name, DocumentRange range)>> GetParametersGroupNames(ITreeNode node) =>
(node switch
{
IBinding binding => binding.Expression is ILambdaExpr lambda
Expand All @@ -90,8 +91,8 @@ public static IReadOnlyList<IReadOnlyList<string>> GetParametersGroupNames(ITree
IMemberSignature memberSignature => GetParameterNames(((IMemberSignatureOrDeclaration)memberSignature)
.ReturnTypeInfo.ReturnType),

IUnionCaseDeclaration ucDecl => new[] { ucDecl.Fields.Select(t => t.SourceName) },
_ => EmptyList<string[]>.Enumerable
IUnionCaseDeclaration ucDecl => new[] { ucDecl.Fields.Select(t => (t.SourceName, t.GetNameDocumentRange())) },
_ => EmptyList<IEnumerable<(string, DocumentRange)>>.Enumerable
})
.Select(t => t.ToIReadOnlyList())
.ToIReadOnlyList();
Expand All @@ -104,7 +105,7 @@ public static IReadOnlyList<IReadOnlyList<string>> GetParametersGroupNames(ITree
_ => false
};

private static IEnumerable<IEnumerable<string>> GetLambdaArgs(ILambdaExpr expr)
private static IEnumerable<IEnumerable<(string, DocumentRange)>> GetLambdaArgs(ILambdaExpr expr)
{
var lambdaParams = expr.Patterns;
var parameters = lambdaParams.Select(GetParameterNames);
Expand All @@ -113,40 +114,48 @@ private static IEnumerable<IEnumerable<string>> GetLambdaArgs(ILambdaExpr expr)
return parameters;
}

public static IEnumerable<string> GetParameterNames(this IFSharpPattern pattern)
public static IEnumerable<(string, DocumentRange)> GetParameterNames(this IFSharpPattern pattern)
{
IEnumerable<string> GetParameterNamesInternal(IFSharpPattern pat, bool isTopLevelParameter)
IEnumerable<(string, DocumentRange)> GetParameterNamesInternal(IFSharpPattern pat, bool isTopLevelParameter)
{
pat = pat.IgnoreInnerParens();
return pat switch
{
ILocalReferencePat local => new[] { local.SourceName },
ILocalReferencePat local => new[] { (local.SourceName, local.GetDocumentRange()) },
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 }
_ => new[] { (SharedImplUtil.MISSING_DECLARATION_NAME, DocumentRange.InvalidRange) }
};
}

return GetParameterNamesInternal(pattern, true);
}

public static IEnumerable<IEnumerable<string>> GetParameterNames(this ITypeUsage pattern) =>
public static IEnumerable<IEnumerable<(string, DocumentRange)>> GetParameterNames(this ITypeUsage pattern) =>
pattern switch
{
IParenTypeUsage parenUsage => GetParameterNames(parenUsage.InnerTypeUsage),
IParameterSignatureTypeUsage local =>
new[] { new[] { local.Identifier?.Name ?? SharedImplUtil.MISSING_DECLARATION_NAME } },
new[]
{
new[]
{
local.Identifier is { } identifier
? (identifier.Name, local.GetDocumentRange())
: (SharedImplUtil.MISSING_DECLARATION_NAME, DocumentRange.InvalidRange)
}
},
IFunctionTypeUsage funPat =>
GetParameterNames(funPat.ArgumentTypeUsage).Union(GetParameterNames(funPat.ReturnTypeUsage)),
ITupleTypeUsage tuplePat => tuplePat.Items.SelectMany(GetParameterNames),
_ => EmptyList<IEnumerable<string>>.Enumerable
_ => EmptyList<IEnumerable<(string, DocumentRange)>>.Enumerable
};

public static IReadOnlyList<IReadOnlyList<string>> GetParametersGroups(this IBinding binding)
public static IReadOnlyList<IReadOnlyList<(string, DocumentRange)>> GetParametersGroups(this IBinding binding)
{
var parameters = binding.ParameterPatterns.Select(GetParameterNames);
var bodyExpr = binding.Expression;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public static (string, int caretOffset) GetDocTemplate(IDocCommentBlock docComme

foreach (var parameter in FSharpParameterUtil.GetParametersGroupNames(docCommentBlock.Parent)
.SelectMany(t => t)
.Select(t => t.name)
.Where(t => t != SharedImplUtil.MISSING_DECLARATION_NAME))
text.Append($"{lineEnding}{linePrefix}<param name=\"{parameter}\"></param>");

Expand Down

0 comments on commit 12ef383

Please sign in to comment.