Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions src/fsharp/NicePrint.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1105,7 +1105,18 @@ module PrintTypes =

let prettyLayoutOfTypeNoConstraints denv ty =
let ty, _cxs = PrettyTypes.PrettifyType denv.g ty
layoutTypeWithInfoAndPrec denv SimplifyTypes.typeSimplificationInfo0 5 ty
layoutTypeWithInfoAndPrec denv SimplifyTypes.typeSimplificationInfo0 5 ty

let layoutOfValReturnType denv (v: ValRef) =
match v.ValReprInfo with
| None ->
let _, tau = v.TypeScheme
let _argtysl, rty = stripFunTy denv.g tau
layoutReturnType denv SimplifyTypes.typeSimplificationInfo0 rty
| Some (ValReprInfo(_typars, argInfos, _retInfo)) ->
let tau = v.TauType
let _c, rty = GetTopTauTypeInFSharpForm denv.g argInfos tau Range.range0
layoutReturnType denv SimplifyTypes.typeSimplificationInfo0 rty

let layoutAssemblyName _denv (ty: TType) =
ty.GetAssemblyName()
Expand Down Expand Up @@ -2435,7 +2446,9 @@ let prettyLayoutOfValOrMember denv infoReader typarInst v = PrintTastMemberOrVal

let prettyLayoutOfValOrMemberNoInst denv infoReader v = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader v

let prettyLayoutOfMemberNoInstShort denv v = PrintTastMemberOrVals.prettyLayoutOfMemberNoInstShort denv v
let prettyLayoutOfMemberNoInstShort denv v = PrintTastMemberOrVals.prettyLayoutOfMemberNoInstShort denv v

let layoutOfValReturnType denv v = v |> PrintTypes.layoutOfValReturnType denv

let prettyLayoutOfInstAndSig denv x = PrintTypes.prettyLayoutOfInstAndSig denv x

Expand Down
2 changes: 2 additions & 0 deletions src/fsharp/NicePrint.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ val prettyLayoutOfValOrMemberNoInst: denv:DisplayEnv -> infoReader:InfoReader ->

val prettyLayoutOfMemberNoInstShort: denv:DisplayEnv -> v:Val -> Layout

val layoutOfValReturnType: denv:DisplayEnv -> v:ValRef -> Layout

val prettyLayoutOfInstAndSig: denv:DisplayEnv -> TyparInst * TTypes * TType -> TyparInst * (TTypes * TType) * (Layout list * Layout) * Layout

val minimalStringsOfTwoTypes: denv:DisplayEnv -> t1:TType -> t2:TType -> string * string * string
Expand Down
51 changes: 34 additions & 17 deletions src/fsharp/service/ServiceParamInfoLocations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,19 @@ open FSharp.Compiler.Text.Range
open FSharp.Compiler.Syntax
open FSharp.Compiler.SyntaxTreeOps

type TupledArgumentLocation = { IsNamedArgument: bool; ArgumentRange: range }

[<Sealed>]
type ParameterLocations(longId: string list, longIdRange: range, openParenLocation: pos, tupleEndLocations: pos list, isThereACloseParen: bool, namedParamNames: string option list) =
type ParameterLocations
(
longId: string list,
longIdRange: range,
openParenLocation: pos,
argRanges: TupledArgumentLocation list,
tupleEndLocations: pos list,
isThereACloseParen: bool,
namedParamNames: string option list
) =

