diff --git a/src/Compiler/Checking/CheckDeclarations.fs b/src/Compiler/Checking/CheckDeclarations.fs
index 0d9b0df134b..7b30fcdb257 100644
--- a/src/Compiler/Checking/CheckDeclarations.fs
+++ b/src/Compiler/Checking/CheckDeclarations.fs
@@ -512,7 +512,8 @@ module TcRecdUnionAndEnumDeclarations =
rfields, thisTy
- | SynUnionCaseKind.FullType (ty, arity) ->
+ | SynUnionCaseKind.FullType ty ->
+ let arity = mkArityForType ty
let tyR, _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty
let curriedArgTys, recordTy = GetTopTauTypeInFSharpForm g (arity |> TranslateSynValInfo m (TcAttributes cenv env) |> TranslatePartialValReprInfo []).ArgInfos tyR m
@@ -882,7 +883,7 @@ module MutRecBindingChecking =
| SynMemberDefn.Member (bind, m), _ ->
// Phase2A: member binding - create prelim valspec (for recursive reference) and RecursiveBindingInfo
let NormalizedBinding(_, _, _, _, _, _, _, valSynData, _, _, _, _) as bind = BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForTycon bind
- let (SynValData(memberFlagsOpt, _, _)) = valSynData
+ let (SynValData2(memberFlagsOpt, _, _)) = valSynData
match tcref.TypeOrMeasureKind with
| TyparKind.Type -> ()
@@ -2362,7 +2363,8 @@ module EstablishTypeDefinitionCores =
let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty
yield (tyR, m)
- | SynUnionCaseKind.FullType (ty, arity) ->
+ | SynUnionCaseKind.FullType ty ->
+ let arity = mkArityForType ty
let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty
let curriedArgTys, _ = GetTopTauTypeInFSharpForm g (arity |> TranslateSynValInfo m (TcAttributes cenv env) |> TranslatePartialValReprInfo []).ArgInfos tyR m
@@ -2544,7 +2546,9 @@ module EstablishTypeDefinitionCores =
// '' documentation is allowed for delegates
let paramNames =
match synTyconRepr with
- | SynTypeDefnSimpleRepr.General (SynTypeDefnKind.Delegate (_ty, arity), _, _, _, _, _, _, _) -> arity.ArgNames
+ | SynTypeDefnSimpleRepr.General (SynTypeDefnKind.Delegate ty, _, _, _, _, _, _, _) ->
+ let arity = mkArityForType ty
+ arity.ArgNames
| SynTypeDefnSimpleRepr.General (SynTypeDefnKind.Unspecified, _, _, _, _, _, Some synPats, _) ->
let rec patName (p: SynSimplePat) =
match p with
@@ -3333,7 +3337,8 @@ module EstablishTypeDefinitionCores =
structLayoutAttributeCheck(not isIncrClass)
allowNullLiteralAttributeCheck()
TFSharpClass
- | SynTypeDefnKind.Delegate (ty, arity) ->
+ | SynTypeDefnKind.Delegate ty ->
+ let arity = mkArityForType ty
noCLIMutableAttributeCheck()
noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedDelegate
structLayoutAttributeCheck false
@@ -4008,14 +4013,14 @@ module TcDeclarations =
let mLetPortion = synExpr.Range
let fldId = ident (CompilerGeneratedName id.idText, mLetPortion)
let headPat = SynPat.LongIdent (SynLongIdent([fldId], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [], None, mLetPortion)
- let retInfo = match tyOpt with None -> None | Some ty -> Some (SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range))
+
let isMutable =
match propKind with
| SynMemberKind.PropertySet
| SynMemberKind.PropertyGetSet -> true
| _ -> false
let attribs = mkAttributeList attribs mWholeAutoProp
- let binding = mkSynBinding (xmlDoc, headPat) (None, false, isMutable, mLetPortion, DebugPointAtBinding.NoneAtInvisible, retInfo, synExpr, synExpr.Range, [], attribs, None, SynBindingTrivia.Zero)
+ let binding = mkSynBinding (xmlDoc, headPat) (None, false, isMutable, mLetPortion, DebugPointAtBinding.NoneAtInvisible, tyOpt, synExpr, synExpr.Range, [], attribs, None, SynBindingTrivia.Zero)
[(SynMemberDefn.LetBindings ([binding], isStatic, false, mWholeAutoProp))]
@@ -4050,9 +4055,8 @@ module TcDeclarations =
| SynMemberKind.PropertyGetSet ->
let getter =
let rhsExpr = SynExpr.Ident fldId
- let retInfo = match tyOpt with None -> None | Some ty -> Some (SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range))
let attribs = mkAttributeList attribs mMemberPortion
- let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, retInfo, rhsExpr, rhsExpr.Range, [], attribs, Some memberFlags, SynBindingTrivia.Zero)
+ let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, tyOpt, rhsExpr, rhsExpr.Range, [], attribs, Some memberFlags, SynBindingTrivia.Zero)
SynMemberDefn.Member (binding, mMemberPortion)
yield getter
| _ -> ()
@@ -4084,7 +4088,7 @@ module TcDeclarations =
let isConcrete =
members |> List.exists (function
- | SynMemberDefn.Member(SynBinding(valData = SynValData(Some memberFlags, _, _)), _) -> not memberFlags.IsDispatchSlot
+ | SynMemberDefn.Member(SynBinding(valData = SynValData(Some memberFlags, _)), _) -> not memberFlags.IsDispatchSlot
| SynMemberDefn.Interface (members=defOpt) -> Option.isSome defOpt
| SynMemberDefn.LetBindings _ -> true
| SynMemberDefn.ImplicitCtor _ -> true
@@ -4242,10 +4246,11 @@ module TcDeclarations =
// members of the type
let preEstablishedHasDefaultCtor =
members |> List.exists (function
- | SynMemberSig.Member (synValSig, memberFlags, _) ->
+ | SynMemberSig.Member (SynValSig(synType = ty) as synValSig, memberFlags, _) ->
memberFlags.MemberKind=SynMemberKind.Constructor &&
// REVIEW: This is a syntactic approximation
- (match synValSig.SynType, synValSig.SynInfo.CurriedArgInfos with
+ let arity = mkArityForType ty
+ (match synValSig.SynType, arity.CurriedArgInfos with
| StripParenTypes (SynType.Fun (argType = StripParenTypes (SynType.LongIdent (SynLongIdent([id], _, _))))), [[_]] when id.idText = "unit" -> true
| _ -> false)
| _ -> false)
@@ -4584,7 +4589,7 @@ and TcModuleOrNamespaceSignatureElementsNonMutRec cenv parent env (id, moduleKin
let ElimSynModuleDeclExpr bind =
match bind with
| SynModuleDecl.Expr (expr, m) ->
- let bind2 = SynBinding (None, SynBindingKind.StandaloneExpression, false, false, [], PreXmlDoc.Empty, SynInfo.emptySynValData, SynPat.Wild m, None, expr, m, DebugPointAtBinding.NoneAtDo, SynBindingTrivia.Zero)
+ let bind2 = SynBinding (None, SynBindingKind.StandaloneExpression, false, false, [], PreXmlDoc.Empty, SynValData(None, None), SynPat.Wild m, None, expr, m, DebugPointAtBinding.NoneAtDo, SynBindingTrivia.Zero)
SynModuleDecl.Let(false, [bind2], m)
| _ -> bind
diff --git a/src/Compiler/Checking/CheckExpressions.fs b/src/Compiler/Checking/CheckExpressions.fs
index 537887747d6..e7a73d8e8aa 100644
--- a/src/Compiler/Checking/CheckExpressions.fs
+++ b/src/Compiler/Checking/CheckExpressions.fs
@@ -2266,7 +2266,7 @@ let PushOnePatternToRhs (cenv: cenv) isMember synPat (NormalizedBindingRhs(simpl
NormalizedBindingRhs(simplePats :: simplePatsList, retTyOpt, rhsExpr)
type NormalizedBindingPatternInfo =
- NormalizedBindingPat of SynPat * NormalizedBindingRhs * SynValData * SynValTyparDecls
+ NormalizedBindingPat of SynPat * NormalizedBindingRhs * SynValData2 * SynValTyparDecls
/// Represents a syntactic, unchecked binding after the resolution of the name resolution status of pattern
/// constructors and after "pushing" all complex patterns to the right hand side.
@@ -2279,7 +2279,7 @@ type NormalizedBinding =
attribs: SynAttribute list *
xmlDoc: XmlDoc *
typars: SynValTyparDecls *
- valSynData: SynValData *
+ valSynData: SynValData2 *
pat: SynPat *
rhsExpr: NormalizedBindingRhs *
mBinding: range *
@@ -2298,14 +2298,14 @@ module BindingNormalization =
let private MakeNormalizedStaticOrValBinding (cenv: cenv) isObjExprBinding id vis typars args rhsExpr valSynData =
- let (SynValData(memberFlagsOpt, _, _)) = valSynData
+ let (SynValData2(memberFlagsOpt, _, _)) = valSynData
NormalizedBindingPat(mkSynPatVar vis id, PushMultiplePatternsToRhs cenv ((isObjExprBinding = ObjExprBinding) || Option.isSome memberFlagsOpt) args rhsExpr, valSynData, typars)
let private MakeNormalizedInstanceMemberBinding (cenv: cenv) thisId memberId toolId vis m typars args rhsExpr valSynData =
NormalizedBindingPat(SynPat.InstanceMember(thisId, memberId, toolId, vis, m), PushMultiplePatternsToRhs cenv true args rhsExpr, valSynData, typars)
let private NormalizeStaticMemberBinding (cenv: cenv) (memberFlags: SynMemberFlags) valSynData id vis typars args m rhsExpr =
- let (SynValData(_, valSynInfo, thisIdOpt)) = valSynData
+ let (SynValData2(_, valSynInfo, thisIdOpt)) = valSynData
if memberFlags.IsInstance then
// instance method without adhoc "this" argument
error(Error(FSComp.SR.tcInstanceMemberRequiresTarget(), m))
@@ -2319,7 +2319,7 @@ module BindingNormalization =
// static property: these transformed into methods taking one "unit" argument
| [], SynMemberKind.Member ->
let memberFlags = {memberFlags with MemberKind = SynMemberKind.PropertyGet}
- let valSynData = SynValData(Some memberFlags, valSynInfo, thisIdOpt)
+ let valSynData = SynValData2(Some memberFlags, valSynInfo, thisIdOpt)
NormalizedBindingPat(mkSynPatVar vis id,
PushOnePatternToRhs cenv true (SynPat.Const(SynConst.Unit, m)) rhsExpr,
valSynData,
@@ -2327,7 +2327,7 @@ module BindingNormalization =
| _ -> MakeNormalizedStaticOrValBinding cenv ValOrMemberBinding id vis typars args rhsExpr valSynData
let private NormalizeInstanceMemberBinding (cenv: cenv) (memberFlags: SynMemberFlags) valSynData thisId memberId (toolId: Ident option) vis typars args m rhsExpr =
- let (SynValData(_, valSynInfo, thisIdOpt)) = valSynData
+ let (SynValData2(_, valSynInfo, thisIdOpt)) = valSynData
if not memberFlags.IsInstance then
// static method with adhoc "this" argument
@@ -2351,7 +2351,7 @@ module BindingNormalization =
(SynPat.InstanceMember(thisId, memberId, toolId, vis, m),
PushOnePatternToRhs cenv true (SynPat.Const(SynConst.Unit, m)) rhsExpr,
// Update the member info to record that this is a SynMemberKind.PropertyGet
- SynValData(Some memberFlags, valSynInfo, thisIdOpt),
+ SynValData2(Some memberFlags, valSynInfo, thisIdOpt),
typars)
| _ ->
@@ -2359,7 +2359,7 @@ module BindingNormalization =
let private NormalizeBindingPattern (cenv: cenv) nameResolver isObjExprBinding (env: TcEnv) valSynData headPat rhsExpr =
let ad = env.AccessRights
- let (SynValData(memberFlagsOpt, _, _)) = valSynData
+ let (SynValData2(memberFlagsOpt, _, _)) = valSynData
let rec normPattern pat =
// One major problem with versions of F# prior to 1.9.x was that data constructors easily 'pollute' the namespace
// of available items, to the point that you can't even define a function with the same name as an existing union case.
@@ -2423,7 +2423,17 @@ module BindingNormalization =
let NormalizeBinding isObjExprBinding (cenv: cenv) (env: TcEnv) binding =
match binding with
- | SynBinding (vis, kind, isInline, isMutable, Attributes attrs, xmlDoc, valSynData, headPat, retInfo, rhsExpr, mBinding, debugPoint, _) ->
+ | SynBinding (vis, kind, isInline, isMutable, Attributes attrs, xmlDoc, _, headPat, retInfo, rhsExpr, mBinding, debugPoint, _) ->
+ let valSynData = inferSynValDataFromBinding binding
+
+ let retInfo : SynBindingReturnInfo option =
+ match retInfo with
+ | Some (SynType.SignatureParameter(attributes, _, _, usedType, m)) ->
+ Some(SynBindingReturnInfo(usedType, m, attributes))
+ | Some t ->
+ Some(SynBindingReturnInfo(t, t.Range, []))
+ | None -> None
+
let (NormalizedBindingPat(pat, rhsExpr, valSynData, typars)) =
NormalizeBindingPattern cenv cenv.nameResolver isObjExprBinding env valSynData headPat (NormalizedBindingRhs ([], retInfo, rhsExpr))
let paramNames = Some valSynData.SynValInfo.ArgNames
@@ -2459,10 +2469,10 @@ module EventDeclarationNormalization =
| _ -> error(BadEventTransformation m)
let private ConvertSynData m valSynData =
- let (SynValData(memberFlagsOpt, valSynInfo, thisIdOpt)) = valSynData
+ let (SynValData2(memberFlagsOpt, valSynInfo, thisIdOpt)) = valSynData
let memberFlagsOpt = ConvertMemberFlagsOpt m memberFlagsOpt
let valSynInfo = ConvertSynInfo m valSynInfo
- SynValData(memberFlagsOpt, valSynInfo, thisIdOpt)
+ SynValData2(memberFlagsOpt, valSynInfo, thisIdOpt)
let rec private RenameBindingPattern f declPattern =
match declPattern with
@@ -4061,7 +4071,8 @@ and TcPseudoMemberSpec cenv newOk env synTypes tpenv synMemberSig m =
/// Check a value specification, e.g. in a signature, interface declaration or a constraint
and TcValSpec (cenv: cenv) env declKind newOk containerInfo memFlagsOpt thisTyOpt tpenv synValSig attrs =
let g = cenv.g
- let (SynValSig(ident=SynIdent(id,_); explicitTypeParams=ValTyparDecls (synTypars, synTyparConstraints, _); synType=ty; arity=valSynInfo; range=m)) = synValSig
+ let (SynValSig(ident=SynIdent(id,_); explicitTypeParams=ValTyparDecls (synTypars, synTyparConstraints, _); synType=ty; range=m)) = synValSig
+ let valSynInfo = mkArityForType ty
let declaredTypars = TcTyparDecls cenv env synTypars
let (ContainerInfo(altActualParent, tcrefContainerInfo)) = containerInfo
@@ -4353,9 +4364,11 @@ and TcTypeOrMeasure kindOpt (cenv: cenv) newOk checkConstraints occ (iwsam: Warn
| SynType.App(arg1, _, args, _, _, postfix, m) ->
TcTypeMeasureApp kindOpt cenv newOk checkConstraints occ env tpenv arg1 args postfix m
- | SynType.Paren(innerType, _) ->
+ | SynType.Paren(innerType, _)
+ | SynType.SignatureParameter(usedType = innerType) ->
TcTypeOrMeasure kindOpt cenv newOk checkConstraints occ iwsam env tpenv innerType
+
and CheckIWSAM (cenv: cenv) (env: TcEnv) checkConstraints iwsam m tcref =
let g = cenv.g
let ad = env.eAccessRights
@@ -6590,7 +6603,7 @@ and TcRecordConstruction (cenv: cenv) (overallTy: TType) env tpenv withExprInfoO
and GetNameAndSynValInfoOfObjExprBinding _cenv _env b =
let (NormalizedBinding (_, _, _, _, _, _, _, valSynData, pat, rhsExpr, mBinding, _)) = b
- let (SynValData(memberFlagsOpt, valSynInfo, _)) = valSynData
+ let (SynValData2(memberFlagsOpt, valSynInfo, _)) = valSynData
match pat, memberFlagsOpt with
// This is the normal case for F# 'with member x.M(...) = ...'
@@ -6682,7 +6695,7 @@ and TcObjectExprBinding (cenv: cenv) (env: TcEnv) implTy tpenv (absSlotInfo, bin
let g = cenv.g
let (NormalizedBinding(vis, kind, isInline, isMutable, attrs, xmlDoc, synTyparDecls, valSynData, headPat, bindingRhs, mBinding, debugPoint)) = bind
- let (SynValData(memberFlagsOpt, _, _)) = valSynData
+ let (SynValData2(memberFlagsOpt, _, _)) = valSynData
// 4a2. adjust the binding, especially in the "member" case, a subset of the logic of AnalyzeAndMakeAndPublishRecursiveValue
let bindingRhs, logicalMethId, memberFlags =
@@ -6762,7 +6775,7 @@ and ComputeObjectExprOverrides (cenv: cenv) (env: TcEnv) tpenv impls =
let binds, bindsAttributes =
[ for binding in binds do
let (NormalizedBinding(_, _, _, _, bindingSynAttribs, _, _, valSynData, _, _, _, _)) = binding
- let (SynValData(memberFlagsOpt, _, _)) = valSynData
+ let (SynValData2(memberFlagsOpt, _, _)) = valSynData
let attrTgt = ObjectExpressionOverrideBinding.AllowedAttribTargets memberFlagsOpt
let bindingAttribs = TcAttributes cenv env attrTgt bindingSynAttribs
yield binding, bindingAttribs
@@ -10176,7 +10189,7 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt
match bind with
| NormalizedBinding(vis, kind, isInline, isMutable, attrs, xmlDoc, _, valSynData, pat, NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr), mBinding, debugPoint) ->
- let (SynValData(memberFlagsOpt, _, _)) = valSynData
+ let (SynValData2(memberFlagsOpt, _, _)) = valSynData
let callerName =
match declKind, kind, pat with
@@ -10234,8 +10247,8 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt
match rotRetSynAttrs with
| [] -> valSynData
| {Range=mHead} :: _ ->
- let (SynValData(valMf, SynValInfo(args, SynArgInfo(attrs, opt, retId)), valId)) = valSynData
- SynValData(valMf, SynValInfo(args, SynArgInfo({Attributes=rotRetSynAttrs; Range=mHead} :: attrs, opt, retId)), valId)
+ let (SynValData2(valMf, SynValInfo(args, SynArgInfo(attrs, opt, retId)), valId)) = valSynData
+ SynValData2(valMf, SynValInfo(args, SynArgInfo({Attributes=rotRetSynAttrs; Range=mHead} :: attrs, opt, retId)), valId)
retAttribs, valAttribs, valSynData
let isVolatile = HasFSharpAttribute g g.attrib_VolatileFieldAttribute valAttribs
@@ -10312,7 +10325,7 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt
let isCompGen = false
// Use the syntactic arity if we're defining a function
- let (SynValData(_, valSynInfo, _)) = valSynData
+ let (SynValData2(_, valSynInfo, _)) = valSynData
let prelimValReprInfo = TranslateSynValInfo mBinding (TcAttributes cenv env) valSynInfo
// Check the pattern of the l.h.s. of the binding
@@ -11350,7 +11363,7 @@ and AnalyzeAndMakeAndPublishRecursiveValue
// Pull apart the inputs
let (NormalizedBinding(vis1, bindingKind, isInline, isMutable, bindingSynAttribs, bindingXmlDoc, synTyparDecls, valSynData, declPattern, bindingRhs, mBinding, debugPoint)) = binding
let (NormalizedBindingRhs(_, _, bindingExpr)) = bindingRhs
- let (SynValData(memberFlagsOpt, valSynInfo, thisIdOpt)) = valSynData
+ let (SynValData2(memberFlagsOpt, valSynInfo, thisIdOpt)) = valSynData
let (ContainerInfo(altActualParent, tcrefContainerInfo)) = containerInfo
let attrTgt = declKind.AllowedAttribTargets memberFlagsOpt
diff --git a/src/Compiler/Checking/CheckExpressions.fsi b/src/Compiler/Checking/CheckExpressions.fsi
index 0bbaca89177..ad70af60fbc 100644
--- a/src/Compiler/Checking/CheckExpressions.fsi
+++ b/src/Compiler/Checking/CheckExpressions.fsi
@@ -261,7 +261,7 @@ type NormalizedBinding =
attribs: SynAttribute list *
xmlDoc: XmlDoc *
typars: SynValTyparDecls *
- valSynData: SynValData *
+ valSynData: SynValData2 *
pat: SynPat *
rhsExpr: NormalizedBindingRhs *
mBinding: range *
diff --git a/src/Compiler/Interactive/fsi.fs b/src/Compiler/Interactive/fsi.fs
index 316dfd429bb..291e48deeae 100644
--- a/src/Compiler/Interactive/fsi.fs
+++ b/src/Compiler/Interactive/fsi.fs
@@ -1881,7 +1881,7 @@ type internal FsiDynamicCompiler(
let m = expr.Range
let itName = "it"
let itID = mkSynId m itName
- let mkBind pat expr = SynBinding (None, SynBindingKind.Do, false, false, [], PreXmlDoc.Empty, SynInfo.emptySynValData, pat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, SynBindingTrivia.Zero)
+ let mkBind pat expr = SynBinding (None, SynBindingKind.Do, false, false, [], PreXmlDoc.Empty, SynValData(None,None), pat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, SynBindingTrivia.Zero)
let bindingA = mkBind (mkSynPatVar None itID) expr
let defA = SynModuleDecl.Let (false, [bindingA], m)
[defA]
diff --git a/src/Compiler/Service/FSharpParseFileResults.fs b/src/Compiler/Service/FSharpParseFileResults.fs
index fe5afbfc4ab..4a2bd84337f 100644
--- a/src/Compiler/Service/FSharpParseFileResults.fs
+++ b/src/Compiler/Service/FSharpParseFileResults.fs
@@ -6,6 +6,7 @@ open System
open System.IO
open System.Collections.Generic
open System.Diagnostics
+open FSharp.Compiler.QuotationPickler
open Internal.Utilities.Library
open Internal.Utilities.Library.Extras
open FSharp.Compiler.Diagnostics
@@ -14,6 +15,7 @@ open FSharp.Compiler.Syntax
open FSharp.Compiler.SyntaxTreeOps
open FSharp.Compiler.Text
open FSharp.Compiler.Text.Range
+open FSharp.Compiler.TypedTreeOps
module SourceFileImpl =
let IsSignatureFile file =
@@ -407,8 +409,9 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
override _.VisitBinding(_path, _, binding) =
match binding with
- | SynBinding (valData = valData; range = range) when rangeContainsPos range pos ->
- let info = valData.SynValInfo.CurriedArgInfos
+ | SynBinding (range = range) when rangeContainsPos range pos ->
+ let valSynData = inferSynValDataFromBinding binding
+ let info = valSynData.SynValInfo.CurriedArgInfos
let mutable found = false
for group in info do
@@ -454,7 +457,8 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
// let x : int = 12
match binding with
| SynBinding (headPat = SynPat.Named (range = patRange)
- returnInfo = Some (SynBindingReturnInfo(typeName = SynType.LongIdent _))) -> Some patRange
+ returnInfo = Some (SynType.LongIdent _
+ | SynType.SignatureParameter(usedType = SynType.LongIdent _))) -> Some patRange
| _ -> defaultTraverse binding
}
diff --git a/src/Compiler/Service/ServiceNavigation.fs b/src/Compiler/Service/ServiceNavigation.fs
index 11ebea8a668..2bf3aa55f68 100755
--- a/src/Compiler/Service/ServiceNavigation.fs
+++ b/src/Compiler/Service/ServiceNavigation.fs
@@ -119,7 +119,7 @@ module NavigationImpl =
| SynUnionCaseKind.Fields (flds) ->
flds
|> List.fold (fun st (SynField (_, _, _, _, _, _, _, m)) -> unionRangesChecked m st) range.Zero
- | SynUnionCaseKind.FullType (ty, _) -> ty.Range
+ | SynUnionCaseKind.FullType ty -> ty.Range
let bodyRange mBody decls =
unionRangesChecked (rangeOfDecls decls) mBody
@@ -168,7 +168,7 @@ module NavigationImpl =
// Process let-binding
let processBinding isMember enclosingEntityKind isAbstract synBinding =
let (SynBinding (valData = valData; headPat = synPat; expr = synExpr)) = synBinding
- let (SynValData (memberOpt, _, _)) = valData
+ let (SynValData (memberOpt, _)) = valData
let m =
match synExpr with
@@ -792,7 +792,7 @@ module NavigateTo =
let addBinding synBinding itemKind container =
let (SynBinding (valData = valData; headPat = headPat)) = synBinding
- let (SynValData (memberFlagsOpt, _, _)) = valData
+ let (SynValData (memberFlagsOpt, _)) = valData
let kind =
match itemKind with
diff --git a/src/Compiler/Service/ServiceParsedInputOps.fs b/src/Compiler/Service/ServiceParsedInputOps.fs
index d41cef4a04b..a9a28fbf7ea 100644
--- a/src/Compiler/Service/ServiceParsedInputOps.fs
+++ b/src/Compiler/Service/ServiceParsedInputOps.fs
@@ -646,7 +646,7 @@ module ParsedInput =
|> Option.orElseWith (fun () -> walkExpr e)
|> Option.orElseWith (fun () ->
match returnInfo with
- | Some (SynBindingReturnInfo (t, _, _)) -> walkType t
+ | Some t -> walkType t
| None -> None)
and walkInterfaceImpl (SynInterfaceImpl (bindings = bindings)) = List.tryPick walkBinding bindings
@@ -913,7 +913,7 @@ module ParsedInput =
and walkUnionCaseType inp =
match inp with
| SynUnionCaseKind.Fields fields -> List.tryPick walkField fields
- | SynUnionCaseKind.FullType (t, _) -> walkType t
+ | SynUnionCaseKind.FullType t -> walkType t
and walkUnionCase synUnionCase =
let (SynUnionCase (attributes = Attributes attrs; caseType = t)) = synUnionCase
@@ -1652,7 +1652,7 @@ module ParsedInput =
List.iter walkAttribute attrs
walkPat pat
walkExpr e
- returnInfo |> Option.iter (fun (SynBindingReturnInfo (t, _, _)) -> walkType t)
+ returnInfo |> Option.iter walkType
and walkInterfaceImpl (SynInterfaceImpl (bindings = bindings)) = List.iter walkBinding bindings
@@ -1675,6 +1675,10 @@ module ParsedInput =
| SynType.WithGlobalConstraints (t, typeConstraints, _) ->
walkType t
List.iter walkTypeConstraint typeConstraints
+ | SynType.SignatureParameter (Attributes attributes, _, id, t, _) ->
+ Option.iter addIdent id
+ walkType t
+ List.iter walkAttribute attributes
| _ -> ()
and walkClause (SynMatchClause (pat = pat; whenExpr = e1; resultExpr = e2)) =
@@ -1838,14 +1842,10 @@ module ParsedInput =
List.iter walkAttribute attrs
walkType t
- and walkValSig (SynValSig (attributes = Attributes attrs; synType = t; arity = SynValInfo (argInfos, argInfo))) =
+ and walkValSig (SynValSig (attributes = Attributes attrs; synType = t)) =
List.iter walkAttribute attrs
walkType t
- argInfo :: (argInfos |> List.concat)
- |> List.collect (fun (SynArgInfo (Attributes attrs, _, _)) -> attrs)
- |> List.iter walkAttribute
-
and walkMemberSig membSig =
match membSig with
| SynMemberSig.Inherit (t, _)
@@ -1898,7 +1898,7 @@ module ParsedInput =
and walkUnionCaseType kind =
match kind with
| SynUnionCaseKind.Fields fields -> List.iter walkField fields
- | SynUnionCaseKind.FullType (t, _) -> walkType t
+ | SynUnionCaseKind.FullType t -> walkType t
and walkUnionCase (SynUnionCase (attributes = Attributes attrs; caseType = t)) =
List.iter walkAttribute attrs
diff --git a/src/Compiler/Service/ServiceStructure.fs b/src/Compiler/Service/ServiceStructure.fs
index cbc625f709b..b14ae493813 100644
--- a/src/Compiler/Service/ServiceStructure.fs
+++ b/src/Compiler/Service/ServiceStructure.fs
@@ -566,7 +566,6 @@ module Structure =
| SynValData (Some {
MemberKind = SynMemberKind.Constructor
},
- _,
_) ->
let collapse = Range.endToEnd synPat.Range d.Range
rcheck Scope.New Collapse.Below d.Range collapse
@@ -574,7 +573,6 @@ module Structure =
| SynValData (Some {
MemberKind = SynMemberKind.PropertyGet | SynMemberKind.PropertySet
},
- _,
_) ->
let range = mkRange d.Range.FileName (mkPos d.Range.StartLine objectModelRange.StartColumn) d.Range.End
diff --git a/src/Compiler/Service/ServiceXmlDocParser.fs b/src/Compiler/Service/ServiceXmlDocParser.fs
index f0b137b4bb8..bccb556ac15 100644
--- a/src/Compiler/Service/ServiceXmlDocParser.fs
+++ b/src/Compiler/Service/ServiceXmlDocParser.fs
@@ -7,6 +7,8 @@ open FSharp.Compiler.Syntax
open FSharp.Compiler.Text
open FSharp.Compiler.Text.Range
open FSharp.Compiler.Xml
+open FSharp.Compiler.TypedTree
+open FSharp.Compiler.TypedTreeOps
/// Represent an Xml documentation block in source code
type XmlDocable = XmlDocable of line: int * indent: int * paramNames: string list
@@ -43,10 +45,11 @@ module XmlDocParsing =
| SynPat.FromParseError _ -> []
let getParamNames binding =
- let (SynBinding (valData = synValData; headPat = synPat)) = binding
+ let (SynBinding (headPat = synPat)) = binding
+ let synValData = inferSynValDataFromBinding binding
match synValData with
- | SynValData (_, SynValInfo (curriedArgs, _), _) when not curriedArgs.IsEmpty ->
+ | SynValData2 (_, SynValInfo (curriedArgs, _), _) when not curriedArgs.IsEmpty ->
let parameters =
[
for args in curriedArgs do
@@ -175,14 +178,16 @@ module XmlDocParsing =
|> List.collect getXmlDocablesSynMemberDefn
| SynMemberDefn.AbstractSlot (valSig, _, range) ->
- let (SynValSig (attributes = synAttributes; arity = synValInfo; xmlDoc = preXmlDoc)) =
+ let (SynValSig (attributes = synAttributes; xmlDoc = preXmlDoc; synType = ty)) =
valSig
+ let arity = mkArityForType ty
+
if isEmptyXmlDoc preXmlDoc then
let fullRange = synAttributes |> List.fold (fun r a -> unionRanges r a.Range) range
let line = fullRange.StartLine
let indent = indentOf line
- let paramNames = synValInfo.ArgNames
+ let paramNames = arity.ArgNames
XmlDocable(line, indent, paramNames)
| SynMemberDefn.Interface (members = synMemberDefnsOption) ->
diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fs b/src/Compiler/SyntaxTree/ParseHelpers.fs
index f3e3fcdfdaf..67d8051ee72 100644
--- a/src/Compiler/SyntaxTree/ParseHelpers.fs
+++ b/src/Compiler/SyntaxTree/ParseHelpers.fs
@@ -421,11 +421,11 @@ let mkSynMemberDefnGetSet
(parseState: IParseState)
(opt_inline: bool)
(mWith: range)
- (classDefnMemberGetSetElements: (bool * SynAttributeList list * (SynPat * range) * SynReturnInfo option * range option * SynExpr * range) list)
+ (classDefnMemberGetSetElements: (bool * SynAttributeList list * (SynPat * range) * SynType option * range option * SynExpr * range) list)
(mAnd: range option)
(mWhole: range)
(propertyNameBindingPat: SynPat)
- (optPropertyType: SynReturnInfo option)
+ (optPropertyType: SynType option)
(visNoLongerUsed: SynAccess option)
(memFlagsBuilder: SynMemberKind -> SynMemberFlags)
(attrs: SynAttributeList list)
@@ -560,64 +560,66 @@ let mkSynMemberDefnGetSet
Some(memFlagsBuilder memberKind),
trivia)
- let (SynBinding (vis, _, isInline, _, attrs, doc, valSynData, pv, rhsRetInfo, rhsExpr, mBindLhs, spBind, trivia)) =
+ let (SynBinding (vis, _, isInline, _, attrs, doc, _valSynData, pv, rhsRetInfo, rhsExpr, mBindLhs, spBind, trivia)) =
binding
let mWholeBindLhs =
(mBindLhs, attrs)
||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
- let (SynValData (_, valSynInfo, _)) = valSynData
+ // let (SynValData (_, valSynInfo, _)) = valSynData
// Setters have all arguments tupled in their internal TAST form, though they don't appear to be
// tupled from the syntax
let memFlags: SynMemberFlags = memFlagsBuilder memberKind
- let valSynInfo =
- let adjustValueArg valueArg =
- match valueArg with
- | [ _ ] -> valueArg
- | _ -> SynInfo.unnamedTopArg
-
- match memberKind, valSynInfo, memFlags.IsInstance with
- | SynMemberKind.PropertyGet, SynValInfo ([], _ret), false
- | SynMemberKind.PropertyGet, SynValInfo ([ _ ], _ret), true ->
- raiseParseErrorAt mWholeBindLhs (FSComp.SR.parsGetterMustHaveAtLeastOneArgument ())
-
- | SynMemberKind.PropertyGet, SynValInfo (thisArg :: indexOrUnitArgs :: rest, ret), true ->
- if not rest.IsEmpty then
- reportParseErrorAt mWholeBindLhs (FSComp.SR.parsGetterAtMostOneArgument ())
-
- SynValInfo([ thisArg; indexOrUnitArgs ], ret)
-
- | SynMemberKind.PropertyGet, SynValInfo (indexOrUnitArgs :: rest, ret), false ->
- if not rest.IsEmpty then
- reportParseErrorAt mWholeBindLhs (FSComp.SR.parsGetterAtMostOneArgument ())
-
- SynValInfo([ indexOrUnitArgs ], ret)
-
- | SynMemberKind.PropertySet, SynValInfo ([ thisArg; valueArg ], ret), true ->
- SynValInfo([ thisArg; adjustValueArg valueArg ], ret)
-
- | SynMemberKind.PropertySet, SynValInfo (thisArg :: indexArgs :: valueArg :: rest, ret), true ->
- if not rest.IsEmpty then
- reportParseErrorAt mWholeBindLhs (FSComp.SR.parsSetterAtMostTwoArguments ())
-
- SynValInfo([ thisArg; indexArgs @ adjustValueArg valueArg ], ret)
-
- | SynMemberKind.PropertySet, SynValInfo ([ valueArg ], ret), false -> SynValInfo([ adjustValueArg valueArg ], ret)
-
- | SynMemberKind.PropertySet, SynValInfo (indexArgs :: valueArg :: rest, ret), _ ->
- if not rest.IsEmpty then
- reportParseErrorAt mWholeBindLhs (FSComp.SR.parsSetterAtMostTwoArguments ())
-
- SynValInfo([ indexArgs @ adjustValueArg valueArg ], ret)
-
- | _ ->
- // should be unreachable, cover just in case
- raiseParseErrorAt mWholeBindLhs (FSComp.SR.parsInvalidProperty ())
-
- let valSynData = SynValData(Some(memFlags), valSynInfo, None)
+ // TODO: this will surely bite me at some point
+
+ // let valSynInfo =
+ // let adjustValueArg valueArg =
+ // match valueArg with
+ // | [ _ ] -> valueArg
+ // | _ -> SynInfo.unnamedTopArg
+ //
+ // match memberKind, valSynInfo, memFlags.IsInstance with
+ // | SynMemberKind.PropertyGet, SynValInfo ([], _ret), false
+ // | SynMemberKind.PropertyGet, SynValInfo ([ _ ], _ret), true ->
+ // raiseParseErrorAt mWholeBindLhs (FSComp.SR.parsGetterMustHaveAtLeastOneArgument ())
+ //
+ // | SynMemberKind.PropertyGet, SynValInfo (thisArg :: indexOrUnitArgs :: rest, ret), true ->
+ // if not rest.IsEmpty then
+ // reportParseErrorAt mWholeBindLhs (FSComp.SR.parsGetterAtMostOneArgument ())
+ //
+ // SynValInfo([ thisArg; indexOrUnitArgs ], ret)
+ //
+ // | SynMemberKind.PropertyGet, SynValInfo (indexOrUnitArgs :: rest, ret), false ->
+ // if not rest.IsEmpty then
+ // reportParseErrorAt mWholeBindLhs (FSComp.SR.parsGetterAtMostOneArgument ())
+ //
+ // SynValInfo([ indexOrUnitArgs ], ret)
+ //
+ // | SynMemberKind.PropertySet, SynValInfo ([ thisArg; valueArg ], ret), true ->
+ // SynValInfo([ thisArg; adjustValueArg valueArg ], ret)
+ //
+ // | SynMemberKind.PropertySet, SynValInfo (thisArg :: indexArgs :: valueArg :: rest, ret), true ->
+ // if not rest.IsEmpty then
+ // reportParseErrorAt mWholeBindLhs (FSComp.SR.parsSetterAtMostTwoArguments ())
+ //
+ // SynValInfo([ thisArg; indexArgs @ adjustValueArg valueArg ], ret)
+ //
+ // | SynMemberKind.PropertySet, SynValInfo ([ valueArg ], ret), false -> SynValInfo([ adjustValueArg valueArg ], ret)
+ //
+ // | SynMemberKind.PropertySet, SynValInfo (indexArgs :: valueArg :: rest, ret), _ ->
+ // if not rest.IsEmpty then
+ // reportParseErrorAt mWholeBindLhs (FSComp.SR.parsSetterAtMostTwoArguments ())
+ //
+ // SynValInfo([ indexArgs @ adjustValueArg valueArg ], ret)
+ //
+ // | _ ->
+ // // should be unreachable, cover just in case
+ // raiseParseErrorAt mWholeBindLhs (FSComp.SR.parsInvalidProperty ())
+
+ let valSynData = SynValData(Some(memFlags), None)
// Fold together the information from the first lambda pattern and the get/set binding
// This uses the 'this' variable from the first and the patterns for the get/set binding,
@@ -857,3 +859,14 @@ let mkSynTypeTuple (elementTypes: SynTupleTypeSegment list) : SynType =
||> List.fold (fun acc segment -> unionRanges acc segment.Range)
SynType.Tuple(false, elementTypes, range)
+
+let getSetAdjuster getSet t =
+ let rec visit t =
+ match t, getSet with
+ | SynType.WithGlobalConstraints (t, _, _), _ -> visit t
+ | SynType.Fun _, _ -> getSet
+ | SynType.SignatureParameter(attributes = _ :: _), _ -> getSet
+ | _, SynMemberKind.Member -> SynMemberKind.PropertyGet
+ | _ -> getSet
+
+ visit t
diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fsi b/src/Compiler/SyntaxTree/ParseHelpers.fsi
index e345dc68a3a..171f86d4fcd 100644
--- a/src/Compiler/SyntaxTree/ParseHelpers.fsi
+++ b/src/Compiler/SyntaxTree/ParseHelpers.fsi
@@ -165,11 +165,11 @@ val mkSynMemberDefnGetSet:
parseState: IParseState ->
opt_inline: bool ->
mWith: range ->
- classDefnMemberGetSetElements: (bool * SynAttributeList list * (SynPat * range) * SynReturnInfo option * range option * SynExpr * range) list ->
+ classDefnMemberGetSetElements: (bool * SynAttributeList list * (SynPat * range) * SynType option * range option * SynExpr * range) list ->
mAnd: range option ->
mWhole: range ->
propertyNameBindingPat: SynPat ->
- optPropertyType: SynReturnInfo option ->
+ optPropertyType: SynType option ->
visNoLongerUsed: SynAccess option ->
memFlagsBuilder: (SynMemberKind -> SynMemberFlags) ->
attrs: SynAttributeList list ->
@@ -180,3 +180,5 @@ val mkSynMemberDefnGetSet:
val adjustHatPrefixToTyparLookup: mFull: range -> rightExpr: SynExpr -> SynExpr
val mkSynTypeTuple: elementTypes: SynTupleTypeSegment list -> SynType
+
+val getSetAdjuster: getSet: SynMemberKind -> t: SynType -> SynMemberKind
diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fs b/src/Compiler/SyntaxTree/SyntaxTree.fs
index 8a0b853f63e..83c247877d6 100644
--- a/src/Compiler/SyntaxTree/SyntaxTree.fs
+++ b/src/Compiler/SyntaxTree/SyntaxTree.fs
@@ -435,6 +435,8 @@ type SynType =
| Paren of innerType: SynType * range: range
+ | SignatureParameter of attributes: SynAttributes * optional: bool * id: Ident option * usedType: SynType * range: range
+
member x.Range =
match x with
| SynType.App (range = m)
@@ -452,7 +454,8 @@ type SynType =
| SynType.HashConstraint (range = m)
| SynType.MeasureDivide (range = m)
| SynType.MeasurePower (range = m)
- | SynType.Paren (range = m) -> m
+ | SynType.Paren (range = m)
+ | SynType.SignatureParameter (range = m) -> m
| SynType.LongIdent lidwd -> lidwd.Range
[]
@@ -1018,10 +1021,9 @@ type SynAttributeList =
type SynAttributes = SynAttributeList list
[]
-type SynValData =
- | SynValData of memberFlags: SynMemberFlags option * valInfo: SynValInfo * thisIdOpt: Ident option
+type SynValData = SynValData of memberFlags: SynMemberFlags option (* valInfo: SynValInfo * *) * thisIdOpt: Ident option
- member x.SynValInfo = (let (SynValData (_flags, synValInfo, _)) = x in synValInfo)
+// member x.SynValInfo = (let (SynValData (_flags, synValInfo, _)) = x in synValInfo)
[]
type SynBinding =
@@ -1034,7 +1036,7 @@ type SynBinding =
xmlDoc: PreXmlDoc *
valData: SynValData *
headPat: SynPat *
- returnInfo: SynBindingReturnInfo option *
+ returnInfo: SynType option * // SynBindingReturnInfo option *
expr: SynExpr *
range: range *
debugPoint: DebugPointAtBinding *
@@ -1051,8 +1053,8 @@ type SynBinding =
member x.RangeOfHeadPattern = let (SynBinding (headPat = headPat)) = x in headPat.Range
-[]
-type SynBindingReturnInfo = SynBindingReturnInfo of typeName: SynType * range: range * attributes: SynAttributes
+// []
+// type SynBindingReturnInfo = SynBindingReturnInfo of typeName: SynType * range: range * attributes: SynAttributes
[]
type SynMemberFlags =
@@ -1140,7 +1142,7 @@ type SynTypeDefnKind =
| Opaque
| Augmentation of withKeyword: range
| IL
- | Delegate of signature: SynType * signatureInfo: SynValInfo
+ | Delegate of signature: SynType // * signatureInfo: SynValInfo
[]
type SynTypeDefnSimpleRepr =
@@ -1219,7 +1221,7 @@ type SynUnionCaseKind =
| Fields of cases: SynField list
- | FullType of fullType: SynType * fullTypeInfo: SynValInfo
+ | FullType of fullType: SynType // * fullTypeInfo: SynValInfo
[]
type SynTypeDefnSigRepr =
@@ -1285,7 +1287,7 @@ type SynValSig =
ident: SynIdent *
explicitTypeParams: SynValTyparDecls *
synType: SynType *
- arity: SynValInfo *
+ // arity: SynValInfo *
isInline: bool *
isMutable: bool *
xmlDoc: PreXmlDoc *
@@ -1296,38 +1298,38 @@ type SynValSig =
member x.RangeOfId = let (SynValSig(ident = SynIdent (id, _))) = x in id.idRange
- member x.SynInfo = let (SynValSig (arity = v)) = x in v
+ // member x.SynInfo = let (SynValSig (arity = v)) = x in v
member x.SynType = let (SynValSig (synType = ty)) = x in ty
-[]
-type SynValInfo =
-
- | SynValInfo of curriedArgInfos: SynArgInfo list list * returnInfo: SynArgInfo
-
- member x.CurriedArgInfos = (let (SynValInfo (args, _)) = x in args)
-
- member x.ArgNames =
- x.CurriedArgInfos
- |> List.concat
- |> List.map (fun info -> info.Ident)
- |> List.choose id
- |> List.map (fun id -> id.idText)
-
-[]
-type SynArgInfo =
-
- | SynArgInfo of attributes: SynAttributes * optional: bool * ident: Ident option
-
- member x.Ident: Ident option = let (SynArgInfo (_, _, id)) = x in id
-
- member x.Attributes: SynAttributes = let (SynArgInfo (attrs, _, _)) = x in attrs
+// []
+// type SynValInfo =
+//
+// | SynValInfo of curriedArgInfos: SynArgInfo list list * returnInfo: SynArgInfo
+//
+// member x.CurriedArgInfos = (let (SynValInfo (args, _)) = x in args)
+//
+// member x.ArgNames =
+// x.CurriedArgInfos
+// |> List.concat
+// |> List.map (fun info -> info.Ident)
+// |> List.choose id
+// |> List.map (fun id -> id.idText)
+
+// []
+// type SynArgInfo =
+//
+// | SynArgInfo of attributes: SynAttributes * optional: bool * ident: Ident option
+//
+// member x.Ident: Ident option = let (SynArgInfo (_, _, id)) = x in id
+//
+// member x.Attributes: SynAttributes = let (SynArgInfo (attrs, _, _)) = x in attrs
[]
type SynValTyparDecls = SynValTyparDecls of typars: SynTyparDecls option * canInfer: bool
-[]
-type SynReturnInfo = SynReturnInfo of returnType: (SynType * SynArgInfo) * range: range
+// []
+// type SynReturnInfo = SynReturnInfo of returnType: (SynType (* SynArgInfo *) ) * range: range
[]
type SynExceptionDefnRepr =
diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fsi b/src/Compiler/SyntaxTree/SyntaxTree.fsi
index 503a7b2faa7..cd031fb396e 100644
--- a/src/Compiler/SyntaxTree/SyntaxTree.fsi
+++ b/src/Compiler/SyntaxTree/SyntaxTree.fsi
@@ -510,6 +510,13 @@ type SynType =
| Paren of innerType: SynType * range: range
+ | SignatureParameter of
+ attributes: SynAttributes *
+ optional: bool *
+ id: Ident option *
+ usedType: SynType *
+ range: range
+
/// Gets the syntax range of this construct
member Range: range
@@ -1161,9 +1168,9 @@ type SynAttributes = SynAttributeList list
/// Represents extra information about the declaration of a value
[]
type SynValData =
- | SynValData of memberFlags: SynMemberFlags option * valInfo: SynValInfo * thisIdOpt: Ident option
+ | SynValData of memberFlags: SynMemberFlags option (* valInfo: SynValInfo * *) * thisIdOpt: Ident option
- member SynValInfo: SynValInfo
+// member SynValInfo: SynValInfo
/// Represents a binding for a 'let' or 'member' declaration
[]
@@ -1177,7 +1184,7 @@ type SynBinding =
xmlDoc: PreXmlDoc *
valData: SynValData *
headPat: SynPat *
- returnInfo: SynBindingReturnInfo option *
+ returnInfo: SynType option *
expr: SynExpr *
range: range *
debugPoint: DebugPointAtBinding *
@@ -1193,9 +1200,9 @@ type SynBinding =
member RangeOfHeadPattern: range
-/// Represents the return information in a binding for a 'let' or 'member' declaration
-[]
-type SynBindingReturnInfo = SynBindingReturnInfo of typeName: SynType * range: range * attributes: SynAttributes
+// /// Represents the return information in a binding for a 'let' or 'member' declaration
+// []
+// type SynBindingReturnInfo = SynBindingReturnInfo of typeName: SynType * range: range * attributes: SynAttributes
/// Represents the flags for a 'member' declaration
[]
@@ -1282,7 +1289,7 @@ type SynTypeDefnKind =
| Opaque
| Augmentation of withKeyword: range
| IL
- | Delegate of signature: SynType * signatureInfo: SynValInfo
+ | Delegate of signature: SynType // * signatureInfo: SynValInfo
/// Represents the syntax tree for the core of a simple type definition, in either signature
/// or implementation.
@@ -1370,7 +1377,7 @@ type SynUnionCaseKind =
| Fields of cases: SynField list
/// Full type spec given by 'UnionCase: ty1 * tyN -> rty'. Only used in FSharp.Core, otherwise a warning.
- | FullType of fullType: SynType * fullTypeInfo: SynValInfo
+ | FullType of fullType: SynType // * fullTypeInfo: SynValInfo
/// Represents the syntax tree for the right-hand-side of a type definition in a signature.
/// Note: in practice, using a discriminated union to make a distinction between
@@ -1446,7 +1453,7 @@ type SynValSig =
ident: SynIdent *
explicitTypeParams: SynValTyparDecls *
synType: SynType *
- arity: SynValInfo *
+ // arity: SynValInfo *
isInline: bool *
isMutable: bool *
xmlDoc: PreXmlDoc *
@@ -1457,38 +1464,38 @@ type SynValSig =
member RangeOfId: range
- member SynInfo: SynValInfo
+ //member SynInfo: SynValInfo
member SynType: SynType
-/// The argument names and other metadata for a member or function
-[]
-type SynValInfo =
-
- /// SynValInfo(curriedArgInfos, returnInfo)
- | SynValInfo of curriedArgInfos: SynArgInfo list list * returnInfo: SynArgInfo
-
- member CurriedArgInfos: SynArgInfo list list
-
- member ArgNames: string list
-
-/// Represents the argument names and other metadata for a parameter for a member or function
-[]
-type SynArgInfo =
-
- | SynArgInfo of attributes: SynAttributes * optional: bool * ident: Ident option
-
- member Ident: Ident option
-
- member Attributes: SynAttributes
+// /// The argument names and other metadata for a member or function
+// []
+// type SynValInfo =
+//
+// /// SynValInfo(curriedArgInfos, returnInfo)
+// | SynValInfo of curriedArgInfos: SynArgInfo list list * returnInfo: SynArgInfo
+//
+// member CurriedArgInfos: SynArgInfo list list
+//
+// member ArgNames: string list
+
+// /// Represents the argument names and other metadata for a parameter for a member or function
+// []
+// type SynArgInfo =
+//
+// | SynArgInfo of attributes: SynAttributes * optional: bool * ident: Ident option
+//
+// member Ident: Ident option
+//
+// member Attributes: SynAttributes
/// Represents the names and other metadata for the type parameters for a member or function
[]
type SynValTyparDecls = SynValTyparDecls of typars: SynTyparDecls option * canInfer: bool
-/// Represents the syntactic elements associated with the "return" of a function or method.
-[]
-type SynReturnInfo = SynReturnInfo of returnType: (SynType * SynArgInfo) * range: range
+// /// Represents the syntactic elements associated with the "return" of a function or method.
+// []
+// type SynReturnInfo = SynReturnInfo of returnType: (SynType (* SynArgInfo) *)) * range: range
/// Represents the right hand side of an exception declaration 'exception E = ... '
[]
diff --git a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs
index 590f5523214..130585ff82d 100644
--- a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs
+++ b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs
@@ -320,10 +320,6 @@ let PushPatternToExpr synArgNameGenerator isMember pat (rhs: SynExpr) =
let nowPats, laterF = SimplePatsOfPat synArgNameGenerator pat
nowPats, SynExpr.Lambda(isMember, false, nowPats, appFunOpt laterF rhs, None, rhs.Range, SynExprLambdaTrivia.Zero)
-let private isSimplePattern pat =
- let _nowPats, laterF = SimplePatsOfPat (SynArgNameGenerator()) pat
- Option.isNone laterF
-
/// "fun (UnionCase x) (UnionCase y) -> body"
/// ==>
/// "fun tmp1 tmp2 ->
@@ -514,167 +510,13 @@ let rec stripParenTypes synType =
let (|StripParenTypes|) synType = stripParenTypes synType
-/// Operations related to the syntactic analysis of arguments of value, function and member definitions and signatures.
-module SynInfo =
-
- /// The argument information for an argument without a name
- let unnamedTopArg1 = SynArgInfo([], false, None)
-
- /// The argument information for a curried argument without a name
- let unnamedTopArg = [ unnamedTopArg1 ]
-
- /// The argument information for a '()' argument
- let unitArgData = unnamedTopArg
-
- /// The 'argument' information for a return value where no attributes are given for the return value (the normal case)
- let unnamedRetVal = SynArgInfo([], false, None)
-
- /// The 'argument' information for the 'this'/'self' parameter in the cases where it is not given explicitly
- let selfMetadata = unnamedTopArg
-
- /// Determine if a syntactic information represents a member without arguments (which is implicitly a property getter)
- let HasNoArgs (SynValInfo (args, _)) = isNil args
-
- /// Check if one particular argument is an optional argument. Used when adjusting the
- /// types of optional arguments for function and member signatures.
- let IsOptionalArg (SynArgInfo (_, isOpt, _)) = isOpt
-
- /// Check if there are any optional arguments in the syntactic argument information. Used when adjusting the
- /// types of optional arguments for function and member signatures.
- let HasOptionalArgs (SynValInfo (args, _)) =
- List.exists (List.exists IsOptionalArg) args
-
- /// Add a parameter entry to the syntactic value information to represent the '()' argument to a property getter. This is
- /// used for the implicit '()' argument in property getter signature specifications.
- let IncorporateEmptyTupledArgForPropertyGetter (SynValInfo (args, retInfo)) = SynValInfo([] :: args, retInfo)
-
- /// Add a parameter entry to the syntactic value information to represent the 'this' argument. This is
- /// used for the implicit 'this' argument in member signature specifications.
- let IncorporateSelfArg (SynValInfo (args, retInfo)) =
- SynValInfo(selfMetadata :: args, retInfo)
-
- /// Add a parameter entry to the syntactic value information to represent the value argument for a property setter. This is
- /// used for the implicit value argument in property setter signature specifications.
- let IncorporateSetterArg (SynValInfo (args, retInfo)) =
- let args =
- match args with
- | [] -> [ unnamedTopArg ]
- | [ arg ] -> [ arg @ [ unnamedTopArg1 ] ]
- | _ -> failwith "invalid setter type"
-
- SynValInfo(args, retInfo)
-
- /// Get the argument counts for each curried argument group. Used in some adhoc places in tc.fs.
- let AritiesOfArgs (SynValInfo (args, _)) = List.map List.length args
-
- /// Get the argument attributes from the syntactic information for an argument.
- let AttribsOfArgData (SynArgInfo (Attributes attribs, _, _)) = attribs
-
- /// Infer the syntactic argument info for a single argument from a simple pattern.
- let rec InferSynArgInfoFromSimplePat attribs p =
- match p with
- | SynSimplePat.Id (nm, _, isCompGen, _, isOpt, _) -> SynArgInfo(attribs, isOpt, (if isCompGen then None else Some nm))
- | SynSimplePat.Typed (a, _, _) -> InferSynArgInfoFromSimplePat attribs a
- | SynSimplePat.Attrib (a, attribs2, _) -> InferSynArgInfoFromSimplePat (attribs @ attribs2) a
-
- /// Infer the syntactic argument info for one or more arguments one or more simple patterns.
- let rec InferSynArgInfoFromSimplePats x =
- match x with
- | SynSimplePats.SimplePats (ps, _) -> List.map (InferSynArgInfoFromSimplePat []) ps
- | SynSimplePats.Typed (ps, _, _) -> InferSynArgInfoFromSimplePats ps
-
- /// Infer the syntactic argument info for one or more arguments a pattern.
- let InferSynArgInfoFromPat p =
- // It is ok to use a fresh SynArgNameGenerator here, because compiler generated names are filtered from SynArgInfo, see InferSynArgInfoFromSimplePat above
- let sp, _ = SimplePatsOfPat (SynArgNameGenerator()) p
- InferSynArgInfoFromSimplePats sp
-
- /// Make sure only a solitary unit argument has unit elimination
- let AdjustArgsForUnitElimination infosForArgs =
- match infosForArgs with
- | [ [] ] -> infosForArgs
- | _ ->
- infosForArgs
- |> List.map (function
- | [] -> unitArgData
- | x -> x)
-
- /// Transform a property declared using '[static] member P = expr' to a method taking a "unit" argument.
- /// This is similar to IncorporateEmptyTupledArgForPropertyGetter, but applies to member definitions
- /// rather than member signatures.
- let AdjustMemberArgs memFlags infosForArgs =
- match infosForArgs with
- | [] when memFlags = SynMemberKind.Member -> [] :: infosForArgs
- | _ -> infosForArgs
-
- /// For 'let' definitions, we infer syntactic argument information from the r.h.s. of a definition, if it
- /// is an immediate 'fun ... -> ...' or 'function ...' expression. This is noted in the F# language specification.
- /// This does not apply to member definitions nor to returns with attributes
- let InferLambdaArgs (retInfo: SynArgInfo) origRhsExpr =
- if retInfo.Attributes.Length > 0 then
- []
- else
- let rec loop e =
- match e with
- | SynExpr.Lambda (fromMethod = false; args = spats; body = rest) -> InferSynArgInfoFromSimplePats spats :: loop rest
- | _ -> []
-
- loop origRhsExpr
-
- let InferSynReturnData (retInfo: SynReturnInfo option) =
- match retInfo with
- | None -> unnamedRetVal
- | Some (SynReturnInfo ((_, retInfo), _)) -> retInfo
-
- let private emptySynValInfo = SynValInfo([], unnamedRetVal)
-
- let emptySynValData = SynValData(None, emptySynValInfo, None)
-
- /// Infer the syntactic information for a 'let' or 'member' definition, based on the argument pattern,
- /// any declared return information (e.g. .NET attributes on the return element), and the r.h.s. expression
- /// in the case of 'let' definitions.
- let InferSynValData (memberFlagsOpt: SynMemberFlags option, pat, retInfo, origRhsExpr) =
-
- let infosForExplicitArgs =
- match pat with
- | Some (SynPat.LongIdent(argPats = SynArgPats.Pats curriedArgs)) -> List.map InferSynArgInfoFromPat curriedArgs
- | _ -> []
-
- let explicitArgsAreSimple =
- match pat with
- | Some (SynPat.LongIdent(argPats = SynArgPats.Pats curriedArgs)) -> List.forall isSimplePattern curriedArgs
- | _ -> true
-
- let retInfo = InferSynReturnData retInfo
-
- match memberFlagsOpt with
- | None ->
- let infosForLambdaArgs = InferLambdaArgs retInfo origRhsExpr
-
- let infosForArgs =
- infosForExplicitArgs
- @ (if explicitArgsAreSimple then infosForLambdaArgs else [])
-
- let infosForArgs = AdjustArgsForUnitElimination infosForArgs
- SynValData(None, SynValInfo(infosForArgs, retInfo), None)
-
- | Some memFlags ->
- let infosForObjArgs = if memFlags.IsInstance then [ selfMetadata ] else []
-
- let infosForArgs = AdjustMemberArgs memFlags.MemberKind infosForExplicitArgs
- let infosForArgs = AdjustArgsForUnitElimination infosForArgs
-
- let argInfos = infosForObjArgs @ infosForArgs
- SynValData(Some memFlags, SynValInfo(argInfos, retInfo), None)
-
let mkSynBindingRhs staticOptimizations rhsExpr mRhs retInfo =
let rhsExpr =
List.foldBack (fun (c, e1) e2 -> SynExpr.LibraryOnlyStaticOptimization(c, e1, e2, mRhs)) staticOptimizations rhsExpr
let rhsExpr, retTyOpt =
match retInfo with
- | Some (SynReturnInfo ((ty, SynArgInfo (rAttribs, _, _)), tym)) ->
- SynExpr.Typed(rhsExpr, ty, rhsExpr.Range), Some(SynBindingReturnInfo(ty, tym, rAttribs))
+ | Some ty -> SynExpr.Typed(rhsExpr, ty, rhsExpr.Range), Some ty
| None -> rhsExpr, None
rhsExpr, retTyOpt
@@ -683,8 +525,8 @@ let mkSynBinding
(xmlDoc: PreXmlDoc, headPat)
(vis, isInline, isMutable, mBind, spBind, retInfo, origRhsExpr, mRhs, staticOptimizations, attrs, memberFlagsOpt, trivia)
=
- let info =
- SynInfo.InferSynValData(memberFlagsOpt, Some headPat, retInfo, origRhsExpr)
+ let info = SynValData(memberFlagsOpt, None)
+ // SynInfo.InferSynValData(memberFlagsOpt, Some headPat, retInfo, origRhsExpr)
let rhsExpr, retTyOpt = mkSynBindingRhs staticOptimizations origRhsExpr mRhs retInfo
let mBind = unionRangeWithXmlDoc xmlDoc mBind
diff --git a/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi b/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi
index cafafaa0ec3..488ab0e0288 100644
--- a/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi
+++ b/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi
@@ -188,89 +188,12 @@ val stripParenTypes: synType: SynType -> SynType
val (|StripParenTypes|): synType: SynType -> SynType
-/// Operations related to the syntactic analysis of arguments of value, function and member definitions and signatures.
-module SynInfo =
- /// The argument information for an argument without a name
- val unnamedTopArg1: SynArgInfo
-
- /// The argument information for a curried argument without a name
- val unnamedTopArg: SynArgInfo list
-
- /// The argument information for a '()' argument
- val unitArgData: SynArgInfo list
-
- /// The 'argument' information for a return value where no attributes are given for the return value (the normal case)
- val unnamedRetVal: SynArgInfo
-
- /// The 'argument' information for the 'this'/'self' parameter in the cases where it is not given explicitly
- val selfMetadata: SynArgInfo list
-
- /// Determine if a syntactic information represents a member without arguments (which is implicitly a property getter)
- val HasNoArgs: SynValInfo -> bool
-
- /// Check if one particular argument is an optional argument. Used when adjusting the
- /// types of optional arguments for function and member signatures.
- val IsOptionalArg: SynArgInfo -> bool
-
- /// Check if there are any optional arguments in the syntactic argument information. Used when adjusting the
- /// types of optional arguments for function and member signatures.
- val HasOptionalArgs: SynValInfo -> bool
-
- /// Add a parameter entry to the syntactic value information to represent the '()' argument to a property getter. This is
- /// used for the implicit '()' argument in property getter signature specifications.
- val IncorporateEmptyTupledArgForPropertyGetter: SynValInfo -> SynValInfo
-
- /// Add a parameter entry to the syntactic value information to represent the 'this' argument. This is
- /// used for the implicit 'this' argument in member signature specifications.
- val IncorporateSelfArg: SynValInfo -> SynValInfo
-
- /// Add a parameter entry to the syntactic value information to represent the value argument for a property setter. This is
- /// used for the implicit value argument in property setter signature specifications.
- val IncorporateSetterArg: SynValInfo -> SynValInfo
-
- /// Get the argument counts for each curried argument group. Used in some adhoc places in tc.fs.
- val AritiesOfArgs: SynValInfo -> int list
-
- /// Get the argument attributes from the syntactic information for an argument.
- val AttribsOfArgData: SynArgInfo -> SynAttribute list
-
- /// Infer the syntactic argument info for a single argument from a simple pattern.
- val InferSynArgInfoFromSimplePat: attribs: SynAttributes -> p: SynSimplePat -> SynArgInfo
-
- /// Infer the syntactic argument info for one or more arguments one or more simple patterns.
- val InferSynArgInfoFromSimplePats: x: SynSimplePats -> SynArgInfo list
-
- /// Infer the syntactic argument info for one or more arguments a pattern.
- val InferSynArgInfoFromPat: p: SynPat -> SynArgInfo list
-
- /// Make sure only a solitary unit argument has unit elimination
- val AdjustArgsForUnitElimination: infosForArgs: SynArgInfo list list -> SynArgInfo list list
-
- /// Transform a property declared using '[static] member P = expr' to a method taking a "unit" argument.
- /// This is similar to IncorporateEmptyTupledArgForPropertyGetter, but applies to member definitions
- /// rather than member signatures.
- val AdjustMemberArgs: memFlags: SynMemberKind -> infosForArgs: 'a list list -> 'a list list
-
- val InferSynReturnData: retInfo: SynReturnInfo option -> SynArgInfo
-
- val emptySynValData: SynValData
-
- /// Infer the syntactic information for a 'let' or 'member' definition, based on the argument pattern,
- /// any declared return information (e.g. .NET attributes on the return element), and the r.h.s. expression
- /// in the case of 'let' definitions.
- val InferSynValData:
- memberFlagsOpt: SynMemberFlags option *
- pat: SynPat option *
- retInfo: SynReturnInfo option *
- origRhsExpr: SynExpr ->
- SynValData
-
val mkSynBindingRhs:
staticOptimizations: (SynStaticOptimizationConstraint list * SynExpr) list ->
rhsExpr: SynExpr ->
mRhs: range ->
- retInfo: SynReturnInfo option ->
- SynExpr * SynBindingReturnInfo option
+ retInfo: SynType option ->
+ SynExpr * SynType option
val mkSynBinding:
xmlDoc: PreXmlDoc * headPat: SynPat ->
@@ -279,7 +202,7 @@ val mkSynBinding:
isMutable: bool *
mBind: range *
spBind: DebugPointAtBinding *
- retInfo: SynReturnInfo option *
+ retInfo: SynType option *
origRhsExpr: SynExpr *
mRhs: range *
staticOptimizations: (SynStaticOptimizationConstraint list * SynExpr) list *
diff --git a/src/Compiler/TypedTree/TypedTree.fs b/src/Compiler/TypedTree/TypedTree.fs
index b3fcdd6c7d5..0052ed77b12 100644
--- a/src/Compiler/TypedTree/TypedTree.fs
+++ b/src/Compiler/TypedTree/TypedTree.fs
@@ -32,6 +32,41 @@ open FSharp.Compiler.TypeProviders
open FSharp.Core.CompilerServices
#endif
+[]
+type SynValInfo =
+
+ | SynValInfo of curriedArgInfos: SynArgInfo list list * returnInfo: SynArgInfo
+
+ member x.CurriedArgInfos = (let (SynValInfo (args, _)) = x in args)
+
+ member x.ArgNames =
+ x.CurriedArgInfos
+ |> List.concat
+ |> List.map (fun info -> info.Ident)
+ |> List.choose id
+ |> List.map (fun id -> id.idText)
+
+[]
+type SynArgInfo =
+
+ | SynArgInfo of attributes: SynAttributes * optional: bool * ident: Ident option
+
+ member x.Ident: Ident option = let (SynArgInfo (_, _, id)) = x in id
+
+ member x.Attributes: SynAttributes = let (SynArgInfo (attrs, _, _)) = x in attrs
+
+[]
+type SynReturnInfo = SynReturnInfo of returnType: (SynType * SynArgInfo) * range: range
+
+[]
+type SynBindingReturnInfo = SynBindingReturnInfo of typeName: SynType * range: range * attributes: SynAttributes
+
+[]
+type SynValData2 =
+ | SynValData2 of memberFlags: SynMemberFlags option * valInfo: SynValInfo * thisIdOpt: Ident option
+
+ member x.SynValInfo = (let (SynValData2 (_flags, synValInfo, _)) = x in synValInfo)
+
type Stamp = int64
type StampMap<'T> = Map
diff --git a/src/Compiler/TypedTree/TypedTree.fsi b/src/Compiler/TypedTree/TypedTree.fsi
index d55e5e40706..86e5d343dbf 100644
--- a/src/Compiler/TypedTree/TypedTree.fsi
+++ b/src/Compiler/TypedTree/TypedTree.fsi
@@ -17,6 +17,42 @@ open FSharp.Compiler.TypeProviders
open FSharp.Compiler.Xml
open FSharp.Core.CompilerServices
+/// The argument names and other metadata for a member or function
+[]
+type SynValInfo =
+
+ /// SynValInfo(curriedArgInfos, returnInfo)
+ | SynValInfo of curriedArgInfos: SynArgInfo list list * returnInfo: SynArgInfo
+
+ member CurriedArgInfos: SynArgInfo list list
+
+ member ArgNames: string list
+
+/// Represents the argument names and other metadata for a parameter for a member or function
+[]
+type SynArgInfo =
+
+ | SynArgInfo of attributes: SynAttributes * optional: bool * ident: Ident option
+
+ member Ident: Ident option
+
+ member Attributes: SynAttributes
+
+/// Represents the syntactic elements associated with the "return" of a function or method.
+[]
+type SynReturnInfo = SynReturnInfo of returnType: (SynType * SynArgInfo) * range: range
+
+// /// Represents the return information in a binding for a 'let' or 'member' declaration
+[]
+type SynBindingReturnInfo = SynBindingReturnInfo of typeName: SynType * range: range * attributes: SynAttributes
+
+/// Represents extra information about the declaration of a value
+[]
+type SynValData2 =
+ | SynValData2 of memberFlags: SynMemberFlags option * valInfo: SynValInfo * thisIdOpt: Ident option
+
+ member SynValInfo: SynValInfo
+
type Stamp = int64
type StampMap<'T> = Map
diff --git a/src/Compiler/TypedTree/TypedTreeOps.fs b/src/Compiler/TypedTree/TypedTreeOps.fs
index 7842afdc105..06b8f9b7f91 100644
--- a/src/Compiler/TypedTree/TypedTreeOps.fs
+++ b/src/Compiler/TypedTree/TypedTreeOps.fs
@@ -31,6 +31,253 @@ open FSharp.Compiler.TypedTreeBasics
open FSharp.Compiler.TypeProviders
#endif
+/// Operations related to the syntactic analysis of arguments of value, function and member definitions and signatures.
+module SynInfo =
+
+ /// The argument information for an argument without a name
+ let unnamedTopArg1 = SynArgInfo([], false, None)
+
+ /// The argument information for a curried argument without a name
+ let unnamedTopArg = [ unnamedTopArg1 ]
+
+ /// The argument information for a '()' argument
+ let unitArgData = unnamedTopArg
+
+ /// The 'argument' information for a return value where no attributes are given for the return value (the normal case)
+ let unnamedRetVal = SynArgInfo([], false, None)
+
+ /// The 'argument' information for the 'this'/'self' parameter in the cases where it is not given explicitly
+ let selfMetadata = unnamedTopArg
+
+ /// Determine if a syntactic information represents a member without arguments (which is implicitly a property getter)
+ let HasNoArgs (SynValInfo (args, _)) = isNil args
+
+ /// Check if one particular argument is an optional argument. Used when adjusting the
+ /// types of optional arguments for function and member signatures.
+ let IsOptionalArg (SynArgInfo (_, isOpt, _)) = isOpt
+
+ /// Check if there are any optional arguments in the syntactic argument information. Used when adjusting the
+ /// types of optional arguments for function and member signatures.
+ let HasOptionalArgs (SynValInfo (args, _)) =
+ List.exists (List.exists IsOptionalArg) args
+
+ /// Add a parameter entry to the syntactic value information to represent the '()' argument to a property getter. This is
+ /// used for the implicit '()' argument in property getter signature specifications.
+ let IncorporateEmptyTupledArgForPropertyGetter (SynValInfo (args, retInfo)) = SynValInfo([] :: args, retInfo)
+
+ /// Add a parameter entry to the syntactic value information to represent the 'this' argument. This is
+ /// used for the implicit 'this' argument in member signature specifications.
+ let IncorporateSelfArg (SynValInfo (args, retInfo)) =
+ SynValInfo(selfMetadata :: args, retInfo)
+
+ /// Add a parameter entry to the syntactic value information to represent the value argument for a property setter. This is
+ /// used for the implicit value argument in property setter signature specifications.
+ let IncorporateSetterArg (SynValInfo (args, retInfo)) =
+ let args =
+ match args with
+ | [] -> [ unnamedTopArg ]
+ | [ arg ] -> [ arg @ [ unnamedTopArg1 ] ]
+ | _ -> failwith "invalid setter type"
+
+ SynValInfo(args, retInfo)
+
+ /// Get the argument counts for each curried argument group. Used in some adhoc places in tc.fs.
+ let AritiesOfArgs (SynValInfo (args, _)) = List.map List.length args
+
+ /// Get the argument attributes from the syntactic information for an argument.
+ let AttribsOfArgData (SynArgInfo (Attributes attribs, _, _)) = attribs
+
+ /// Infer the syntactic argument info for a single argument from a simple pattern.
+ let rec InferSynArgInfoFromSimplePat attribs p =
+ match p with
+ | SynSimplePat.Id (nm, _, isCompGen, _, isOpt, _) -> SynArgInfo(attribs, isOpt, (if isCompGen then None else Some nm))
+ | SynSimplePat.Typed (a, _, _) -> InferSynArgInfoFromSimplePat attribs a
+ | SynSimplePat.Attrib (a, attribs2, _) -> InferSynArgInfoFromSimplePat (attribs @ attribs2) a
+
+ /// Infer the syntactic argument info for one or more arguments one or more simple patterns.
+ let rec InferSynArgInfoFromSimplePats x =
+ match x with
+ | SynSimplePats.SimplePats (ps, _) -> List.map (InferSynArgInfoFromSimplePat []) ps
+ | SynSimplePats.Typed (ps, _, _) -> InferSynArgInfoFromSimplePats ps
+
+ /// Infer the syntactic argument info for one or more arguments a pattern.
+ let InferSynArgInfoFromPat p =
+ // It is ok to use a fresh SynArgNameGenerator here, because compiler generated names are filtered from SynArgInfo, see InferSynArgInfoFromSimplePat above
+ let sp, _ = SimplePatsOfPat (SynArgNameGenerator()) p
+ InferSynArgInfoFromSimplePats sp
+
+ /// Make sure only a solitary unit argument has unit elimination
+ let AdjustArgsForUnitElimination infosForArgs =
+ match infosForArgs with
+ | [ [] ] -> infosForArgs
+ | _ ->
+ infosForArgs
+ |> List.map (function
+ | [] -> unitArgData
+ | x -> x)
+
+ /// Transform a property declared using '[static] member P = expr' to a method taking a "unit" argument.
+ /// This is similar to IncorporateEmptyTupledArgForPropertyGetter, but applies to member definitions
+ /// rather than member signatures.
+ let AdjustMemberArgs memFlags infosForArgs =
+ match infosForArgs with
+ | [] when memFlags = SynMemberKind.Member -> [] :: infosForArgs
+ | _ -> infosForArgs
+
+ /// For 'let' definitions, we infer syntactic argument information from the r.h.s. of a definition, if it
+ /// is an immediate 'fun ... -> ...' or 'function ...' expression. This is noted in the F# language specification.
+ /// This does not apply to member definitions nor to returns with attributes
+ let InferLambdaArgs (retInfo: SynArgInfo) origRhsExpr =
+ if retInfo.Attributes.Length > 0 then
+ []
+ else
+ let rec loop e =
+ match e with
+ | SynExpr.Lambda (fromMethod = false; args = spats; body = rest) -> InferSynArgInfoFromSimplePats spats :: loop rest
+ | _ -> []
+
+ loop origRhsExpr
+
+ let InferSynReturnData (retInfo: SynReturnInfo option) =
+ match retInfo with
+ | None -> unnamedRetVal
+ | Some (SynReturnInfo ((_, retInfo), _)) -> retInfo
+
+ let private emptySynValInfo = SynValInfo([], unnamedRetVal)
+
+ let emptySynValData = SynValData2(None, emptySynValInfo, None)
+
+ /// Infer the syntactic information for a 'let' or 'member' definition, based on the argument pattern,
+ /// any declared return information (e.g. .NET attributes on the return element), and the r.h.s. expression
+ /// in the case of 'let' definitions.
+ let InferSynValData (memberFlagsOpt: SynMemberFlags option, pat, retInfo, origRhsExpr) =
+
+ let infosForExplicitArgs =
+ match pat with
+ | Some (SynPat.LongIdent(extraId = Some _ ; argPats = SynArgPats.Pats [ SynPat.Tuple(elementPats = pats) ])) ->
+ List.map InferSynArgInfoFromPat pats
+ | Some (SynPat.LongIdent(argPats = SynArgPats.Pats curriedArgs)) -> List.map InferSynArgInfoFromPat curriedArgs
+ | _ -> []
+
+ let isSimplePattern pat =
+ let _nowPats, laterF = SimplePatsOfPat (SynArgNameGenerator()) pat
+ Option.isNone laterF
+
+ let explicitArgsAreSimple =
+ match pat with
+ | Some (SynPat.LongIdent(extraId = Some _ ; argPats = SynArgPats.Pats [ SynPat.Tuple(elementPats = pats) ])) ->
+ List.forall isSimplePattern pats
+ | Some (SynPat.LongIdent(argPats = SynArgPats.Pats curriedArgs)) -> List.forall isSimplePattern curriedArgs
+ | _ -> true
+
+ let retInfo = InferSynReturnData retInfo
+
+ match memberFlagsOpt with
+ | None ->
+ let infosForLambdaArgs = InferLambdaArgs retInfo origRhsExpr
+
+ let infosForArgs =
+ infosForExplicitArgs
+ @ (if explicitArgsAreSimple then infosForLambdaArgs else [])
+
+ let infosForArgs = AdjustArgsForUnitElimination infosForArgs
+ SynValData2(None, SynValInfo(infosForArgs, retInfo), None)
+
+ | Some memFlags ->
+ let infosForObjArgs = if memFlags.IsInstance then [ selfMetadata ] else []
+
+ let infosForArgs = AdjustMemberArgs memFlags.MemberKind infosForExplicitArgs
+ let infosForArgs = AdjustArgsForUnitElimination infosForArgs
+
+ let argInfos = infosForObjArgs @ infosForArgs
+
+ let inferredSynValData = SynValData2(Some memFlags, SynValInfo(argInfos, retInfo), None)
+
+ let adjustValueArg valueArg =
+ match valueArg with
+ | [ _ ] -> valueArg
+ | _ -> unnamedTopArg
+
+ let valSynInfo =
+ match memFlags.MemberKind, inferredSynValData.SynValInfo, memFlags.IsInstance with
+ | SynMemberKind.PropertyGet, SynValInfo (thisArg :: indexOrUnitArgs :: _rest, ret), true ->
+ SynValInfo([ thisArg; indexOrUnitArgs ], ret)
+
+ | SynMemberKind.PropertyGet, SynValInfo (indexOrUnitArgs :: _rest, ret), false ->
+ SynValInfo([ indexOrUnitArgs ], ret)
+
+ | SynMemberKind.PropertySet, SynValInfo ([ thisArg; valueArg ], ret), true ->
+ SynValInfo([ thisArg; adjustValueArg valueArg ], ret)
+
+ | SynMemberKind.PropertySet, SynValInfo (thisArg :: indexArgs :: valueArg :: _rest, ret), true ->
+ SynValInfo([ thisArg; indexArgs @ adjustValueArg valueArg ], ret)
+
+ | SynMemberKind.PropertySet, SynValInfo ([ valueArg ], ret), false -> SynValInfo([ adjustValueArg valueArg ], ret)
+
+ | SynMemberKind.PropertySet, SynValInfo (indexArgs :: valueArg :: _rest, ret), _ ->
+ SynValInfo([ indexArgs @ adjustValueArg valueArg ], ret)
+
+ | _, valInfo, _ ->
+ // should be unreachable, cover just in case
+ valInfo
+
+ SynValData2(Some(memFlags), valSynInfo, None)
+
+let mkArityForType ty =
+ let mkArgInfo t =
+ let mkArgInfoImpl t =
+ match t with
+ | SynType.SignatureParameter(attributes, optional, id, _, _) ->
+ SynArgInfo(attributes, optional, id)
+ | _ -> SynArgInfo([], false, None)
+
+ match t with
+ // struct tuples are consider as one SynArgInfo
+ | SynType.Tuple(false, path, _) ->
+ path
+ |> List.choose (function
+ | SynTupleTypeSegment.Type t -> Some (mkArgInfoImpl t)
+ | _ -> None)
+ | t -> [ mkArgInfoImpl t ]
+
+ let rec collectTypes continuation t =
+ match t with
+ | SynType.Fun(argType, returnType, _, _) ->
+ collectTypes (fun types -> argType :: types |> continuation) returnType
+ | t -> continuation [ t ]
+
+ let rec visit t =
+ match t with
+ | SynType.WithGlobalConstraints(t, _, _) -> visit t
+ | SynType.Fun(argType, returnType, _, _) ->
+ let allTypes = argType :: collectTypes id returnType
+ let argTypes = List.take (allTypes.Length - 1) allTypes
+ List.map mkArgInfo argTypes, SynArgInfo([], false, None)
+ | _ -> [], SynArgInfo([], false, None)
+
+ visit ty
+ |> SynValInfo
+
+let inferSynValDataFromBinding binding =
+ match binding with
+ | SynBinding (valData = valSynData; headPat = headPat; returnInfo = retInfo; expr = rhsExpr) ->
+ let (SynValData(memberFlags, thisIdOpt)) = valSynData
+ let returnInfo : SynReturnInfo option =
+ match retInfo with
+ | Some (SynType.SignatureParameter(attributes, optional, ident, usedType, m)) ->
+ Some (SynReturnInfo((usedType, SynArgInfo(attributes, optional, ident)), m))
+ | Some t ->
+ Some (SynReturnInfo((t, SynArgInfo([], false, None)), t.Range))
+ | None -> None
+
+ let origRhsExpr =
+ match rhsExpr with
+ | SynExpr.Typed(expr = rhsExpr)
+ | rhsExpr -> rhsExpr
+
+ let (SynValData2(memberFlags, valInfo, _)) = SynInfo.InferSynValData(memberFlags, Some headPat, returnInfo, origRhsExpr)
+ SynValData2(memberFlags, valInfo, thisIdOpt)
+
let AccFreeVarsStackGuardDepth = GetEnvInteger "FSHARP_AccFreeVars" 100
let RemapExprStackGuardDepth = GetEnvInteger "FSHARP_RemapExpr" 50
let FoldExprStackGuardDepth = GetEnvInteger "FSHARP_FoldExpr" 50
@@ -819,7 +1066,7 @@ let destFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (domainTy, range
let destAnyTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) -> tupInfo, l | _ -> failwith "destAnyTupleTy: not a tuple type")
-let destRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) when not (evalTupInfoIsStruct tupInfo) -> l | _ -> failwith "destRefTupleTy: not a reference tuple type")
+let destRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) when not (evalTupInfoIsStruct tupInfo) -> l | x -> failwith $"destRefTupleTy: not a reference tuple type, got {x}")
let destStructTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) when evalTupInfoIsStruct tupInfo -> l | _ -> failwith "destStructTupleTy: not a struct tuple type")
diff --git a/src/Compiler/TypedTree/TypedTreeOps.fsi b/src/Compiler/TypedTree/TypedTreeOps.fsi
index 2c6ce527458..794c331eecf 100755
--- a/src/Compiler/TypedTree/TypedTreeOps.fsi
+++ b/src/Compiler/TypedTree/TypedTreeOps.fsi
@@ -17,6 +17,87 @@ open FSharp.Compiler.Xml
open FSharp.Compiler.TypedTree
open FSharp.Compiler.TcGlobals
+/// Operations related to the syntactic analysis of arguments of value, function and member definitions and signatures.
+module SynInfo =
+ /// The argument information for an argument without a name
+ val unnamedTopArg1: SynArgInfo
+
+ /// The argument information for a curried argument without a name
+ val unnamedTopArg: SynArgInfo list
+
+ /// The argument information for a '()' argument
+ val unitArgData: SynArgInfo list
+
+ /// The 'argument' information for a return value where no attributes are given for the return value (the normal case)
+ val unnamedRetVal: SynArgInfo
+
+ /// The 'argument' information for the 'this'/'self' parameter in the cases where it is not given explicitly
+ val selfMetadata: SynArgInfo list
+
+ /// Determine if a syntactic information represents a member without arguments (which is implicitly a property getter)
+ val HasNoArgs: SynValInfo -> bool
+
+ /// Check if one particular argument is an optional argument. Used when adjusting the
+ /// types of optional arguments for function and member signatures.
+ val IsOptionalArg: SynArgInfo -> bool
+
+ /// Check if there are any optional arguments in the syntactic argument information. Used when adjusting the
+ /// types of optional arguments for function and member signatures.
+ val HasOptionalArgs: SynValInfo -> bool
+
+ /// Add a parameter entry to the syntactic value information to represent the '()' argument to a property getter. This is
+ /// used for the implicit '()' argument in property getter signature specifications.
+ val IncorporateEmptyTupledArgForPropertyGetter: SynValInfo -> SynValInfo
+
+ /// Add a parameter entry to the syntactic value information to represent the 'this' argument. This is
+ /// used for the implicit 'this' argument in member signature specifications.
+ val IncorporateSelfArg: SynValInfo -> SynValInfo
+
+ /// Add a parameter entry to the syntactic value information to represent the value argument for a property setter. This is
+ /// used for the implicit value argument in property setter signature specifications.
+ val IncorporateSetterArg: SynValInfo -> SynValInfo
+
+ /// Get the argument counts for each curried argument group. Used in some adhoc places in tc.fs.
+ val AritiesOfArgs: SynValInfo -> int list
+
+ /// Get the argument attributes from the syntactic information for an argument.
+ val AttribsOfArgData: SynArgInfo -> SynAttribute list
+
+ /// Infer the syntactic argument info for a single argument from a simple pattern.
+ val InferSynArgInfoFromSimplePat: attribs: SynAttributes -> p: SynSimplePat -> SynArgInfo
+
+ /// Infer the syntactic argument info for one or more arguments one or more simple patterns.
+ val InferSynArgInfoFromSimplePats: x: SynSimplePats -> SynArgInfo list
+
+ /// Infer the syntactic argument info for one or more arguments a pattern.
+ val InferSynArgInfoFromPat: p: SynPat -> SynArgInfo list
+
+ /// Make sure only a solitary unit argument has unit elimination
+ val AdjustArgsForUnitElimination: infosForArgs: SynArgInfo list list -> SynArgInfo list list
+
+ /// Transform a property declared using '[static] member P = expr' to a method taking a "unit" argument.
+ /// This is similar to IncorporateEmptyTupledArgForPropertyGetter, but applies to member definitions
+ /// rather than member signatures.
+ val AdjustMemberArgs: memFlags: SynMemberKind -> infosForArgs: 'a list list -> 'a list list
+
+ val InferSynReturnData: retInfo: SynReturnInfo option -> SynArgInfo
+
+ val emptySynValData: SynValData2
+
+ /// Infer the syntactic information for a 'let' or 'member' definition, based on the argument pattern,
+ /// any declared return information (e.g. .NET attributes on the return element), and the r.h.s. expression
+ /// in the case of 'let' definitions.
+ val InferSynValData:
+ memberFlagsOpt: SynMemberFlags option *
+ pat: SynPat option *
+ retInfo: SynReturnInfo option *
+ origRhsExpr: SynExpr ->
+ SynValData2
+
+val mkArityForType: ty: SynType -> SynValInfo
+
+val inferSynValDataFromBinding: binding: SynBinding -> SynValData2
+
type Erasure =
| EraseAll
| EraseMeasures
diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy
index c0453c0c80c..c3bbf729a8c 100644
--- a/src/Compiler/pars.fsy
+++ b/src/Compiler/pars.fsy
@@ -63,7 +63,7 @@ let mkSynDoBinding (vis, expr, m) =
| None -> ()
SynBinding(None,
SynBindingKind.Do,
- false, false, [], PreXmlDoc.Empty, SynInfo.emptySynValData,
+ false, false, [], PreXmlDoc.Empty, SynValData(None, None),
SynPat.Const(SynConst.Unit, m),
None, expr, m, DebugPointAtBinding.NoneAtDo,
SynBindingTrivia.Zero)
@@ -854,7 +854,7 @@ moduleSpfn:
valSpfn:
| opt_attributes opt_declVisibility VAL opt_attributes opt_inline opt_mutable opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints optLiteralValueSpfn
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
- let attr1, attr2, isInline, isMutable, vis2, id, doc, explicitValTyparDecls, (ty, arity), (mEquals, konst: SynExpr option) = ($1), ($4), ($5), ($6), ($7), ($8), grabXmlDoc(parseState, $1, 1), ($9), ($11), ($12)
+ let attr1, attr2, isInline, isMutable, vis2, id, doc, explicitValTyparDecls, ty, (mEquals, konst: SynExpr option) = ($1), ($4), ($5), ($6), ($7), ($8), grabXmlDoc(parseState, $1, 1), ($9), ($11), ($12)
if not (isNil attr2) then errorR(Deprecated(FSComp.SR.parsAttributesMustComeBeforeVal(), rhs parseState 4))
let m =
rhs2 parseState 1 11
@@ -864,7 +864,7 @@ valSpfn:
| None -> m
| Some e -> unionRanges m e.Range
let mVal = rhs parseState 3
- let valSpfn = SynValSig((attr1@attr2), id, explicitValTyparDecls, ty, arity, isInline, isMutable, doc, vis2, konst, m, { ValKeyword = Some mVal; WithKeyword = None; EqualsRange = mEquals })
+ let valSpfn = SynValSig((attr1@attr2), id, explicitValTyparDecls, ty, isInline, isMutable, doc, vis2, konst, m, { ValKeyword = Some mVal; WithKeyword = None; EqualsRange = mEquals })
SynModuleSigDecl.Val(valSpfn, m)
}
@@ -992,16 +992,15 @@ tyconSpfnRhs:
SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel (kind, decls, objectModelRange), augmentation, mWhole, trivia)) }
| DELEGATE OF topType
- { let m = lhs parseState
- let ty, arity = $3
+ { let m = lhs parseState
let flags = AbstractMemberFlags true SynMemberFlagsTrivia.Zero SynMemberKind.Member
- let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero)
+ let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, $3, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero)
let invoke = SynMemberSig.Member(valSig, flags, m)
(fun nameRange nameInfo mEquals augmentation ->
if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType())
let mWhole = unionRanges nameRange m
let trivia: SynTypeDefnSigTrivia = { TypeKeyword = None; WithKeyword = None; EqualsRange = mEquals }
- SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel (SynTypeDefnKind.Delegate (ty, arity), [invoke], m), [], mWhole, trivia)) }
+ SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel (SynTypeDefnKind.Delegate $3, [invoke], m), [], mWhole, trivia)) }
/* The right-hand-side of an object type definition in a signature */
@@ -1069,9 +1068,9 @@ classSpfnMembersAtLeastOne:
classMemberSpfn:
| opt_attributes opt_declVisibility memberSpecFlags opt_inline opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet optLiteralValueSpfn
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
- let isInline, doc, vis2, id, explicitValTyparDecls, (ty, arity), (mEquals, optLiteralValue) = $4, grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11
+ let isInline, doc, vis2, id, explicitValTyparDecls, ty, (mEquals, optLiteralValue) = $4, grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11
let mWith, getSetRangeOpt, getSet = $10
- let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet
+
let mWhole =
let m = rhs parseState 3
match getSetRangeOpt with
@@ -1084,8 +1083,8 @@ classMemberSpfn:
| None -> m
| Some e -> unionRanges m e.Range
let trivia = { ValKeyword = None; WithKeyword = mWith; EqualsRange = mEquals }
- let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, mWhole, trivia)
- let flags = $3 (getSetAdjuster arity)
+ let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, isInline, false, doc, vis2, optLiteralValue, mWhole, trivia)
+ let flags = $3 (getSetAdjuster getSet ty)
SynMemberSig.Member(valSpfn, flags, mWhole) }
| opt_attributes opt_declVisibility interfaceMember appType
@@ -1115,10 +1114,10 @@ classMemberSpfn:
SynMemberSig.NestedType($5, rhs2 parseState 1 5) }
| opt_attributes opt_declVisibility NEW COLON topTypeWithTypeConstraints
- { let vis, doc, (ty, valSynInfo) = $2, grabXmlDoc(parseState, $1, 1), $5
+ { let vis, doc, ty = $2, grabXmlDoc(parseState, $1, 1), $5
let m = unionRanges (rhs parseState 1) ty.Range |> unionRangeWithXmlDoc doc
let isInline = false
- let valSpfn = SynValSig ($1, (SynIdent(mkSynId (rhs parseState 3) "new", None)), noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, m, SynValSigTrivia.Zero)
+ let valSpfn = SynValSig ($1, (SynIdent(mkSynId (rhs parseState 3) "new", None)), noInferredTypars, ty, isInline, false, doc, vis, None, m, SynValSigTrivia.Zero)
SynMemberSig.Member(valSpfn, CtorMemberFlags SynMemberFlagsTrivia.Zero, m) }
@@ -1737,14 +1736,13 @@ tyconDefnRhs:
/* A delegate type definition */
| DELEGATE OF topType
- { let m = lhs parseState
- let ty, arity = $3
+ { let m = lhs parseState
(fun nameRange augmentation ->
- let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero)
+ let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, $3, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero)
let flags = AbstractMemberFlags true SynMemberFlagsTrivia.Zero SynMemberKind.Member
let invoke = SynMemberDefn.AbstractSlot(valSig, flags, m)
if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType())
- SynTypeDefnRepr.ObjectModel (SynTypeDefnKind.Delegate (ty, arity), [invoke], m), []) }
+ SynTypeDefnRepr.ObjectModel (SynTypeDefnKind.Delegate $3, [invoke], m), []) }
/* The right-hand-side of a object type definition */
@@ -1932,20 +1930,19 @@ classDefnMember:
[ SynMemberDefn.Interface ($4, mWithKwd, members, mWhole) ] }
| opt_attributes opt_declVisibility abstractMemberFlags opt_inline nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet opt_ODECLEND
- { let ty, arity = $8
- let isInline, doc, id, explicitValTyparDecls = $4, grabXmlDoc(parseState, $1, 1), $5, $6
+ { let isInline, doc, id, explicitValTyparDecls = $4, grabXmlDoc(parseState, $1, 1), $5, $6
let mWith, getSetRangeOpt, getSet = $9
- let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet
+
let mWhole =
let m = rhs parseState 1
match getSetRangeOpt with
- | None -> unionRanges m ty.Range
+ | None -> unionRanges m $8.Range
| Some m2 -> unionRanges m m2
|> unionRangeWithXmlDoc doc
if Option.isSome $2 then errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), mWhole))
let trivia = { ValKeyword = None; WithKeyword = mWith; EqualsRange = None }
- let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, mWhole, trivia)
- [ SynMemberDefn.AbstractSlot(valSpfn, $3 (getSetAdjuster arity), mWhole) ] }
+ let valSpfn = SynValSig($1, id, explicitValTyparDecls, $8, isInline, false, doc, None, None, mWhole, trivia)
+ [ SynMemberDefn.AbstractSlot(valSpfn, $3 (getSetAdjuster getSet $8), mWhole) ] }
| opt_attributes opt_declVisibility inheritsDefn
{ if not (isNil $1) then errorR(Error(FSComp.SR.parsAttributesIllegalOnInherit(), rhs parseState 1))
@@ -1975,7 +1972,7 @@ classDefnMember:
let m = unionRanges mWholeBindLhs $7.Range |> unionRangeWithXmlDoc xmlDoc
let mEquals = rhs parseState 6
let expr = $7
- let valSynData = SynValData (Some (CtorMemberFlags SynMemberFlagsTrivia.Zero), SynValInfo([SynInfo.InferSynArgInfoFromPat $4], SynInfo.unnamedRetVal), $5)
+ let valSynData = SynValData (Some (CtorMemberFlags SynMemberFlagsTrivia.Zero), $5)
let vis = $2
let declPat = SynPat.LongIdent (SynLongIdent([mkSynId (rhs parseState 3) "new"], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [$4], vis, rhs parseState 3)
// Check that 'SynPatForConstructorDecl' matches this correctly
@@ -2815,11 +2812,11 @@ cType:
/* A return type in an 'extern' DllImport function definition */
cRetType:
| opt_attributes cType
- { SynReturnInfo(($2, SynArgInfo($1, false, None)), rhs parseState 2) }
+ { SynType.SignatureParameter($1, false, None, $2, rhs parseState 2) }
| opt_attributes VOID
- { let m = rhs parseState 2
- SynReturnInfo((SynType.App(SynType.LongIdent(SynLongIdent([ident("unit", m)], [], [ Some (IdentTrivia.OriginalNotation "void") ])), None, [], [], None, false, m), SynArgInfo($1, false, None)), m) }
+ { let m = rhs parseState 2
+ SynType.App(SynType.LongIdent(SynLongIdent([ident("unit", m)], [], [ Some (IdentTrivia.OriginalNotation "void") ])), None, [], [], None, false, m) }
localBindings:
@@ -5035,72 +5032,70 @@ topTypeWithTypeConstraints:
{ $1 }
| topType WHEN typeConstraints
- { let ty, arity = $1
- // nb. it doesn't matter where the constraints go in the structure of the type.
- SynType.WithGlobalConstraints(ty, List.rev $3, lhs parseState), arity }
+ { // nb. it doesn't matter where the constraints go in the structure of the type.
+ SynType.WithGlobalConstraints($1, List.rev $3, lhs parseState) }
opt_topReturnTypeWithTypeConstraints:
|
{ None }
| COLON topTypeWithTypeConstraints
- { let ty, arity = $2
- let arity = (match arity with SynValInfo([], rmdata)-> rmdata | _ -> SynInfo.unnamedRetVal)
- Some (SynReturnInfo((ty, arity), rhs parseState 2)) }
+ { Some $2 }
topType:
| topTupleType RARROW topType
- { let dty, dmdata= $1
- let rty, (SynValInfo(dmdatas, rmdata)) = $3
- let mArrow = rhs parseState 2
- SynType.Fun(dty, rty, lhs parseState, { ArrowRange = mArrow }), (SynValInfo(dmdata :: dmdatas, rmdata)) }
+ { let mArrow = rhs parseState 2
+ SynType.Fun($1, $3, lhs parseState, { ArrowRange = mArrow }) }
| topTupleType
- { let ty, rmdata = $1 in ty, (SynValInfo([], (match rmdata with [md] -> md | _ -> SynInfo.unnamedRetVal))) }
+ { $1 }
topTupleType:
| topAppType STAR topTupleTypeElements
- { let t, argInfo = $1
- let mStar = rhs parseState 2
- let path = SynTupleTypeSegment.Type t :: SynTupleTypeSegment.Star mStar :: (List.map fst $3)
- let mdata = argInfo :: (List.choose snd $3)
- mkSynTypeTuple path, mdata }
+ { let mStar = rhs parseState 2
+ let path = SynTupleTypeSegment.Type $1 :: SynTupleTypeSegment.Star mStar :: $3
+ mkSynTypeTuple path }
| topAppType
- { let ty, mdata = $1 in ty, [mdata] }
+ { $1 }
topTupleTypeElements:
| topAppType STAR topTupleTypeElements
- { let t, argInfo = $1
- let mStar = rhs parseState 2
- (SynTupleTypeSegment.Type t, Some argInfo) :: (SynTupleTypeSegment.Star mStar, None) :: $3 }
+ { let mStar = rhs parseState 2
+ SynTupleTypeSegment.Type $1 :: SynTupleTypeSegment.Star mStar :: $3 }
| topAppType %prec prec_toptuptyptail_prefix
- { let t, argInfo = $1
- [ SynTupleTypeSegment.Type t, Some argInfo ] }
+ { [ SynTupleTypeSegment.Type $1 ] }
topAppType:
| attributes appType COLON appType
{ match $2 with
- | SynType.LongIdent(SynLongIdent([id], _, _)) -> $4, SynArgInfo($1, false, Some id)
+ | SynType.LongIdent(SynLongIdent([id], _, _)) ->
+ let m = rhs2 parseState 1 4
+ SynType.SignatureParameter($1, false, Some id, $4, m)
| _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) }
| attributes QMARK ident COLON appType
- { $5, SynArgInfo($1, true, Some $3) }
+ { let m = rhs2 parseState 1 5
+ SynType.SignatureParameter($1, true, Some $3, $5, m) }
| attributes appType
- { ($2, SynArgInfo($1, false, None)) }
+ { let m = rhs2 parseState 1 2
+ SynType.SignatureParameter($1, false, None, $2, m) }
| appType COLON appType
{ match $1 with
- | SynType.LongIdent(SynLongIdent([id], _, _)) -> $3, SynArgInfo([], false, Some id)
+ | SynType.LongIdent(SynLongIdent([id], _, _)) ->
+ let m = rhs2 parseState 1 3
+ SynType.SignatureParameter([], false, Some id, $3, m)
| _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) }
| QMARK ident COLON appType
- { $4, SynArgInfo([], true, Some $2) }
+ { let m = rhs2 parseState 1 4
+ SynType.SignatureParameter([], true, Some $2, $4, m) }
| appType
- { $1, SynArgInfo([], false, None) }
+ { $1 }
/* Any tokens in this grammar must be added to the lex filter rule 'peekAdjacentTypars' */
/* See the F# specification "Lexical analysis of type applications and type parameter definitions" */
diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected
index b808314ad58..02385613f8c 100644
--- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected
+++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected
@@ -5781,21 +5781,6 @@ FSharp.Compiler.Syntax.SynAccess: Int32 GetHashCode(System.Collections.IEquality
FSharp.Compiler.Syntax.SynAccess: Int32 Tag
FSharp.Compiler.Syntax.SynAccess: Int32 get_Tag()
FSharp.Compiler.Syntax.SynAccess: System.String ToString()
-FSharp.Compiler.Syntax.SynArgInfo
-FSharp.Compiler.Syntax.SynArgInfo: Boolean get_optional()
-FSharp.Compiler.Syntax.SynArgInfo: Boolean optional
-FSharp.Compiler.Syntax.SynArgInfo: FSharp.Compiler.Syntax.SynArgInfo NewSynArgInfo(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Boolean, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident])
-FSharp.Compiler.Syntax.SynArgInfo: Int32 Tag
-FSharp.Compiler.Syntax.SynArgInfo: Int32 get_Tag()
-FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] Attributes
-FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes
-FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] get_Attributes()
-FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] get_attributes()
-FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] Ident
-FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] get_Ident()
-FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] get_ident()
-FSharp.Compiler.Syntax.SynArgInfo: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] ident
-FSharp.Compiler.Syntax.SynArgInfo: System.String ToString()
FSharp.Compiler.Syntax.SynArgPats
FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.Text.Range get_range()
FSharp.Compiler.Syntax.SynArgPats+NamePatPairs: FSharp.Compiler.Text.Range range
@@ -5846,7 +5831,7 @@ FSharp.Compiler.Syntax.SynBinding: Boolean isInline
FSharp.Compiler.Syntax.SynBinding: Boolean isMutable
FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.DebugPointAtBinding debugPoint
FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.DebugPointAtBinding get_debugPoint()
-FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynBinding NewSynBinding(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Syntax.SynBindingKind, Boolean, Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Syntax.SynValData, FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynBindingReturnInfo], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtBinding, FSharp.Compiler.SyntaxTrivia.SynBindingTrivia)
+FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynBinding NewSynBinding(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Syntax.SynBindingKind, Boolean, Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Syntax.SynValData, FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynType], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtBinding, FSharp.Compiler.SyntaxTrivia.SynBindingTrivia)
FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynBindingKind get_kind()
FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynBindingKind kind
FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynExpr expr
@@ -5873,8 +5858,8 @@ FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Collections.FSharpList`1[FSh
FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] get_attributes()
FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] accessibility
FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] get_accessibility()
-FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynBindingReturnInfo] get_returnInfo()
-FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynBindingReturnInfo] returnInfo
+FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynType] get_returnInfo()
+FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynType] returnInfo
FSharp.Compiler.Syntax.SynBinding: System.String ToString()
FSharp.Compiler.Syntax.SynBindingKind
FSharp.Compiler.Syntax.SynBindingKind+Tags: Int32 Do
@@ -5904,17 +5889,6 @@ FSharp.Compiler.Syntax.SynBindingKind: Int32 GetHashCode(System.Collections.IEqu
FSharp.Compiler.Syntax.SynBindingKind: Int32 Tag
FSharp.Compiler.Syntax.SynBindingKind: Int32 get_Tag()
FSharp.Compiler.Syntax.SynBindingKind: System.String ToString()
-FSharp.Compiler.Syntax.SynBindingReturnInfo
-FSharp.Compiler.Syntax.SynBindingReturnInfo: FSharp.Compiler.Syntax.SynBindingReturnInfo NewSynBindingReturnInfo(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList])
-FSharp.Compiler.Syntax.SynBindingReturnInfo: FSharp.Compiler.Syntax.SynType get_typeName()
-FSharp.Compiler.Syntax.SynBindingReturnInfo: FSharp.Compiler.Syntax.SynType typeName
-FSharp.Compiler.Syntax.SynBindingReturnInfo: FSharp.Compiler.Text.Range get_range()
-FSharp.Compiler.Syntax.SynBindingReturnInfo: FSharp.Compiler.Text.Range range
-FSharp.Compiler.Syntax.SynBindingReturnInfo: Int32 Tag
-FSharp.Compiler.Syntax.SynBindingReturnInfo: Int32 get_Tag()
-FSharp.Compiler.Syntax.SynBindingReturnInfo: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes
-FSharp.Compiler.Syntax.SynBindingReturnInfo: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] get_attributes()
-FSharp.Compiler.Syntax.SynBindingReturnInfo: System.String ToString()
FSharp.Compiler.Syntax.SynByteStringKind
FSharp.Compiler.Syntax.SynByteStringKind+Tags: Int32 Regular
FSharp.Compiler.Syntax.SynByteStringKind+Tags: Int32 Verbatim
@@ -8166,15 +8140,6 @@ FSharp.Compiler.Syntax.SynRationalConst: FSharp.Compiler.Syntax.SynRationalConst
FSharp.Compiler.Syntax.SynRationalConst: Int32 Tag
FSharp.Compiler.Syntax.SynRationalConst: Int32 get_Tag()
FSharp.Compiler.Syntax.SynRationalConst: System.String ToString()
-FSharp.Compiler.Syntax.SynReturnInfo
-FSharp.Compiler.Syntax.SynReturnInfo: FSharp.Compiler.Syntax.SynReturnInfo NewSynReturnInfo(System.Tuple`2[FSharp.Compiler.Syntax.SynType,FSharp.Compiler.Syntax.SynArgInfo], FSharp.Compiler.Text.Range)
-FSharp.Compiler.Syntax.SynReturnInfo: FSharp.Compiler.Text.Range get_range()
-FSharp.Compiler.Syntax.SynReturnInfo: FSharp.Compiler.Text.Range range
-FSharp.Compiler.Syntax.SynReturnInfo: Int32 Tag
-FSharp.Compiler.Syntax.SynReturnInfo: Int32 get_Tag()
-FSharp.Compiler.Syntax.SynReturnInfo: System.String ToString()
-FSharp.Compiler.Syntax.SynReturnInfo: System.Tuple`2[FSharp.Compiler.Syntax.SynType,FSharp.Compiler.Syntax.SynArgInfo] get_returnType()
-FSharp.Compiler.Syntax.SynReturnInfo: System.Tuple`2[FSharp.Compiler.Syntax.SynType,FSharp.Compiler.Syntax.SynArgInfo] returnType
FSharp.Compiler.Syntax.SynSimplePat
FSharp.Compiler.Syntax.SynSimplePat+Attrib: FSharp.Compiler.Syntax.SynSimplePat get_pat()
FSharp.Compiler.Syntax.SynSimplePat+Attrib: FSharp.Compiler.Syntax.SynSimplePat pat
@@ -8483,6 +8448,16 @@ FSharp.Compiler.Syntax.SynType+Paren: FSharp.Compiler.Syntax.SynType get_innerTy
FSharp.Compiler.Syntax.SynType+Paren: FSharp.Compiler.Syntax.SynType innerType
FSharp.Compiler.Syntax.SynType+Paren: FSharp.Compiler.Text.Range get_range()
FSharp.Compiler.Syntax.SynType+Paren: FSharp.Compiler.Text.Range range
+FSharp.Compiler.Syntax.SynType+SignatureParameter: Boolean get_optional()
+FSharp.Compiler.Syntax.SynType+SignatureParameter: Boolean optional
+FSharp.Compiler.Syntax.SynType+SignatureParameter: FSharp.Compiler.Syntax.SynType get_usedType()
+FSharp.Compiler.Syntax.SynType+SignatureParameter: FSharp.Compiler.Syntax.SynType usedType
+FSharp.Compiler.Syntax.SynType+SignatureParameter: FSharp.Compiler.Text.Range get_range()
+FSharp.Compiler.Syntax.SynType+SignatureParameter: FSharp.Compiler.Text.Range range
+FSharp.Compiler.Syntax.SynType+SignatureParameter: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes
+FSharp.Compiler.Syntax.SynType+SignatureParameter: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] get_attributes()
+FSharp.Compiler.Syntax.SynType+SignatureParameter: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] get_id()
+FSharp.Compiler.Syntax.SynType+SignatureParameter: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] id
FSharp.Compiler.Syntax.SynType+StaticConstant: FSharp.Compiler.Syntax.SynConst constant
FSharp.Compiler.Syntax.SynType+StaticConstant: FSharp.Compiler.Syntax.SynConst get_constant()
FSharp.Compiler.Syntax.SynType+StaticConstant: FSharp.Compiler.Text.Range get_range()
@@ -8508,6 +8483,7 @@ FSharp.Compiler.Syntax.SynType+Tags: Int32 LongIdentApp
FSharp.Compiler.Syntax.SynType+Tags: Int32 MeasureDivide
FSharp.Compiler.Syntax.SynType+Tags: Int32 MeasurePower
FSharp.Compiler.Syntax.SynType+Tags: Int32 Paren
+FSharp.Compiler.Syntax.SynType+Tags: Int32 SignatureParameter
FSharp.Compiler.Syntax.SynType+Tags: Int32 StaticConstant
FSharp.Compiler.Syntax.SynType+Tags: Int32 StaticConstantExpr
FSharp.Compiler.Syntax.SynType+Tags: Int32 StaticConstantNamed
@@ -8541,6 +8517,7 @@ FSharp.Compiler.Syntax.SynType: Boolean IsLongIdentApp
FSharp.Compiler.Syntax.SynType: Boolean IsMeasureDivide
FSharp.Compiler.Syntax.SynType: Boolean IsMeasurePower
FSharp.Compiler.Syntax.SynType: Boolean IsParen
+FSharp.Compiler.Syntax.SynType: Boolean IsSignatureParameter
FSharp.Compiler.Syntax.SynType: Boolean IsStaticConstant
FSharp.Compiler.Syntax.SynType: Boolean IsStaticConstantExpr
FSharp.Compiler.Syntax.SynType: Boolean IsStaticConstantNamed
@@ -8558,6 +8535,7 @@ FSharp.Compiler.Syntax.SynType: Boolean get_IsLongIdentApp()
FSharp.Compiler.Syntax.SynType: Boolean get_IsMeasureDivide()
FSharp.Compiler.Syntax.SynType: Boolean get_IsMeasurePower()
FSharp.Compiler.Syntax.SynType: Boolean get_IsParen()
+FSharp.Compiler.Syntax.SynType: Boolean get_IsSignatureParameter()
FSharp.Compiler.Syntax.SynType: Boolean get_IsStaticConstant()
FSharp.Compiler.Syntax.SynType: Boolean get_IsStaticConstantExpr()
FSharp.Compiler.Syntax.SynType: Boolean get_IsStaticConstantNamed()
@@ -8575,6 +8553,7 @@ FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewLongIdentApp(F
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewMeasureDivide(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewMeasurePower(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynRationalConst, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewParen(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range)
+FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewSignatureParameter(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Boolean, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewStaticConstant(FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewStaticConstantExpr(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewStaticConstantNamed(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range)
@@ -8592,6 +8571,7 @@ FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+LongIdentApp
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+MeasureDivide
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+MeasurePower
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+Paren
+FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+SignatureParameter
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+StaticConstant
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+StaticConstantExpr
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+StaticConstantNamed
@@ -8753,8 +8733,6 @@ FSharp.Compiler.Syntax.SynTypeDefnKind+Augmentation: FSharp.Compiler.Text.Range
FSharp.Compiler.Syntax.SynTypeDefnKind+Augmentation: FSharp.Compiler.Text.Range withKeyword
FSharp.Compiler.Syntax.SynTypeDefnKind+Delegate: FSharp.Compiler.Syntax.SynType get_signature()
FSharp.Compiler.Syntax.SynTypeDefnKind+Delegate: FSharp.Compiler.Syntax.SynType signature
-FSharp.Compiler.Syntax.SynTypeDefnKind+Delegate: FSharp.Compiler.Syntax.SynValInfo get_signatureInfo()
-FSharp.Compiler.Syntax.SynTypeDefnKind+Delegate: FSharp.Compiler.Syntax.SynValInfo signatureInfo
FSharp.Compiler.Syntax.SynTypeDefnKind+Tags: Int32 Abbrev
FSharp.Compiler.Syntax.SynTypeDefnKind+Tags: Int32 Augmentation
FSharp.Compiler.Syntax.SynTypeDefnKind+Tags: Int32 Class
@@ -8793,7 +8771,7 @@ FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind C
FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind IL
FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind Interface
FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind NewAugmentation(FSharp.Compiler.Text.Range)
-FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind NewDelegate(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynValInfo)
+FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind NewDelegate(FSharp.Compiler.Syntax.SynType)
FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind Opaque
FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind Record
FSharp.Compiler.Syntax.SynTypeDefnKind: FSharp.Compiler.Syntax.SynTypeDefnKind Struct
@@ -9018,8 +8996,6 @@ FSharp.Compiler.Syntax.SynUnionCaseKind+Fields: Microsoft.FSharp.Collections.FSh
FSharp.Compiler.Syntax.SynUnionCaseKind+Fields: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynField] get_cases()
FSharp.Compiler.Syntax.SynUnionCaseKind+FullType: FSharp.Compiler.Syntax.SynType fullType
FSharp.Compiler.Syntax.SynUnionCaseKind+FullType: FSharp.Compiler.Syntax.SynType get_fullType()
-FSharp.Compiler.Syntax.SynUnionCaseKind+FullType: FSharp.Compiler.Syntax.SynValInfo fullTypeInfo
-FSharp.Compiler.Syntax.SynUnionCaseKind+FullType: FSharp.Compiler.Syntax.SynValInfo get_fullTypeInfo()
FSharp.Compiler.Syntax.SynUnionCaseKind+Tags: Int32 Fields
FSharp.Compiler.Syntax.SynUnionCaseKind+Tags: Int32 FullType
FSharp.Compiler.Syntax.SynUnionCaseKind: Boolean IsFields
@@ -9027,7 +9003,7 @@ FSharp.Compiler.Syntax.SynUnionCaseKind: Boolean IsFullType
FSharp.Compiler.Syntax.SynUnionCaseKind: Boolean get_IsFields()
FSharp.Compiler.Syntax.SynUnionCaseKind: Boolean get_IsFullType()
FSharp.Compiler.Syntax.SynUnionCaseKind: FSharp.Compiler.Syntax.SynUnionCaseKind NewFields(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynField])
-FSharp.Compiler.Syntax.SynUnionCaseKind: FSharp.Compiler.Syntax.SynUnionCaseKind NewFullType(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynValInfo)
+FSharp.Compiler.Syntax.SynUnionCaseKind: FSharp.Compiler.Syntax.SynUnionCaseKind NewFullType(FSharp.Compiler.Syntax.SynType)
FSharp.Compiler.Syntax.SynUnionCaseKind: FSharp.Compiler.Syntax.SynUnionCaseKind+Fields
FSharp.Compiler.Syntax.SynUnionCaseKind: FSharp.Compiler.Syntax.SynUnionCaseKind+FullType
FSharp.Compiler.Syntax.SynUnionCaseKind: FSharp.Compiler.Syntax.SynUnionCaseKind+Tags
@@ -9035,11 +9011,7 @@ FSharp.Compiler.Syntax.SynUnionCaseKind: Int32 Tag
FSharp.Compiler.Syntax.SynUnionCaseKind: Int32 get_Tag()
FSharp.Compiler.Syntax.SynUnionCaseKind: System.String ToString()
FSharp.Compiler.Syntax.SynValData
-FSharp.Compiler.Syntax.SynValData: FSharp.Compiler.Syntax.SynValData NewSynValData(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynMemberFlags], FSharp.Compiler.Syntax.SynValInfo, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident])
-FSharp.Compiler.Syntax.SynValData: FSharp.Compiler.Syntax.SynValInfo SynValInfo
-FSharp.Compiler.Syntax.SynValData: FSharp.Compiler.Syntax.SynValInfo get_SynValInfo()
-FSharp.Compiler.Syntax.SynValData: FSharp.Compiler.Syntax.SynValInfo get_valInfo()
-FSharp.Compiler.Syntax.SynValData: FSharp.Compiler.Syntax.SynValInfo valInfo
+FSharp.Compiler.Syntax.SynValData: FSharp.Compiler.Syntax.SynValData NewSynValData(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynMemberFlags], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident])
FSharp.Compiler.Syntax.SynValData: Int32 Tag
FSharp.Compiler.Syntax.SynValData: Int32 get_Tag()
FSharp.Compiler.Syntax.SynValData: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] get_thisIdOpt()
@@ -9047,19 +9019,6 @@ FSharp.Compiler.Syntax.SynValData: Microsoft.FSharp.Core.FSharpOption`1[FSharp.C
FSharp.Compiler.Syntax.SynValData: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynMemberFlags] get_memberFlags()
FSharp.Compiler.Syntax.SynValData: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynMemberFlags] memberFlags
FSharp.Compiler.Syntax.SynValData: System.String ToString()
-FSharp.Compiler.Syntax.SynValInfo
-FSharp.Compiler.Syntax.SynValInfo: FSharp.Compiler.Syntax.SynArgInfo get_returnInfo()
-FSharp.Compiler.Syntax.SynValInfo: FSharp.Compiler.Syntax.SynArgInfo returnInfo
-FSharp.Compiler.Syntax.SynValInfo: FSharp.Compiler.Syntax.SynValInfo NewSynValInfo(Microsoft.FSharp.Collections.FSharpList`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynArgInfo]], FSharp.Compiler.Syntax.SynArgInfo)
-FSharp.Compiler.Syntax.SynValInfo: Int32 Tag
-FSharp.Compiler.Syntax.SynValInfo: Int32 get_Tag()
-FSharp.Compiler.Syntax.SynValInfo: Microsoft.FSharp.Collections.FSharpList`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynArgInfo]] CurriedArgInfos
-FSharp.Compiler.Syntax.SynValInfo: Microsoft.FSharp.Collections.FSharpList`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynArgInfo]] curriedArgInfos
-FSharp.Compiler.Syntax.SynValInfo: Microsoft.FSharp.Collections.FSharpList`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynArgInfo]] get_CurriedArgInfos()
-FSharp.Compiler.Syntax.SynValInfo: Microsoft.FSharp.Collections.FSharpList`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynArgInfo]] get_curriedArgInfos()
-FSharp.Compiler.Syntax.SynValInfo: Microsoft.FSharp.Collections.FSharpList`1[System.String] ArgNames
-FSharp.Compiler.Syntax.SynValInfo: Microsoft.FSharp.Collections.FSharpList`1[System.String] get_ArgNames()
-FSharp.Compiler.Syntax.SynValInfo: System.String ToString()
FSharp.Compiler.Syntax.SynValSig
FSharp.Compiler.Syntax.SynValSig: Boolean get_isInline()
FSharp.Compiler.Syntax.SynValSig: Boolean get_isMutable()
@@ -9071,11 +9030,7 @@ FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynType SynType
FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynType get_SynType()
FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynType get_synType()
FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynType synType
-FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValInfo SynInfo
-FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValInfo arity
-FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValInfo get_SynInfo()
-FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValInfo get_arity()
-FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValSig NewSynValSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynIdent, FSharp.Compiler.Syntax.SynValTyparDecls, FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynValInfo, Boolean, Boolean, FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynValSigTrivia)
+FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValSig NewSynValSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynIdent, FSharp.Compiler.Syntax.SynValTyparDecls, FSharp.Compiler.Syntax.SynType, Boolean, Boolean, FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynValSigTrivia)
FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValTyparDecls explicitTypeParams
FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValTyparDecls get_explicitTypeParams()
FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.SyntaxTrivia.SynValSigTrivia get_trivia()
diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs
index b6af2161a86..c90afe9fd72 100644
--- a/tests/service/Symbols.fs
+++ b/tests/service/Symbols.fs
@@ -116,9 +116,9 @@ extern void setCallbridgeSupportTarget(IntPtr newTarget)
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Let(false, [ SynBinding(returnInfo =
- Some (SynBindingReturnInfo(typeName =
+ Some (
SynType.App(typeName =
- SynType.LongIdent(SynLongIdent([unitIdent], [], [Some (IdentTrivia.OriginalNotation "void")])))))) ] , _)
+ SynType.LongIdent(SynLongIdent([unitIdent], [], [Some (IdentTrivia.OriginalNotation "void")]))))) ] , _)
])
])) ->
Assert.AreEqual("unit", unitIdent.idText)
diff --git a/tests/service/SyntaxTreeTests/BindingTests.fs b/tests/service/SyntaxTreeTests/BindingTests.fs
index c132b306ecd..059d017082e 100644
--- a/tests/service/SyntaxTreeTests/BindingTests.fs
+++ b/tests/service/SyntaxTreeTests/BindingTests.fs
@@ -379,21 +379,21 @@ let b : int * string * bool = 1, "", false
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Let(bindings = [
SynBinding(returnInfo =
- Some (SynBindingReturnInfo(typeName = SynType.Tuple(path = [
+ Some (SynType.Tuple(path = [
SynTupleTypeSegment.Type _
SynTupleTypeSegment.Star _
SynTupleTypeSegment.Type _
- ]))))
+ ])))
])
SynModuleDecl.Let(bindings = [
SynBinding(returnInfo =
- Some (SynBindingReturnInfo(typeName = SynType.Tuple(path = [
+ Some (SynType.Tuple(path = [
SynTupleTypeSegment.Type _
SynTupleTypeSegment.Star _
SynTupleTypeSegment.Type _
SynTupleTypeSegment.Star _
SynTupleTypeSegment.Type _
- ]))))
+ ])))
])
]) ])) ->
Assert.Pass ()
diff --git a/tests/service/SyntaxTreeTests/SignatureTypeTests.fs b/tests/service/SyntaxTreeTests/SignatureTypeTests.fs
index 943fa5ba5e3..d79548eb9cc 100644
--- a/tests/service/SyntaxTreeTests/SignatureTypeTests.fs
+++ b/tests/service/SyntaxTreeTests/SignatureTypeTests.fs
@@ -471,3 +471,45 @@ type Z with
assertRange (14, 0) (14, 4) mType3
assertRange (14, 7) (14, 11) mWith3
| _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
+
+[]
+let ``SynValSig contains parameter names`` () =
+ let parseResults =
+ getParseResultsOfSignatureFile
+ """
+module Meh
+
+val InferSynValData:
+ memberFlagsOpt: SynMemberFlags option * pat: SynPat option * SynReturnInfo option * origRhsExpr: SynExpr ->
+ x: string ->
+ SynValData2
+"""
+
+ match parseResults with
+ | ParsedInput.SigFile (ParsedSigFileInput (modules=[
+ SynModuleOrNamespaceSig(decls=[
+ SynModuleSigDecl.Val(valSig = SynValSig(synType =
+ SynType.Fun(
+ argType =
+ SynType.Tuple(path = [
+ SynTupleTypeSegment.Type(SynType.SignatureParameter(id = Some memberFlagsOpt))
+ SynTupleTypeSegment.Star _
+ SynTupleTypeSegment.Type(SynType.SignatureParameter(id = Some pat))
+ SynTupleTypeSegment.Star _
+ SynTupleTypeSegment.Type(SynType.App _)
+ SynTupleTypeSegment.Star _
+ SynTupleTypeSegment.Type(SynType.SignatureParameter(id = Some origRhsExpr))
+ ])
+ returnType =
+ SynType.Fun(
+ argType = SynType.SignatureParameter(id = Some x)
+ returnType = SynType.LongIdent _
+ )
+ )
+ ))
+ ] ) ])) ->
+ Assert.AreEqual("memberFlagsOpt", memberFlagsOpt.idText)
+ Assert.AreEqual("pat", pat.idText)
+ Assert.AreEqual("origRhsExpr", origRhsExpr.idText)
+ Assert.AreEqual("x", x.idText)
+ | _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
diff --git a/tests/service/SyntaxTreeTests/TypeTests.fs b/tests/service/SyntaxTreeTests/TypeTests.fs
index c38e684ada3..4dad7757089 100644
--- a/tests/service/SyntaxTreeTests/TypeTests.fs
+++ b/tests/service/SyntaxTreeTests/TypeTests.fs
@@ -496,13 +496,13 @@ let _: struct (int * int) = ()
match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
- SynModuleDecl.Let(bindings = [ SynBinding(returnInfo = Some (SynBindingReturnInfo(typeName =
- SynType.Tuple(true, [ SynTupleTypeSegment.Type _ ; SynTupleTypeSegment.Star _ ; SynTupleTypeSegment.Type _ ], mTuple)))) ])
+ SynModuleDecl.Let(bindings = [ SynBinding(returnInfo = Some (
+ SynType.Tuple(true, [ SynTupleTypeSegment.Type _ ; SynTupleTypeSegment.Star _ ; SynTupleTypeSegment.Type _ ], mTuple))) ])
])
])
) ->
assertRange (2, 7) (2, 25) mTuple
-
+
| _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
[]
@@ -516,11 +516,81 @@ let _: struct (int * int = ()
match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
- SynModuleDecl.Let(bindings = [ SynBinding(returnInfo = Some (SynBindingReturnInfo(typeName =
- SynType.Tuple(true, [ SynTupleTypeSegment.Type _ ; SynTupleTypeSegment.Star _ ; SynTupleTypeSegment.Type _ ], mTuple)))) ])
+ SynModuleDecl.Let(bindings = [ SynBinding(returnInfo = Some (
+ SynType.Tuple(true, [ SynTupleTypeSegment.Type _ ; SynTupleTypeSegment.Star _ ; SynTupleTypeSegment.Type _ ], mTuple))) ])
])
])
) ->
assertRange (2, 7) (2, 24) mTuple
-
+
+ | _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
+
+[]
+let ``Named parameters in delegate type`` () =
+ let parseResults =
+ getParseResults
+ """
+type Foo = delegate of a: A * b: B -> c:C -> D
+ """
+
+ match parseResults with
+ | ParsedInput.ImplFile (ParsedImplFileInput(modules = [
+ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
+ SynModuleDecl.Types(typeDefns = [
+ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(kind =
+ SynTypeDefnKind.Delegate(SynType.Fun(
+ argType =
+ SynType.Tuple(path = [
+ SynTupleTypeSegment.Type(SynType.SignatureParameter(id = Some a))
+ SynTupleTypeSegment.Star _
+ SynTupleTypeSegment.Type(SynType.SignatureParameter(id = Some b))
+ ])
+ returnType =
+ SynType.Fun(
+ argType = SynType.SignatureParameter(id = Some c)
+ returnType = SynType.LongIdent _
+ )
+ ))))
+ ])
+ ])
+ ])) ->
+ Assert.AreEqual("a", a.idText)
+ Assert.AreEqual("b", b.idText)
+ Assert.AreEqual("c", c.idText)
+ | _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
+
+[]
+let ``Attributes in optional named member parameter`` () =
+ let parseResults =
+ getParseResults
+ """
+type X =
+ abstract member Y: [] ?a: A -> B
+ """
+
+ match parseResults with
+ | ParsedInput.ImplFile (ParsedImplFileInput(modules = [
+ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
+ SynModuleDecl.Types(typeDefns = [
+ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(
+ members = [
+ SynMemberDefn.AbstractSlot(slotSig = SynValSig(synType =
+ SynType.Fun(
+ argType = SynType.SignatureParameter(
+ [ { Attributes = [ _ ; _ ] } ],
+ true,
+ Some a,
+ SynType.LongIdent _,
+ m
+ )
+ returnType = SynType.LongIdent _
+ )
+ ))
+ ]
+ ))
+ ])
+ ])
+ ])) ->
+ Assert.AreEqual("a", a.idText)
+ assertRange (3, 23) (3, 41) m
| _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
diff --git a/tests/service/SyntaxTreeTests/UnionCaseTests.fs b/tests/service/SyntaxTreeTests/UnionCaseTests.fs
index 2cb1f80b730..fff7410cad8 100644
--- a/tests/service/SyntaxTreeTests/UnionCaseTests.fs
+++ b/tests/service/SyntaxTreeTests/UnionCaseTests.fs
@@ -135,4 +135,31 @@ type Currency =
])) ->
assertRange (7, 4) (7, 11) mPrivate
| _ ->
- Assert.Fail "Could not get valid AST"
\ No newline at end of file
+ Assert.Fail "Could not get valid AST"
+
+[]
+let ``SynUnionCaseKind.FullType`` () =
+ let parseResults =
+ getParseResults
+ """
+type X =
+ | a: int * z:int
+ """
+
+ match parseResults with
+ | ParsedInput.ImplFile (ParsedImplFileInput(modules = [
+ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
+ SynModuleDecl.Types(typeDefns = [
+ SynTypeDefn(typeRepr = SynTypeDefnRepr.Simple(simpleRepr =
+ SynTypeDefnSimpleRepr.Union(unionCases = [
+ SynUnionCase(caseType = SynUnionCaseKind.FullType(SynType.Tuple(path = [
+ SynTupleTypeSegment.Type(SynType.LongIdent _)
+ SynTupleTypeSegment.Star _
+ SynTupleTypeSegment.Type(SynType.SignatureParameter(id = Some z))
+ ])))
+ ])))
+ ])
+ ])
+ ])) ->
+ Assert.AreEqual("z", z.idText)
+ | _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"