diff --git a/src/fsharp/CheckComputationExpressions.fs b/src/fsharp/CheckComputationExpressions.fs index dba398db360..963ae0e9382 100644 --- a/src/fsharp/CheckComputationExpressions.fs +++ b/src/fsharp/CheckComputationExpressions.fs @@ -639,10 +639,10 @@ let TcComputationExpression (cenv: cenv) env (overallTy: OverallTy) tpenv (mWhol match e with | ForEachThen (isFromSource, firstSourcePat, firstSource, JoinOrGroupJoinOrZipClause(nm, secondSourcePat, secondSource, keySelectorsOpt, pat3opt, mOpCore), innerComp) when - (let _firstSourceSimplePats, later1 = - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - SimplePatsOfPat cenv.synArgNameGenerator firstSourcePat - Option.isNone later1) + (use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + match firstSourcePat with + | SynPat.Named _ -> true + | _ -> SimplePatsOfPat cenv.synArgNameGenerator firstSourcePat |> snd |> Option.isNone) -> Some (isFromSource, firstSourcePat, firstSource, nm, secondSourcePat, secondSource, keySelectorsOpt, pat3opt, mOpCore, innerComp) @@ -828,7 +828,12 @@ let TcComputationExpression (cenv: cenv) env (overallTy: OverallTy) tpenv (mWhol vspecs, envinner) | None -> varSpace - let firstSourceSimplePats, later1 = SimplePatsOfPat cenv.synArgNameGenerator firstSourcePat + let firstSourceSimplePats, later1 = + match firstSourcePat with + | SynPat.Named (v, thisV, _, m) -> + SynSimplePats.SimplePats ([SynSimplePat.Id (v, None, false, thisV, false, m)], m), None + | _ -> + SimplePatsOfPat cenv.synArgNameGenerator firstSourcePat let secondSourceSimplePats, later2 = SimplePatsOfPat cenv.synArgNameGenerator secondSourcePat if Option.isSome later1 then errorR (Error (FSComp.SR.tcJoinMustUseSimplePattern(nm.idText), firstSourcePat.Range)) diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index 761c8113bed..0da1ce32cca 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -4830,8 +4830,8 @@ module TcDeclarations = // Only the keep the field-targeted attributes let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> true | _ -> false) let mLetPortion = synExpr.Range - let fldId = ident (CompilerGeneratedName id.idText, mLetPortion) - let headPat = SynPat.LongIdent (LongIdentWithDots([fldId], []), None, None, Some noInferredTypars, SynArgPats.Pats [], None, mLetPortion) + let fldPat = SynPat.Named(ident (CompilerGeneratedName id.idText, mLetPortion), false, None, mLetPortion) + let headPat = SynPat.ParametersOwner (fldPat, 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 @@ -4858,8 +4858,8 @@ module TcDeclarations = // Only the keep the non-field-targeted attributes let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> false | _ -> true) let fldId = ident (CompilerGeneratedName id.idText, mMemberPortion) - let headPatIds = if isStatic then [id] else [ident ("__", mMemberPortion);id] - let headPat = SynPat.LongIdent (LongIdentWithDots(headPatIds, []), None, None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion) + let headPatIdPat = if isStatic then SynPat.Named(id, false, None, id.idRange) else SynPat.LongIdent(LongIdentWithDots([ident ("__", mMemberPortion);id], []), None, unionRanges mMemberPortion id.idRange) + let headPat = SynPat.ParametersOwner (headPatIdPat, None, None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion) match propKind, mGetSetOpt with | SynMemberKind.PropertySet, Some m -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), m)) @@ -4884,7 +4884,7 @@ module TcDeclarations = | SynMemberKind.PropertyGetSet -> let setter = let vId = ident("v", mMemberPortion) - let headPat = SynPat.LongIdent (LongIdentWithDots(headPatIds, []), None, None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion) + let headPat = SynPat.ParametersOwner (headPatIdPat, None, None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion) let rhsExpr = mkSynAssign (SynExpr.Ident fldId) (SynExpr.Ident vId) //let retInfo = match tyOpt with None -> None | Some ty -> Some (SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range)) let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, None, rhsExpr, rhsExpr.Range, [], [], Some (memberFlags SynMemberKind.PropertySet), SynBindingTrivia.Zero) diff --git a/src/fsharp/CheckExpressions.fs b/src/fsharp/CheckExpressions.fs index c098df997eb..8fc1a63e2ca 100644 --- a/src/fsharp/CheckExpressions.fs +++ b/src/fsharp/CheckExpressions.fs @@ -2470,11 +2470,18 @@ module BindingNormalization = let ad = env.AccessRights let (SynValData(memberFlagsOpt, _, _)) = valSynData let rec normPattern pat = + let memberflagNotConstructor = + match memberFlagsOpt with + | None -> false + | Some memberFlags -> + memberFlags.MemberKind <> SynMemberKind.Constructor && + memberFlags.MemberKind <> SynMemberKind.ClassConstructor + // 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. match pat with | SynPat.FromParseError(p, _) -> normPattern p - | SynPat.LongIdent (LongIdentWithDots(longId, _), _, toolId, tyargs, SynArgPats.Pats args, vis, m) -> + | SynPat.ParametersOwner (LongOrSingleIdentInPat longId, _, toolId, tyargs, SynArgPats.Pats args, vis, m) -> let typars = match tyargs with None -> inferredTyparDecls | Some typars -> typars match memberFlagsOpt with | None -> @@ -2506,15 +2513,38 @@ module BindingNormalization = // Object constructors are normalized in TcLetrecBindings // Here we are normalizing member definitions with simple (not long) ids, // e.g. "static member x = 3" and "member x = 3" (instance with missing "this." comes through here. It is trapped and generates a warning) - | SynPat.Named(id, false, vis, m) - when - (match memberFlagsOpt with - | None -> false - | Some memberFlags -> - memberFlags.MemberKind <> SynMemberKind.Constructor && - memberFlags.MemberKind <> SynMemberKind.ClassConstructor) -> + | SynPat.Named(id, false, vis, m) when memberflagNotConstructor -> NormalizeStaticMemberBinding cenv (Option.get memberFlagsOpt) valSynData id vis inferredTyparDecls [] m rhsExpr + | SynPat.Named(id, false, vis, m) when Option.isNone memberFlagsOpt && String.isLeadingIdentifierCharacterUpperCase id.idText -> + match ResolvePatternLongIdent cenv.tcSink nameResolver AllIdsOK true m ad env.NameEnv TypeNameResolutionInfo.Default [id] with + | Item.NewDef id -> + if id.idText = opNameCons then + NormalizedBindingPat(pat, rhsExpr, valSynData, inferredTyparDecls) + else + if isObjExprBinding = ObjExprBinding then + errorR(Deprecated(FSComp.SR.tcObjectExpressionFormDeprecated(), m)) + MakeNormalizedStaticOrValBinding cenv isObjExprBinding id vis inferredTyparDecls [] rhsExpr valSynData + | _ -> + error(Error(FSComp.SR.tcInvalidDeclaration(), m)) + + // e.g. "member this.Text = "" " + | SynPat.LongIdent(LongIdentWithDots(id = [thisId; memberId]), vis, m) when memberflagNotConstructor -> + NormalizeInstanceMemberBinding cenv (Option.get memberFlagsOpt) valSynData thisId memberId None vis inferredTyparDecls [] m rhsExpr + + // e.g. "member _.(|A'|) = ... + | SynPat.DotGetOperator(pat, _, _, operator, _, vis, m) when memberflagNotConstructor -> + let thisId = + // SynPat is expected to be Named here. + // SynPat.DotGetOperator is only created in prependIdentInPattern in SyntaxTreeOps. + match pat with + | SynPat.Named(ident = id) -> id + | _ -> + // TODO: proper error message? + error (Error(FSComp.SR.tcInvalidPattern(), pat.Range)) + + NormalizeInstanceMemberBinding cenv (Option.get memberFlagsOpt) valSynData thisId operator.Ident None vis inferredTyparDecls [] m rhsExpr + | SynPat.Typed(pat', x, y) -> let (NormalizedBindingPat(pat'', e'', valSynData, typars)) = normPattern pat' NormalizedBindingPat(SynPat.Typed(pat'', x, y), e'', valSynData, typars) @@ -2522,6 +2552,9 @@ module BindingNormalization = | SynPat.Attrib(_, _, m) -> error(Error(FSComp.SR.tcAttributesInvalidInPatterns(), m)) + | SynPat.Paren(pat = SynPat.Operator(operator, vis, _)) -> + NormalizedBindingPat(SynPat.Named(operator.Ident, false, vis, pat.Range), rhsExpr, valSynData, inferredTyparDecls) + | _ -> NormalizedBindingPat(pat, rhsExpr, valSynData, inferredTyparDecls) normPattern pat @@ -4093,7 +4126,15 @@ and TcPseudoMemberSpec cenv newOk env synTypes tpenv memSpfn m = /// Check a value specification, e.g. in a signature, interface declaration or a constraint and TcValSpec cenv env declKind newOk containerInfo memFlagsOpt thisTyOpt tpenv valSpfn attrs = let g = cenv.g - let (SynValSig(ident=id; explicitValDecls=ValTyparDecls (synTypars, synTyparConstraints, _); synType=ty; arity=valSynInfo; range=m)) = valSpfn + let (SynValSig(pat = pat; explicitValDecls=ValTyparDecls (synTypars, synTyparConstraints, _); synType=ty; arity=valSynInfo; range=m)) = valSpfn + let id = + match pat with + | SingleIdentInPat id -> id + | _ -> + // TODO: introduce a new one of these things? + error(Error(FSComp.SR.tcAttributeIsNotValidForLanguageElementUseDo(), pat.Range)) + Ident("?", pat.Range) + let declaredTypars = TcTyparDecls cenv env synTypars let (ContainerInfo(altActualParent, tcrefContainerInfo)) = containerInfo @@ -4621,7 +4662,7 @@ and TcStaticConstantParameter cenv (env: TcEnv) tpenv kind (StripParenTypes v) i | SynType.LongIdent lidwd -> let m = lidwd.Range - TcStaticConstantParameter cenv env tpenv kind (SynType.StaticConstantExpr(SynExpr.LongIdent (false, lidwd, None, m), m)) idOpt container + TcStaticConstantParameter cenv env tpenv kind (SynType.StaticConstantExpr(SynExpr.LongIdent (lidwd, None, m), m)) idOpt container | _ -> fail() @@ -5024,6 +5065,16 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p (fun values -> TPat_isinst (srcTy, tgtTy, Some (pat values), m)), acc | _ -> failwith "TcPat" + | SynPat.As (SynPat.Named (id, isMemberThis, vis, m), (SynPat.Named (ident = id2) as p), _) when String.isLeadingIdentifierCharacterUpperCase id2.idText -> + let bindf, names, takenNames = TcPatBindingName cenv env id ty isMemberThis vis topValInfo vFlags (names, takenNames) + let pat', acc = TcPat warnOnUpper cenv env None vFlags (tpenv, names, takenNames) ty p + (fun values -> TPat_as (pat' values, bindf values, m)), acc + + | SynPat.As(SynPat.Named(ident = id) as pat1, (SynPat.IsInst _ as pat2), m) when String.isLeadingIdentifierCharacterUpperCase id.idText -> + let pats = [pat1; pat2] + let pats', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) (List.map (fun _ -> ty) pats) pats + (fun values -> TPat_conjs(List.map (fun f -> f values) pats', m)), acc + | SynPat.As (p, SynPat.Named (id, isMemberThis, vis, m), _) | SynPat.As (SynPat.Named (id, isMemberThis, vis, m), p, _) -> let bindf, names, takenNames = TcPatBindingName cenv env id ty isMemberThis vis topValInfo vFlags (names, takenNames) @@ -5037,11 +5088,14 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p (fun values -> TPat_conjs(List.map (fun f -> f values) pats', m)), acc | SynPat.Named (id, isMemberThis, vis, m) -> - let bindf, names, takenNames = TcPatBindingName cenv env id ty isMemberThis vis topValInfo vFlags (names, takenNames) + TcPatNamed warnOnUpper cenv env ad topValInfo vFlags (tpenv, names, takenNames) ty (id, isMemberThis, vis, m) + + | SynPat.Operator(operator, vis, m) -> + let bindf, names, takenNames = TcPatBindingName cenv env operator.Ident ty false vis topValInfo vFlags (names, takenNames) let pat', acc = TcPat warnOnUpper cenv env None vFlags (tpenv, names, takenNames) ty (SynPat.Wild m) (fun values -> TPat_as (pat' values, bindf values, m)), acc - + | SynPat.OptionalVal (id, m) -> errorR (Error (FSComp.SR.tcOptionalArgsOnlyOnMembers (), m)) let bindf, names, takenNames = TcPatBindingName cenv env id ty false None topValInfo vFlags (names, takenNames) @@ -5079,9 +5133,28 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p let pats', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) (List.map (fun _ -> ty) pats) pats (fun values -> TPat_conjs(List.map (fun f -> f values) pats', m)), acc - | SynPat.LongIdent (longDotId=longDotId; typarDecls=tyargs; argPats=args; accessibility=vis; range=m) -> + | SynPat.ParametersOwner (pattern = pat; typarDecls=tyargs; argPats=args; accessibility=vis; range=m) -> + let longDotId = + match pat with + | LongOrSingleIdentInPat longDotId -> longDotId + | _ -> + // TODO: this again should be happening, throw something more specific? + errorR (Error(FSComp.SR.tcInvalidPattern(), m)) + [] + TcPatLongIdent warnOnUpper cenv env ad topValInfo vFlags (tpenv, names, takenNames) ty (longDotId, tyargs, args, vis, m) + | SynPat.LongIdent(LongIdentWithDots(id = longDotId), vis, m) -> + TcPatLongIdent warnOnUpper cenv env ad topValInfo vFlags (tpenv, names, takenNames) ty (longDotId, None, SynArgPats.Pats [], vis, m) + + | SynPat.DotGetOperator(pref = pat; operator = operator; accessibility = vis; range = m) -> + let longDotId = + match pat with + | SynPat.Named(ident = ident) -> [ ident; operator.Ident ] + | _ -> [ operator.Ident ] + + TcPatLongIdent warnOnUpper cenv env ad topValInfo vFlags (tpenv, names, takenNames) ty (longDotId, None, SynArgPats.Pats [], vis, m) + | SynPat.QuoteExpr(_, m) -> errorR (Error(FSComp.SR.tcInvalidPattern(), m)) (fun _ -> TPat_error m), (tpenv, names, takenNames) @@ -5167,21 +5240,25 @@ and ConvSynPatToSynExpr x = match x with | SynPat.FromParseError(p, _) -> ConvSynPatToSynExpr p | SynPat.Const (c, m) -> SynExpr.Const (c, m) - | SynPat.Named (id, _, None, _) -> SynExpr.Ident id + | SynPat.Named (id, _, None, _) + | SynPat.Operator(SynOperatorName.Operator(id), None, _) -> SynExpr.Ident id | SynPat.Typed (p, cty, m) -> SynExpr.Typed (ConvSynPatToSynExpr p, cty, m) - | SynPat.LongIdent (longDotId=LongIdentWithDots(longId, dotms) as lidwd; argPats=args; accessibility=None; range=m) -> - let args = match args with SynArgPats.Pats args -> args | _ -> failwith "impossible: active patterns can be used only with SynConstructorArgs.Pats" - let e = - if dotms.Length = longId.Length then - let e = SynExpr.LongIdent (false, LongIdentWithDots(longId, List.truncate (dotms.Length - 1) dotms), None, m) - SynExpr.DiscardAfterMissingQualificationAfterDot (e, unionRanges e.Range (List.last dotms)) - else SynExpr.LongIdent (false, lidwd, None, m) - List.fold (fun f x -> mkSynApp1 f (ConvSynPatToSynExpr x) m) e args + | SynPat.LongIdent(LongIdentWithDots(longId, dotms) as lidwd, None, m) -> + if dotms.Length = longId.Length then + let e = SynExpr.LongIdent (LongIdentWithDots(longId, List.truncate (dotms.Length - 1) dotms), None, m) + SynExpr.DiscardAfterMissingQualificationAfterDot (e, unionRanges e.Range (List.last dotms)) + else + SynExpr.LongIdent (lidwd, None, m) + | SynPat.Tuple (isStruct, args, m) -> SynExpr.Tuple (isStruct, List.map ConvSynPatToSynExpr args, [], m) | SynPat.Paren (p, _) -> ConvSynPatToSynExpr p | SynPat.ArrayOrList (isArray, args, m) -> SynExpr.ArrayOrList (isArray,List.map ConvSynPatToSynExpr args, m) | SynPat.QuoteExpr (e,_) -> e | SynPat.Null m -> SynExpr.Null m + | SynPat.ParametersOwner (pattern = pat; argPats=args; accessibility=None; range=m) -> + let args = match args with SynArgPats.Pats args -> args | _ -> failwith "impossible: active patterns can be used only with SynConstructorArgs.Pats" + let e = ConvSynPatToSynExpr pat + List.fold (fun f x -> mkSynApp1 f (ConvSynPatToSynExpr x) m) e args | _ -> error(Error(FSComp.SR.tcInvalidArgForParameterizedPattern(), x.Range)) and IsNameOf (cenv: cenv) (env: TcEnv) ad m (id: Ident) = @@ -5193,10 +5270,32 @@ and IsNameOf (cenv: cenv) (env: TcEnv) ad m (id: Ident) = | _ -> false with _ -> false -/// Check a long identifier in a pattern -and TcPatLongIdent warnOnUpper cenv env ad topValInfo vFlags (tpenv, names, takenNames) ty (longDotId, tyargs, args, vis, m) = - let (LongIdentWithDots(longId, _)) = longDotId +and TcPatNamed warnOnUpper cenv env ad topValInfo vFlags (tpenv, names, takenNames) ty (id, isMemberThis, vis, m) = + let defaultTc () = + let bindf, names, takenNames = TcPatBindingName cenv env id ty isMemberThis vis topValInfo vFlags (names, takenNames) + let pat', acc = TcPat warnOnUpper cenv env None vFlags (tpenv, names, takenNames) ty (SynPat.Wild m) + + (fun values -> TPat_as (pat' values, bindf values, m)), acc + + let isNotMember = Option.isNone topValInfo + if isNotMember && String.isLeadingIdentifierCharacterUpperCase id.idText then + match ResolvePatternLongIdent cenv.tcSink cenv.nameResolver warnOnUpper false m ad env.NameEnv TypeNameResolutionInfo.Default [id] with + | Item.ActivePatternCase apref as item -> + TcPatLongIdentActivePatternCase warnOnUpper cenv env vFlags (tpenv, names, takenNames) ty (id.idRange, item, apref, SynArgPats.Pats [], m) + + | Item.UnionCase _ | Item.ExnCase _ as item -> + TcPatLongIdentUnionCaseOrExnCase warnOnUpper cenv env ad vFlags (tpenv, names, takenNames) ty (id.idRange, item, SynArgPats.Pats [], m) + + | Item.Value vref -> + TcPatLongIdentLiteral warnOnUpper cenv env vFlags (tpenv, names, takenNames) ty (id.idRange, vref, SynArgPats.Pats [], m) + | _ -> + defaultTc () + else + defaultTc () + +/// Check a long identifier in a pattern +and TcPatLongIdent warnOnUpper cenv env ad topValInfo vFlags (tpenv, names, takenNames) ty (longId, tyargs, args, vis, m) = if tyargs.IsSome then errorR(Error(FSComp.SR.tcInvalidTypeArgumentUsage(), m)) let warnOnUpperForId = @@ -5636,8 +5735,9 @@ and TcExprThen cenv (overallTy: OverallTy) env tpenv isArg synExpr delayed = if isOpt then errorR(Error(FSComp.SR.tcSyntaxErrorUnexpectedQMark(), mLongId)) // Check to see if pattern translation decided to use an alternative identifier. match altNameRefCellOpt with - | Some {contents = SynSimplePatAlternativeIdInfo.Decided altId} -> - TcExprThen cenv overallTy env tpenv isArg (SynExpr.LongIdent (isOpt, LongIdentWithDots([altId], []), None, mLongId)) delayed + | Some {contents = SynSimplePatAlternativeIdInfo.Decided altId} -> + let expr = if isOpt then SynExpr.Optional(altId, mLongId) else SynExpr.LongIdent (LongIdentWithDots([altId], []), None, mLongId) + TcExprThen cenv overallTy env tpenv isArg expr delayed | _ -> TcLongIdentThen cenv overallTy env tpenv longId delayed // f x @@ -5869,7 +5969,9 @@ and TcExprUndelayed cenv (overallTy: OverallTy) env tpenv (synExpr: SynExpr) = match synExpr with // ( * ) | SynExpr.Paren(SynExpr.IndexRange (None, opm, None, _m1, _m2, _), _, _, _) -> - let replacementExpr = SynExpr.Ident(ident(CompileOpName "*", opm)) + let replacementExpr = + let ident = ident(CompileOpName "*", opm) + SynExpr.Operator(SynOperatorName.Operator(ident), opm) TcExpr cenv overallTy env tpenv replacementExpr | SynExpr.Paren (expr2, _, _, mWholeExprIncludingParentheses) -> @@ -5880,7 +5982,8 @@ and TcExprUndelayed cenv (overallTy: OverallTy) env tpenv (synExpr: SynExpr) = TcExpr cenv overallTy env tpenv expr2 | SynExpr.DotIndexedGet _ | SynExpr.DotIndexedSet _ - | SynExpr.TypeApp _ | SynExpr.Ident _ | SynExpr.LongIdent _ | SynExpr.App _ | SynExpr.DotGet _ -> error(Error(FSComp.SR.tcExprUndelayed(), synExpr.Range)) + | SynExpr.TypeApp _ | SynExpr.Ident _ | SynExpr.LongIdent _ | SynExpr.App _ | SynExpr.DotGet _ + | SynExpr.Operator _ | SynExpr.Optional _ |SynExpr.DotGetOperator _ -> error(Error(FSComp.SR.tcExprUndelayed(), synExpr.Range)) | SynExpr.Const (SynConst.String (s, _, m), _) -> TcNonControlFlowExpr env <| fun env -> @@ -6606,7 +6709,7 @@ and ExpandIndexArgs (synLeftExprOpt: SynExpr option) indexArgs = | None -> error(Error(FSComp.SR.tcInvalidUseOfReverseIndex(), range)) | Some xsId -> mkSynApp1 - (mkSynDot range range xsId (mkSynId (range.MakeSynthetic()) "GetReverseIndex")) + (mkSynDot range range xsId (SynExpr.Ident(mkSynId (range.MakeSynthetic()) "GetReverseIndex"))) sliceArgs range @@ -8855,6 +8958,7 @@ and TcImplicitOpItemThen cenv overallTy env id sln tpenv mItem delayed = | SynExpr.TypeTest (synExpr, _, _) | SynExpr.Upcast (synExpr, _, _) | SynExpr.DotGet (synExpr, _, _, _) + | SynExpr.DotGetOperator(pref = synExpr) | SynExpr.Downcast (synExpr, _, _) | SynExpr.InferredUpcast (synExpr, _) | SynExpr.InferredDowncast (synExpr, _) @@ -8865,6 +8969,8 @@ and TcImplicitOpItemThen cenv overallTy env id sln tpenv mItem delayed = | SynExpr.InterpolatedString _ | SynExpr.Null _ | SynExpr.Ident _ + | SynExpr.Operator _ + | SynExpr.Optional _ | SynExpr.Const _ | SynExpr.LongIdent _ -> true @@ -10099,7 +10205,8 @@ and CheckRecursiveBindingIds binds = match b with | SynPat.Named(id, _, _, _) | SynPat.As(_, SynPat.Named(id, _, _, _), _) - | SynPat.LongIdent(longDotId=LongIdentWithDots([id], _)) -> id.idText + | SynPat.LongIdent(longDotId=LongIdentWithDots([id], _)) + | SynPat.ParametersOwner(pattern = SynPat.Named(ident = id)) -> id.idText | _ -> "" if nm <> "" && not (hashOfBinds.Add nm) then error(Duplicate("value", nm, m)) @@ -11420,6 +11527,16 @@ and AnalyzeRecursiveDecl memberFlagsOpt, thisIdOpt, bindingAttribs, valSynInfo, ty, bindingRhs, mBinding, explicitTyparInfo) + | SynPat.Paren (SynPat.Operator _ as pat', _) -> analyzeRecursiveDeclPat tpenv pat' + + | SynPat.Operator (operator, vis2, _) -> + AnalyzeRecursiveStaticMemberOrValDecl + (cenv, envinner, tpenv, declKind, + newslotsOK, overridesOK, tcrefContainerInfo, + vis1, operator.Ident, vis2, declaredTypars, + memberFlagsOpt, thisIdOpt, bindingAttribs, + valSynInfo, ty, bindingRhs, mBinding, explicitTyparInfo) + | SynPat.InstanceMember(thisId, memberId, toolId, vis2, _) -> AnalyzeRecursiveInstanceMemberDecl (cenv, envinner, tpenv, declKind, diff --git a/src/fsharp/SyntaxTree.fs b/src/fsharp/SyntaxTree.fs index 01496318751..8961416ce3d 100644 --- a/src/fsharp/SyntaxTree.fs +++ b/src/fsharp/SyntaxTree.fs @@ -18,6 +18,23 @@ type Ident (text: string, range: range) = type LongIdent = Ident list +[] + type SynOperatorName = + | ActivePattern of id: Ident + | PartialActivePattern of id: Ident + | Operator of id: Ident + member this.Range: range = + match this with + | SynOperatorName.ActivePattern(id=id) + | SynOperatorName.PartialActivePattern(id=id) + | SynOperatorName.Operator(id=id) -> id.idRange + + member this.Ident: Ident = + match this with + | SynOperatorName.ActivePattern(id=id) + | SynOperatorName.PartialActivePattern(id=id) + | SynOperatorName.Operator(id=id) -> id + type LongIdentWithDots = | LongIdentWithDots of id: LongIdent * dotRanges: range list @@ -666,7 +683,6 @@ type SynExpr = ident: Ident | LongIdent of - isOptional: bool * longDotId: LongIdentWithDots * altNameRefCell: SynSimplePatAlternativeIdInfo ref option * range: range @@ -858,6 +874,22 @@ type SynExpr = isControlFlow: bool * innerExpr: SynExpr + | Operator of + operatorName: SynOperatorName * + range: range + + | DotGetOperator of + pref: SynExpr * + dot: range * + lpr: range * + operator: SynOperatorName * + rpr: range * + range: range + + | Optional of + ident: Ident * + range: range + member e.Range = match e with | SynExpr.Paren (_, leftParenRange, rightParenRange, r) -> @@ -926,7 +958,10 @@ type SynExpr = | SynExpr.MatchBang (range=m) | SynExpr.DoBang (range=m) | SynExpr.Fixed (range=m) - | SynExpr.InterpolatedString (range=m) -> m + | SynExpr.InterpolatedString (range=m) + | SynExpr.Operator(range=m) + | SynExpr.DotGetOperator(range=m) + | SynExpr.Optional(range=m) -> m | SynExpr.Ident id -> id.idRange | SynExpr.DebugPoint (_, _, innerExpr) -> innerExpr.Range @@ -937,7 +972,7 @@ type SynExpr = unionRanges expr.Range lidwd.RangeWithoutAnyExtraDot else m - | SynExpr.LongIdent (_, lidwd, _, _) -> lidwd.RangeWithoutAnyExtraDot + | SynExpr.LongIdent (lidwd, _, _) -> lidwd.RangeWithoutAnyExtraDot | SynExpr.DiscardAfterMissingQualificationAfterDot (expr, _) -> expr.Range | _ -> e.Range @@ -1075,6 +1110,25 @@ type SynPat = accessibility: SynAccess option * range: range + | Operator of + operator: SynOperatorName * + accessibility: SynAccess option * + range: range + + | DotGetOperator of + pref: SynPat * + dot: range * + lpr: range * + operator: SynOperatorName * + rpr: range * + accessibility: SynAccess option * + range: range + + | LongIdent of + longDotId: LongIdentWithDots * + accessibility: SynAccess option * + range: range + | Typed of pat: SynPat * targetType: SynType * @@ -1100,8 +1154,8 @@ type SynPat = rhsPat: SynPat * range: range - | LongIdent of - longDotId: LongIdentWithDots * + | ParametersOwner of + pattern: SynPat * propertyKeyword: PropertyKeyword option * extraId: Ident option * // holds additional ident for tooling typarDecls: SynValTyparDecls option * // usually None: temporary used to parse "f<'a> x = x" @@ -1167,6 +1221,8 @@ type SynPat = | SynPat.Ands (range=m) | SynPat.As (range=m) | SynPat.LongIdent (range=m) + | SynPat.Operator (range=m) + | SynPat.DotGetOperator(range=m) | SynPat.ArrayOrList (range=m) | SynPat.Tuple (range=m) | SynPat.Typed (range=m) @@ -1179,6 +1235,7 @@ type SynPat = | SynPat.InstanceMember (range=m) | SynPat.OptionalVal (range=m) | SynPat.Paren (range=m) + | SynPat.ParametersOwner(range=m) | SynPat.FromParseError (range=m) -> m [] @@ -1539,7 +1596,7 @@ type SynComponentInfo = type SynValSig = | SynValSig of attributes: SynAttributes * - ident: Ident * + pat: SynPat * explicitValDecls: SynValTyparDecls * synType: SynType * arity: SynValInfo * @@ -1551,7 +1608,7 @@ type SynValSig = withKeyword: range option * range: range - member x.RangeOfId = let (SynValSig(ident=id)) = x in id.idRange + member x.RangeOfId = let (SynValSig(pat=pat)) = x in pat.Range member x.SynInfo = let (SynValSig(arity=v)) = x in v diff --git a/src/fsharp/SyntaxTree.fsi b/src/fsharp/SyntaxTree.fsi index 72cd9eac748..ca323f0b6b4 100644 --- a/src/fsharp/SyntaxTree.fsi +++ b/src/fsharp/SyntaxTree.fsi @@ -17,6 +17,20 @@ type Ident = /// Represents a long identifier e.g. 'A.B.C' type LongIdent = Ident list +/// Represents an operator identifier in F# code +/// Parenthesis not included + [] + type SynOperatorName = + /// |A|B| + | ActivePattern of id: Ident + /// |A|_| + | PartialActivePattern of id: Ident + /// >=> + | Operator of id: Ident + + member Range: range + member Ident: Ident + /// Represents a long identifier with possible '.' at end. /// /// Typically dotRanges.Length = lid.Length-1, but they may be same if (incomplete) code ends in a dot, e.g. "Foo.Bar." @@ -814,11 +828,9 @@ type SynExpr = /// F# syntax: ident.ident...ident /// - /// isOptional: true if preceded by a '?' for an optional named parameter /// altNameRefCell: Normally 'None' except for some compiler-generated /// variables in desugaring pattern matching. See SynSimplePat.Id | LongIdent of - isOptional: bool * longDotId: LongIdentWithDots * altNameRefCell: SynSimplePatAlternativeIdInfo ref option * range: range @@ -1054,6 +1066,25 @@ type SynExpr = isControlFlow: bool * innerExpr: SynExpr + /// Operator name + | Operator of + operatorName: SynOperatorName * + range: range + + /// example Fantomas.SourceParser.(|EmptyFile|_|) + | DotGetOperator of + pref: SynExpr * + dot: range * + lpr: range * + operator: SynOperatorName * + rpr: range * + range: range + + /// ?x + | Optional of + ident: Ident * + range: range + /// Gets the syntax range of this construct member Range: range @@ -1201,6 +1232,28 @@ type SynPat = isThisVal: bool * accessibility: SynAccess option * range: range + + /// A operator 'ident' + | Operator of + operator: SynOperatorName * + accessibility: SynAccess option * + range: range + + /// _.(+) + | DotGetOperator of + pref: SynPat * + dot: range * + lpr: range * + operator: SynOperatorName * + rpr: range * + accessibility: SynAccess option * + range: range + + /// A long identifier pattern + | LongIdent of + longDotId: LongIdentWithDots * + accessibility: SynAccess option * + range: range /// A typed pattern 'pat : type' | Typed of @@ -1233,8 +1286,8 @@ type SynPat = range: range /// A long identifier pattern possibly with argument patterns - | LongIdent of - longDotId: LongIdentWithDots * + | ParametersOwner of + pattern: SynPat * propertyKeyword: PropertyKeyword option * extraId: Ident option * // holds additional ident for tooling typarDecls: SynValTyparDecls option * // usually None: temporary used to parse "f<'a> x = x" @@ -1693,7 +1746,7 @@ type SynComponentInfo = type SynValSig = | SynValSig of attributes: SynAttributes * - ident: Ident * + pat: SynPat * explicitValDecls: SynValTyparDecls * synType: SynType * arity: SynValInfo * diff --git a/src/fsharp/SyntaxTreeOps.fs b/src/fsharp/SyntaxTreeOps.fs index 0da5235f7bd..0f5579bab72 100644 --- a/src/fsharp/SyntaxTreeOps.fs +++ b/src/fsharp/SyntaxTreeOps.fs @@ -46,12 +46,12 @@ let mkSynIdGet m n = SynExpr.Ident (mkSynId m n) let mkSynLidGet m path n = let lid = pathToSynLid m path @ [mkSynId m n] let dots = List.replicate (lid.Length - 1) m - SynExpr.LongIdent (false, LongIdentWithDots(lid, dots), None, m) + SynExpr.LongIdent (LongIdentWithDots(lid, dots), None, m) let mkSynIdGetWithAlt m id altInfo = match altInfo with | None -> SynExpr.Ident id - | _ -> SynExpr.LongIdent (false, LongIdentWithDots([id], []), altInfo, m) + | _ -> SynExpr.LongIdent (LongIdentWithDots([id], []), altInfo, m) let mkSynSimplePatVar isOpt id = SynSimplePat.Id (id, None, false, false, isOpt, id.idRange) @@ -60,20 +60,49 @@ let mkSynCompGenSimplePatVar id = SynSimplePat.Id (id, None, true, false, false, /// Match a long identifier, including the case for single identifiers which gets a more optimized node in the syntax tree. let (|LongOrSingleIdent|_|) inp = match inp with - | SynExpr.LongIdent (isOpt, lidwd, altId, _m) -> Some (isOpt, lidwd, altId, lidwd.RangeWithoutAnyExtraDot) + | SynExpr.Optional(ident, _) -> Some (true, LongIdentWithDots([ident],[]), None, ident.idRange) + | SynExpr.LongIdent (lidwd, altId, _m) -> Some (false, lidwd, altId, lidwd.RangeWithoutAnyExtraDot) | SynExpr.Ident id -> Some (false, LongIdentWithDots([id], []), None, id.idRange) + | SynExpr.Operator(operatorName = operator) -> Some (false, LongIdentWithDots([operator.Ident], []), None, operator.Ident.idRange) + | SynExpr.DotGetOperator(expr, dotm, _, operator, _, m) -> + let lidwd, altId = + match expr with + | SynExpr.LongIdent(LongIdentWithDots(lid, dots), altId, _) -> + LongIdentWithDots( [yield! lid; yield operator.Ident], [ yield! dots; yield dotm]), altId + | SynExpr.Ident id -> LongIdentWithDots([id;operator.Ident], [dotm]), None + | _ -> LongIdentWithDots([operator.Ident], []), None + + Some (false, lidwd, altId, m) + | _ -> None + +let (|LongOrSingleIdentInPat|_|) (pat: SynPat) = + match pat with + | SynPat.LongIdent(longDotId = LongIdentWithDots(lids,_)) -> Some lids + | SynPat.Named (ident = ident) -> Some [ ident ] + | SynPat.Paren(SynPat.Operator(operator = operator), _) + | SynPat.Operator(operator = operator) -> Some [ operator.Ident ] + | SynPat.DotGetOperator(SynPat.Named(ident = ident), _, _,operator, _, _, _) -> Some [ ident; operator.Ident ] | _ -> None let (|SingleIdent|_|) inp = match inp with - | SynExpr.LongIdent (false, LongIdentWithDots([id], _), None, _) -> Some id + | SynExpr.LongIdent (LongIdentWithDots([id], _), None, _) -> Some id | SynExpr.Ident id -> Some id + | SynExpr.Operator(operatorName = operator) -> Some operator.Ident + | _ -> None + +let (|SingleIdentInPat|_|) (pat:SynPat) : Ident option = + match pat with + | SynPat.Named(ident = ident) + | SynPat.LongIdent(longDotId = LongIdentWithDots([ident], [])) -> Some ident + | SynPat.Paren(SynPat.Operator(operator = operator), _) + | SynPat.Operator(operator = operator) -> Some operator.Ident | _ -> None let (|SynBinOp|_|) input = match input with - | SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, SynExpr.Ident synId, x1, _m1), x2, _m2) -> - Some (synId, x1, x2) + | SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, SynExpr.Operator(synId, _), x1, _m1), x2, _m2) -> + Some (synId.Ident, x1, x2) | _ -> None let (|SynPipeRight|_|) input = @@ -150,7 +179,7 @@ let IsDebugPointBinding synPat synExpr = // Don't yield the binding sequence point if there are any arguments, i.e. we're defining a function or a method let isFunction = match synPat with - | SynPat.LongIdent (argPats=SynArgPats.Pats args; typarDecls=typarDecls) when not args.IsEmpty || typarDecls.IsSome -> true + | SynPat.ParametersOwner (argPats=SynArgPats.Pats args; typarDecls=typarDecls) when not args.IsEmpty || typarDecls.IsSome -> true | _ -> false not isFunction @@ -165,12 +194,12 @@ let mkSynPatVar vis (id: Ident) = SynPat.Named (id, false, vis, id.idRange) let mkSynThisPatVar (id: Ident) = SynPat.Named (id, true, None, id.idRange) -let mkSynPatMaybeVar lidwd vis m = SynPat.LongIdent (lidwd, None, None, None, SynArgPats.Pats [], vis, m) +let mkSynPatMaybeVar lidwd vis m = SynPat.LongIdent (lidwd, vis, m) /// Extract the argument for patterns corresponding to the declaration of 'new ... = ...' let (|SynPatForConstructorDecl|_|) x = match x with - | SynPat.LongIdent (longDotId=LongIdentWithDots([_], _); argPats=SynArgPats.Pats [arg]) -> Some arg + | SynPat.ParametersOwner (pattern = SynPat.Named _; argPats=SynArgPats.Pats [arg]) -> Some arg | _ -> None /// Recognize the '()' in 'new()' @@ -208,10 +237,14 @@ let rec SimplePatOfPat (synArgNameGenerator: SynArgNameGenerator) p = SynSimplePat.Attrib(p2, attribs, m), laterF - | SynPat.Named (v, thisV, _, m) -> + | SynPat.Named (v, thisV, _, m) when (not (String.isLeadingIdentifierCharacterUpperCase v.idText)) -> SynSimplePat.Id (v, None, false, thisV, false, m), None + | SynPat.Named (v, true, _, m) -> + SynSimplePat.Id (v, None, false, true, false, m), + None + | SynPat.OptionalVal (v, m) -> SynSimplePat.Id (v, None, false, false, true, m), None @@ -224,7 +257,7 @@ let rec SimplePatOfPat (synArgNameGenerator: SynArgNameGenerator) p = let m = p.Range let isCompGen, altNameRefCell, id, item = match p with - | SynPat.LongIdent(longDotId=LongIdentWithDots([id], _); typarDecls=None; argPats=SynArgPats.Pats []; accessibility=None) -> + | SynPat.ParametersOwner(pattern = SingleIdentInPat id; typarDecls=None; argPats=SynArgPats.Pats []; accessibility=None) -> // The pattern is 'V' or some other capitalized identifier. // It may be a real variable, in which case we want to maintain its name. // But it may also be a nullary union case or some other identifier. @@ -232,6 +265,14 @@ let rec SimplePatOfPat (synArgNameGenerator: SynArgNameGenerator) p = let altNameRefCell = Some (ref (SynSimplePatAlternativeIdInfo.Undecided (mkSynId m (synArgNameGenerator.New())))) let item = mkSynIdGetWithAlt m id altNameRefCell false, altNameRefCell, id, item + | SynPat.Named(ident = ident; accessibility=None) when (String.isLeadingIdentifierCharacterUpperCase ident.idText) -> + // The pattern is 'V' or some other capitalized identifier. + // It may be a real variable, in which case we want to maintain its name. + // But it may also be a nullary union case or some other identifier. + // In this case, we want to use an alternate compiler generated name for the hidden variable. + let altNameRefCell = Some (ref (SynSimplePatAlternativeIdInfo.Undecided (mkSynId m (synArgNameGenerator.New())))) + let item = mkSynIdGetWithAlt m ident altNameRefCell + false, altNameRefCell, ident, item | SynPat.Named(ident, _, _, _) | SynPat.As(_, SynPat.Named(ident, _, _, _), _) -> // named pats should be referred to as their name in docs, tooltips, etc. @@ -331,9 +372,9 @@ let opNameParenGet = CompileOpName parenGet let opNameQMark = CompileOpName qmark -let mkSynOperator opm oper = mkSynIdGet opm (CompileOpName oper) +let mkSynOperator (opm: range) (oper: string): SynExpr = SynExpr.Operator(SynOperatorName.Operator(mkSynId opm (CompileOpName oper)), opm) -let mkSynInfix opm (l: SynExpr) oper (r: SynExpr) = +let mkSynInfix (opm: range) (l: SynExpr) (oper: string) (r: SynExpr): SynExpr = let firstTwoRange = unionRanges l.Range opm let wholeRange = unionRanges l.Range r.Range let app1 = SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynOperator opm oper, l, firstTwoRange) @@ -408,30 +449,42 @@ let mkSynAssign (l: SynExpr) (r: SynExpr) = mkSynQMarkSet m a b r | SynExpr.App (_, _, SynExpr.App (_, _, SingleIdent nm, a, _), b, _) when nm.idText = opNameParenGet -> mkSynDotParenSet m a b r - | SynExpr.App (_, _, SynExpr.LongIdent (false, v, None, _), x, _) -> SynExpr.NamedIndexedPropertySet (v, x, r, m) + | SynExpr.App (_, _, SynExpr.LongIdent (v, None, _), x, _) -> SynExpr.NamedIndexedPropertySet (v, x, r, m) | SynExpr.App (_, _, SynExpr.DotGet (e, _, v, _), x, _) -> SynExpr.DotNamedIndexedPropertySet (e, v, x, r, m) | l -> SynExpr.Set (l, r, m) -let mkSynDot dotm m l r = - match l with - | SynExpr.LongIdent (isOpt, LongIdentWithDots(lid, dots), None, _) -> - // REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes) - SynExpr.LongIdent (isOpt, LongIdentWithDots(lid@[r], dots@[dotm]), None, m) - | SynExpr.Ident id -> - SynExpr.LongIdent (false, LongIdentWithDots([id;r], [dotm]), None, m) - | SynExpr.DotGet (e, dm, LongIdentWithDots(lid, dots), _) -> - // REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes) - SynExpr.DotGet (e, dm, LongIdentWithDots(lid@[r], dots@[dotm]), m) - | expr -> - SynExpr.DotGet (expr, dotm, LongIdentWithDots([r], []), m) +let mkSynDot dotm m (l: SynExpr) (r: SynExpr) = + match r with + | SynExpr.Ident r -> + match l with + | SynExpr.LongIdent (LongIdentWithDots(lid, dots), None, _) -> + // REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes) + SynExpr.LongIdent (LongIdentWithDots(lid@[r], dots@[dotm]), None, m) + | SynExpr.Ident id -> + SynExpr.LongIdent (LongIdentWithDots([id;r], [dotm]), None, m) + | SynExpr.DotGet (e, dm, LongIdentWithDots(lid, dots), _) -> + // REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes) + SynExpr.DotGet (e, dm, LongIdentWithDots(lid@[r], dots@[dotm]), m) + | expr -> + SynExpr.DotGet (expr, dotm, LongIdentWithDots([r], []), m) + | SynExpr.Paren(SynExpr.Operator(operatorName = operator), lpr, rpr, pr) -> + let m = unionRanges l.Range r.Range + let rpr = Option.defaultValue pr rpr + SynExpr.DotGetOperator(l, dotm, lpr, operator, rpr, m) + | _ -> + // TODO: the parser will only send an SynExpr.Ident or SynExpr.Paren(SynExpr.Operator)) as r + // What should be constructed here? + // Report error? + let m = unionRanges l.Range r.Range + SynExpr.FromParseError(SynExpr.Const(SynConst.Unit, Range.Zero), m) let mkSynDotMissing dotm m l = match l with - | SynExpr.LongIdent (isOpt, LongIdentWithDots(lid, dots), None, _) -> + | SynExpr.LongIdent (LongIdentWithDots(lid, dots), None, _) -> // REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes) - SynExpr.LongIdent (isOpt, LongIdentWithDots(lid, dots@[dotm]), None, m) + SynExpr.LongIdent (LongIdentWithDots(lid, dots@[dotm]), None, m) | SynExpr.Ident id -> - SynExpr.LongIdent (false, LongIdentWithDots([id], [dotm]), None, m) + SynExpr.LongIdent (LongIdentWithDots([id], [dotm]), None, m) | SynExpr.DotGet (e, dm, LongIdentWithDots(lid, dots), _) -> SynExpr.DotGet (e, dm, LongIdentWithDots(lid, dots@[dotm]), m)// REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes) | expr -> @@ -599,12 +652,12 @@ module SynInfo = let infosForExplicitArgs = match pat with - | Some(SynPat.LongIdent(argPats=SynArgPats.Pats curriedArgs)) -> List.map InferSynArgInfoFromPat curriedArgs + | Some(SynPat.ParametersOwner(argPats=SynArgPats.Pats curriedArgs)) -> List.map InferSynArgInfoFromPat curriedArgs | _ -> [] let explicitArgsAreSimple = match pat with - | Some(SynPat.LongIdent(argPats=SynArgPats.Pats curriedArgs)) -> List.forall isSimplePattern curriedArgs + | Some(SynPat.ParametersOwner(argPats=SynArgPats.Pats curriedArgs)) -> List.forall isSimplePattern curriedArgs | _ -> true let retInfo = InferSynReturnData retInfo @@ -763,6 +816,8 @@ let rec synExprContainsError inpExpr = | SynExpr.LibraryOnlyStaticOptimization _ | SynExpr.Null _ | SynExpr.Ident _ + | SynExpr.Operator _ + | SynExpr.Optional _ | SynExpr.ImplicitZero _ | SynExpr.Const _ -> false @@ -776,6 +831,7 @@ let rec synExprContainsError inpExpr = | SynExpr.Do (e, _) | SynExpr.Assert (e, _) | SynExpr.DotGet (e, _, _, _) + | SynExpr.DotGetOperator(pref = e) | SynExpr.LongIdentSet (_, e, _) | SynExpr.New (_, _, e, _) | SynExpr.TypeApp (e, _, _, _, _, _, _) @@ -888,3 +944,30 @@ let (|ParsedHashDirectiveArguments|) (input: ParsedHashDirectiveArgument list) = | ParsedHashDirectiveArgument.String (s, _, _) -> s | ParsedHashDirectiveArgument.SourceIdentifier (_, v, _) -> v) input + +let prependIdentInPattern (ident: Ident) (dotm: range) (pat: SynPat): SynPat = + let m = unionRanges ident.idRange pat.Range + + match pat with + | SynPat.Named (ident=lastIdent; accessibility = vis) -> + SynPat.LongIdent(LongIdentWithDots([ ident; lastIdent ], [ dotm ]), vis, m) + | SynPat.LongIdent(LongIdentWithDots(lids, dots), access, _) -> + SynPat.LongIdent(LongIdentWithDots(ident::lids, dotm::dots), access, m) + | SynPat.Paren(SynPat.Operator(operator = operator; accessibility = access), pr) -> + let lpr, rpr = + mkRange pr.FileName pr.Start (Position.mkPos pr.StartLine (pr.StartColumn + 1)), + mkRange pr.FileName (Position.mkPos pr.EndLine (pr.EndColumn - 1)) pr.End + + SynPat.DotGetOperator( + SynPat.Named(ident, false, access, ident.idRange), + dotm, + lpr, + operator, + rpr, + None, + m + ) + | _ -> + // TODO: this again should not be allowed to happen + // Raise parse error? + SynPat.Const(SynConst.Unit, m) \ No newline at end of file diff --git a/src/fsharp/SyntaxTreeOps.fsi b/src/fsharp/SyntaxTreeOps.fsi index ab17675469f..130ec07d0dd 100644 --- a/src/fsharp/SyntaxTreeOps.fsi +++ b/src/fsharp/SyntaxTreeOps.fsi @@ -44,8 +44,12 @@ val mkSynCompGenSimplePatVar: id:Ident -> SynSimplePat /// Match a long identifier, including the case for single identifiers which gets a more optimized node in the syntax tree. val (|LongOrSingleIdent|_|): inp:SynExpr -> (bool * LongIdentWithDots * SynSimplePatAlternativeIdInfo ref option * range) option +val (|LongOrSingleIdentInPat|_|): pat: SynPat -> LongIdent option + val (|SingleIdent|_|): inp:SynExpr -> Ident option +val (|SingleIdentInPat|_|): pat: SynPat -> Ident option + /// This affects placement of debug points val IsControlFlowExpression: e:SynExpr -> bool @@ -142,7 +146,7 @@ val mkSynDelay: m:range -> e:SynExpr -> SynExpr val mkSynAssign: l:SynExpr -> r:SynExpr -> SynExpr -val mkSynDot: dotm:range -> m:range -> l:SynExpr -> r:Ident -> SynExpr +val mkSynDot: dotm:range -> m:range -> l:SynExpr -> r:SynExpr -> SynExpr val mkSynDotMissing: dotm:range -> m:range -> l:SynExpr -> SynExpr @@ -300,3 +304,5 @@ val (|SynPipeRight2|_|): SynExpr -> (SynExpr * SynExpr * SynExpr) option /// 'e1 |||> e2' val (|SynPipeRight3|_|): SynExpr -> (SynExpr * SynExpr * SynExpr * SynExpr) option + +val prependIdentInPattern: ident: Ident -> dotm: range -> pat: SynPat -> SynPat \ No newline at end of file diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index d2f4ceb0890..eeaad021a56 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1840,7 +1840,7 @@ type internal FsiDynamicCompiler member _.CreateDebuggerBreak (m: range) = let breakPath = ["System";"Diagnostics";"Debugger";"Break"] let dots = List.replicate (breakPath.Length - 1) m - let methCall = SynExpr.LongIdent (false, LongIdentWithDots(List.map (mkSynId m) breakPath, dots), None, m) + let methCall = SynExpr.LongIdent (LongIdentWithDots(List.map (mkSynId m) breakPath, dots), None, m) let args = SynExpr.Const (SynConst.Unit, m) let breakStatement = SynExpr.App (ExprAtomicFlag.Atomic, false, methCall, args, m) SynModuleDecl.Expr(breakStatement, m) diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index 3974392952f..caa93b8edd4 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -189,7 +189,7 @@ let idOfPat (parseState:IParseState) m p = | SynPat.Wild r when parseState.LexBuffer.SupportsFeature LanguageFeature.WildCardInForLoop -> mkSynId r "_" | SynPat.Named (id, false, _, _) -> id - | SynPat.LongIdent(longDotId=LongIdentWithDots([id], _); typarDecls=None; argPats=SynArgPats.Pats []; accessibility=None) -> id + | SynPat.LongIdent(longDotId=LongIdentWithDots([id], _); accessibility=None) -> id | _ -> raiseParseErrorAt m (FSComp.SR.parsIntegerForLoopRequiresSimpleIdentifier()) let checkForMultipleAugmentations m a1 a2 = @@ -346,7 +346,7 @@ let rangeOfLongIdent(lid:LongIdent) = %type exconCore %type moduleDefnsOrExprPossiblyEmptyOrBlock %type path -%type pathOp +%type pathOp /* LESS GREATER parsedOk typeArgs m for each mWhole */ %type typeArgsActual /* LESS GREATER typeArgs m for each mWhole */ @@ -855,12 +855,12 @@ moduleSpfn: { SynModuleSigDecl.Open($1, (rhs parseState 1)) } valSpfn: - | opt_attributes opt_declVisibility VAL opt_attributes opt_inline opt_mutable opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints optLiteralValueSpfn + | opt_attributes opt_declVisibility VAL opt_attributes opt_inline opt_mutable opt_access identOrOpPat 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), konst = ($1), ($4), ($5), ($6), ($7), ($8), grabXmlDoc(parseState, $1, 1), ($9), ($11), ($12) + let attr1, attr2, isInline, isMutable, vis2, idPat, doc, explicitValTyparDecls, (ty, arity), konst = ($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 |> unionRangeWithXmlDoc doc - let valSpfn = SynValSig((attr1@attr2), id, explicitValTyparDecls, ty, arity, isInline, isMutable, doc, vis2, konst, None, m) + let valSpfn = SynValSig((attr1@attr2), idPat, explicitValTyparDecls, ty, arity, isInline, isMutable, doc, vis2, konst, None, m) SynModuleSigDecl.Val(valSpfn, m) } @@ -983,7 +983,8 @@ tyconSpfnRhs: | DELEGATE OF topType { let m = lhs parseState let ty, arity = $3 - let invoke = SynMemberSig.Member(SynValSig([], mkSynId m "Invoke", inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, None, m), AbstractMemberFlags SynMemberFlagsTrivia.Zero SynMemberKind.Member, m) + let pat = SynPat.Named(mkSynId m "Invoke", false, None, m) + let invoke = SynMemberSig.Member(SynValSig([], pat, inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, None, m), AbstractMemberFlags SynMemberFlagsTrivia.Zero SynMemberKind.Member, m) (fun nameRange nameInfo mEquals augmentation -> if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType()) let mWhole = unionRanges nameRange m @@ -1053,9 +1054,9 @@ classSpfnMembersAtLeastOne: /* A object member in a signature */ classMemberSpfn: - | opt_attributes opt_declVisibility memberSpecFlags opt_inline opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet optLiteralValueSpfn + | opt_attributes opt_declVisibility memberSpecFlags opt_inline opt_access identOrOpPat 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), optLiteralValue = $4, grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11 + let isInline, doc, vis2, idPat, explicitValTyparDecls, (ty, arity), 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 wholeRange = @@ -1065,7 +1066,7 @@ classMemberSpfn: | Some m2 -> unionRanges m m2 |> fun m -> (m, $1) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range) |> unionRangeWithXmlDoc doc - let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, mWith, wholeRange) + let valSpfn = SynValSig($1, idPat, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, mWith, wholeRange) let _, flags = $3 SynMemberSig.Member(valSpfn, flags (getSetAdjuster arity), wholeRange) } @@ -1099,7 +1100,9 @@ classMemberSpfn: { let vis, doc, (ty, valSynInfo) = $2, grabXmlDoc(parseState, $1, 1), $5 let m = unionRanges (rhs parseState 1) ty.Range |> unionRangeWithXmlDoc doc let isInline = false - let valSpfn = SynValSig ($1, mkSynId (rhs parseState 3) "new", noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, None, m) + let mPat = rhs parseState 3 + let pat = SynPat.Named(mkSynId mPat "new", false, None, mPat) + let valSpfn = SynValSig ($1, pat, noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, None, m) SynMemberSig.Member(valSpfn, CtorMemberFlags SynMemberFlagsTrivia.Zero, m) } @@ -1124,13 +1127,13 @@ classMemberSpfnGetSet: /* The "get, set" on a property member in a signature */ classMemberSpfnGetSetElements: - | nameop + | ident { (let (id:Ident) = $1 if id.idText = "get" then SynMemberKind.PropertyGet else if id.idText = "set" then SynMemberKind.PropertySet else raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsGetOrSetRequired())) } - | nameop COMMA nameop + | ident COMMA ident { let (id:Ident) = $1 if not ((id.idText = "get" && $3.idText = "set") || (id.idText = "set" && $3.idText = "get")) then @@ -1722,7 +1725,8 @@ tyconDefnRhs: { let m = lhs parseState let ty, arity = $3 (fun nameRange augmentation -> - let valSpfn = SynValSig([], mkSynId m "Invoke", inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, None, m) + let pat = SynPat.Named(mkSynId m "Invoke", false, None, m) + let valSpfn = SynValSig([], pat, inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, None, m) let invoke = SynMemberDefn.AbstractSlot(valSpfn, AbstractMemberFlags SynMemberFlagsTrivia.Zero SynMemberKind.Member, m) if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType()) SynTypeDefnRepr.ObjectModel (SynTypeDefnKind.Delegate (ty, arity), [invoke], m), []) } @@ -1881,7 +1885,9 @@ memberCore: let rec go p = match p with | SynPat.LongIdent (longDotId=LongIdentWithDots([id], _)) -> id.idText - | SynPat.Named (nm, _, _, _) | SynPat.As (_, SynPat.Named (nm, _, _, _), _) -> nm.idText + | SynPat.Named (ident = nm) + | SynPat.As (_, SynPat.Named (ident = nm), _) + | SynPat.ParametersOwner(pattern = SynPat.Named(ident = nm)) -> nm.idText | SynPat.Typed (p, _, _) -> go p | SynPat.Attrib (p, _, _) -> go p | _ -> raiseParseErrorAt mBindLhs (FSComp.SR.parsInvalidDeclarationSyntax()) @@ -1989,10 +1995,11 @@ memberCore: let (SynBinding (_, _, _, _, _, doc2, _, bindingPatOuter, _, _, _, _, _)) = bindingOuter - let lidOuter, lidVisOuter = + let patOuter, lidVisOuter = match bindingPatOuter with - | SynPat.LongIdent (lid, _, None, None, SynArgPats.Pats [], lidVisOuter, m) -> lid, lidVisOuter - | SynPat.Named (id, _, visOuter, m) | SynPat.As(_, SynPat.Named (id, _, visOuter, m), _) -> LongIdentWithDots([id], []), visOuter + | SynPat.ParametersOwner (pat, _, None, None, SynArgPats.Pats [], lidVisOuter, m) -> pat, lidVisOuter + | SynPat.Named (id, isThisVal, visOuter, m) | SynPat.As(_, SynPat.Named (id, isThisVal, visOuter, m), _) -> SynPat.Named(id, isThisVal, visOuter, m), visOuter + | SynPat.LongIdent(longDotId, visOuter, m) -> SynPat.LongIdent(longDotId, visOuter, m), visOuter | p -> raiseParseErrorAt mWholeBindLhs (FSComp.SR.parsInvalidDeclarationSyntax()) // Merge the visibility from the outer point with the inner point, e.g. @@ -2009,7 +2016,7 @@ memberCore: // Replace the "get" or the "set" with the right name let rec go p = match p with - | SynPat.LongIdent (longDotId=LongIdentWithDots([id], _); typarDecls=tyargs; argPats=SynArgPats.Pats args; accessibility=lidVisInner; range=m) -> + | SynPat.ParametersOwner (pattern = SingleIdentInPat id; typarDecls=tyargs; argPats=SynArgPats.Pats args; accessibility=lidVisInner; range=m) -> // Setters have all arguments tupled in their internal form, though they don't // appear to be tupled from the syntax. Somewhat unfortunate let args = @@ -2025,9 +2032,9 @@ memberCore: raiseParseErrorAt m (FSComp.SR.parsSetSyntax()) else args - SynPat.LongIdent (lidOuter, withPropertyKeyword, Some(id), tyargs, SynArgPats.Pats args, mergeLidVisOuter lidVisInner, m) + SynPat.ParametersOwner (patOuter, withPropertyKeyword, Some(id), tyargs, SynArgPats.Pats args, mergeLidVisOuter lidVisInner, m) | SynPat.Named (nm, _, lidVisInner, m) - | SynPat.As (_, SynPat.Named (nm, _, lidVisInner, m), _) -> SynPat.LongIdent (lidOuter, None, None, None, SynArgPats.Pats [], mergeLidVisOuter lidVisInner, m) + | SynPat.As (_, SynPat.Named (nm, _, lidVisInner, m), _) -> SynPat.ParametersOwner (patOuter, None, None, None, SynArgPats.Pats [], mergeLidVisOuter lidVisInner, m) | SynPat.Typed (p, ty, m) -> SynPat.Typed(go p, ty, m) | SynPat.Attrib (p, attribs, m) -> SynPat.Attrib(go p, attribs, m) | SynPat.Wild(m) -> SynPat.Wild(m) @@ -2083,9 +2090,9 @@ classDefnMember: | Some (mWithKwd, members, m) -> Some mWithKwd, Some members, unionRanges (rhs2 parseState 1 4) m [ SynMemberDefn.Interface ($4, mWithKwd, members, mWhole) ] } - | opt_attributes opt_declVisibility abstractMemberFlags opt_inline nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet opt_ODECLEND + | opt_attributes opt_declVisibility abstractMemberFlags opt_inline identOrOpPat 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, idPat, 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 wholeRange = @@ -2095,7 +2102,7 @@ classDefnMember: | Some m2 -> unionRanges m m2 |> unionRangeWithXmlDoc doc if Option.isSome $2 then errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), wholeRange)) - let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, mWith, wholeRange) + let valSpfn = SynValSig($1, idPat, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, mWith, wholeRange) [ SynMemberDefn.AbstractSlot(valSpfn, AbstractMemberFlags $3 (getSetAdjuster arity), wholeRange) ] } | opt_attributes opt_declVisibility inheritsDefn @@ -2128,7 +2135,10 @@ classDefnMember: let expr = $7 let valSynData = SynValData (Some (CtorMemberFlags SynMemberFlagsTrivia.Zero), SynValInfo([SynInfo.InferSynArgInfoFromPat $4], SynInfo.unnamedRetVal), $5) let vis = $2 - let declPat = SynPat.LongIdent (LongIdentWithDots([mkSynId (rhs parseState 3) "new"], []), None, None, Some noInferredTypars, SynArgPats.Pats [$4], vis, rhs parseState 3) + let idPat = + let mPat = rhs parseState 3 + SynPat.Named(mkSynId mPat "new", false, None, mPat) + let declPat = SynPat.ParametersOwner (idPat, None, None, Some noInferredTypars, SynArgPats.Pats [$4], vis, rhs parseState 3) // Check that 'SynPatForConstructorDecl' matches this correctly assert (match declPat with SynPatForConstructorDecl _ -> true | _ -> false) let synBindingTrivia: SynBindingTrivia = { LetKeyword = None; EqualsRange = Some mEquals } @@ -2174,12 +2184,15 @@ atomicPatternLongIdent: | UNDERSCORE DOT pathOp { if not (parseState.LexBuffer.SupportsFeature LanguageFeature.SingleUnderscorePattern) then raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedSymbolDot()) - let (LongIdentWithDots(lid, dotms)) = $3 - (None, LongIdentWithDots(ident("_", rhs parseState 1)::lid, rhs parseState 2::dotms)) } + + let underscore = ident("_", rhs parseState 1) + let dotm = rhs parseState 2 + None, prependIdentInPattern underscore dotm $3 } | GLOBAL DOT pathOp - { let (LongIdentWithDots(lid, dotms)) = $3 - (None, LongIdentWithDots(ident(MangledGlobalName, rhs parseState 1) :: lid, rhs parseState 2 :: dotms)) } + { let globalIdent = ident(MangledGlobalName, rhs parseState 1) + let dotm = rhs parseState 2 + None, prependIdentInPattern globalIdent dotm $3 } | pathOp { (None, $1) } @@ -2187,8 +2200,10 @@ atomicPatternLongIdent: | access UNDERSCORE DOT pathOp { if not (parseState.LexBuffer.SupportsFeature LanguageFeature.SingleUnderscorePattern) then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedSymbolDot()) - let (LongIdentWithDots(lid, dotms)) = $4 - (Some($1), LongIdentWithDots(ident("_", rhs parseState 2)::lid, rhs parseState 3::dotms)) } + + let underscore = ident("_", rhs parseState 2) + let dotm = rhs parseState 3 + Some($1), prependIdentInPattern underscore dotm $4 } | access pathOp { (Some($1), $2) } @@ -2629,7 +2644,7 @@ attrUnionCaseDecl: /* The name of a union case */ unionCaseName: - | nameop + | ident { $1 } | LPAREN COLON_COLON rparen @@ -2882,7 +2897,9 @@ cPrototype: SynExpr.Const (SynConst.String("extern was not given a DllImport attribute", SynStringKind.Regular, rhs parseState 8), rhs parseState 8), mRhs) (fun attrs _ -> - let bindingPat = SynPat.LongIdent (LongIdentWithDots([nm], []), None, None, Some noInferredTypars, SynArgPats.Pats [SynPat.Tuple(false, args, argsm)], vis, nmm) + let bindingPat = + let idPat = SynPat.Named(nm, false, None, nm.idRange) + SynPat.ParametersOwner (idPat, None, None, Some noInferredTypars, SynArgPats.Pats [SynPat.Tuple(false, args, argsm)], vis, nmm) let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range) let xmlDoc = grabXmlDoc(parseState, attrs, 1) let binding = @@ -3254,7 +3271,10 @@ headBindingPattern: SynPat.Or($1, $3, rhs2 parseState 1 3, { BarRange = mBar }) } | headBindingPattern COLON_COLON headBindingPattern - { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons, []), None, None, None, SynArgPats.Pats [SynPat.Tuple (false, [$1;$3], rhs2 parseState 1 3)], None, lhs parseState) } + { let pat = + let mPat = rhs parseState 2 + SynPat.Named(mkSynId mPat (CompileOpName opNameCons), false, None, mPat) + SynPat.ParametersOwner (pat, None, None, None, SynArgPats.Pats [SynPat.Tuple (false, [$1;$3], rhs2 parseState 1 3)], None, lhs parseState) } | tuplePatternElements %prec pat_tuple { SynPat.Tuple(false, List.rev $1, lhs parseState) } @@ -3293,44 +3313,44 @@ namePatPair: constrPattern: | atomicPatternLongIdent explicitValTyparDecls - { let vis, lid = $1 - SynPat.LongIdent (lid, None, None, Some $2, SynArgPats.Pats [], vis, lhs parseState) } + { let vis, pat = $1 + SynPat.ParametersOwner (pat, None, None, Some $2, SynArgPats.Pats [], vis, lhs parseState) } | atomicPatternLongIdent explicitValTyparDecls atomicPatsOrNamePatPairs %prec pat_app - { let vis, lid = $1 + { let vis, pat = $1 let args, argsM = $3 let m = unionRanges (rhs2 parseState 1 2) argsM - SynPat.LongIdent (lid, None, None, Some $2, args, vis, m) } + SynPat.ParametersOwner (pat, None, None, Some $2, args, vis, m) } | atomicPatternLongIdent explicitValTyparDecls HIGH_PRECEDENCE_PAREN_APP atomicPatsOrNamePatPairs - { let vis, lid = $1 + { let vis, pat = $1 let args, argsM = $4 let m = unionRanges (rhs2 parseState 1 2) argsM - SynPat.LongIdent (lid, None, None, Some $2, args, vis, m) } + SynPat.ParametersOwner (pat, None, None, Some $2, args, vis, m) } | atomicPatternLongIdent explicitValTyparDecls HIGH_PRECEDENCE_BRACK_APP atomicPatsOrNamePatPairs - { let vis, lid = $1 + { let vis, pat = $1 let args, argsM = $4 let m = unionRanges (rhs2 parseState 1 2) argsM - SynPat.LongIdent (lid, None, None, Some $2, args, vis, m) } + SynPat.ParametersOwner (pat, None, None, Some $2, args, vis, m) } | atomicPatternLongIdent atomicPatsOrNamePatPairs %prec pat_app - { let vis, lid = $1 + { let vis, pat = $1 let args, argsM = $2 let m = unionRanges (rhs parseState 1) argsM - SynPat.LongIdent (lid, None, None, None, args, vis, m) } + SynPat.ParametersOwner (pat, None, None, None, args, vis, m) } | atomicPatternLongIdent HIGH_PRECEDENCE_PAREN_APP atomicPatsOrNamePatPairs - { let vis, lid = $1 + { let vis, pat = $1 let args, argsM = $3 let m = unionRanges (rhs parseState 1) argsM - SynPat.LongIdent (lid, None, None, None, args, vis, m) } + SynPat.ParametersOwner (pat, None, None, None, args, vis, m) } | atomicPatternLongIdent HIGH_PRECEDENCE_BRACK_APP atomicPatsOrNamePatPairs - { let vis, lid = $1 + { let vis, pat = $1 let args, argsM = $3 let m = unionRanges (rhs parseState 1) argsM - SynPat.LongIdent (lid, None, None, None, args, vis, m) } + SynPat.ParametersOwner (pat, None, None, None, args, vis, m) } | COLON_QMARK atomTypeOrAnonRecdType %prec pat_isinst { SynPat.IsInst($2, lhs parseState) } @@ -3386,10 +3406,16 @@ atomicPattern: { SynPat.OptionalVal($2, lhs parseState) } | atomicPatternLongIdent %prec prec_atompat_pathop - { let vis, lidwd = $1 - if not (isNilOrSingleton lidwd.Lid) || String.isLeadingIdentifierCharacterUpperCase (List.head lidwd.Lid).idText - then mkSynPatMaybeVar lidwd vis (lhs parseState) - else mkSynPatVar vis (List.head lidwd.Lid) } + { let vis, pat = $1 + match pat with + | SynPat.LongIdent(longDotId = lidwd) -> + if not (isNilOrSingleton lidwd.Lid) || String.isLeadingIdentifierCharacterUpperCase (List.head lidwd.Lid).idText + then mkSynPatMaybeVar lidwd vis (lhs parseState) + else mkSynPatVar vis (List.head lidwd.Lid) + | SynPat.Named(ident, isThisVal, _, m) -> SynPat.Named(ident, isThisVal, vis, m) + | SynPat.Operator(operator, _, m) -> SynPat.Operator(operator, vis, m) + | SynPat.DotGetOperator(pref, dot, lpr, operator, rpr, _, m) -> SynPat.DotGetOperator(pref, dot, lpr, operator, rpr, vis, m) + | _ -> pat } | constant { SynPat.Const (fst $1, snd $1) } @@ -3493,7 +3519,9 @@ parenPattern: SynPat.Attrib($2, $1, lhsm) } | parenPattern COLON_COLON parenPattern - { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons, []), None, None, None, SynArgPats.Pats [ SynPat.Tuple (false, [$1;$3], rhs2 parseState 1 3) ], None, lhs parseState) } + { let mPat = rhs parseState 2 + let pat = SynPat.Named(mkSynId mPat opNameCons, false, None, mPat) + SynPat.ParametersOwner (pat, None, None, None, SynArgPats.Pats [ SynPat.Tuple (false, [$1;$3], rhs2 parseState 1 3) ], None, lhs parseState) } | constrPattern { $1 } @@ -4441,8 +4469,9 @@ atomicExpr: { let arg1 = SynExpr.Ident (ident("base", rhs parseState 1)) $3 arg1 (lhs parseState) (rhs parseState 2), false } - | QMARK nameop - { SynExpr.LongIdent (true, LongIdentWithDots([$2], []), None, rhs parseState 2), false } + | QMARK ident + { let m = rhs2 parseState 1 2 + SynExpr.Optional($2, m), false } | atomicExpr QMARK dynamicArg { let arg1, hpa1 = $1 @@ -4451,7 +4480,7 @@ atomicExpr: | GLOBAL { SynExpr.Ident (ident(MangledGlobalName, rhs parseState 1)), false } - | identExpr + | identOrOpExpr { $1, false } | LBRACK listExprElements RBRACK @@ -4485,7 +4514,7 @@ atomicExpr: { $1, false } atomicExprQualification: - | identOrOp + | identOrOpExpr { let idm = rhs parseState 1 (fun e lhsm dotm -> mkSynDot dotm lhsm e $1) } @@ -4512,12 +4541,19 @@ atomicExprQualification: SynExpr.LibraryOnlyUnionCaseFieldGet (e, mkSynCaseName lhsm opNameCons, (fst $5), lhsm)) } | LPAREN typedSequentialExpr rparen - { (fun e lhsm dotm -> + { let lpr = rhs parseState 1 + let rpr = rhs parseState 3 + let pr = unionRanges lpr rpr + (fun e lhsm dotm -> // Check for expr.( * ) // Note that "*" is parsed as an expression (it is allowed in "foo.[3,*]") match $2 with | SynExpr.IndexRange (None, opm, None, _m1, _m2, _) -> - mkSynDot dotm lhsm e (ident(CompileOpName "*", opm)) + let rightExpr = + let starIdent = ident(CompileOpName "*", opm) + let operatorExpr = SynExpr.Operator(SynOperatorName.Operator(starIdent), opm) + SynExpr.Paren(operatorExpr, lpr, Some rpr, pr) + mkSynDot dotm lhsm e rightExpr | _ -> if parseState.LexBuffer.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatError (FSComp.SR.mlCompatMultiPrefixTyparsNoLongerSupported()) (lhs parseState) @@ -5580,26 +5616,40 @@ path: let (LongIdentWithDots(lid, dotms)) = $1 in LongIdentWithDots(lid, dotms @ [rhs parseState 2]) } -/* An operator name, with surrounnding parentheses */ -opName: - | LPAREN operatorName rparen - { ident(CompileOpName $2, rhs parseState 2) } +/* An operator name, with surrounding parentheses */ +opName: + | LPAREN operatorName rparen + { let ident = ident(CompileOpName $2, rhs parseState 2) + rhs parseState 1, SynOperatorName.Operator(ident), rhs parseState 3 } - | LPAREN error rparen - { reportParseErrorAt (lhs parseState) (FSComp.SR.parsErrorParsingAsOperatorName()); ident(CompileOpName "****", rhs parseState 2) } + | LPAREN error rparen + { reportParseErrorAt (lhs parseState) (FSComp.SR.parsErrorParsingAsOperatorName()) + let ident = ident(CompileOpName "****", rhs parseState 2) + rhs parseState 1, SynOperatorName.Operator(ident), rhs parseState 3 } | LPAREN_STAR_RPAREN - { ident(CompileOpName "*", rhs parseState 1) } + { let m= rhs parseState 1 + let lpr = mkFileIndexRange m.FileIndex m.Start m.Start + let mStar = mkFileIndexRange m.FileIndex (mkPos m.StartLine (m.StartColumn + 1)) (mkPos m.EndLine (m.EndColumn - 1)) + let ident = ident(CompileOpName "*", mStar) + let rpr = mkFileIndexRange m.FileIndex m.End m.End + lpr, SynOperatorName.Operator(ident), rpr } /* active pattern name */ - | LPAREN activePatternCaseNames BAR rparen - { let text = ("|" + String.concat "|" (List.rev $2) + "|") - ident(text, rhs2 parseState 2 3) } - + | LPAREN activePatternCaseNames BAR rparen + { let lpr = rhs parseState 1 + let text = ("|" + String.concat "|" (List.rev $2) + "|") + let ident = ident(text, rhs2 parseState 2 3) + let rpr = rhs parseState 4 + lpr, SynOperatorName.ActivePattern(ident), rpr } + /* partial active pattern name */ - | LPAREN activePatternCaseNames BAR UNDERSCORE BAR rparen - { let text = ("|" + String.concat "|" (List.rev $2) + "|_|" ) - ident(text, rhs2 parseState 2 5) } + | LPAREN activePatternCaseNames BAR UNDERSCORE BAR rparen + { let lpr = rhs parseState 1 + let text = ("|" + String.concat "|" (List.rev $2) + "|_|" ) + let ident = ident(text, rhs2 parseState 2 5) + let rpr = rhs parseState 6 + lpr, SynOperatorName.PartialActivePattern(ident), rpr } /* An operator name, without surrounding parentheses */ operatorName: @@ -5702,43 +5752,37 @@ activePatternCaseNames: { $3 :: $1 } /* A single item that is an identifier or operator name */ -identOrOp: +identOrOpExpr: | ident - { $1 } + { SynExpr.Ident($1) } | opName - { $1 } + { let lpr, operatorName, rpr = $1 + let m = rhs parseState 1 + SynExpr.Paren(SynExpr.Operator(operatorName, operatorName.Range), lpr, Some rpr, m) } + +/* A single item that is an identifier or operator name for patterns */ +identOrOpPat: + | ident + { SynPat.Named($1, false, None, $1.idRange) } + + | opName + { let _lpr, operatorName, _rpr = $1 + let m = rhs parseState 1 + SynPat.Paren(SynPat.Operator(operatorName, None, operatorName.Range), m) } /* An A.B.C path ending in an identifier or operator name */ /* Note, only used in atomicPatternLongIdent */ pathOp: - | ident - { LongIdentWithDots([$1], []) } - - | opName - { LongIdentWithDots([$1], []) } + | identOrOpPat { $1 } | ident DOT pathOp - { let (LongIdentWithDots(lid, dotms)) = $3 in LongIdentWithDots($1 :: lid, rhs parseState 2 :: dotms) } + { prependIdentInPattern $1 (rhs parseState 2) $3 } | ident DOT error - { (* silent recovery *) LongIdentWithDots([$1], [rhs parseState 2]) } + { (* silent recovery *) SynPat.LongIdent(LongIdentWithDots([$1], [rhs parseState 2]), None, rhs parseState 2) } -/* nameop is identOrOp not used as part of a path */ -nameop: - | identOrOp { $1 } - -identExpr: - | ident - { SynExpr.Ident($1) } - - | opName - { let m = lhs parseState - let mLparen = mkFileIndexRange m.FileIndex m.Start (mkPos m.StartLine (m.StartColumn + 1)) - let mRparen = mkFileIndexRange m.FileIndex (mkPos m.EndLine (m.EndColumn - 1)) m.End - SynExpr.Paren(SynExpr.Ident($1), mLparen, Some mRparen, m) } - topSeparator: | SEMICOLON { } | SEMICOLON_SEMICOLON { } diff --git a/src/fsharp/service/FSharpParseFileResults.fs b/src/fsharp/service/FSharpParseFileResults.fs index 9ad2fd26717..c252d39dd27 100644 --- a/src/fsharp/service/FSharpParseFileResults.fs +++ b/src/fsharp/service/FSharpParseFileResults.fs @@ -84,17 +84,22 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, member _.TryRangeOfNameOfNearestOuterBindingContainingPos pos = let tryGetIdentRangeFromBinding binding = - match binding with - | SynBinding(headPat=headPat) -> - match headPat with + let rec visit (pat: SynPat) = + match pat with | SynPat.LongIdent (longDotId=longIdentWithDots) -> Some longIdentWithDots.Range | SynPat.As (rhsPat=SynPat.Named (ident=ident; isThisVal=false)) | SynPat.Named (ident, false, _, _) -> Some ident.idRange + | SynPat.Operator(operator, _, _) -> Some operator.Ident.idRange + | SynPat.DotGetOperator(range = m) -> Some m + | SynPat.ParametersOwner(pattern = pat) -> visit pat | _ -> None + match binding with + | SynBinding(headPat=headPat) -> visit headPat + let rec walkBinding expr workingRange = match expr with @@ -137,11 +142,12 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, SyntaxTraversal.Traverse(pos, input, { new SyntaxVisitorBase<_>() with member _.VisitExpr(_, _, defaultTraverse, expr) = match expr with - | SynExpr.App (_, _, SynExpr.App(_, true, SynExpr.Ident ident, _, _), argExpr, _) when rangeContainsPos argExpr.Range pos -> + | SynExpr.App (_, _, SynExpr.App(_, true, SynExpr.Operator(SynOperatorName.Operator _ as operator,_), _, _), argExpr, _) when rangeContainsPos argExpr.Range pos -> match argExpr with | SynExpr.App(_, _, _, SynExpr.Paren(expr, _, _, _), _) when rangeContainsPos expr.Range pos -> None | _ -> + let ident = operator.Ident if ident.idText = "op_PipeRight" then Some (ident, 1) elif ident.idText = "op_PipeRight2" then @@ -173,7 +179,9 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, match expr with | SynExpr.Ident ident -> Some ident.idRange - | SynExpr.LongIdent (_, _, _, range) -> Some range + | SynExpr.Operator(operator, _) -> Some operator.Ident.idRange + + | SynExpr.LongIdent (range = range) -> Some range | SynExpr.Paren (expr, _, _, range) when rangeContainsPos range pos -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos @@ -307,11 +315,11 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, SynExprAppLocationsImpl.getAllCurriedArgsAtPosition pos input member _.TryRangeOfParenEnclosingOpEqualsGreaterUsage opGreaterEqualPos = - let (|Ident|_|) ofName = - function | SynExpr.Ident ident when ident.idText = ofName -> Some () + let (|Operator|_|) ofName = + function | SynExpr.Operator(operator, _) when operator.Ident.idText = ofName -> Some () | _ -> None let (|InfixAppOfOpEqualsGreater|_|) = - function | SynExpr.App(ExprAtomicFlag.NonAtomic, false, SynExpr.App(ExprAtomicFlag.NonAtomic, true, Ident "op_EqualsGreater", actualParamListExpr, _), actualLambdaBodyExpr, _) -> + function | SynExpr.App(ExprAtomicFlag.NonAtomic, false, SynExpr.App(ExprAtomicFlag.NonAtomic, true, Operator "op_EqualsGreater", actualParamListExpr, _), actualLambdaBodyExpr, _) -> Some (actualParamListExpr, actualLambdaBodyExpr) | _ -> None @@ -357,9 +365,9 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, SyntaxTraversal.Traverse(expressionPos, input, { new SyntaxVisitorBase<_>() with member _.VisitExpr(_, _, defaultTraverse, expr) = match expr with - | SynExpr.App(_, false, SynExpr.Ident funcIdent, expr, _) -> - if funcIdent.idText = "op_Dereference" && rangeContainsPos expr.Range expressionPos then - Some funcIdent.idRange + | SynExpr.App(_, false, SynExpr.Operator(SynOperatorName.Operator _ as operator, _), expr, _) -> + if operator.Ident.idText = "op_Dereference" && rangeContainsPos expr.Range expressionPos then + Some operator.Ident.idRange else None | _ -> defaultTraverse expr }) @@ -368,8 +376,8 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, SyntaxTraversal.Traverse(expressionPos, input, { new SyntaxVisitorBase<_>() with member _.VisitExpr(_, _, defaultTraverse, expr) = match expr with - | SynExpr.App(_, false, SynExpr.Ident funcIdent, expr, _) -> - if funcIdent.idText = "op_Dereference" && rangeContainsPos expr.Range expressionPos then + | SynExpr.App(_, false, SynExpr.Operator(SynOperatorName.Operator _ as operator, _), expr, _) -> + if operator.Ident.idText = "op_Dereference" && rangeContainsPos expr.Range expressionPos then Some expr.Range else None @@ -524,10 +532,13 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, match expr with | SynExpr.ArbitraryAfterError _ | SynExpr.LongIdent _ + | SynExpr.DotGetOperator _ | SynExpr.LibraryOnlyILAssembly _ | SynExpr.LibraryOnlyStaticOptimization _ | SynExpr.Null _ | SynExpr.Ident _ + | SynExpr.Operator _ + | SynExpr.Optional _ | SynExpr.ImplicitZero _ | SynExpr.Const _ -> () diff --git a/src/fsharp/service/ServiceInterfaceStubGenerator.fs b/src/fsharp/service/ServiceInterfaceStubGenerator.fs index a4bda5f44d1..b24552a08b9 100644 --- a/src/fsharp/service/ServiceInterfaceStubGenerator.fs +++ b/src/fsharp/service/ServiceInterfaceStubGenerator.fs @@ -853,7 +853,7 @@ module InterfaceStubGenerator = | SynExpr.Ident _ident -> None - | SynExpr.LongIdent (_, _longIdent, _altNameRefCell, _range) -> + | SynExpr.LongIdent _ -> None | SynExpr.LongIdentSet (_longIdent, synExpr, _range) -> diff --git a/src/fsharp/service/ServiceNavigation.fs b/src/fsharp/service/ServiceNavigation.fs index 321d1ff50cb..a8433099a75 100755 --- a/src/fsharp/service/ServiceNavigation.fs +++ b/src/fsharp/service/ServiceNavigation.fs @@ -233,17 +233,17 @@ module NavigationImpl = [ createMember(rcid, NavigationItemKind.Field, FSharpGlyph.Field, range, enclosingEntityKind, false, access) ] | SynMemberDefn.AutoProperty(ident=id; accessibility=access) -> [ createMember(id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, access) ] - | SynMemberDefn.AbstractSlot(SynValSig(ident=id; synType=ty; accessibility=access), _, _) -> + | SynMemberDefn.AbstractSlot(SynValSig(pat = SingleIdentInPat id; synType=ty; accessibility=access), _, _) -> [ createMember(id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access) ] | SynMemberDefn.NestedType _ -> failwith "tycon as member????" //processTycon tycon | SynMemberDefn.Interface(members=Some(membs)) -> processMembers membs enclosingEntityKind |> snd | _ -> [] // can happen if one is a getter and one is a setter - | [SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.LongIdent(longDotId=lid1; extraId=Some(info1))) as binding1) - SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.LongIdent(longDotId=lid2; extraId=Some(info2))) as binding2)] -> + | [SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.ParametersOwner(pattern = LongOrSingleIdentInPat lid1; extraId=Some(info1))) as binding1) + SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.ParametersOwner(pattern = LongOrSingleIdentInPat lid2; extraId=Some(info2))) as binding2)] -> // ensure same long id - assert((lid1.Lid,lid2.Lid) ||> List.forall2 (fun x y -> x.idText = y.idText)) + assert((lid1,lid2) ||> List.forall2 (fun x y -> x.idText = y.idText)) // ensure one is getter, other is setter assert((info1.idText = "set" && info2.idText = "get") || (info2.idText = "set" && info1.idText = "get")) @@ -392,7 +392,7 @@ module NavigationImpl = and processSigMembers (members: SynMemberSig list): list = [ for memb in members do match memb with - | SynMemberSig.Member(SynValSig.SynValSig(ident=id; accessibility=access; range=m), _, _) -> + | SynMemberSig.Member(SynValSig.SynValSig(pat = SingleIdentInPat id; accessibility=access; range=m), _, _) -> yield createMember(id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Class, false, access) | SynMemberSig.ValField(SynField(_, _, Some(rcid), ty, _, _, access, _), _) -> yield createMember(rcid, NavigationItemKind.Field, FSharpGlyph.Field, ty.Range, NavigationEntityKind.Class, false, access) @@ -400,7 +400,7 @@ module NavigationImpl = // Process declarations in a module that belong to the right drop-down (let bindings) let processNestedSigDeclarations decls = decls |> List.collect (function - | SynModuleSigDecl.Val(SynValSig.SynValSig(ident=id; accessibility=access; range=m), _) -> + | SynModuleSigDecl.Val(SynValSig.SynValSig(pat = SingleIdentInPat id; accessibility=access; range=m), _) -> [ createMember(id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Module, false, access) ] | _ -> [] ) @@ -540,8 +540,9 @@ module NavigateTo = | _ -> () { Type = containerType; Name = formatLongIdent lid } - let addValSig kind (SynValSig(ident=id)) isSig container = - addIdent kind id isSig container + let addValSig kind (SynValSig(pat = pat)) isSig container = + ((|SingleIdentInPat|_|) pat) + |> Option.iter (fun id -> addIdent kind id isSig container) let addField(SynField(_, _, id, _, _, _, _, _)) isSig container = match id with diff --git a/src/fsharp/service/ServiceParamInfoLocations.fs b/src/fsharp/service/ServiceParamInfoLocations.fs index b9bfc6a2b76..ab6d0256b8e 100755 --- a/src/fsharp/service/ServiceParamInfoLocations.fs +++ b/src/fsharp/service/ServiceParamInfoLocations.fs @@ -58,9 +58,15 @@ module internal ParameterLocationsImpl = let rec digOutIdentFromFuncExpr synExpr = // we found it, dig out ident match synExpr with - | SynExpr.Ident id -> Some ([id.idText], id.idRange) - | SynExpr.LongIdent (_, LongIdentWithDots(lid, _), _, lidRange) + | SynExpr.Ident id + | SynExpr.Optional(id, _) -> Some ([id.idText], id.idRange) + | SynExpr.Operator(operator, _) -> Some ([operator.Ident.idText], operator.Ident.idRange) + | SynExpr.LongIdent (LongIdentWithDots(lid, _), _, lidRange) | SynExpr.DotGet (_, _, LongIdentWithDots(lid, _), lidRange) -> Some (pathOfLid lid, lidRange) + | SynExpr.DotGetOperator(pref, _, _, operator, _, m) -> + match digOutIdentFromFuncExpr pref with + | Some (lid, _) -> Some ([ yield! lid; yield operator.Ident.idText ], m) + | None -> Some ([operator.Ident.idText], m) | SynExpr.TypeApp (synExpr, _, _synTypeList, _commas, _, _, _range) -> digOutIdentFromFuncExpr synExpr | SynExpr.Paren(expr = expr) -> digOutIdentFromFuncExpr expr | _ -> None @@ -80,15 +86,15 @@ module internal ParameterLocationsImpl = // f(x=4) | SynExpr.App (ExprAtomicFlag.NonAtomic, _, SynExpr.App (ExprAtomicFlag.NonAtomic, true, - SynExpr.Ident op, + SynExpr.Operator(operatorName = SynOperatorName.Operator(op)), SynExpr.Ident n, _range), _, _) when op.idText="op_Equality" -> Some n.idText // f(?x=4) | SynExpr.App (ExprAtomicFlag.NonAtomic, _, SynExpr.App (ExprAtomicFlag.NonAtomic, true, - SynExpr.Ident op, - SynExpr.LongIdent (true(*isOptional*), LongIdentWithDots([n], _), _ref, _lidrange), _range), + SynExpr.Operator(operatorName = SynOperatorName.Operator(op)), + SynExpr.Optional(n, _), _range), _, _) when op.idText="op_Equality" -> Some n.idText | _ -> None diff --git a/src/fsharp/service/ServiceParseTreeWalk.fs b/src/fsharp/service/ServiceParseTreeWalk.fs index 7044425bdd4..22fa18e0aa0 100755 --- a/src/fsharp/service/ServiceParseTreeWalk.fs +++ b/src/fsharp/service/ServiceParseTreeWalk.fs @@ -440,7 +440,7 @@ module SyntaxTraversal = let ok = match isPartOfArrayOrList, synExpr with | false, SynExpr.Ident ident -> visitor.VisitRecordField(path, None, Some (LongIdentWithDots([ident], []))) - | false, SynExpr.LongIdent (false, lidwd, _, _) -> visitor.VisitRecordField(path, None, Some lidwd) + | false, SynExpr.LongIdent (lidwd, _, _) -> visitor.VisitRecordField(path, None, Some lidwd) | _ -> None if ok.IsSome then ok else @@ -520,8 +520,14 @@ module SyntaxTraversal = |> pick expr | SynExpr.Ident _ident -> None + + | SynExpr.Operator _ -> None - | SynExpr.LongIdent (_, _longIdent, _altNameRefCell, _range) -> None + | SynExpr.LongIdent _ -> None + + | SynExpr.DotGetOperator _ -> None + + | SynExpr.Optional _ -> None | SynExpr.LongIdentSet (_longIdent, synExpr, _range) -> traverseSynExpr synExpr @@ -639,7 +645,7 @@ module SyntaxTraversal = | SynPat.Tuple (_, ps, _) | SynPat.ArrayOrList (_, ps, _) -> ps |> List.tryPick (traversePat path) | SynPat.Attrib (p, _, _) -> traversePat path p - | SynPat.LongIdent(argPats=args) -> + | SynPat.ParametersOwner(argPats=args) -> match args with | SynArgPats.Pats ps -> ps |> List.tryPick (traversePat path) | SynArgPats.NamePatPairs (ps, _) -> @@ -683,10 +689,10 @@ module SyntaxTraversal = match mems |> Seq.toList with | [mem] -> // the typical case, a single member has this range 'r' Some (dive mem r (traverseSynMemberDefn path traverseInherit)) - | [SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.LongIdent(longDotId=lid1; extraId=Some(info1)))) as mem1 - SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.LongIdent(longDotId=lid2; extraId=Some(info2)))) as mem2] -> // can happen if one is a getter and one is a setter + | [SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.ParametersOwner(pattern = LongOrSingleIdentInPat lid1; extraId=Some(info1)))) as mem1 + SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.ParametersOwner(pattern = LongOrSingleIdentInPat lid2; extraId=Some(info2)))) as mem2] -> // can happen if one is a getter and one is a setter // ensure same long id - assert( (lid1.Lid,lid2.Lid) ||> List.forall2 (fun x y -> x.idText = y.idText) ) + assert( (lid1,lid2) ||> List.forall2 (fun x y -> x.idText = y.idText) ) // ensure one is getter, other is setter assert( (info1.idText="set" && info2.idText="get") || (info2.idText="set" && info1.idText="get") ) diff --git a/src/fsharp/service/ServiceParsedInputOps.fs b/src/fsharp/service/ServiceParsedInputOps.fs index b945de135a7..e241f10881e 100644 --- a/src/fsharp/service/ServiceParsedInputOps.fs +++ b/src/fsharp/service/ServiceParsedInputOps.fs @@ -215,7 +215,7 @@ module ParsedInput = member _.VisitExpr(_path, traverseSynExpr, defaultTraverse, expr) = let expr = expr // fix debugger locals match expr with - | SynExpr.LongIdent (_, LongIdentWithDots(longIdent, _), _altNameRefCell, _range) -> + | SynExpr.LongIdent (longDotId = LongIdentWithDots(longIdent, _)) -> let _, r = CheckLongIdent longIdent Some r | SynExpr.LongIdentSet (LongIdentWithDots(longIdent, _), synExpr, _range) -> @@ -280,8 +280,8 @@ module ParsedInput = traverseSynExpr synExpr else Some range - | SynExpr.App (ExprAtomicFlag.NonAtomic, true, SynExpr.Ident ident, rhs, _) - when ident.idText = "op_ArrayLookup" + | SynExpr.App (ExprAtomicFlag.NonAtomic, true, SynExpr.Operator(operator, _), rhs, _) + when operator.Ident.idText = "op_ArrayLookup" && not(SyntaxTraversal.rangeContainsPosLeftEdgeInclusive rhs.Range pos) -> match defaultTraverse expr with | None -> @@ -308,7 +308,7 @@ module ParsedInput = match expr with | SynExpr.Paren (e, _, _, _) when foundCandidate -> TryGetExpression foundCandidate e - | SynExpr.LongIdent (_isOptional, LongIdentWithDots(lid, _), _altNameRefCell, _m) -> + | SynExpr.LongIdent (longDotId = LongIdentWithDots(lid, _)) -> getLidParts lid |> Some | SynExpr.DotGet (leftPart, _, LongIdentWithDots(lid, _), _) when (rangeContainsPos (rangeOfLid lid) pos) || foundCandidate -> // requested position is at the lid part of the DotGet @@ -380,7 +380,7 @@ module ParsedInput = | Some (n, _) -> Some ((List.item n lid).idRange.End, (List.length lid = n+1) // foo.$ || (posGeq (List.item (n+1) lid).idRange.Start pos)) // foo.$bar match expr with - | SynExpr.LongIdent (_isOptional, lidwd, _altNameRefCell, _m) -> + | SynExpr.LongIdent (longDotId = lidwd) -> traverseLidOrElse None lidwd | SynExpr.LongIdentSet (lidwd, exprRhs, _m) -> [ dive lidwd lidwd.Range (traverseLidOrElse None) @@ -429,8 +429,8 @@ module ParsedInput = // the cursor is left of the dot None | r -> r - | SynExpr.App (ExprAtomicFlag.NonAtomic, true, SynExpr.Ident ident, lhs, _m) - when ident.idText = "op_ArrayLookup" + | SynExpr.App (ExprAtomicFlag.NonAtomic, true, SynExpr.Operator(operator, _), lhs, _m) + when operator.Ident.idText = "op_ArrayLookup" && not(SyntaxTraversal.rangeContainsPosLeftEdgeInclusive lhs.Range pos) -> match defaultTraverse expr with | None -> @@ -495,7 +495,7 @@ module ParsedInput = | SynPat.Typed(pat, t, _) -> walkPat pat |> Option.orElseWith (fun () -> walkType t) | SynPat.Attrib(pat, Attributes attrs, _) -> walkPat pat |> Option.orElseWith (fun () -> List.tryPick walkAttribute attrs) | SynPat.Or(pat1, pat2, _, _) -> List.tryPick walkPat [pat1; pat2] - | SynPat.LongIdent(typarDecls=typars; argPats=ConstructorPats pats; range=r) -> + | SynPat.ParametersOwner(typarDecls=typars; argPats=ConstructorPats pats; range=r) -> ifPosInRange r (fun _ -> kind) |> Option.orElseWith (fun () -> typars @@ -548,7 +548,7 @@ module ParsedInput = |> Option.orElseWith (fun () -> Option.bind walkExpr e1) and walkExprWithKind (parentKind: EntityKind option) = function - | SynExpr.LongIdent (_, LongIdentWithDots(_, dotRanges), _, r) -> + | SynExpr.LongIdent (LongIdentWithDots(_, dotRanges), _, r) -> match dotRanges with | [] when isPosInRange r -> parentKind |> Option.orElseWith (fun () -> Some (EntityKind.FunctionOrValue false)) | firstDotRange :: _ -> @@ -558,6 +558,16 @@ module ParsedInput = parentKind |> Option.orElseWith (fun () -> Some (EntityKind.FunctionOrValue false)) else None | _ -> None + | SynExpr.DotGetOperator(LongOrSingleIdent(_, LongIdentWithDots(_, dotRanges), _, _), mDot, _, _, _, m) -> + match [ yield! dotRanges; yield mDot ] with + | [] when isPosInRange m -> parentKind |> Option.orElseWith (fun () -> Some (EntityKind.FunctionOrValue false)) + | firstDotRange :: _ -> + let firstPartRange = + mkRange "" m.Start (mkPos firstDotRange.StartLine (firstDotRange.StartColumn - 1)) + if isPosInRange firstPartRange then + parentKind |> Option.orElseWith (fun () -> Some (EntityKind.FunctionOrValue false)) + else None + | _ -> None | SynExpr.Paren (e, _, _, _) -> walkExprWithKind parentKind e | SynExpr.Quote (_, _, e, _, _) -> walkExprWithKind parentKind e | SynExpr.Typed (e, _, _) -> walkExprWithKind parentKind e @@ -595,6 +605,8 @@ module ParsedInput = | SynExpr.IfThenElse (ifExpr=e1; thenExpr=e2; elseExpr=e3) -> List.tryPick (walkExprWithKind parentKind) [e1; e2] |> Option.orElseWith (fun () -> match e3 with None -> None | Some e -> walkExprWithKind parentKind e) | SynExpr.Ident ident -> ifPosInRange ident.idRange (fun _ -> Some (EntityKind.FunctionOrValue false)) + | SynExpr.Operator(operator, _) -> ifPosInRange operator.Ident.idRange (fun _ -> Some (EntityKind.FunctionOrValue false)) + | SynExpr.Optional(ident, _) -> ifPosInRange ident.idRange (fun _ -> Some (EntityKind.FunctionOrValue false)) | SynExpr.LongIdentSet (_, e, _) -> walkExprWithKind parentKind e | SynExpr.DotGet (e, _, _, _) -> walkExprWithKind parentKind e | SynExpr.DotSet (e, _, _, _) -> walkExprWithKind parentKind e @@ -826,8 +838,8 @@ module ParsedInput = let (|Operator|_|) name e = match e with - | SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, SynExpr.Ident ident, lhs, _), rhs, _) - when ident.idText = name -> Some (lhs, rhs) + | SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, SynExpr.Operator(operatorName = operator), lhs, _), rhs, _) + when operator.Ident.idText = name -> Some (lhs, rhs) | _ -> None // checks if we are in a range operator @@ -880,10 +892,10 @@ module ParsedInput = | SynExpr.App (_, false, SynExpr.TypeApp (SynExpr.Ident id, _, _, _, mGreaterThan, _, _), arg, _) -> // A<_>() Some (endOfClosingTokenOrIdent mGreaterThan id, findSetters arg) - | SynExpr.App (_, false, SynExpr.LongIdent (_, lid, _, _), arg, _) -> + | SynExpr.App (_, false, SynExpr.LongIdent (longDotId = lid), arg, _) -> // A.B() Some (endOfLastIdent lid, findSetters arg) - | SynExpr.App (_, false, SynExpr.TypeApp (SynExpr.LongIdent (_, lid, _, _), _, _, _, mGreaterThan, _, _), arg, _) -> + | SynExpr.App (_, false, SynExpr.TypeApp (SynExpr.LongIdent (longDotId = lid), _, _, _, mGreaterThan, _, _), arg, _) -> // A.B<_>() Some (endOfClosingTokenOrLastIdent mGreaterThan lid, findSetters arg) | _ -> None @@ -1009,7 +1021,7 @@ module ParsedInput = | SynPat.LongIdent(longDotId = lidwd) when rangeContainsPos lidwd.Range pos -> // let fo|o x = () Some CompletionContext.Invalid - | SynPat.LongIdent(argPats=ctorArgs) -> + | SynPat.ParametersOwner(argPats=ctorArgs) -> match ctorArgs with | SynArgPats.Pats pats -> pats |> List.tryPick (fun (SkipFromParseErrorPat pat) -> @@ -1256,6 +1268,9 @@ module ParsedInput = | SynPat.ArrayOrList (_, pats, _) | SynPat.Ands (pats, _) -> List.iter walkPat pats | SynPat.Named (ident, _, _, _) -> addIdent ident + | SynPat.LongIdent(longDotId = LongIdentWithDots(lid, _)) -> List.iter addIdent lid + | SynPat.Operator(operator, _, _) -> addIdent operator.Ident + | SynPat.DotGetOperator(pref = pref; operator = operator) -> walkPat pref; addIdent operator.Ident | SynPat.Typed (pat, t, _) -> walkPat pat walkType t @@ -1264,8 +1279,8 @@ module ParsedInput = List.iter walkAttribute attrs | SynPat.As (pat1, pat2, _) | SynPat.Or (pat1, pat2, _, _) -> List.iter walkPat [pat1; pat2] - | SynPat.LongIdent (longDotId=ident; typarDecls=typars; argPats=ConstructorPats pats) -> - addLongIdentWithDots ident + | SynPat.ParametersOwner (pattern = pat; typarDecls=typars; argPats=ConstructorPats pats) -> + walkPat pat typars |> Option.iter (fun (ValTyparDecls (typars, constraints, _)) -> List.iter walkTyparDecl typars @@ -1345,6 +1360,7 @@ module ParsedInput = addLongIdentWithDots ident e |> Option.iter walkExpr) | SynExpr.Ident ident -> addIdent ident + | SynExpr.Operator(operator, _) -> addIdent operator.Ident | SynExpr.ObjExpr (objType=ty; argOptions=argOpt; bindings=bindings; members=ms; extraImpls=ifaces) -> let bindings = unionBindingAndMembers bindings ms argOpt |> Option.iter (fun (e, ident) -> @@ -1353,7 +1369,10 @@ module ParsedInput = walkType ty List.iter walkBinding bindings List.iter walkInterfaceImpl ifaces - | SynExpr.LongIdent (_, ident, _, _) -> addLongIdentWithDots ident + | SynExpr.LongIdent (longDotId = ident) -> addLongIdentWithDots ident + | SynExpr.DotGetOperator(LongOrSingleIdent(_, LongIdentWithDots(lid, dotRanges), _, _), mDot, _, operator, _, _) -> + addLongIdentWithDots (LongIdentWithDots([ yield! lid; yield operator.Ident ], [ yield! dotRanges; yield mDot ])) + | SynExpr.Optional(ident, _) -> addIdent ident | SynExpr.For (ident=ident; identBody=e1; toBody=e2; doBody=e3) -> addIdent ident List.iter walkExpr [e1; e2; e3] diff --git a/src/fsharp/service/ServiceStructure.fs b/src/fsharp/service/ServiceStructure.fs index f78070a9e91..f9f98ff2ef2 100644 --- a/src/fsharp/service/ServiceStructure.fs +++ b/src/fsharp/service/ServiceStructure.fs @@ -829,7 +829,7 @@ module Structure = let rec parseModuleSigDeclaration (decl: SynModuleSigDecl) = match decl with - | SynModuleSigDecl.Val (SynValSig(attributes=attrs; ident=ident; range=valrange), r) -> + | SynModuleSigDecl.Val (SynValSig(attributes=attrs; pat= SingleIdentInPat ident; range=valrange), r) -> let collapse = Range.endToEnd ident.idRange valrange rcheck Scope.Val Collapse.Below r collapse parseAttributes attrs diff --git a/src/fsharp/service/ServiceUntypedParse.fs b/src/fsharp/service/ServiceUntypedParse.fs index 3228be7e5cd..540626b510e 100755 --- a/src/fsharp/service/ServiceUntypedParse.fs +++ b/src/fsharp/service/ServiceUntypedParse.fs @@ -600,8 +600,8 @@ module UntypedParseImpl = traverseSynExpr synExpr else Some range - | SynExpr.App (ExprAtomicFlag.NonAtomic, true, (SynExpr.Ident ident), rhs, _) - when ident.idText = "op_ArrayLookup" + | SynExpr.App (ExprAtomicFlag.NonAtomic, true, (SynExpr.Operator(operator, _)), rhs, _) + when operator.Ident.idText = "op_ArrayLookup" && not(AstTraversal.rangeContainsPosLeftEdgeInclusive rhs.Range pos) -> match defaultTraverse expr with | None -> @@ -755,8 +755,8 @@ module UntypedParseImpl = // the cursor is left of the dot None | r -> r - | SynExpr.App (ExprAtomicFlag.NonAtomic, true, (SynExpr.Ident ident), lhs, _m) - when ident.idText = "op_ArrayLookup" + | SynExpr.App (ExprAtomicFlag.NonAtomic, true, (SynExpr.Operator(operator, _)), lhs, _m) + when operator.Ident.idText = "op_ArrayLookup" && not(AstTraversal.rangeContainsPosLeftEdgeInclusive lhs.Range pos) -> match defaultTraverse expr with | None -> diff --git a/src/fsharp/service/ServiceXmlDocParser.fs b/src/fsharp/service/ServiceXmlDocParser.fs index dfd08c45048..d7d4b3952d5 100644 --- a/src/fsharp/service/ServiceXmlDocParser.fs +++ b/src/fsharp/service/ServiceXmlDocParser.fs @@ -22,10 +22,15 @@ module XmlDocParsing = match pat with | SynPat.As (_, SynPat.Named(id,_isTheThisVar,_access,_range), _) | SynPat.Named (id,_isTheThisVar,_access,_range) -> [id.idText] + | SynPat.LongIdent(longDotId = LongIdentWithDots(lid, _)) -> List.map (fun (id:Ident) -> id.idText) lid + | SynPat.Operator(operator, _, _) -> [ operator.Ident.idText ] | SynPat.Typed(pat,_type,_range) -> digNamesFrom pat | SynPat.Attrib(pat,_attrs,_range) -> digNamesFrom pat - | SynPat.LongIdent(argPats=ConstructorPats pats) -> - pats |> List.collect digNamesFrom + | SynPat.ParametersOwner(pattern = pat; argPats=ConstructorPats pats) -> + pat::pats |> List.collect digNamesFrom + | SynPat.DotGetOperator (pref = pref; operator = operator) -> + [ yield! digNamesFrom pref + yield operator.Ident.idText ] | SynPat.Tuple(_,pats,_range) -> pats |> List.collect digNamesFrom | SynPat.Paren(pat,_range) -> digNamesFrom pat | SynPat.OptionalVal (id, _) -> [id.idText] diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs index 8e9b6ae2cff..425eb0aab67 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs @@ -21,7 +21,7 @@ module OffsideExceptions = |> shouldSucceed |> ignore - [] + [] let RelaxWhitespace2 compilation = compilation |> asFsx @@ -31,7 +31,7 @@ module OffsideExceptions = |> shouldSucceed |> ignore - [] + [] let RelaxWhitespace2_Warning25 compilation = compilation |> asFsx diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/UnionTypes/UnionTypes.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/UnionTypes/UnionTypes.fs index 1e27322bfbd..b37765e79c5 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/UnionTypes/UnionTypes.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/UnionTypes/UnionTypes.fs @@ -71,7 +71,7 @@ module UnionTypes = |> verifyCompile |> shouldFail |> withDiagnostics [ - (Error 10, Line 8, Col 12, Line 8, Col 13, "Unexpected integer literal in union case. Expected identifier, '(', '(*)' or other token.") + (Error 10, Line 8, Col 12, Line 8, Col 13, "Unexpected integer literal in union case. Expected identifier, '(' or other token.") ] //SOURCE=E_BeginWithUppercase03.fsx SCFLAGS="--test:ErrorRanges" # E_BeginWithUppercase03.fsx @@ -81,7 +81,7 @@ module UnionTypes = |> verifyCompile |> shouldFail |> withDiagnostics [ - (Error 10, Line 9, Col 12, Line 9, Col 15, "Unexpected string literal in union case. Expected identifier, '(', '(*)' or other token.") + (Error 10, Line 9, Col 12, Line 9, Col 15, "Unexpected string literal in union case. Expected identifier, '(' or other token.") ] //SOURCE=E_BeginWithUppercase04.fsx SCFLAGS="--test:ErrorRanges" # E_BeginWithUppercase04.fsx @@ -91,7 +91,7 @@ module UnionTypes = |> verifyCompile |> shouldFail |> withDiagnostics [ - (Error 10, Line 9, Col 12, Line 9, Col 13, "Unexpected reserved keyword in union case. Expected identifier, '(', '(*)' or other token.") + (Error 10, Line 9, Col 12, Line 9, Col 13, "Unexpected reserved keyword in union case. Expected identifier, '(' or other token.") ] //SOURCE=E_BeginWithUppercaseNoPipe01.fsx SCFLAGS="--test:ErrorRanges" # E_BeginWithUppercaseNoPipe01.fsx 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 51359493963..b89fccd9793 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -6297,6 +6297,18 @@ FSharp.Compiler.Syntax.SynExpr+DotGet: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExpr+DotGet: FSharp.Compiler.Text.Range get_rangeOfDot() FSharp.Compiler.Syntax.SynExpr+DotGet: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+DotGet: FSharp.Compiler.Text.Range rangeOfDot +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Syntax.SynExpr get_pref() +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Syntax.SynExpr pref +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Syntax.SynOperatorName get_operator() +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Syntax.SynOperatorName operator +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Text.Range dot +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Text.Range get_dot() +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Text.Range get_lpr() +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Text.Range get_rpr() +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Text.Range lpr +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynExpr+DotGetOperator: FSharp.Compiler.Text.Range rpr FSharp.Compiler.Syntax.SynExpr+DotIndexedGet: FSharp.Compiler.Syntax.SynExpr get_indexArgs() FSharp.Compiler.Syntax.SynExpr+DotIndexedGet: FSharp.Compiler.Syntax.SynExpr get_objectExpr() FSharp.Compiler.Syntax.SynExpr+DotIndexedGet: FSharp.Compiler.Syntax.SynExpr indexArgs @@ -6523,8 +6535,6 @@ FSharp.Compiler.Syntax.SynExpr+LibraryOnlyUnionCaseFieldSet: Int32 fieldNum FSharp.Compiler.Syntax.SynExpr+LibraryOnlyUnionCaseFieldSet: Int32 get_fieldNum() FSharp.Compiler.Syntax.SynExpr+LibraryOnlyUnionCaseFieldSet: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] get_longId() FSharp.Compiler.Syntax.SynExpr+LibraryOnlyUnionCaseFieldSet: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] longId -FSharp.Compiler.Syntax.SynExpr+LongIdent: Boolean get_isOptional() -FSharp.Compiler.Syntax.SynExpr+LongIdent: Boolean isOptional FSharp.Compiler.Syntax.SynExpr+LongIdent: FSharp.Compiler.Syntax.LongIdentWithDots get_longDotId() FSharp.Compiler.Syntax.SynExpr+LongIdent: FSharp.Compiler.Syntax.LongIdentWithDots longDotId FSharp.Compiler.Syntax.SynExpr+LongIdent: FSharp.Compiler.Text.Range get_range() @@ -6601,6 +6611,14 @@ FSharp.Compiler.Syntax.SynExpr+ObjExpr: Microsoft.FSharp.Core.FSharpOption`1[FSh FSharp.Compiler.Syntax.SynExpr+ObjExpr: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] withKeyword FSharp.Compiler.Syntax.SynExpr+ObjExpr: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Syntax.SynExpr,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident]]] argOptions FSharp.Compiler.Syntax.SynExpr+ObjExpr: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Syntax.SynExpr,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident]]] get_argOptions() +FSharp.Compiler.Syntax.SynExpr+Operator: FSharp.Compiler.Syntax.SynOperatorName get_operatorName() +FSharp.Compiler.Syntax.SynExpr+Operator: FSharp.Compiler.Syntax.SynOperatorName operatorName +FSharp.Compiler.Syntax.SynExpr+Operator: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.Syntax.SynExpr+Operator: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynExpr+Optional: FSharp.Compiler.Syntax.Ident get_ident() +FSharp.Compiler.Syntax.SynExpr+Optional: FSharp.Compiler.Syntax.Ident ident +FSharp.Compiler.Syntax.SynExpr+Optional: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.Syntax.SynExpr+Optional: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+Paren: FSharp.Compiler.Syntax.SynExpr expr FSharp.Compiler.Syntax.SynExpr+Paren: FSharp.Compiler.Syntax.SynExpr get_expr() FSharp.Compiler.Syntax.SynExpr+Paren: FSharp.Compiler.Text.Range get_leftParenRange() @@ -6667,6 +6685,7 @@ FSharp.Compiler.Syntax.SynExpr+Tags: Int32 DiscardAfterMissingQualificationAfter FSharp.Compiler.Syntax.SynExpr+Tags: Int32 Do FSharp.Compiler.Syntax.SynExpr+Tags: Int32 DoBang FSharp.Compiler.Syntax.SynExpr+Tags: Int32 DotGet +FSharp.Compiler.Syntax.SynExpr+Tags: Int32 DotGetOperator FSharp.Compiler.Syntax.SynExpr+Tags: Int32 DotIndexedGet FSharp.Compiler.Syntax.SynExpr+Tags: Int32 DotIndexedSet FSharp.Compiler.Syntax.SynExpr+Tags: Int32 DotNamedIndexedPropertySet @@ -6702,6 +6721,8 @@ FSharp.Compiler.Syntax.SynExpr+Tags: Int32 NamedIndexedPropertySet FSharp.Compiler.Syntax.SynExpr+Tags: Int32 New FSharp.Compiler.Syntax.SynExpr+Tags: Int32 Null FSharp.Compiler.Syntax.SynExpr+Tags: Int32 ObjExpr +FSharp.Compiler.Syntax.SynExpr+Tags: Int32 Operator +FSharp.Compiler.Syntax.SynExpr+Tags: Int32 Optional FSharp.Compiler.Syntax.SynExpr+Tags: Int32 Paren FSharp.Compiler.Syntax.SynExpr+Tags: Int32 Quote FSharp.Compiler.Syntax.SynExpr+Tags: Int32 Record @@ -6826,6 +6847,7 @@ FSharp.Compiler.Syntax.SynExpr: Boolean IsDiscardAfterMissingQualificationAfterD FSharp.Compiler.Syntax.SynExpr: Boolean IsDo FSharp.Compiler.Syntax.SynExpr: Boolean IsDoBang FSharp.Compiler.Syntax.SynExpr: Boolean IsDotGet +FSharp.Compiler.Syntax.SynExpr: Boolean IsDotGetOperator FSharp.Compiler.Syntax.SynExpr: Boolean IsDotIndexedGet FSharp.Compiler.Syntax.SynExpr: Boolean IsDotIndexedSet FSharp.Compiler.Syntax.SynExpr: Boolean IsDotNamedIndexedPropertySet @@ -6861,6 +6883,8 @@ FSharp.Compiler.Syntax.SynExpr: Boolean IsNamedIndexedPropertySet FSharp.Compiler.Syntax.SynExpr: Boolean IsNew FSharp.Compiler.Syntax.SynExpr: Boolean IsNull FSharp.Compiler.Syntax.SynExpr: Boolean IsObjExpr +FSharp.Compiler.Syntax.SynExpr: Boolean IsOperator +FSharp.Compiler.Syntax.SynExpr: Boolean IsOptional FSharp.Compiler.Syntax.SynExpr: Boolean IsParen FSharp.Compiler.Syntax.SynExpr: Boolean IsQuote FSharp.Compiler.Syntax.SynExpr: Boolean IsRecord @@ -6893,6 +6917,7 @@ FSharp.Compiler.Syntax.SynExpr: Boolean get_IsDiscardAfterMissingQualificationAf FSharp.Compiler.Syntax.SynExpr: Boolean get_IsDo() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsDoBang() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsDotGet() +FSharp.Compiler.Syntax.SynExpr: Boolean get_IsDotGetOperator() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsDotIndexedGet() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsDotIndexedSet() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsDotNamedIndexedPropertySet() @@ -6928,6 +6953,8 @@ FSharp.Compiler.Syntax.SynExpr: Boolean get_IsNamedIndexedPropertySet() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsNew() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsNull() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsObjExpr() +FSharp.Compiler.Syntax.SynExpr: Boolean get_IsOperator() +FSharp.Compiler.Syntax.SynExpr: Boolean get_IsOptional() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsParen() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsQuote() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsRecord() @@ -6959,6 +6986,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMi FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDo(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.LongIdentWithDots, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotGetOperator(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynOperatorName, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotIndexedGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotIndexedSet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotNamedIndexedPropertySet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.LongIdentWithDots, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) @@ -6985,7 +7013,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLibraryOnlyILA FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLibraryOnlyStaticOptimization(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynStaticOptimizationConstraint], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLibraryOnlyUnionCaseFieldGet(FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Int32, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLibraryOnlyUnionCaseFieldSet(FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Int32, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLongIdent(Boolean, FSharp.Compiler.Syntax.LongIdentWithDots, Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpRef`1[FSharp.Compiler.Syntax.SynSimplePatAlternativeIdInfo]], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLongIdent(FSharp.Compiler.Syntax.LongIdentWithDots, Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpRef`1[FSharp.Compiler.Syntax.SynSimplePatAlternativeIdInfo]], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLongIdentSet(FSharp.Compiler.Syntax.LongIdentWithDots, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewMatch(FSharp.Compiler.Syntax.DebugPointAtBinding, FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMatchClause], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprMatchTrivia) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewMatchBang(FSharp.Compiler.Syntax.DebugPointAtBinding, FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMatchClause], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprMatchBangTrivia) @@ -6994,6 +7022,8 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewNamedIndexedPr FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewNew(Boolean, FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewNull(FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewObjExpr(FSharp.Compiler.Syntax.SynType, Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Syntax.SynExpr,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident]]], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynBinding], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynInterfaceImpl], FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewOperator(FSharp.Compiler.Syntax.SynOperatorName, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewOptional(FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewParen(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewQuote(FSharp.Compiler.Syntax.SynExpr, Boolean, FSharp.Compiler.Syntax.SynExpr, Boolean, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewRecord(Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`5[FSharp.Compiler.Syntax.SynType,FSharp.Compiler.Syntax.SynExpr,FSharp.Compiler.Text.Range,Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Text.Range,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Position]]],FSharp.Compiler.Text.Range]], Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Syntax.SynExpr,System.Tuple`2[FSharp.Compiler.Text.Range,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Position]]]], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynExprRecordField], FSharp.Compiler.Text.Range) @@ -7025,6 +7055,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissi FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+Do FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+DoBang FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+DotGet +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+DotGetOperator FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+DotIndexedGet FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+DotIndexedSet FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+DotNamedIndexedPropertySet @@ -7060,6 +7091,8 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+NamedIndexedPrope FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+New FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+Null FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+ObjExpr +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+Operator +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+Optional FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+Paren FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+Quote FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr+Record @@ -7839,6 +7872,36 @@ FSharp.Compiler.Syntax.SynOpenDeclTarget: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.Syntax.SynOpenDeclTarget: Int32 Tag FSharp.Compiler.Syntax.SynOpenDeclTarget: Int32 get_Tag() FSharp.Compiler.Syntax.SynOpenDeclTarget: System.String ToString() +FSharp.Compiler.Syntax.SynOperatorName +FSharp.Compiler.Syntax.SynOperatorName+ActivePattern: FSharp.Compiler.Syntax.Ident get_id() +FSharp.Compiler.Syntax.SynOperatorName+ActivePattern: FSharp.Compiler.Syntax.Ident id +FSharp.Compiler.Syntax.SynOperatorName+Operator: FSharp.Compiler.Syntax.Ident get_id() +FSharp.Compiler.Syntax.SynOperatorName+Operator: FSharp.Compiler.Syntax.Ident id +FSharp.Compiler.Syntax.SynOperatorName+PartialActivePattern: FSharp.Compiler.Syntax.Ident get_id() +FSharp.Compiler.Syntax.SynOperatorName+PartialActivePattern: FSharp.Compiler.Syntax.Ident id +FSharp.Compiler.Syntax.SynOperatorName+Tags: Int32 ActivePattern +FSharp.Compiler.Syntax.SynOperatorName+Tags: Int32 Operator +FSharp.Compiler.Syntax.SynOperatorName+Tags: Int32 PartialActivePattern +FSharp.Compiler.Syntax.SynOperatorName: Boolean IsActivePattern +FSharp.Compiler.Syntax.SynOperatorName: Boolean IsOperator +FSharp.Compiler.Syntax.SynOperatorName: Boolean IsPartialActivePattern +FSharp.Compiler.Syntax.SynOperatorName: Boolean get_IsActivePattern() +FSharp.Compiler.Syntax.SynOperatorName: Boolean get_IsOperator() +FSharp.Compiler.Syntax.SynOperatorName: Boolean get_IsPartialActivePattern() +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.Ident Ident +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.Ident get_Ident() +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.SynOperatorName NewActivePattern(FSharp.Compiler.Syntax.Ident) +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.SynOperatorName NewOperator(FSharp.Compiler.Syntax.Ident) +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.SynOperatorName NewPartialActivePattern(FSharp.Compiler.Syntax.Ident) +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.SynOperatorName+ActivePattern +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.SynOperatorName+Operator +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.SynOperatorName+PartialActivePattern +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Syntax.SynOperatorName+Tags +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Text.Range Range +FSharp.Compiler.Syntax.SynOperatorName: FSharp.Compiler.Text.Range get_Range() +FSharp.Compiler.Syntax.SynOperatorName: Int32 Tag +FSharp.Compiler.Syntax.SynOperatorName: Int32 get_Tag() +FSharp.Compiler.Syntax.SynOperatorName: System.String ToString() FSharp.Compiler.Syntax.SynPat FSharp.Compiler.Syntax.SynPat+Ands: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynPat+Ands: FSharp.Compiler.Text.Range range @@ -7872,6 +7935,20 @@ FSharp.Compiler.Syntax.SynPat+DeprecatedCharRange: Char get_startChar() FSharp.Compiler.Syntax.SynPat+DeprecatedCharRange: Char startChar FSharp.Compiler.Syntax.SynPat+DeprecatedCharRange: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynPat+DeprecatedCharRange: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Syntax.SynOperatorName get_operator() +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Syntax.SynOperatorName operator +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Syntax.SynPat get_pref() +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Syntax.SynPat pref +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Text.Range dot +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Text.Range get_dot() +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Text.Range get_lpr() +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Text.Range get_rpr() +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Text.Range lpr +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynPat+DotGetOperator: FSharp.Compiler.Text.Range rpr +FSharp.Compiler.Syntax.SynPat+DotGetOperator: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] accessibility +FSharp.Compiler.Syntax.SynPat+DotGetOperator: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] get_accessibility() FSharp.Compiler.Syntax.SynPat+FromParseError: FSharp.Compiler.Syntax.SynPat get_pat() FSharp.Compiler.Syntax.SynPat+FromParseError: FSharp.Compiler.Syntax.SynPat pat FSharp.Compiler.Syntax.SynPat+FromParseError: FSharp.Compiler.Text.Range get_range() @@ -7892,18 +7969,10 @@ FSharp.Compiler.Syntax.SynPat+IsInst: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynPat+IsInst: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Syntax.LongIdentWithDots get_longDotId() FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Syntax.LongIdentWithDots longDotId -FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Syntax.SynArgPats argPats -FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Syntax.SynArgPats get_argPats() FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynPat+LongIdent: FSharp.Compiler.Text.Range range -FSharp.Compiler.Syntax.SynPat+LongIdent: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] extraId -FSharp.Compiler.Syntax.SynPat+LongIdent: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] get_extraId() -FSharp.Compiler.Syntax.SynPat+LongIdent: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.PropertyKeyword] get_propertyKeyword() -FSharp.Compiler.Syntax.SynPat+LongIdent: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.PropertyKeyword] propertyKeyword FSharp.Compiler.Syntax.SynPat+LongIdent: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] accessibility FSharp.Compiler.Syntax.SynPat+LongIdent: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] get_accessibility() -FSharp.Compiler.Syntax.SynPat+LongIdent: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynValTyparDecls] get_typarDecls() -FSharp.Compiler.Syntax.SynPat+LongIdent: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynValTyparDecls] typarDecls FSharp.Compiler.Syntax.SynPat+Named: Boolean get_isThisVal() FSharp.Compiler.Syntax.SynPat+Named: Boolean isThisVal FSharp.Compiler.Syntax.SynPat+Named: FSharp.Compiler.Syntax.Ident get_ident() @@ -7914,6 +7983,12 @@ FSharp.Compiler.Syntax.SynPat+Named: Microsoft.FSharp.Core.FSharpOption`1[FSharp FSharp.Compiler.Syntax.SynPat+Named: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] get_accessibility() FSharp.Compiler.Syntax.SynPat+Null: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynPat+Null: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynPat+Operator: FSharp.Compiler.Syntax.SynOperatorName get_operator() +FSharp.Compiler.Syntax.SynPat+Operator: FSharp.Compiler.Syntax.SynOperatorName operator +FSharp.Compiler.Syntax.SynPat+Operator: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.Syntax.SynPat+Operator: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynPat+Operator: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] accessibility +FSharp.Compiler.Syntax.SynPat+Operator: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] get_accessibility() FSharp.Compiler.Syntax.SynPat+OptionalVal: FSharp.Compiler.Syntax.Ident get_ident() FSharp.Compiler.Syntax.SynPat+OptionalVal: FSharp.Compiler.Syntax.Ident ident FSharp.Compiler.Syntax.SynPat+OptionalVal: FSharp.Compiler.Text.Range get_range() @@ -7926,6 +8001,20 @@ FSharp.Compiler.Syntax.SynPat+Or: FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia ge FSharp.Compiler.Syntax.SynPat+Or: FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia trivia FSharp.Compiler.Syntax.SynPat+Or: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynPat+Or: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynPat+ParametersOwner: FSharp.Compiler.Syntax.SynArgPats argPats +FSharp.Compiler.Syntax.SynPat+ParametersOwner: FSharp.Compiler.Syntax.SynArgPats get_argPats() +FSharp.Compiler.Syntax.SynPat+ParametersOwner: FSharp.Compiler.Syntax.SynPat get_pattern() +FSharp.Compiler.Syntax.SynPat+ParametersOwner: FSharp.Compiler.Syntax.SynPat pattern +FSharp.Compiler.Syntax.SynPat+ParametersOwner: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.Syntax.SynPat+ParametersOwner: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynPat+ParametersOwner: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] extraId +FSharp.Compiler.Syntax.SynPat+ParametersOwner: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] get_extraId() +FSharp.Compiler.Syntax.SynPat+ParametersOwner: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.PropertyKeyword] get_propertyKeyword() +FSharp.Compiler.Syntax.SynPat+ParametersOwner: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.PropertyKeyword] propertyKeyword +FSharp.Compiler.Syntax.SynPat+ParametersOwner: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] accessibility +FSharp.Compiler.Syntax.SynPat+ParametersOwner: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess] get_accessibility() +FSharp.Compiler.Syntax.SynPat+ParametersOwner: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynValTyparDecls] get_typarDecls() +FSharp.Compiler.Syntax.SynPat+ParametersOwner: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynValTyparDecls] typarDecls FSharp.Compiler.Syntax.SynPat+Paren: FSharp.Compiler.Syntax.SynPat get_pat() FSharp.Compiler.Syntax.SynPat+Paren: FSharp.Compiler.Syntax.SynPat pat FSharp.Compiler.Syntax.SynPat+Paren: FSharp.Compiler.Text.Range get_range() @@ -7944,14 +8033,17 @@ FSharp.Compiler.Syntax.SynPat+Tags: Int32 As FSharp.Compiler.Syntax.SynPat+Tags: Int32 Attrib FSharp.Compiler.Syntax.SynPat+Tags: Int32 Const FSharp.Compiler.Syntax.SynPat+Tags: Int32 DeprecatedCharRange +FSharp.Compiler.Syntax.SynPat+Tags: Int32 DotGetOperator FSharp.Compiler.Syntax.SynPat+Tags: Int32 FromParseError FSharp.Compiler.Syntax.SynPat+Tags: Int32 InstanceMember FSharp.Compiler.Syntax.SynPat+Tags: Int32 IsInst FSharp.Compiler.Syntax.SynPat+Tags: Int32 LongIdent FSharp.Compiler.Syntax.SynPat+Tags: Int32 Named FSharp.Compiler.Syntax.SynPat+Tags: Int32 Null +FSharp.Compiler.Syntax.SynPat+Tags: Int32 Operator FSharp.Compiler.Syntax.SynPat+Tags: Int32 OptionalVal FSharp.Compiler.Syntax.SynPat+Tags: Int32 Or +FSharp.Compiler.Syntax.SynPat+Tags: Int32 ParametersOwner FSharp.Compiler.Syntax.SynPat+Tags: Int32 Paren FSharp.Compiler.Syntax.SynPat+Tags: Int32 QuoteExpr FSharp.Compiler.Syntax.SynPat+Tags: Int32 Record @@ -7978,14 +8070,17 @@ FSharp.Compiler.Syntax.SynPat: Boolean IsAs FSharp.Compiler.Syntax.SynPat: Boolean IsAttrib FSharp.Compiler.Syntax.SynPat: Boolean IsConst FSharp.Compiler.Syntax.SynPat: Boolean IsDeprecatedCharRange +FSharp.Compiler.Syntax.SynPat: Boolean IsDotGetOperator FSharp.Compiler.Syntax.SynPat: Boolean IsFromParseError FSharp.Compiler.Syntax.SynPat: Boolean IsInstanceMember FSharp.Compiler.Syntax.SynPat: Boolean IsIsInst FSharp.Compiler.Syntax.SynPat: Boolean IsLongIdent FSharp.Compiler.Syntax.SynPat: Boolean IsNamed FSharp.Compiler.Syntax.SynPat: Boolean IsNull +FSharp.Compiler.Syntax.SynPat: Boolean IsOperator FSharp.Compiler.Syntax.SynPat: Boolean IsOptionalVal FSharp.Compiler.Syntax.SynPat: Boolean IsOr +FSharp.Compiler.Syntax.SynPat: Boolean IsParametersOwner FSharp.Compiler.Syntax.SynPat: Boolean IsParen FSharp.Compiler.Syntax.SynPat: Boolean IsQuoteExpr FSharp.Compiler.Syntax.SynPat: Boolean IsRecord @@ -7998,14 +8093,17 @@ FSharp.Compiler.Syntax.SynPat: Boolean get_IsAs() FSharp.Compiler.Syntax.SynPat: Boolean get_IsAttrib() FSharp.Compiler.Syntax.SynPat: Boolean get_IsConst() FSharp.Compiler.Syntax.SynPat: Boolean get_IsDeprecatedCharRange() +FSharp.Compiler.Syntax.SynPat: Boolean get_IsDotGetOperator() FSharp.Compiler.Syntax.SynPat: Boolean get_IsFromParseError() FSharp.Compiler.Syntax.SynPat: Boolean get_IsInstanceMember() FSharp.Compiler.Syntax.SynPat: Boolean get_IsIsInst() FSharp.Compiler.Syntax.SynPat: Boolean get_IsLongIdent() FSharp.Compiler.Syntax.SynPat: Boolean get_IsNamed() FSharp.Compiler.Syntax.SynPat: Boolean get_IsNull() +FSharp.Compiler.Syntax.SynPat: Boolean get_IsOperator() FSharp.Compiler.Syntax.SynPat: Boolean get_IsOptionalVal() FSharp.Compiler.Syntax.SynPat: Boolean get_IsOr() +FSharp.Compiler.Syntax.SynPat: Boolean get_IsParametersOwner() FSharp.Compiler.Syntax.SynPat: Boolean get_IsParen() FSharp.Compiler.Syntax.SynPat: Boolean get_IsQuoteExpr() FSharp.Compiler.Syntax.SynPat: Boolean get_IsRecord() @@ -8018,14 +8116,17 @@ FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewAs(FSharp.Compil FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewAttrib(FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewConst(FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewDeprecatedCharRange(Char, Char, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewDotGetOperator(FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynOperatorName, FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewFromParseError(FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewInstanceMember(FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.Ident, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewIsInst(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewLongIdent(FSharp.Compiler.Syntax.LongIdentWithDots, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.PropertyKeyword], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynValTyparDecls], FSharp.Compiler.Syntax.SynArgPats, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewLongIdent(FSharp.Compiler.Syntax.LongIdentWithDots, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewNamed(FSharp.Compiler.Syntax.Ident, Boolean, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewNull(FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewOperator(FSharp.Compiler.Syntax.SynOperatorName, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewOptionalVal(FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewOr(FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynPatOrTrivia) +FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewParametersOwner(FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.PropertyKeyword], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynValTyparDecls], FSharp.Compiler.Syntax.SynArgPats, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewParen(FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewQuoteExpr(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat NewRecord(Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[System.Tuple`2[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident],FSharp.Compiler.Syntax.Ident],FSharp.Compiler.Text.Range,FSharp.Compiler.Syntax.SynPat]], FSharp.Compiler.Text.Range) @@ -8038,14 +8139,17 @@ FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+As FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Attrib FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Const FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+DeprecatedCharRange +FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+DotGetOperator FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+FromParseError FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+InstanceMember FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+IsInst FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+LongIdent FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Named FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Null +FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Operator FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+OptionalVal FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Or +FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+ParametersOwner FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Paren FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+QuoteExpr FSharp.Compiler.Syntax.SynPat: FSharp.Compiler.Syntax.SynPat+Record @@ -8950,8 +9054,8 @@ FSharp.Compiler.Syntax.SynValSig: Boolean get_isInline() FSharp.Compiler.Syntax.SynValSig: Boolean get_isMutable() FSharp.Compiler.Syntax.SynValSig: Boolean isInline FSharp.Compiler.Syntax.SynValSig: Boolean isMutable -FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.Ident get_ident() -FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.Ident ident +FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynPat get_pat() +FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynPat pat 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() @@ -8960,7 +9064,7 @@ 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.Ident, 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], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValSig NewSynValSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynPat, 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], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValTyparDecls explicitValDecls FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.SynValTyparDecls get_explicitValDecls() FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Text.Range RangeOfId diff --git a/tests/fsharpqa/Source/Diagnostics/NONTERM/attrUnionCaseDecl01.fs b/tests/fsharpqa/Source/Diagnostics/NONTERM/attrUnionCaseDecl01.fs index fc7db92f79d..22064056121 100644 --- a/tests/fsharpqa/Source/Diagnostics/NONTERM/attrUnionCaseDecl01.fs +++ b/tests/fsharpqa/Source/Diagnostics/NONTERM/attrUnionCaseDecl01.fs @@ -1,6 +1,6 @@ // #Regression #Diagnostics // Regression test for FSharp1.0:3702 -//Incomplete structured construct at or before this point in union case\. Expected identifier, '\(', '\(\*\)' or other token\.$ +//Incomplete structured construct at or before this point in union case\. Expected identifier, '\(' or other token\.$ #light type Stuff = | AnonymousVariableType of string diff --git a/tests/fsharpqa/Source/Diagnostics/NONTERM/attrUnionCaseDecl01b.fs b/tests/fsharpqa/Source/Diagnostics/NONTERM/attrUnionCaseDecl01b.fs index 900a961bd2c..2184474efbd 100644 --- a/tests/fsharpqa/Source/Diagnostics/NONTERM/attrUnionCaseDecl01b.fs +++ b/tests/fsharpqa/Source/Diagnostics/NONTERM/attrUnionCaseDecl01b.fs @@ -1,7 +1,7 @@ // #Regression #Diagnostics // Regression test for FSharp1.0:3702 //NONTERM -//Incomplete structured construct at or before this point in union case\. Expected identifier, '\(', '\(\*\)' or other token\.$ +//Incomplete structured construct at or before this point in union case\. Expected identifier, '\(' or other token\.$ diff --git a/tests/fsharpqa/Source/InteractiveSession/Misc/E_type_id_equal_pipe.fsx b/tests/fsharpqa/Source/InteractiveSession/Misc/E_type_id_equal_pipe.fsx index 6e4d7bd0401..67d39e2fe79 100644 --- a/tests/fsharpqa/Source/InteractiveSession/Misc/E_type_id_equal_pipe.fsx +++ b/tests/fsharpqa/Source/InteractiveSession/Misc/E_type_id_equal_pipe.fsx @@ -1,5 +1,5 @@ // #Regression #NoMT #FSI // Regression test for FSHARP1.0:5629 -//Incomplete structured construct at or before this point in union case\. Expected identifier, '\(', '\(\*\)' or other token\.$ +//Incomplete structured construct at or before this point in union case\. Expected identifier, '\(' or other token\.$ type R = | ;; exit 1;; diff --git a/tests/service/ParserTests.fs b/tests/service/ParserTests.fs index 0587c2cae09..8e85e5214d3 100644 --- a/tests/service/ParserTests.fs +++ b/tests/service/ParserTests.fs @@ -158,7 +158,7 @@ let f (x match getSingleDeclInModule parseResults with | SynModuleDecl.Let (_, [ SynBinding (headPat = headPat) ], _) -> match headPat with - | SynPat.LongIdent (argPats=SynArgPats.Pats [ SynPat.FromParseError (SynPat.Paren (SynPat.Named _, _), _) ]) -> () + | SynPat.ParametersOwner (argPats=SynArgPats.Pats [ SynPat.FromParseError (SynPat.Paren (SynPat.Named _, _), _) ]) -> () | _ -> failwith "Unexpected tree" | _ -> failwith "Unexpected tree" @@ -171,7 +171,7 @@ let f (x, y match getSingleDeclInModule parseResults with | SynModuleDecl.Let (_, [ SynBinding (headPat = headPat) ], _) -> match headPat with - | SynPat.LongIdent (argPats=SynArgPats.Pats [ SynPat.FromParseError (SynPat.Paren (SynPat.Tuple _, _), _) ]) -> () + | SynPat.ParametersOwner (argPats=SynArgPats.Pats [ SynPat.FromParseError (SynPat.Paren (SynPat.Tuple _, _), _) ]) -> () | _ -> failwith "Unexpected tree" | _ -> failwith "Unexpected tree" @@ -182,7 +182,7 @@ let f (x, """ match getSingleDeclInModule parseResults with - | SynModuleDecl.Let (_, [ SynBinding (headPat = SynPat.LongIdent (argPats = SynArgPats.Pats [ pat ])) ], _) -> + | SynModuleDecl.Let (_, [ SynBinding (headPat = SynPat.ParametersOwner (argPats = SynArgPats.Pats [ pat ])) ], _) -> match pat with | SynPat.FromParseError (SynPat.Paren (SynPat.FromParseError (SynPat.Wild _, _), _), _) -> () | _ -> failwith "Unexpected tree" diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index 43332a92081..942aaed1b4d 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -570,7 +570,7 @@ type Foo() = SynModuleDecl.Types( typeDefns = [ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members=[ _ - SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.LongIdent(propertyKeyword=Some(PropertyKeyword.With mWith)))) ]) + SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.ParametersOwner(propertyKeyword=Some(PropertyKeyword.With mWith)))) ]) ) ]) ]) ])) -> assertRange (4, 31) (4, 35) mWith @@ -591,7 +591,7 @@ type Foo() = SynModuleDecl.Types( typeDefns = [ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members=[ _ - SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.LongIdent(propertyKeyword=Some(PropertyKeyword.With mWith)))) ]) + SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.ParametersOwner(propertyKeyword=Some(PropertyKeyword.With mWith)))) ]) ) ]) ]) ])) -> assertRange (4, 36) (4, 40) mWith @@ -614,8 +614,8 @@ type Foo() = SynModuleDecl.Types( typeDefns = [ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members=[ _ - SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.LongIdent(propertyKeyword=Some(PropertyKeyword.With mWith)))) - SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.LongIdent(propertyKeyword=Some(PropertyKeyword.And mAnd)))) ]) + SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.ParametersOwner(propertyKeyword=Some(PropertyKeyword.With mWith)))) + SynMemberDefn.Member(memberDefn=SynBinding(headPat=SynPat.ParametersOwner(propertyKeyword=Some(PropertyKeyword.And mAnd)))) ]) ) ]) ]) ])) -> assertRange (5, 8) (5, 12) mWith @@ -3030,7 +3030,7 @@ match x with match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.Expr( - expr = SynExpr.Match(clauses = [ SynMatchClause(pat = SynPat.LongIdent(argPats = SynArgPats.NamePatPairs(pats = [ _, mEquals ,_ ])))]) + expr = SynExpr.Match(clauses = [ SynMatchClause(pat = SynPat.ParametersOwner(argPats = SynArgPats.NamePatPairs(pats = [ _, mEquals ,_ ])))]) ) ]) ])) -> assertRange (3, 7) (3, 8) mEquals @@ -3038,6 +3038,27 @@ match x with [] let ``SynPat.Or contains the range of the bar`` () = + let ast = + getParseResults + """ +let internal ifElseCtx a b = 2 +let private ifRagnarokElse = ifElseCtx 3 4 +""" + + match ast with + | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Let(bindings = [ + SynBinding(headPat = SynPat.ParametersOwner(pattern = SynPat.Named _; accessibility = Some SynAccess.Internal)) + ]) + SynModuleDecl.Let(bindings = [ + SynBinding(headPat = SynPat.Named(_, _, Some SynAccess.Private, _)) + ]) + ]) ])) -> + Assert.Pass() + | _ -> Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``access modifier is in SynPat.Named`` () = let parseResults = getParseResults """ @@ -3795,3 +3816,420 @@ let x = assertRange (7, 4) (7, 27) m3 | _ -> Assert.Fail "Could not get valid AST" + +module OperatorName = + [] + let ``operator as function`` () = + let ast = """ +(+) 3 4 +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr (expr = SynExpr.App(funcExpr = SynExpr.App(funcExpr = + SynExpr.Paren(SynExpr.Operator(SynOperatorName.Operator(ident), _), lpr, Some rpr, pr)))) + ]) + ])) -> + assertRange (2, 0) (2, 1) lpr + Assert.AreEqual("op_Addition", ident.idText) + assertRange (2, 2) (2, 3) rpr + assertRange (2, 0) (2, 3) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``active pattern as function `` () = + let ast = """ +(|Odd|Even|) 4 +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr (expr = SynExpr.App(funcExpr = + SynExpr.Paren(SynExpr.Operator(SynOperatorName.ActivePattern(ident), _), lpr, Some rpr, pr))) + ]) + ])) -> + assertRange (2, 0) (2, 1) lpr + Assert.AreEqual("|Odd|Even|", ident.idText) + assertRange (2, 11) (2, 12) rpr + assertRange (2, 0) (2, 12) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``partial active pattern as function `` () = + let ast = """ +(|Odd|_|) 4 +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr (expr = SynExpr.App(funcExpr = + SynExpr.Paren(SynExpr.Operator(SynOperatorName.PartialActivePattern(ident), _), lpr, Some rpr, pr))) + ]) + ])) -> + assertRange (2, 0) (2, 1) lpr + Assert.AreEqual("|Odd|_|", ident.idText) + assertRange (2, 8) (2, 9) rpr + assertRange (2, 0) (2, 9) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``custom operator definition`` () = + let ast = """ +let (+) a b = a + b +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Let(bindings = [SynBinding(headPat= + SynPat.ParametersOwner(pattern = SynPat.Paren(SynPat.Operator(SynOperatorName.Operator(ident), None, _), pr))) + // SynPat.LongIdent(longDotId=LongIdentWithDots(operatorName=Some(SynOperatorName.Operator(lpr, ident, rpr)))))]) + ]) + ])])) -> + Assert.AreEqual("op_Addition", ident.idText) + assertRange (2, 4) (2, 7) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``active pattern definition`` () = + let ast = """ +let (|Odd|Even|) (a: int) = if a % 2 = 0 then Even else Odd +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Let(bindings = [SynBinding(headPat= + SynPat.ParametersOwner(pattern = SynPat.Paren(SynPat.Operator(SynOperatorName.ActivePattern(ident), None, _), pr))) + ]) + ])])) -> + Assert.AreEqual("|Odd|Even|", ident.idText) + assertRange (2, 4) (2, 16) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``partial active pattern definition`` () = + let ast = """ +let (|Int32Const|_|) (a: SynConst) = match a with SynConst.Int32 _ -> Some a | _ -> None +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Let(bindings = [SynBinding(headPat= + SynPat.ParametersOwner(pattern = SynPat.Paren(SynPat.Operator(SynOperatorName.PartialActivePattern(ident), None, _), pr))) + ]) + ])])) -> + Assert.AreEqual("|Int32Const|_|", ident.idText) + assertRange (2, 4) (2, 20) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``operator name in SynValSig`` () = + let ast = """ +module IntrinsicOperators +val (&): e1: bool -> e2: bool -> bool +""" + |> getParseResultsOfSignatureFile + + match ast with + | ParsedInput.SigFile(ParsedSigFileInput(modules = [ + SynModuleOrNamespaceSig(decls = [ + SynModuleSigDecl.Val(valSig = SynValSig(pat = + SynPat.Paren(SynPat.Operator(SynOperatorName.Operator(ident), None, _), pr) + ))]) + ])) -> + Assert.AreEqual("op_Amp", ident.idText) + assertRange (3, 4) (3, 7) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``operator name in val constraint`` () = + let ast = + getParseResultsOfSignatureFile """ + [] + module Operators + /// Overloaded unary negation. + /// + /// The value to negate. + /// + /// The result of the operation. + /// + /// + /// + val inline (~-): n: ^T -> ^T when ^T: (static member ( ~- ): ^T -> ^T) and default ^T: int +""" + + match ast with + | ParsedInput.SigFile(ParsedSigFileInput(modules = [ + SynModuleOrNamespaceSig(decls = [ + SynModuleSigDecl.Val(valSig = SynValSig(synType=SynType.WithGlobalConstraints(constraints=[ + SynTypeConstraint.WhereTyparSupportsMember(memberSig=SynMemberSig.Member(memberSig=SynValSig(pat = + SynPat.Paren(SynPat.Operator(SynOperatorName.Operator(ident), None, _), pr)))) + SynTypeConstraint.WhereTyparDefaultsToType _ + ]))) + ]) + ])) -> + Assert.AreEqual("op_UnaryNegation", ident.idText) + assertRange (12, 57) (12, 63) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``named parameter`` () = + let ast = getParseResults """ +f(x=4) +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr(expr = SynExpr.App(argExpr = SynExpr.Paren(expr = SynExpr.App(funcExpr= + SynExpr.App(funcExpr=SynExpr.Operator(SynOperatorName.Operator(ident), _)))))) + ]) + ])) -> + Assert.AreEqual("op_Equality", ident.idText) + assertRange (2,3) (2,4) ident.idRange + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``infix operation`` () = + let ast = getParseResults """ +1 + 1 +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr(expr = + SynExpr.App(funcExpr = SynExpr.App(isInfix = true + funcExpr = SynExpr.Operator(SynOperatorName.Operator(ident), _) + argExpr = SynExpr.Const(SynConst.Int32(1), _)) + argExpr = SynExpr.Const(SynConst.Int32(1), _))) + ]) + ])) -> + Assert.AreEqual("op_Addition", ident.idText) + assertRange (2,2) (2,3) ident.idRange + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``detect difference between compiled operators`` () = + let ast = getParseResults """ +(+) a b +op_Addition a b +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr(expr = + SynExpr.App(funcExpr = SynExpr.App(isInfix = false + funcExpr = SynExpr.Paren(SynExpr.Operator(SynOperatorName.Operator(operatorIdent), _), lpr, Some rpr, pr) + argExpr = SynExpr.Ident a1) + argExpr = SynExpr.Ident b1)) + SynModuleDecl.Expr(expr = + SynExpr.App(funcExpr = SynExpr.App(isInfix = false + funcExpr = SynExpr.Ident op_Addition + argExpr = SynExpr.Ident a2) + argExpr = SynExpr.Ident b2) + ) + ]) + ])) -> + assertRange (2,0) (2,1) lpr + Assert.AreEqual("op_Addition", operatorIdent.idText) + assertRange (2,2) (2,3) rpr + assertRange (2,0) (2,3) pr + Assert.AreEqual("a", a1.idText) + Assert.AreEqual("b", b1.idText) + + Assert.AreEqual("op_Addition", op_Addition.idText) + Assert.AreEqual("a", a2.idText) + Assert.AreEqual("b", b2.idText) + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``operator in member definition`` () = + let ast = getParseResults """ +type X with + member _.(+) a b = a + b +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types(typeDefns = [ + SynTypeDefn(members = [ + SynMemberDefn.Member(memberDefn = SynBinding(headPat = SynPat.ParametersOwner(pattern = + SynPat.DotGetOperator(SynPat.Named _, mDot, lpr, SynOperatorName.Operator(operatorIdent), rpr, _, m)))) + ]) + ] + ) + ]) + ])) -> + assertRange (3,12) (3,13) mDot + assertRange (3,13) (3,14) lpr + Assert.AreEqual("op_Addition", operatorIdent.idText) + assertRange (3,15) (3,16) rpr + assertRange (3,11) (3,16) m + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``nameof operator`` () = + let ast = getParseResults """ +nameof(+) +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr(expr = + SynExpr.App(isInfix = false + funcExpr = SynExpr.Ident nameofIdent + argExpr = SynExpr.Paren(SynExpr.Operator(SynOperatorName.Operator(operatorIdent), _), lpr, Some rpr, pr))) + ]) + ])) -> + Assert.AreEqual("nameof", nameofIdent.idText) + assertRange (2,6) (2,7) lpr + Assert.AreEqual("op_Addition", operatorIdent.idText) + assertRange (2,8) (2,9) rpr + assertRange (2,6) (2,9) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``optional expression`` () = + let ast = getParseResults """ +f(?x = 7) +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Expr(expr = + SynExpr.App(isInfix = false + funcExpr = SynExpr.Ident f + argExpr = SynExpr.Paren( + SynExpr.App(funcExpr = SynExpr.App( + isInfix = true + funcExpr = SynExpr.Operator(SynOperatorName.Operator(eqIdent),_) + argExpr = SynExpr.Optional(x, mOptional) + ) + argExpr = SynExpr.Const(SynConst.Int32 7, _)), lpr, Some rpr, pr))) + ]) + ])) -> + Assert.AreEqual("f", f.idText) + assertRange (2,1) (2,2) lpr + Assert.AreEqual("x", x.idText) + assertRange (2,2) (2, 4) mOptional + Assert.AreEqual("op_Equality", eqIdent.idText) + assertRange (2,8) (2,9) rpr + assertRange (2,1) (2,9) pr + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``object model with two members`` () = + let ast = getParseResults """ +type X() = + let mutable allowInto = 0 + member _.AllowIntoPattern with get() = allowInto and set v = allowInto <- v +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types(typeDefns = [ + SynTypeDefn.SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members =[ + SynMemberDefn.ImplicitCtor _ + SynMemberDefn.LetBindings _ + SynMemberDefn.Member(memberDefn = SynBinding(headPat = SynPat.ParametersOwner(pattern = SynPat.LongIdent(longDotId = LongIdentWithDots(id = [ _ ; allowIntoPatternGet ])) + propertyKeyword = Some (PropertyKeyword.With mWith)))) + SynMemberDefn.Member(memberDefn = SynBinding(headPat = SynPat.ParametersOwner(pattern = SynPat.LongIdent(longDotId = LongIdentWithDots(id = [ _ ; allowIntoPatternSet ])) + propertyKeyword = Some (PropertyKeyword.And mAnd)))) + ])) + ]) + ]) + ])) -> + Assert.AreEqual("AllowIntoPattern", allowIntoPatternGet.idText) + assertRange (4, 30) (4, 34) mWith + Assert.AreEqual("AllowIntoPattern", allowIntoPatternSet.idText) + assertRange (4, 53) (4, 56) mAnd + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``qualified operator expression`` () = + let ast = getParseResults """ +let PowByte (x:byte) n = Checked.( * ) x +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Let(bindings = [ + SynBinding(expr = SynExpr.App(funcExpr = SynExpr.DotGetOperator(SynExpr.Ident checkedIdent, mDot, lpr, SynOperatorName.Operator(operatorIdent), rpr, m))) + ]) + ]) + ])) -> + Assert.AreEqual("Checked", checkedIdent.idText) + assertRange (2, 32) (2, 33) mDot + assertRange (2, 33) (2, 34) lpr + Assert.AreEqual("op_Multiply", operatorIdent.idText) + assertRange (2, 37) (2, 38) rpr + assertRange (2, 25) (2, 38) m + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" + + [] + let ``active pattern identifier in private member`` () = + let ast = getParseResults """ +type A() = + member private _.(| + A' + |) = (| + Lazy + |) +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types(typeDefns = [ + SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members = [ + SynMemberDefn.ImplicitCtor _ + SynMemberDefn.Member(memberDefn = SynBinding( + headPat = SynPat.DotGetOperator(pref = SynPat.Named(ident = underscoreIdent) + operator = SynOperatorName.ActivePattern(aQuoteIdent) + accessibility = Some SynAccess.Private + range = mDotGetOperator) + )) + ])) + ]) + ]) + ])) -> + () + Assert.AreEqual("_", underscoreIdent.idText) + Assert.AreEqual("|A'|", aQuoteIdent.idText) + assertRange (3, 19) (5, 6) mDotGetOperator + | _ -> + Assert.Fail $"Could not get valid AST, got {ast}" \ No newline at end of file