let tupleEndLocations = Array.ofList tupleEndLocations
let namedParamNames = Array.ofList namedParamNames
Expand All @@ -30,6 +41,7 @@ type ParameterLocations(longId: string list, longIdRange: range, openParenLocati
member this.TupleEndLocations = tupleEndLocations
member this.IsThereACloseParen = isThereACloseParen
member this.NamedParamNames = namedParamNames
member this.ArgumentLocations = argRanges |> Array.ofList

[<AutoOpen>]
module internal ParameterLocationsImpl =
Expand All @@ -54,7 +66,7 @@ module internal ParameterLocationsImpl =
| _ -> None

type FindResult =
| Found of openParen: pos * commasAndCloseParen: (pos * string option) list * hasClosedParen: bool
| Found of openParen: pos * argRanges: TupledArgumentLocation list * commasAndCloseParen: (pos * string option) list * hasClosedParen: bool
| NotFound

let digOutIdentFromStaticArg (StripParenTypes synType) =
Expand Down Expand Up @@ -90,7 +102,8 @@ module internal ParameterLocationsImpl =
match inner with
| None ->
if SyntaxTraversal.rangeContainsPosLeftEdgeExclusiveAndRightEdgeInclusive parenRange pos then
Found (parenRange.Start, [(parenRange.End, getNamedParamName synExpr)], rpRangeOpt.IsSome), None
let argRanges = [{ IsNamedArgument = (getNamedParamName synExpr).IsSome; ArgumentRange = synExpr.Range }]
Found (parenRange.Start, argRanges, [(parenRange.End, getNamedParamName synExpr)], rpRangeOpt.IsSome), None
else
NotFound, None
| _ -> NotFound, None
Expand All @@ -107,8 +120,12 @@ module internal ParameterLocationsImpl =
match inner with
| None ->
if SyntaxTraversal.rangeContainsPosLeftEdgeExclusiveAndRightEdgeInclusive parenRange pos then
// argRange, isNamed
let argRanges =
synExprList
|> List.map (fun e -> { IsNamedArgument = (getNamedParamName e).IsSome; ArgumentRange = e.Range })
let commasAndCloseParen = ((synExprList, commaRanges@[parenRange]) ||> List.map2 (fun e c -> c.End, getNamedParamName e))
let r = Found (parenRange.Start, commasAndCloseParen, rpRangeOpt.IsSome)
let r = Found (parenRange.Start, argRanges, commasAndCloseParen, rpRangeOpt.IsSome)
r, None
else
NotFound, None
Expand All @@ -127,14 +144,14 @@ module internal ParameterLocationsImpl =

| SynExpr.ArbitraryAfterError (_debugStr, range) -> // single argument when e.g. after open paren you hit EOF
if SyntaxTraversal.rangeContainsPosEdgesExclusive range pos then
let r = Found (range.Start, [(range.End, None)], false)
let r = Found (range.Start, [], [(range.End, None)], false)
r, None
else
NotFound, None

| SynExpr.Const (SynConst.Unit, unitRange) ->
if SyntaxTraversal.rangeContainsPosEdgesExclusive unitRange pos then
let r = Found (unitRange.Start, [(unitRange.End, None)], true)
let r = Found (unitRange.Start, [], [(unitRange.End, None)], true)
r, None
else
NotFound, None
Expand All @@ -145,7 +162,7 @@ module internal ParameterLocationsImpl =
| None ->
if SyntaxTraversal.rangeContainsPosEdgesExclusive e.Range pos then
// any other expression doesn't start with parens, so if it was the target of an App, then it must be a single argument e.g. "f x"
Found (e.Range.Start, [ (e.Range.End, None) ], false), Some inner
Found (e.Range.Start, [], [ (e.Range.End, None) ], false), Some inner
else
NotFound, Some inner
| _ -> NotFound, Some inner
Expand All @@ -157,7 +174,7 @@ module internal ParameterLocationsImpl =
let betweenTheBrackets = mkRange wholem.FileName openm.Start wholem.End
if SyntaxTraversal.rangeContainsPosEdgesExclusive betweenTheBrackets pos && args |> List.forall isStaticArg then
let commasAndCloseParen = [ for c in commas -> c.End ] @ [ wholem.End ]
Some (ParameterLocations(pathOfLid lid, lidm, openm.Start, commasAndCloseParen, closemOpt.IsSome, args |> List.map digOutIdentFromStaticArg))
Some (ParameterLocations(pathOfLid lid, lidm, openm.Start, [], commasAndCloseParen, closemOpt.IsSome, args |> List.map digOutIdentFromStaticArg))
else
None
| _ ->
Expand All @@ -173,9 +190,9 @@ module internal ParameterLocationsImpl =
| SynExpr.New (_, synType, synExpr, _) ->
let constrArgsResult, cacheOpt = searchSynArgExpr traverseSynExpr pos synExpr
match constrArgsResult, cacheOpt with
| Found(parenLoc, args, isThereACloseParen), _ ->
| Found(parenLoc, argRanges, commasAndCloseParen, isThereACloseParen), _ ->
let typeName = getTypeName synType
Some (ParameterLocations(typeName, synType.Range, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd))
Some (ParameterLocations(typeName, synType.Range, parenLoc, argRanges, commasAndCloseParen |> List.map fst, isThereACloseParen, commasAndCloseParen |> List.map snd))
| NotFound, Some cache ->
cache
| _ ->
Expand All @@ -194,7 +211,7 @@ module internal ParameterLocationsImpl =
if SyntaxTraversal.rangeContainsPosEdgesExclusive typeArgsm pos then
// We found it, dig out ident
match digOutIdentFromFuncExpr synExpr with
| Some(lid, lidRange) -> Some (ParameterLocations(lid, lidRange, op.idRange.Start, [ wholem.End ], false, []))
| Some(lid, lidRange) -> Some (ParameterLocations(lid, lidRange, op.idRange.Start, [], [ wholem.End ], false, []))
| None -> None
else
None
Expand All @@ -209,7 +226,7 @@ module internal ParameterLocationsImpl =
// Search the argument
let xResult, cacheOpt = searchSynArgExpr traverseSynExpr pos synExpr2
match xResult, cacheOpt with
| Found(parenLoc, args, isThereACloseParen), _ ->
| Found(parenLoc, argRanges, commasAndCloseParen, isThereACloseParen), _ ->
// We found it, dig out ident
match digOutIdentFromFuncExpr synExpr with
| Some(lid, lidRange) ->
Expand All @@ -219,7 +236,7 @@ module internal ParameterLocationsImpl =
// For now, we don't support infix operators.
None
else
Some (ParameterLocations(lid, lidRange, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd))
Some (ParameterLocations(lid, lidRange, parenLoc, argRanges, commasAndCloseParen |> List.map fst, isThereACloseParen, commasAndCloseParen |> List.map snd))
| None -> None
| NotFound, Some cache -> cache
| _ -> traverseSynExpr synExpr2
Expand All @@ -232,7 +249,8 @@ module internal ParameterLocationsImpl =
let typeArgsm = mkRange openm.FileName openm.Start wholem.End
if SyntaxTraversal.rangeContainsPosEdgesExclusive typeArgsm pos && tyArgs |> List.forall isStaticArg then
let commasAndCloseParen = [ for c in commas -> c.End ] @ [ wholem.End ]
let r = ParameterLocations(["dummy"], synExpr.Range, openm.Start, commasAndCloseParen, closemOpt.IsSome, tyArgs |> List.map digOutIdentFromStaticArg)
let argRanges = tyArgs |> List.map (fun tyarg -> { IsNamedArgument = false; ArgumentRange = tyarg.Range })
let r = ParameterLocations(["dummy"], synExpr.Range, openm.Start, argRanges, commasAndCloseParen, closemOpt.IsSome, tyArgs |> List.map digOutIdentFromStaticArg)
Some r
else
None
Expand All @@ -253,10 +271,10 @@ module internal ParameterLocationsImpl =
// inherit ty(expr) --- treat it like an application (constructor call)
let xResult, _cacheOpt = searchSynArgExpr defaultTraverse pos expr
match xResult with
| Found(parenLoc, args, isThereACloseParen) ->
| Found(parenLoc, argRanges, commasAndCloseParen, isThereACloseParen) ->
// we found it, dig out ident
let typeName = getTypeName ty
let r = ParameterLocations(typeName, ty.Range, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd)
let r = ParameterLocations(typeName, ty.Range, parenLoc, argRanges, commasAndCloseParen |> List.map fst, isThereACloseParen, commasAndCloseParen |> List.map snd)
Some r
| NotFound -> None
else None
Expand All @@ -276,7 +294,6 @@ type ParameterLocations with
r
| _ -> None


module internal SynExprAppLocationsImpl =
let rec private searchSynArgExpr traverseSynExpr expr ranges =
match expr with
Expand Down
8 changes: 7 additions & 1 deletion src/fsharp/service/ServiceParamInfoLocations.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ namespace FSharp.Compiler.EditorServices
open FSharp.Compiler.Syntax
open FSharp.Compiler.Text

/// Represents the location of a tupled argument, which can optionally be a named argument.
type TupledArgumentLocation = { IsNamedArgument: bool; ArgumentRange: range }

/// Represents the locations relevant to activating parameter info in an IDE
[<Sealed>]
type public ParameterLocations =
Expand All @@ -33,7 +36,10 @@ type public ParameterLocations =
member IsThereACloseParen : bool

/// Either empty or a name if an actual named parameter; f(0,a=4,?b=None) would be [|None; Some "a"; Some "b"|]
member NamedParamNames : string option []
member NamedParamNames : string option []

/// Array of locations for each argument, and a flag if that argument is named
member ArgumentLocations: TupledArgumentLocation []

/// Find the information about parameter info locations at a particular source location
static member Find : pos * ParsedInput -> ParameterLocations option
Expand Down
Loading