@@ -165,7 +165,7 @@ type FcsParameterInfoCandidateBase<'TSymbol, 'TParameter when 'TSymbol :> FSharp
165
165
paramArrayIndex <- - 1
166
166
167
167
let paramGroups = this.ParameterGroups
168
- let paramGroups =
168
+ let paramGroups =
169
169
if this.SkipLastGroupDescription then
170
170
let paramGroups = List( paramGroups)
171
171
paramGroups.RemoveAt( paramGroups.Count - 1 )
@@ -194,7 +194,7 @@ type FcsParameterInfoCandidateBase<'TSymbol, 'TParameter when 'TSymbol :> FSharp
194
194
if isNull parameter then () else
195
195
196
196
let name = parameter.ShortName
197
-
197
+
198
198
let summary =
199
199
if parameter.PresentationLanguage.Is< FSharpLanguage>() then
200
200
// todo: implement providing xml in declared element, remove this code
@@ -206,7 +206,7 @@ type FcsParameterInfoCandidateBase<'TSymbol, 'TParameter when 'TSymbol :> FSharp
206
206
| _ -> null
207
207
else
208
208
parameter.GetXMLDescriptionSummary( true )
209
-
209
+
210
210
let description = XmlDocRichTextPresenter.Run( summary, false , CSharpLanguage.Instance)
211
211
paramInfos[ index] <- ParamPresentationInfo( Name = name, Description = description)
212
212
)
@@ -217,7 +217,7 @@ type FcsParameterInfoCandidateBase<'TSymbol, 'TParameter when 'TSymbol :> FSharp
217
217
let paramGroups = this.ParameterGroups
218
218
if paramGroups.Count = 0 then RichText() else
219
219
220
- let curriedParamsCount = paramGroups |> Seq.sumBy Seq.length
220
+ let curriedParamsCount = paramGroups |> Seq.sumBy Seq.length
221
221
let groupParameters = paramGroups.Count
222
222
223
223
// Add additional group parameters to highlight group ranges
@@ -357,11 +357,24 @@ type FcsParameterInfoCandidateBase<'TSymbol, 'TParameter when 'TSymbol :> FSharp
357
357
type FcsMfvParameterInfoCandidate ( mfv , symbolUse , fsContext ) =
358
358
inherit FcsParameterInfoCandidateBase< FSharpMemberOrFunctionOrValue, FSharpParameter>( mfv, symbolUse, fsContext)
359
359
360
+ let isCustomOp = mfv.Attributes.HasAttributeInstance( FSharpPredefinedType.customOperationAttrTypeName)
361
+
360
362
override val ExtendedType = if mfv.IsExtensionMember then Some mfv.ApparentEnclosingEntity else None
361
- override val ParameterGroups = mfv.CurriedParameterGroups
362
363
override val ReturnType = if mfv.IsConstructor then None else Some mfv.ReturnParameter.Type
363
364
override val XmlDoc = mfv.XmlDoc
364
365
366
+ override val ParameterGroups =
367
+ if not isCustomOp then
368
+ mfv.CurriedParameterGroups
369
+ else
370
+ let firstGroup = mfv.CurriedParameterGroups[ 0 ]
371
+ if firstGroup.IsEmpty() then [||] else
372
+
373
+ firstGroup
374
+ |> Seq.tail
375
+ |> Seq.map ( fun p -> Array.singleton p :> IList<_>)
376
+ |> Array.ofSeq :> _
377
+
365
378
override this.GetParamName ( parameter ) = parameter.Name
366
379
override this.GetParamType ( parameter ) = parameter.Type
367
380
override this.IsOptionalParam ( parameter ) = parameter.IsOptionalArg
@@ -451,7 +464,7 @@ type FcsActivePatternMfvParameterInfoCandidate(apc: FSharpActivePatternCase, mfv
451
464
parameterGroups.RemoveAt( parameterGroups.Count - 1 )
452
465
453
466
returnType |> Option.iter ( fun returnType ->
454
- let returnGroup =
467
+ let returnGroup =
455
468
if returnType.IsTupleType then
456
469
returnType.GenericArguments |> Seq.map ( fun t -> None, t)
457
470
else
@@ -676,11 +689,11 @@ type FSharpParameterInfoContextBase<'TNode when 'TNode :> IFSharpTreeNode>(caret
676
689
677
690
if removeParenRange then
678
691
let parenExpr = argGroups[ 0 ]. As< IParenExpr>()
679
- let range =
692
+ let range =
680
693
argGroups[ 0 ]. Node.GetDocumentRange()
681
694
.TrimLeft( if isNotNull parenExpr && isNull parenExpr.LeftParen then 0 else 1 )
682
695
.TrimRight( if isNotNull parenExpr && isNull parenExpr.RightParen then 0 else 1 )
683
- range.Contains( caretOffset)
696
+ range.Contains( caretOffset)
684
697
else
685
698
if allowAtLastArgEnd && offset <= lastArgEnd || offset < lastArgEnd then true else
686
699
@@ -762,7 +775,7 @@ type FSharpPatternParameterInfoContext(caretOffset, pat: IFSharpPattern, referen
762
775
| :? IParametersOwnerPat as parameterOwnerPat ->
763
776
parameterOwnerPat.ParametersEnumerable
764
777
|> List.ofSeq
765
- |> List.map ParameterInfoArgument.Pattern
778
+ |> List.map ParameterInfoArgument.Pattern
766
779
| _ -> []
767
780
768
781
@@ -817,7 +830,7 @@ type FSharpParameterInfoContextFactory() =
817
830
818
831
let rec isInsideComment checkPrevious ( token : ITreeNode ) =
819
832
token.IsCommentToken() && caretOffset.Offset > token.GetTreeStartOffset() .Offset ||
820
- checkPrevious && getTokenType token == FSharpTokenType.NEW_ LINE && isInsideComment false token.PrevSibling
833
+ checkPrevious && getTokenType token == FSharpTokenType.NEW_ LINE && isInsideComment false token.PrevSibling
821
834
822
835
if isAutoPopup && isInsideComment true token then null else
823
836
@@ -844,7 +857,7 @@ type FSharpParameterInfoContextFactory() =
844
857
caretOffset.Offset >= contextRange.StartOffset.Offset &&
845
858
caretOffset.ToDocumentCoords() .Column > contextRange.StartOffset.ToDocumentCoords() .Column
846
859
847
- let rec tryCreateContext isAutoPopup ( caretOffset : DocumentOffset ) ( expr : IFSharpExpression ) =
860
+ let rec tryCreateContext isAutoPopup ( caretOffset : DocumentOffset ) ( expr : IFSharpExpression ) =
848
861
let range = expr.GetDocumentRange()
849
862
let expr =
850
863
match expr with
@@ -865,7 +878,7 @@ type FSharpParameterInfoContextFactory() =
865
878
match expr with
866
879
| :? IPrefixAppExpr as appExpr ->
867
880
// todo: allow on non-refExpr invoked expressions (lambdas, other apps)
868
- let reference =
881
+ let reference =
869
882
match appExpr.InvokedReferenceExpression with
870
883
| null -> null
871
884
| refExpr -> refExpr.Reference
@@ -980,7 +993,7 @@ type FSharpParameterInfoContextFactory() =
980
993
981
994
match pat with
982
995
| :? IParametersOwnerPat as parametersOwnerPat ->
983
- createFromPattern isAutoPopup caretOffset parametersOwnerPat
996
+ createFromPattern isAutoPopup caretOffset parametersOwnerPat
984
997
985
998
| :? IReferencePat as refPat ->
986
999
match ParametersOwnerPatNavigator.GetByParameter( refPat) with
@@ -1007,7 +1020,7 @@ type FSharpParameterInfoContextFactory() =
1007
1020
if caretOffset.Offset <= endOffset.Offset &&
1008
1021
( isNull argExpr || caretOffset.Offset < argExpr.GetTreeStartOffset() .Offset) then
1009
1022
// Inside invoked type reference name, try to get context from a parent node instead
1010
- let parentExpr = context.GetContainingNode< IFSharpExpression>()
1023
+ let parentExpr = context.GetContainingNode< IFSharpExpression>()
1011
1024
tryCreateFromParentExpr false caretOffset parentExpr else
1012
1025
1013
1026
match getSymbols reference with
@@ -1033,7 +1046,7 @@ type FSharpParameterInfoContextFactory() =
1033
1046
1034
1047
if caretOffset.Offset >= range.StartOffset.Offset && caretOffset.Offset < range.EndOffset.Offset ||
1035
1048
caretOffset = endOffset && isNotNull ( PrefixAppExprNavigator.GetByArgumentExpression( appExpr)) then
1036
- // Inside invoked function name, try to get context from a parent expression instead
1049
+ // Inside invoked function name, try to get context from a parent expression instead
1037
1050
tryCreateFromParentExpr isAutoPopup caretOffset appExpr else
1038
1051
1039
1052
let appExpr = getOutermostPrefixAppExpr contextExpr
@@ -1049,7 +1062,7 @@ type FSharpParameterInfoContextFactory() =
1049
1062
let typeInherit = TypeInheritNavigator.GetByCtorArgExpression( expr)
1050
1063
if isNotNull typeInherit then
1051
1064
typeInherit.Reference, typeInherit.CtorArgExpression else
1052
-
1065
+
1053
1066
let attribute = AttributeNavigator.GetByExpression( expr)
1054
1067
if isNotNull attribute then
1055
1068
attribute.Reference, attribute.Expression else
@@ -1105,7 +1118,7 @@ type FSharpParameterInfoContextFactory() =
1105
1118
else
1106
1119
// This is called again before requesting a new context on reparsed file
1107
1120
let offset = caretOffset.Offset
1108
- let shouldPopup =
1121
+ let shouldPopup =
1109
1122
let token = getTokenAtOffset true true caretOffset solution
1110
1123
if isNull token then false else
1111
1124
0 commit comments