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}"