diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index 6d42345fda..bc398daa1e 100644 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -9,6 +9,7 @@ open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Infos open FSharp.Compiler.Syntax +open FSharp.Compiler.Xml open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index 41a4498234..76e40e8b09 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -30,6 +30,7 @@ open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics @@ -5717,7 +5718,7 @@ let ApplyDefaults (cenv: cenv) g denvAtEnd m mexpr extraAttribs = ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css denvAtEnd tp) with e -> errorRecovery e m -let CheckValueRestriction denvAtEnd rootSigOpt implFileTypePriorToSig m = +let CheckValueRestriction denvAtEnd infoReader rootSigOpt implFileTypePriorToSig m = if Option.isNone rootSigOpt then let rec check (mty: ModuleOrNamespaceType) = for v in mty.AllValsAndMembers do @@ -5731,7 +5732,7 @@ let CheckValueRestriction denvAtEnd rootSigOpt implFileTypePriorToSig m = // for example FSharp 1.0 3661. (match v.ValReprInfo with None -> true | Some tvi -> tvi.HasNoArgs)) then match ftyvs with - | tp :: _ -> errorR (ValueRestriction(denvAtEnd, false, v, tp, v.Range)) + | tp :: _ -> errorR (ValueRestriction(denvAtEnd, infoReader, false, v, tp, v.Range)) | _ -> () mty.ModuleAndNamespaceDefinitions |> List.iter (fun v -> check v.ModuleOrNamespaceType) try check implFileTypePriorToSig with e -> errorRecovery e m @@ -5762,7 +5763,7 @@ let CheckModuleSignature g (cenv: cenv) m denvAtEnd rootSigOpt implFileTypePrior // As typechecked the signature and implementation use different tycons etc. // Here we (a) check there are enough names, (b) match them up to build a renaming and // (c) check signature conformance up to this renaming. - if not (SignatureConformance.CheckNamesOfModuleOrNamespace denv (mkLocalTyconRef implFileSpecPriorToSig) sigFileType) then + if not (SignatureConformance.CheckNamesOfModuleOrNamespace denv cenv.infoReader (mkLocalTyconRef implFileSpecPriorToSig) sigFileType) then raise (ReportedError None) // Compute the remapping from implementation to signature @@ -5770,7 +5771,7 @@ let CheckModuleSignature g (cenv: cenv) m denvAtEnd rootSigOpt implFileTypePrior let aenv = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.RepackagedEntities } - if not (SignatureConformance.Checker(cenv.g, cenv.amap, denv, remapInfo, true).CheckSignature aenv (mkLocalModRef implFileSpecPriorToSig) sigFileType) then ( + if not (SignatureConformance.Checker(cenv.g, cenv.amap, denv, remapInfo, true).CheckSignature aenv cenv.infoReader (mkLocalModRef implFileSpecPriorToSig) sigFileType) then ( // We can just raise 'ReportedError' since CheckModuleOrNamespace raises its own error raise (ReportedError None) ) @@ -5795,6 +5796,8 @@ let TypeCheckOneImplFile (rootSigOpt: ModuleOrNamespaceType option) (ParsedImplFileInput (_, isScript, qualNameOfFile, scopedPragmas, _, implFileFrags, isLastCompiland)) = + let infoReader = InfoReader(g, amap) + eventually { let cenv = cenv.Create (g, isScript, niceNameGen, amap, topCcu, false, Option.isSome rootSigOpt, @@ -5838,7 +5841,7 @@ let TypeCheckOneImplFile // Check the value restriction. Only checked if there is no signature. conditionallySuppressErrorReporting (checkForErrors()) (fun () -> - CheckValueRestriction denvAtEnd rootSigOpt implFileTypePriorToSig m) + CheckValueRestriction denvAtEnd infoReader rootSigOpt implFileTypePriorToSig m) // Solve unsolved internal type variables conditionallySuppressErrorReporting (checkForErrors()) (fun () -> diff --git a/src/fsharp/CheckExpressions.fs b/src/fsharp/CheckExpressions.fs index 31f34b8df1..352aa63278 100644 --- a/src/fsharp/CheckExpressions.fs +++ b/src/fsharp/CheckExpressions.fs @@ -35,6 +35,7 @@ open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps @@ -78,7 +79,7 @@ exception UnitTypeExpectedWithPossibleAssignment of DisplayEnv * TType * bool * exception UnitTypeExpectedWithPossiblePropertySetter of DisplayEnv * TType * string * string * range exception UnionPatternsBindDifferentNames of range exception VarBoundTwice of Ident -exception ValueRestriction of DisplayEnv * bool * Val * Typar * range +exception ValueRestriction of DisplayEnv * InfoReader * bool * Val * Typar * range exception ValNotMutable of DisplayEnv * ValRef * range exception ValNotLocal of DisplayEnv * ValRef * range exception InvalidRuntimeCoercion of DisplayEnv * TType * TType * range @@ -2573,7 +2574,7 @@ let TcValEarlyGeneralizationConsistencyCheck cenv (env: TcEnv) (v: Val, vrec, ti let tau3 = instType (mkTyparInst tpsorig tinst) tau2 //printfn "tau3 = '%s'" (DebugPrint.showType tau3) if not (AddCxTypeEqualsTypeUndoIfFailed env.DisplayEnv cenv.css m tau tau3) then - let txt = bufs (fun buf -> NicePrint.outputQualifiedValSpec env.DisplayEnv buf v) + let txt = bufs (fun buf -> NicePrint.outputQualifiedValSpec env.DisplayEnv cenv.infoReader buf (mkLocalValRef v)) error(Error(FSComp.SR.tcInferredGenericTypeGivesRiseToInconsistency(v.DisplayName, txt), m))) | _ -> () @@ -6230,7 +6231,7 @@ and FreshenObjExprAbstractSlot cenv (env: TcEnv) (implty: TType) virtNameAndArit match absSlots with | [] when not (CompileAsEvent cenv.g bindAttribs) -> let absSlotsByName = List.filter (fst >> fst >> (=) bindName) virtNameAndArityPairs - let getSignature absSlot = (NicePrint.stringOfMethInfo cenv.amap mBinding env.DisplayEnv absSlot).Replace("abstract ", "") + let getSignature absSlot = (NicePrint.stringOfMethInfo cenv.infoReader mBinding env.DisplayEnv absSlot).Replace("abstract ", "") let getDetails (absSlot: MethInfo) = if absSlot.GetParamTypes(cenv.amap, mBinding, []) |> List.existsSquared (isAnyTupleTy cenv.g) then FSComp.SR.tupleRequiredInAbstractMethod() @@ -6506,7 +6507,7 @@ and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, overridesAndVirts |> List.iter (fun (m, implty, dispatchSlots, dispatchSlotsKeyed, availPriorOverrides, overrides) -> let overrideSpecs = overrides |> List.map fst - DispatchSlotChecking.CheckOverridesAreAllUsedOnce (env.DisplayEnv, cenv.g, cenv.amap, true, implty, dispatchSlotsKeyed, availPriorOverrides, overrideSpecs) + DispatchSlotChecking.CheckOverridesAreAllUsedOnce (env.DisplayEnv, cenv.g, cenv.infoReader, true, implty, dispatchSlotsKeyed, availPriorOverrides, overrideSpecs) DispatchSlotChecking.CheckDispatchSlotsAreImplemented (env.DisplayEnv, cenv.infoReader, m, env.NameEnv, cenv.tcSink, false, implty, dispatchSlots, availPriorOverrides, overrideSpecs) |> ignore) @@ -9908,7 +9909,7 @@ and ApplyAbstractSlotInference (cenv: cenv) (envinner: TcEnv) (bindingTy, m, syn | [] -> let details = slots - |> Seq.map (NicePrint.stringOfMethInfo cenv.amap m envinner.DisplayEnv) + |> Seq.map (NicePrint.stringOfMethInfo cenv.infoReader m envinner.DisplayEnv) |> Seq.map (sprintf "%s %s" System.Environment.NewLine) |> String.concat "" diff --git a/src/fsharp/CheckExpressions.fsi b/src/fsharp/CheckExpressions.fsi index e493d5a0b9..e257b08fd8 100644 --- a/src/fsharp/CheckExpressions.fsi +++ b/src/fsharp/CheckExpressions.fsi @@ -20,6 +20,7 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps @@ -130,7 +131,7 @@ exception UnitTypeExpectedWithPossibleAssignment of DisplayEnv * TType * bool * exception FunctionValueUnexpected of DisplayEnv * TType * range exception UnionPatternsBindDifferentNames of range exception VarBoundTwice of Ident -exception ValueRestriction of DisplayEnv * bool * Val * Typar * range +exception ValueRestriction of DisplayEnv * InfoReader * bool * Val * Typar * range exception ValNotMutable of DisplayEnv * ValRef * range exception ValNotLocal of DisplayEnv * ValRef * range exception InvalidRuntimeCoercion of DisplayEnv * TType * TType * range diff --git a/src/fsharp/CompilerConfig.fs b/src/fsharp/CompilerConfig.fs index 6ba776c601..05b91907d3 100644 --- a/src/fsharp/CompilerConfig.fs +++ b/src/fsharp/CompilerConfig.fs @@ -25,6 +25,7 @@ open FSharp.Compiler.IO open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.Text open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree #if !NO_EXTENSIONTYPING @@ -487,6 +488,8 @@ type TcConfigBuilder = mutable pathMap: PathMap mutable langVersion: LanguageVersion + + mutable xmlDocInfoLoader: IXmlDocumentationInfoLoader option } @@ -662,6 +665,7 @@ type TcConfigBuilder = useFsiAuxLib = isInteractive rangeForErrors = rangeForErrors sdkDirOverride = sdkDirOverride + xmlDocInfoLoader = None } member tcConfigB.FxResolver = @@ -1033,6 +1037,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = member x.tryGetMetadataSnapshot = data.tryGetMetadataSnapshot member x.internalTestSpanStackReferring = data.internalTestSpanStackReferring member x.noConditionalErasure = data.noConditionalErasure + member x.xmlDocInfoLoader = data.xmlDocInfoLoader static member Create(builder, validate) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter diff --git a/src/fsharp/CompilerConfig.fsi b/src/fsharp/CompilerConfig.fsi index 1aeb3b64e7..b87600b095 100644 --- a/src/fsharp/CompilerConfig.fsi +++ b/src/fsharp/CompilerConfig.fsi @@ -7,6 +7,7 @@ open System open Internal.Utilities open Internal.Utilities.Library open FSharp.Compiler +open FSharp.Compiler.Xml open FSharp.Compiler.AbstractIL open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.ILBinaryReader @@ -273,6 +274,8 @@ type TcConfigBuilder = mutable pathMap : PathMap mutable langVersion : LanguageVersion + + mutable xmlDocInfoLoader : IXmlDocumentationInfoLoader option } static member CreateNew: @@ -440,6 +443,8 @@ type TcConfig = member isInteractive: bool member isInvalidationSupported: bool + member xmlDocInfoLoader: IXmlDocumentationInfoLoader option + member FxResolver: FxResolver member ComputeLightSyntaxInitialStatus: string -> bool diff --git a/src/fsharp/CompilerDiagnostics.fs b/src/fsharp/CompilerDiagnostics.fs index 4e8fffc493..64d1ad67af 100644 --- a/src/fsharp/CompilerDiagnostics.fs +++ b/src/fsharp/CompilerDiagnostics.fs @@ -142,7 +142,7 @@ let GetRangeOfDiagnostic(err: PhasedDiagnostic) = | IntfImplInIntrinsicAugmentation m | OverrideInExtrinsicAugmentation m | IntfImplInExtrinsicAugmentation m - | ValueRestriction(_, _, _, _, m) + | ValueRestriction(_, _, _, _, _, m) | LetRecUnsound (_, _, m) | ObsoleteError (_, m) | ObsoleteWarning (_, m) @@ -156,10 +156,10 @@ let GetRangeOfDiagnostic(err: PhasedDiagnostic) = | TyconBadArgs(_, _, _, m) -> Some m - | FieldNotContained(_, arf, _, _) -> Some arf.Range - | ValueNotContained(_, _, aval, _, _) -> Some aval.Range - | ConstrNotContained(_, aval, _, _) -> Some aval.Id.idRange - | ExnconstrNotContained(_, aexnc, _, _) -> Some aexnc.Range + | FieldNotContained(_, _, _, arf, _, _) -> Some arf.Range + | ValueNotContained(_, _, _, aval, _, _) -> Some aval.Range + | ConstrNotContained(_, _, _, aval, _, _) -> Some aval.Id.idRange + | ExnconstrNotContained(_, _, aexnc, _, _) -> Some aexnc.Range | VarBoundTwice id | UndefinedName(_, _, id, _) -> @@ -803,7 +803,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) (canSuggestNa sprintf " // %s" nameOrOneBasedIndexMessage | _ -> "" - (NicePrint.stringOfMethInfo x.amap m displayEnv x.methodSlot.Method) + paramInfo + (NicePrint.stringOfMethInfo x.infoReader m displayEnv x.methodSlot.Method) + paramInfo let nl = System.Environment.NewLine let formatOverloads (overloads: OverloadInformation list) = @@ -1348,18 +1348,20 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) (canSuggestNa | UnionPatternsBindDifferentNames _ -> os.Append(UnionPatternsBindDifferentNamesE().Format) |> ignore - | ValueNotContained (denv, mref, implVal, sigVal, f) -> - let text1, text2 = NicePrint.minimalStringsOfTwoValues denv implVal sigVal + | ValueNotContained (denv, infoReader, mref, implVal, sigVal, f) -> + let text1, text2 = NicePrint.minimalStringsOfTwoValues denv infoReader (mkLocalValRef implVal) (mkLocalValRef sigVal) os.Append(f((fullDisplayTextOfModRef mref), text1, text2)) |> ignore - | ConstrNotContained (denv, v1, v2, f) -> - os.Append(f((NicePrint.stringOfUnionCase denv v1), (NicePrint.stringOfUnionCase denv v2))) |> ignore + | ConstrNotContained (denv, infoReader, enclosingTycon, v1, v2, f) -> + let enclosingTcref = mkLocalEntityRef enclosingTycon + os.Append(f((NicePrint.stringOfUnionCase denv infoReader enclosingTcref v1), (NicePrint.stringOfUnionCase denv infoReader enclosingTcref v2))) |> ignore - | ExnconstrNotContained (denv, v1, v2, f) -> - os.Append(f((NicePrint.stringOfExnDef denv v1), (NicePrint.stringOfExnDef denv v2))) |> ignore + | ExnconstrNotContained (denv, infoReader, v1, v2, f) -> + os.Append(f((NicePrint.stringOfExnDef denv infoReader (mkLocalEntityRef v1)), (NicePrint.stringOfExnDef denv infoReader (mkLocalEntityRef v2)))) |> ignore - | FieldNotContained (denv, v1, v2, f) -> - os.Append(f((NicePrint.stringOfRecdField denv v1), (NicePrint.stringOfRecdField denv v2))) |> ignore + | FieldNotContained (denv, infoReader, enclosingTycon, v1, v2, f) -> + let enclosingTcref = mkLocalEntityRef enclosingTycon + os.Append(f((NicePrint.stringOfRecdField denv infoReader enclosingTcref v1), (NicePrint.stringOfRecdField denv infoReader enclosingTcref v2))) |> ignore | RequiredButNotSpecified (_, mref, k, name, _) -> let nsb = new System.Text.StringBuilder() @@ -1510,19 +1512,19 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) (canSuggestNa | MissingFields(sl, _) -> os.Append(MissingFieldsE().Format (String.concat "," sl + ".")) |> ignore - | ValueRestriction(denv, hassig, v, _, _) -> + | ValueRestriction(denv, infoReader, hassig, v, _, _) -> let denv = { denv with showImperativeTyparAnnotations=true } let tau = v.TauType if hassig then if isFunTy denv.g tau && (arityOfVal v).HasNoArgs then os.Append(ValueRestriction1E().Format v.DisplayName - (NicePrint.stringOfQualifiedValOrMember denv v) + (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) v.DisplayName) |> ignore else os.Append(ValueRestriction2E().Format v.DisplayName - (NicePrint.stringOfQualifiedValOrMember denv v) + (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) v.DisplayName) |> ignore else match v.MemberInfo with @@ -1533,17 +1535,17 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) (canSuggestNa | SynMemberKind.Constructor -> true (* can't infer extra polymorphism *) | _ -> false (* can infer extra polymorphism *) end -> - os.Append(ValueRestriction3E().Format (NicePrint.stringOfQualifiedValOrMember denv v)) |> ignore + os.Append(ValueRestriction3E().Format (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v))) |> ignore | _ -> if isFunTy denv.g tau && (arityOfVal v).HasNoArgs then os.Append(ValueRestriction4E().Format v.DisplayName - (NicePrint.stringOfQualifiedValOrMember denv v) + (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) v.DisplayName) |> ignore else os.Append(ValueRestriction5E().Format v.DisplayName - (NicePrint.stringOfQualifiedValOrMember denv v) + (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) v.DisplayName) |> ignore diff --git a/src/fsharp/CompilerImports.fs b/src/fsharp/CompilerImports.fs index 8ee516b595..3232ccdf9c 100644 --- a/src/fsharp/CompilerImports.fs +++ b/src/fsharp/CompilerImports.fs @@ -29,12 +29,12 @@ open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Import open FSharp.Compiler.IO open FSharp.Compiler.CodeAnalysis -open FSharp.Compiler.Syntax open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTreePickle open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics @@ -1015,6 +1015,19 @@ and [] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse | ResolvedImportedAssembly importedAssembly -> ResolvedCcu(importedAssembly.FSharpViewOfMetadata) | UnresolvedImportedAssembly _ -> UnresolvedCcu(assemblyRef.QualifiedName) + member tcImports.TryFindXmlDocumentationInfo(assemblyName: string) = + CheckDisposed() + let rec look (t: TcImports) = + match NameMap.tryFind assemblyName t.CcuTable with + | Some res -> Some res + | None -> + match t.Base with + | Some t2 -> look t2 + | None -> None + + match look tcImports with + | Some res -> res.FSharpViewOfMetadata.Deref.XmlDocumentationInfo + | _ -> None #if !NO_EXTENSIONTYPING member tcImports.GetProvidedAssemblyInfo(ctok, m, assembly: Tainted) = @@ -1073,7 +1086,12 @@ and [] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse MemberSignatureEquality = (fun ty1 ty2 -> typeEquivAux EraseAll g ty1 ty2) ImportProvidedType = (fun ty -> Import.ImportProvidedType (tcImports.GetImportMap()) m ty) TryGetILModuleDef = (fun () -> Some ilModule) - TypeForwarders = Map.empty } + TypeForwarders = Map.empty + XmlDocumentationInfo = + match tcConfig.xmlDocInfoLoader with + | Some xmlDocInfoLoader -> xmlDocInfoLoader.TryLoad(fileName, ilModule) + | _ -> None + } let ccu = CcuThunk.Create(ilShortAssemName, ccuData) let ccuinfo = @@ -1183,6 +1201,10 @@ and [] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse { new Import.AssemblyLoader with member x.FindCcuFromAssemblyRef (ctok, m, ilAssemblyRef) = tcImports.FindCcuFromAssemblyRef (ctok, m, ilAssemblyRef) + + member x.TryFindXmlDocumentationInfo (assemblyName) = + tcImports.TryFindXmlDocumentationInfo(assemblyName) + #if !NO_EXTENSIONTYPING member x.GetProvidedAssemblyInfo (ctok, m, assembly) = tcImports.GetProvidedAssemblyInfo (ctok, m, assembly) member x.RecordGeneratedTypeRoot root = tcImports.RecordGeneratedTypeRoot root @@ -1434,7 +1456,7 @@ and [] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse if verbose then dprintn ("Converting IL assembly to F# data structures "+nm) let auxModuleLoader = tcImports.MkLoaderForMultiModuleILAssemblies ctok m let invalidateCcu = new Event<_>() - let ccu = Import.ImportILAssembly(tcImports.GetImportMap, m, auxModuleLoader, ilScopeRef, tcConfig.implicitIncludeDir, Some filename, ilModule, invalidateCcu.Publish) + let ccu = Import.ImportILAssembly(tcImports.GetImportMap, m, auxModuleLoader, tcConfig.xmlDocInfoLoader, ilScopeRef, tcConfig.implicitIncludeDir, Some filename, ilModule, invalidateCcu.Publish) let ilg = defaultArg ilGlobalsOpt EcmaMscorlibILGlobals @@ -1499,7 +1521,12 @@ and [] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse TryGetILModuleDef = ilModule.TryGetILModuleDef UsesFSharp20PlusQuotations = minfo.usesQuotations MemberSignatureEquality= (fun ty1 ty2 -> typeEquivAux EraseAll (tcImports.GetTcGlobals()) ty1 ty2) - TypeForwarders = ImportILAssemblyTypeForwarders(tcImports.GetImportMap, m, ilModule.GetRawTypeForwarders()) } + TypeForwarders = ImportILAssemblyTypeForwarders(tcImports.GetImportMap, m, ilModule.GetRawTypeForwarders()) + XmlDocumentationInfo = + match tcConfig.xmlDocInfoLoader, ilModule.TryGetILModuleDef() with + | Some xmlDocInfoLoader, Some ilModuleDef -> xmlDocInfoLoader.TryLoad(filename, ilModuleDef) + | _ -> None + } let ccu = CcuThunk.Create(ccuName, ccuData) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 9f42a53607..a3837ae5fc 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -195,7 +195,7 @@ type ContextInfo = type OverloadInformation = { methodSlot: CalledMeth - amap : ImportMap + infoReader : InfoReader error: exn } @@ -2395,6 +2395,7 @@ and ReportNoCandidatesError (csenv: ConstraintSolverEnv) (nUnnamedCallerArgs, nN let amap = csenv.amap let m = csenv.m let denv = csenv.DisplayEnv + let infoReader = csenv.InfoReader match (calledMethGroup |> List.partition (CalledMeth.GetMethod >> IsMethInfoAccessible amap m ad)), (calledMethGroup |> List.partition (fun cmeth -> cmeth.HasCorrectObjArgs(m))), @@ -2419,7 +2420,7 @@ and ReportNoCandidatesError (csenv: ConstraintSolverEnv) (nUnnamedCallerArgs, nN // One method, incorrect name/arg assignment | _, _, _, _, ([], [cmeth]) -> let minfo = cmeth.Method - let msgNum, msgText = FSComp.SR.csRequiredSignatureIs(NicePrint.stringOfMethInfo amap m denv minfo) + let msgNum, msgText = FSComp.SR.csRequiredSignatureIs(NicePrint.stringOfMethInfo infoReader m denv minfo) match cmeth.UnassignedNamedArgs with | CallerNamedArg(id, _) :: _ -> if minfo.IsConstructor then @@ -2437,7 +2438,7 @@ and ReportNoCandidatesError (csenv: ConstraintSolverEnv) (nUnnamedCallerArgs, nN let minfo = cmeth.Method let nReqd = cmeth.TotalNumUnnamedCalledArgs let nActual = cmeth.TotalNumUnnamedCallerArgs - let signature = NicePrint.stringOfMethInfo amap m denv minfo + let signature = NicePrint.stringOfMethInfo infoReader m denv minfo if nActual = nReqd then let nreqdTyArgs = cmeth.NumCalledTyArgs let nactualTyArgs = cmeth.NumCallerTyArgs @@ -2526,7 +2527,7 @@ and ResolveOverloading reqdRetTyOpt // The expected return type, if known = let g = csenv.g - let amap = csenv.amap + let infoReader = csenv.InfoReader let m = csenv.m let denv = csenv.DisplayEnv let isOpConversion = methodName = "op_Explicit" || methodName = "op_Implicit" @@ -2621,7 +2622,7 @@ and ResolveOverloading calledMeth) with | OkResult _ -> None | ErrorResult(_warnings, exn) -> - Some {methodSlot = calledMeth; amap = amap; error = exn }) + Some {methodSlot = calledMeth; infoReader = infoReader; error = exn }) None, ErrorD (failOverloading (NoOverloadsFound (methodName, errors, cx))), NoTrace @@ -2798,8 +2799,8 @@ and ResolveOverloading let methods = let getMethodSlotsAndErrors methodSlot errors = [ match errors with - | [] -> yield { methodSlot = methodSlot; error = Unchecked.defaultof; amap = amap } - | errors -> for error in errors do yield { methodSlot = methodSlot; error = error; amap = amap } ] + | [] -> yield { methodSlot = methodSlot; error = Unchecked.defaultof; infoReader = infoReader } + | errors -> for error in errors do yield { methodSlot = methodSlot; error = error; infoReader = infoReader } ] // use the most precise set diff --git a/src/fsharp/ConstraintSolver.fsi b/src/fsharp/ConstraintSolver.fsi index 7744a408f4..b37d4445ea 100644 --- a/src/fsharp/ConstraintSolver.fsi +++ b/src/fsharp/ConstraintSolver.fsi @@ -94,7 +94,7 @@ type ContextInfo = type OverloadInformation = { methodSlot: CalledMeth - amap : ImportMap + infoReader: InfoReader error: exn } diff --git a/src/fsharp/DetupleArgs.fs b/src/fsharp/DetupleArgs.fs index b7b2838815..2ff48082fa 100644 --- a/src/fsharp/DetupleArgs.fs +++ b/src/fsharp/DetupleArgs.fs @@ -8,6 +8,7 @@ open Internal.Utilities.Library.Extras open FSharp.Compiler.TcGlobals open FSharp.Compiler.Syntax open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index f1b179f27f..8045ceb501 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -32,6 +32,7 @@ open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text.Range open FSharp.Compiler.Text open FSharp.Compiler.Text.LayoutRender +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index 844b3a0c00..e04b5fb11a 100644 --- a/src/fsharp/InfoReader.fs +++ b/src/fsharp/InfoReader.fs @@ -19,6 +19,7 @@ open FSharp.Compiler.Text open FSharp.Compiler.Text.Range open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps +open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypeRelations /// Use the given function to select some of the member values from the members of an F# type @@ -925,3 +926,147 @@ let PropTypOfEventInfo (infoReader: InfoReader) m ad (einfo: EventInfo) = let delTy = einfo.GetDelegateType(amap, m) let argsTy = ArgsTypOfEventInfo infoReader m ad einfo mkIEventType g delTy argsTy + +/// Try to find the name of the metadata file for this external definition +let TryFindMetadataInfoOfExternalEntityRef (infoReader: InfoReader) m eref = + let g = infoReader.g + match eref with + | ERefLocal _ -> None + | ERefNonLocal nlref -> + // Generalize to get a formal signature + let formalTypars = eref.Typars m + let formalTypeInst = generalizeTypars formalTypars + let ty = TType_app(eref, formalTypeInst) + if isILAppTy g ty then + let formalTypeInfo = ILTypeInfo.FromType g ty + Some(nlref.Ccu.FileName, formalTypars, formalTypeInfo) + else None + +/// Try to find the xml doc associated with the assembly name and xml doc signature +let TryFindXmlDocByAssemblyNameAndSig (infoReader: InfoReader) assemblyName xmlDocSig = + infoReader.amap.assemblyLoader.TryFindXmlDocumentationInfo(assemblyName) + |> Option.bind (fun xmlDocInfo -> + xmlDocInfo.TryGetXmlDocBySig(xmlDocSig) + ) + +let private libFileOfEntityRef x = + match x with + | ERefLocal _ -> None + | ERefNonLocal nlref -> nlref.Ccu.FileName + +let GetXmlDocSigOfEntityRef infoReader m (eref: EntityRef) = + if eref.IsILTycon then + match TryFindMetadataInfoOfExternalEntityRef infoReader m eref with + | None -> None + | Some (ccuFileName, _, formalTypeInfo) -> Some(ccuFileName, "T:"+formalTypeInfo.ILTypeRef.FullName) + else + let ccuFileName = libFileOfEntityRef eref + let m = eref.Deref + if m.XmlDocSig = "" then + m.XmlDocSig <- XmlDocSigOfEntity eref + Some (ccuFileName, m.XmlDocSig) + +let GetXmlDocSigOfScopedValRef g (tcref: TyconRef) (vref: ValRef) = + let ccuFileName = libFileOfEntityRef tcref + let v = vref.Deref + if v.XmlDocSig = "" && v.HasDeclaringEntity then + let ap = buildAccessPath vref.TopValDeclaringEntity.CompilationPathOpt + let path = + if vref.TopValDeclaringEntity.IsModule then + let sep = if ap.Length > 0 then "." else "" + ap + sep + vref.TopValDeclaringEntity.CompiledName + else + ap + v.XmlDocSig <- XmlDocSigOfVal g false path v + Some (ccuFileName, v.XmlDocSig) + +let GetXmlDocSigOfRecdFieldRef (rfref: RecdFieldRef) = + let tcref = rfref.TyconRef + let ccuFileName = libFileOfEntityRef tcref + if rfref.RecdField.XmlDocSig = "" then + rfref.RecdField.XmlDocSig <- XmlDocSigOfProperty [tcref.CompiledRepresentationForNamedType.FullName; rfref.RecdField.Name] + Some (ccuFileName, rfref.RecdField.XmlDocSig) + +let GetXmlDocSigOfUnionCaseRef (ucref: UnionCaseRef) = + let tcref = ucref.TyconRef + let ccuFileName = libFileOfEntityRef tcref + if ucref.UnionCase.XmlDocSig = "" then + ucref.UnionCase.XmlDocSig <- XmlDocSigOfUnionCase [tcref.CompiledRepresentationForNamedType.FullName; ucref.CaseName] + Some (ccuFileName, ucref.UnionCase.XmlDocSig) + +let GetXmlDocSigOfMethInfo (infoReader: InfoReader) m (minfo: MethInfo) = + let amap = infoReader.amap + match minfo with + | FSMeth (g, _, vref, _) -> + GetXmlDocSigOfScopedValRef g minfo.DeclaringTyconRef vref + | ILMeth (g, ilminfo, _) -> + let actualTypeName = ilminfo.DeclaringTyconRef.CompiledRepresentationForNamedType.FullName + let fmtps = ilminfo.FormalMethodTypars + let genArity = if fmtps.Length=0 then "" else sprintf "``%d" fmtps.Length + + match TryFindMetadataInfoOfExternalEntityRef infoReader m ilminfo.DeclaringTyconRef with + | None -> None + | Some (ccuFileName, formalTypars, formalTypeInfo) -> + let filminfo = ILMethInfo(g, formalTypeInfo.ToType, None, ilminfo.RawMetadata, fmtps) + let args = + match ilminfo.IsILExtensionMethod with + | true -> filminfo.GetRawArgTypes(amap, m, minfo.FormalMethodInst) + | false -> filminfo.GetParamTypes(amap, m, minfo.FormalMethodInst) + + // http://msdn.microsoft.com/en-us/library/fsbx0t7x.aspx + // If the name of the item itself has periods, they are replaced by the hash-sign ('#'). + // It is assumed that no item has a hash-sign directly in its name. For example, the fully + // qualified name of the String constructor would be "System.String.#ctor". + let normalizedName = ilminfo.ILName.Replace(".", "#") + + Some (ccuFileName, "M:"+actualTypeName+"."+normalizedName+genArity+XmlDocArgsEnc g (formalTypars, fmtps) args) + | DefaultStructCtor _ -> None +#if !NO_EXTENSIONTYPING + | ProvidedMeth _ -> None +#endif + +let GetXmlDocSigOfValRef g (vref: ValRef) = + if not vref.IsLocalRef then + let ccuFileName = vref.nlr.Ccu.FileName + let v = vref.Deref + if v.XmlDocSig = "" && v.HasDeclaringEntity then + v.XmlDocSig <- XmlDocSigOfVal g false vref.TopValDeclaringEntity.CompiledRepresentationForNamedType.Name v + Some (ccuFileName, v.XmlDocSig) + else + match vref.ApparentEnclosingEntity with + | Parent tcref -> + GetXmlDocSigOfScopedValRef g tcref vref + | _ -> + None + +let GetXmlDocSigOfProp infoReader m (pinfo: PropInfo) = + let g = pinfo.TcGlobals + match pinfo with +#if !NO_EXTENSIONTYPING + | ProvidedProp _ -> None // No signature is possible. If an xml comment existed it would have been returned by PropInfo.XmlDoc in infos.fs +#endif + | FSProp _ as fspinfo -> + match fspinfo.ArbitraryValRef with + | None -> None + | Some vref -> GetXmlDocSigOfScopedValRef g pinfo.DeclaringTyconRef vref + | ILProp(ILPropInfo(_, pdef)) -> + match TryFindMetadataInfoOfExternalEntityRef infoReader m pinfo.DeclaringTyconRef with + | Some (ccuFileName, formalTypars, formalTypeInfo) -> + let filpinfo = ILPropInfo(formalTypeInfo, pdef) + Some (ccuFileName, "P:"+formalTypeInfo.ILTypeRef.FullName+"."+pdef.Name+XmlDocArgsEnc g (formalTypars, []) (filpinfo.GetParamTypes(infoReader.amap, m))) + | _ -> None + +let GetXmlDocSigOfEvent infoReader m (einfo: EventInfo) = + match einfo with + | ILEvent _ -> + match TryFindMetadataInfoOfExternalEntityRef infoReader m einfo.DeclaringTyconRef with + | Some (ccuFileName, _, formalTypeInfo) -> + Some(ccuFileName, "E:"+formalTypeInfo.ILTypeRef.FullName+"."+einfo.EventName) + | _ -> None + | _ -> None + +let GetXmlDocSigOfILFieldInfo infoReader m (finfo: ILFieldInfo) = + match TryFindMetadataInfoOfExternalEntityRef infoReader m finfo.DeclaringTyconRef with + | Some (ccuFileName, _, formalTypeInfo) -> + Some(ccuFileName, "F:"+formalTypeInfo.ILTypeRef.FullName+"."+finfo.FieldName) + | _ -> None diff --git a/src/fsharp/InfoReader.fsi b/src/fsharp/InfoReader.fsi index 8a77e17e2c..d8606880ce 100644 --- a/src/fsharp/InfoReader.fsi +++ b/src/fsharp/InfoReader.fsi @@ -11,6 +11,7 @@ open FSharp.Compiler.Import open FSharp.Compiler.Infos open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree /// Try to select an F# value when querying members, and if so return a MethInfo that wraps the F# value. @@ -153,3 +154,27 @@ val IsStandardEventInfo: infoReader:InfoReader -> m:range -> ad:AccessorDomain - val ArgsTypOfEventInfo: infoReader:InfoReader -> m:range -> ad:AccessorDomain -> einfo:EventInfo -> TType val PropTypOfEventInfo: infoReader:InfoReader -> m:range -> ad:AccessorDomain -> einfo:EventInfo -> TType + +/// Try to find the name of the metadata file for this external definition +val TryFindMetadataInfoOfExternalEntityRef: infoReader:InfoReader -> m:range -> eref:EntityRef -> (string option * Typars * ILTypeInfo) option + +/// Try to find the xml doc associated with the assembly name and metadata key +val TryFindXmlDocByAssemblyNameAndSig: infoReader:InfoReader -> assemblyName: string -> xmlDocSig: string -> XmlDoc option + +val GetXmlDocSigOfEntityRef: infoReader:InfoReader -> m:range -> eref:EntityRef -> (string option * string) option + +val GetXmlDocSigOfScopedValRef: TcGlobals -> tcref:TyconRef -> vref:ValRef -> (string option * string) option + +val GetXmlDocSigOfRecdFieldRef: rfref:RecdFieldRef -> (string option * string) option + +val GetXmlDocSigOfUnionCaseRef: ucref:UnionCaseRef -> (string option * string) option + +val GetXmlDocSigOfMethInfo: infoReader: InfoReader -> m:range -> minfo:MethInfo -> (string option * string) option + +val GetXmlDocSigOfValRef: TcGlobals -> vref: ValRef -> (string option * string) option + +val GetXmlDocSigOfProp: infoReader:InfoReader -> m:range -> pinfo:PropInfo -> (string option * string) option + +val GetXmlDocSigOfEvent: infoReader:InfoReader -> m:range -> einfo:EventInfo -> (string option * string) option + +val GetXmlDocSigOfILFieldInfo: infoReader:InfoReader -> m:range -> finfo:ILFieldInfo -> (string option * string) option \ No newline at end of file diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index bfbf4d47fa..7721d0ccba 100644 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -13,6 +13,7 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.Text.Layout open FSharp.Compiler.Text.LayoutRender +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs index c51b83e10b..f26b67afa2 100644 --- a/src/fsharp/MethodOverrides.fs +++ b/src/fsharp/MethodOverrides.fs @@ -334,13 +334,13 @@ module DispatchSlotChecking = checkLanguageFeatureErrorRecover g.langVersion LanguageFeature.DefaultInterfaceMemberConsumption m if reqdSlot.PossiblyNoMostSpecificImplementation then - errorR(Error(FSComp.SR.typrelInterfaceMemberNoMostSpecificImplementation(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) + errorR(Error(FSComp.SR.typrelInterfaceMemberNoMostSpecificImplementation(NicePrint.stringOfMethInfo infoReader m denv dispatchSlot), m)) // error reporting path let compiledSig = CompiledSigOfMeth g amap m dispatchSlot let noimpl() = - missingOverloadImplementation.Add((isReqdTyInterface, lazy NicePrint.stringOfMethInfo amap m denv dispatchSlot)) + missingOverloadImplementation.Add((isReqdTyInterface, lazy NicePrint.stringOfMethInfo infoReader m denv dispatchSlot)) match overrides |> List.filter (IsPartialMatch g dispatchSlot compiledSig) with | [] -> @@ -370,7 +370,7 @@ module DispatchSlotChecking = elif not (IsTyparKindMatch compiledSig overrideBy) then fail(Error(FSComp.SR.typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) else - fail(Error(FSComp.SR.typrelMemberCannotImplement(FormatOverride denv overrideBy, NicePrint.stringOfMethInfo amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) + fail(Error(FSComp.SR.typrelMemberCannotImplement(FormatOverride denv overrideBy, NicePrint.stringOfMethInfo infoReader m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) | overrideBy :: _ -> errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) @@ -538,10 +538,12 @@ module DispatchSlotChecking = [ (reqdTy, GetClassDispatchSlots infoReader ad m reqdTy) ] /// Check all implementations implement some dispatch slot. - let CheckOverridesAreAllUsedOnce(denv, g, amap, isObjExpr, reqdTy, + let CheckOverridesAreAllUsedOnce(denv, g, infoReader: InfoReader, isObjExpr, reqdTy, dispatchSlotsKeyed: NameMultiMap, availPriorOverrides: OverrideInfo list, overrides: OverrideInfo list) = + let amap = infoReader.amap + let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) for overrideBy in overrides do if not overrideBy.IsFakeEventProperty then @@ -572,13 +574,13 @@ module DispatchSlotChecking = | [dispatchSlot] -> if dispatchSlot.IsFinal && (isObjExpr || not (typeEquiv g reqdTy dispatchSlot.ApparentEnclosingType)) then - errorR(Error(FSComp.SR.typrelMethodIsSealed(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) + errorR(Error(FSComp.SR.typrelMethodIsSealed(NicePrint.stringOfMethInfo infoReader m denv dispatchSlot), m)) | dispatchSlots -> match dispatchSlots |> List.filter (fun dispatchSlot -> isInterfaceTy g dispatchSlot.ApparentEnclosingType || not (DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed dispatchSlot)) with | h1 :: h2 :: _ -> - errorR(Error(FSComp.SR.typrelOverrideImplementsMoreThenOneSlot((FormatOverride denv overrideBy), (NicePrint.stringOfMethInfo amap m denv h1), (NicePrint.stringOfMethInfo amap m denv h2)), m)) + errorR(Error(FSComp.SR.typrelOverrideImplementsMoreThenOneSlot((FormatOverride denv overrideBy), (NicePrint.stringOfMethInfo infoReader m denv h1), (NicePrint.stringOfMethInfo infoReader m denv h2)), m)) | _ -> // dispatch slots are ordered from the derived classes to base // so we can check the topmost dispatch slot if it is final @@ -782,7 +784,7 @@ module DispatchSlotChecking = |> List.filter (fst >> mustOverrideSomething reqdTy) |> List.map snd - CheckOverridesAreAllUsedOnce (denv, g, amap, false, reqdTy, dispatchSlotsKeyed, availPriorOverrides, overridesToCheck) + CheckOverridesAreAllUsedOnce (denv, g, infoReader, false, reqdTy, dispatchSlotsKeyed, availPriorOverrides, overridesToCheck) with e -> errorRecovery e m diff --git a/src/fsharp/MethodOverrides.fsi b/src/fsharp/MethodOverrides.fsi index df1736b452..1e5a07350a 100644 --- a/src/fsharp/MethodOverrides.fsi +++ b/src/fsharp/MethodOverrides.fsi @@ -81,7 +81,7 @@ module DispatchSlotChecking = val CheckDispatchSlotsAreImplemented: denv:DisplayEnv * infoReader:InfoReader * m:range * nenv:NameResolutionEnv * sink:TcResultsSink * isOverallTyAbstract:bool * reqdTy:TType * dispatchSlots:RequiredSlot list * availPriorOverrides:OverrideInfo list * overrides:OverrideInfo list -> bool /// Check all implementations implement some dispatch slot. - val CheckOverridesAreAllUsedOnce: denv:DisplayEnv * g:TcGlobals * amap:ImportMap * isObjExpr:bool * reqdTy:TType * dispatchSlotsKeyed:NameMultiMap * availPriorOverrides:OverrideInfo list * overrides:OverrideInfo list -> unit + val CheckOverridesAreAllUsedOnce: denv:DisplayEnv * g:TcGlobals * infoReader:InfoReader * isObjExpr:bool * reqdTy:TType * dispatchSlotsKeyed:NameMultiMap * availPriorOverrides:OverrideInfo list * overrides:OverrideInfo list -> unit /// Get the slots of a type that can or must be implemented. val GetSlotImplSets: infoReader:InfoReader -> denv:DisplayEnv -> ad:AccessorDomain -> isObjExpr:bool -> allReqdTys:(TType * range) list -> SlotImplSet list diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index c59d9e5aad..4cf03cb77e 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -21,6 +21,7 @@ open FSharp.Compiler.Text open FSharp.Compiler.Text.Layout open FSharp.Compiler.Text.LayoutRender open FSharp.Compiler.Text.TaggedText +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps @@ -130,14 +131,83 @@ module internal PrintUtilities = emptyL else xml.UnprocessedLines - |> List.ofArray + |> Array.map (fun x -> + x.Split('\n') // These lines may have new-lines in them and we need to split them so we can format it + ) + |> Array.concat /// note here that we don't add a space after the triple-slash, because /// the implicit spacing hasn't been trimmed here. - |> List.map (fun line -> ("///" + line) |> tagText |> wordL) - |> spaceListL + |> Array.map (fun line -> ("///" + line) |> tagText |> wordL) + |> List.ofArray + |> aboveListL xmlDocL @@ restL else restL + let private layoutXmlDocFromSig (denv: DisplayEnv) (infoReader: InfoReader) (possibleXmlDoc: XmlDoc) restL (info: (string option * string) option) = + let xmlDoc = + if possibleXmlDoc.IsEmpty then + match info with + | Some(Some ccuFileName, xmlDocSig) -> + infoReader.amap.assemblyLoader.TryFindXmlDocumentationInfo(System.IO.Path.GetFileNameWithoutExtension ccuFileName) + |> Option.bind (fun xmlDocInfo -> + xmlDocInfo.TryGetXmlDocBySig(xmlDocSig) + ) + |> Option.defaultValue possibleXmlDoc + | _ -> + possibleXmlDoc + else + possibleXmlDoc + layoutXmlDoc denv xmlDoc restL + + let layoutXmlDocOfValRef (denv: DisplayEnv) (infoReader: InfoReader) (vref: ValRef) restL = + if denv.showDocumentation then + GetXmlDocSigOfValRef denv.g vref + |> layoutXmlDocFromSig denv infoReader vref.XmlDoc restL + else + restL + + let layoutXmlDocOfMethInfo (denv: DisplayEnv) (infoReader: InfoReader) (minfo: MethInfo) restL = + if denv.showDocumentation then + GetXmlDocSigOfMethInfo infoReader Range.range0 minfo + |> layoutXmlDocFromSig denv infoReader minfo.XmlDoc restL + else + restL + + let layoutXmlDocOfPropInfo (denv: DisplayEnv) (infoReader: InfoReader) (pinfo: PropInfo) restL = + if denv.showDocumentation then + GetXmlDocSigOfProp infoReader Range.range0 pinfo + |> layoutXmlDocFromSig denv infoReader pinfo.XmlDoc restL + else + restL + + let layoutXmlDocOfEventInfo (denv: DisplayEnv) (infoReader: InfoReader) (einfo: EventInfo) restL = + if denv.showDocumentation then + GetXmlDocSigOfEvent infoReader Range.range0 einfo + |> layoutXmlDocFromSig denv infoReader einfo.XmlDoc restL + else + restL + + let layoutXmlDocOfRecdFieldRef (denv: DisplayEnv) (infoReader: InfoReader) (rfref: RecdFieldRef) restL = + if denv.showDocumentation then + GetXmlDocSigOfRecdFieldRef rfref + |> layoutXmlDocFromSig denv infoReader rfref.RecdField.XmlDoc restL + else + restL + + let layoutXmlDocOfUnionCaseRef (denv: DisplayEnv) (infoReader: InfoReader) (ucref: UnionCaseRef) restL = + if denv.showDocumentation then + GetXmlDocSigOfUnionCaseRef ucref + |> layoutXmlDocFromSig denv infoReader ucref.UnionCase.XmlDoc restL + else + restL + + let layoutXmlDocOfEntityRef (denv: DisplayEnv) (infoReader: InfoReader) (eref: EntityRef) restL = + if denv.showDocumentation then + GetXmlDocSigOfEntityRef infoReader Range.range0 eref + |> layoutXmlDocFromSig denv infoReader eref.XmlDoc restL + else + restL + module private PrintIL = let fullySplitILTypeRef (tref: ILTypeRef) = @@ -320,7 +390,7 @@ module private PrintTypes = | _ -> itemL /// Layout a reference to a type - let layoutTyconRef denv tycon = layoutTyconRefImpl false denv tycon + let layoutTyconRefImpl denv tycon = layoutTyconRefImpl false denv tycon /// Layout the flags of a member let layoutMemberFlags (memFlags: SynMemberFlags) = @@ -404,7 +474,7 @@ module private PrintTypes = let _, _, _, rty, _ = GetTypeOfMemberInMemberForm denv.g vref let rty = GetFSharpViewOfReturnType denv.g rty let tcref = tcrefOfAppTy denv.g rty - layoutTyconRef denv tcref ++ argsL + layoutTyconRefImpl denv tcref ++ argsL and layoutILAttribElement denv arg = match arg with @@ -632,7 +702,7 @@ module private PrintTypes = let negvs, posvs = ListMeasureVarOccsWithNonZeroExponents unt |> sortVars |> List.partition (fun (_, e) -> SignRational e < 0) let negcs, poscs = ListMeasureConOccsWithNonZeroExponents denv.g false unt |> sortCons |> List.partition (fun (_, e) -> SignRational e < 0) let unparL uv = layoutTyparRef denv uv - let unconL tc = layoutTyconRef denv tc + let unconL tc = layoutTyconRefImpl denv tc let rationalL e = wordL (tagNumericLiteral (RationalToString e)) let measureToPowerL x e = if e = OneRational then x else x -- wordL (tagPunctuation "^") -- rationalL e let prefix = spaceListL (List.map (fun (v, e) -> measureToPowerL (unparL v) e) posvs @ @@ -684,7 +754,7 @@ module private PrintTypes = | GenericParameterStyle.Implicit -> tc.IsPrefixDisplay | GenericParameterStyle.Prefix -> true | GenericParameterStyle.Suffix -> false - layoutTypeAppWithInfoAndPrec denv env (layoutTyconRef denv tc) prec usePrefix args + layoutTypeAppWithInfoAndPrec denv env (layoutTyconRefImpl denv tc) prec usePrefix args | TType_ucase (UnionCaseRef(tc, _), args) -> let usePrefix = @@ -692,7 +762,7 @@ module private PrintTypes = | GenericParameterStyle.Implicit -> tc.IsPrefixDisplay | GenericParameterStyle.Prefix -> true | GenericParameterStyle.Suffix -> false - layoutTypeAppWithInfoAndPrec denv env (layoutTyconRef denv tc) prec usePrefix args + layoutTypeAppWithInfoAndPrec denv env (layoutTyconRefImpl denv tc) prec usePrefix args // Layout a tuple type | TType_anon (anonInfo, tys) -> @@ -969,7 +1039,7 @@ module private PrintTastMemberOrVals = DemangleOperatorNameAsLayout (tagFunction >> mkNav v.DefinitionRange) name let nameL = if denv.showMemberContainers then - layoutTyconRef denv v.MemberApparentEntity ^^ SepL.dot ^^ nameL + layoutTyconRefImpl denv v.MemberApparentEntity ^^ SepL.dot ^^ nameL else nameL let nameL = if denv.showTyparBinding then layoutTyparDecls denv nameL true niceMethodTypars else nameL @@ -1043,7 +1113,7 @@ module private PrintTastMemberOrVals = stat --- (nameL ^^ wordL (tagPunctuation ":") ^^ (tauL --- (WordL.keywordWith ^^ WordL.keywordSet))) prettyTyparInst, resL - prettyTyparInst, layoutXmlDoc denv v.XmlDoc memberL + prettyTyparInst, memberL let prettyLayoutOfMember denv typarInst (v:Val) = prettyLayoutOfMemberShortOption denv typarInst v false @@ -1101,8 +1171,8 @@ module private PrintTastMemberOrVals = let nameL = if v.IsMutable && not denv.suppressMutableKeyword then wordL (tagKeyword "mutable") ++ nameL - else - nameL + else + nameL let nameL = mkInlineL denv v nameL let isOverGeneric = List.length (Zset.elements (freeInType CollectTyparsNoCaching tau).FreeTypars) < List.length tps // Bug: 1143 @@ -1116,31 +1186,31 @@ module private PrintTastMemberOrVals = match denv.generatedValueLayout v with | None -> valAndTypeL | Some rhsL -> (valAndTypeL ++ wordL (tagPunctuation"=")) --- rhsL - let overallL = - match v.LiteralValue with - | Some literalValue -> valAndTypeL ++ layoutOfLiteralValue literalValue - | None -> valAndTypeL - layoutXmlDoc denv v.XmlDoc overallL + match v.LiteralValue with + | Some literalValue -> valAndTypeL ++ layoutOfLiteralValue literalValue + | None -> valAndTypeL - let prettyLayoutOfValOrMember denv typarInst (v: Val) = + let prettyLayoutOfValOrMember denv infoReader typarInst (vref: ValRef) = let prettyTyparInst, vL = - match v.MemberInfo with + match vref.MemberInfo with | None -> - let tps, tau = v.TypeScheme + let tps, tau = vref.TypeScheme // adjust the type in case this is the 'this' pointer stored in a reference cell - let tau = StripSelfRefCell(denv.g, v.BaseOrThisInfo, tau) + let tau = StripSelfRefCell(denv.g, vref.BaseOrThisInfo, tau) let (prettyTyparInst, prettyTypars, prettyTauTy), cxs = PrettyTypes.PrettifyInstAndTyparsAndType denv.g (typarInst, tps, tau) - let resL = layoutNonMemberVal denv (prettyTypars, v, prettyTauTy, cxs) + let resL = layoutNonMemberVal denv (prettyTypars, vref.Deref, prettyTauTy, cxs) prettyTyparInst, resL | Some _ -> - prettyLayoutOfMember denv typarInst v + prettyLayoutOfMember denv typarInst vref.Deref - prettyTyparInst, layoutAttribs denv true v.Type TyparKind.Type v.Attribs vL + prettyTyparInst, + layoutAttribs denv true vref.Type TyparKind.Type vref.Attribs vL + |> layoutXmlDocOfValRef denv infoReader vref - let prettyLayoutOfValOrMemberNoInst denv v = - prettyLayoutOfValOrMember denv emptyTyparInst v |> snd + let prettyLayoutOfValOrMemberNoInst denv infoReader v = + prettyLayoutOfValOrMember denv infoReader emptyTyparInst v |> snd let layoutTyparConstraint denv x = x |> PrintTypes.layoutTyparConstraint denv @@ -1150,9 +1220,9 @@ let layoutType denv x = x |> PrintTypes.layoutType denv let outputTypars denv nm os x = x |> PrintTypes.layoutTyparDecls denv (wordL nm) true |> bufferL os -let outputTyconRef denv os x = x |> PrintTypes.layoutTyconRef denv |> bufferL os +let outputTyconRef denv os x = x |> PrintTypes.layoutTyconRefImpl denv |> bufferL os -let layoutTyconRef denv x = x |> PrintTypes.layoutTyconRef denv +let layoutTyconRef denv x = x |> PrintTypes.layoutTyconRefImpl denv let layoutConst g ty c = PrintTypes.layoutConst g ty c @@ -1217,10 +1287,12 @@ module InfoMemberPrinting = // That is, this style: // new: argName1: argType1 * ... * argNameN: argTypeN -> retType // Method: argName1: argType1 * ... * argNameN: argTypeN -> retType - let private layoutMethInfoFSharpStyleCore amap m denv (minfo: MethInfo) minst = + let private layoutMethInfoFSharpStyleCore (infoReader: InfoReader) m denv (minfo: MethInfo) minst = + let amap = infoReader.amap + match minfo.ArbitraryValRef with | Some vref -> - PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref + PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader vref | None -> let layout = if not minfo.IsConstructor && not minfo.IsInstance then WordL.keywordStatic @@ -1236,7 +1308,7 @@ module InfoMemberPrinting = PrintTypes.layoutTyparDecls denv (minfo.LogicalName |> tagMethod |> wordL) true minfo.FormalMethodTypars ) ^^ WordL.colon - let layout = layoutXmlDoc denv minfo.XmlDoc layout + let layout = layoutXmlDocOfMethInfo denv infoReader minfo layout let paramDatas = minfo.GetParamDatas(amap, m, minst) let layout = layout ^^ @@ -1264,7 +1336,7 @@ module InfoMemberPrinting = layout ^^ if isAppTy minfo.TcGlobals minfo.ApparentEnclosingAppType then let tcref = minfo.ApparentEnclosingTyconRef - PrintTypes.layoutTyconRef denv tcref + PrintTypes.layoutTyconRefImpl denv tcref else emptyL let layout = @@ -1315,13 +1387,15 @@ module InfoMemberPrinting = // // For C# extension members: // ApparentContainer.Method(argName1: argType1, ..., argNameN: argTypeN) : retType - let prettyLayoutOfMethInfoFreeStyle (amap: Import.ImportMap) m denv typarInst methInfo = + let prettyLayoutOfMethInfoFreeStyle (infoReader: InfoReader) m denv typarInst methInfo = + let amap = infoReader.amap + match methInfo with | DefaultStructCtor _ -> let prettyTyparInst, _ = PrettyTypes.PrettifyInst amap.g typarInst - prettyTyparInst, PrintTypes.layoutTyconRef denv methInfo.ApparentEnclosingTyconRef ^^ wordL (tagPunctuation "()") + prettyTyparInst, PrintTypes.layoutTyconRefImpl denv methInfo.ApparentEnclosingTyconRef ^^ wordL (tagPunctuation "()") | FSMeth(_, _, vref, _) -> - let prettyTyparInst, resL = PrintTastMemberOrVals.prettyLayoutOfValOrMember { denv with showMemberContainers=true } typarInst vref.Deref + let prettyTyparInst, resL = PrintTastMemberOrVals.prettyLayoutOfValOrMember { denv with showMemberContainers=true } infoReader typarInst vref prettyTyparInst, resL | ILMeth(_, ilminfo, _) -> let prettyTyparInst, prettyMethInfo, minst = prettifyILMethInfo amap m methInfo typarInst ilminfo @@ -1375,22 +1449,22 @@ module InfoMemberPrinting = module private TastDefinitionPrinting = open PrintTypes - let layoutExtensionMember denv (v: Val) = - let tycon = v.MemberApparentEntity.Deref - let nameL = tagMethod tycon.DisplayName |> mkNav v.DefinitionRange |> wordL + let layoutExtensionMember denv infoReader (vref: ValRef) = + let tycon = vref.MemberApparentEntity.Deref + let nameL = tagMethod tycon.DisplayName |> mkNav vref.DefinitionRange |> wordL let nameL = layoutAccessibility denv tycon.Accessibility nameL // "type-accessibility" let tps = - match PartitionValTyparsForApparentEnclosingType denv.g v with + match PartitionValTyparsForApparentEnclosingType denv.g vref.Deref with | Some(_, memberParentTypars, _, _, _) -> memberParentTypars | None -> [] let lhsL = WordL.keywordType ^^ layoutTyparDecls denv nameL tycon.IsPrefixDisplay tps - let memberL = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv v + let memberL = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader vref (lhsL ^^ WordL.keywordWith) @@-- memberL - let layoutExtensionMembers denv vs = - aboveListL (List.map (layoutExtensionMember denv) vs) + let layoutExtensionMembers denv infoReader vs = + aboveListL (List.map (layoutExtensionMember denv infoReader) vs) - let layoutRecdField addAccess denv (fld: RecdField) = + let layoutRecdField addAccess denv infoReader (enclosingTcref: TyconRef) (fld: RecdField) = let lhs = tagRecordField fld.Name |> mkNav fld.DefinitionRange @@ -1398,11 +1472,16 @@ module private TastDefinitionPrinting = let lhs = (if addAccess then layoutAccessibility denv fld.Accessibility lhs else lhs) let lhs = if fld.IsMutable then wordL (tagKeyword "mutable") --- lhs else lhs let fieldL = (lhs ^^ RightL.colon) --- layoutType denv fld.FormalType - layoutXmlDoc denv fld.XmlDoc fieldL - let layoutUnionOrExceptionField denv isGenerated i (fld: RecdField) = + // The enclosing TyconRef might be a union and we can only get fields from union cases, so we need ignore unions here. + if not enclosingTcref.IsUnionTycon then + layoutXmlDocOfRecdFieldRef denv infoReader (RecdFieldRef(enclosingTcref, fld.Id.idText)) fieldL + else + fieldL + + let layoutUnionOrExceptionField denv infoReader isGenerated enclosingTcref i (fld: RecdField) = if isGenerated i fld then layoutTypeWithInfoAndPrec denv SimplifyTypes.typeSimplificationInfo0 2 fld.FormalType - else layoutRecdField false denv fld + else layoutRecdField false denv infoReader enclosingTcref fld let isGeneratedUnionCaseField pos (f: RecdField) = if pos < 0 then f.Name = "Item" @@ -1411,25 +1490,25 @@ module private TastDefinitionPrinting = let isGeneratedExceptionField pos (f: RecdField) = f.Name = "Data" + (string pos) - let layoutUnionCaseFields denv isUnionCase fields = + let layoutUnionCaseFields denv infoReader isUnionCase enclosingTcref fields = match fields with - | [f] when isUnionCase -> layoutUnionOrExceptionField denv isGeneratedUnionCaseField -1 f + | [f] when isUnionCase -> layoutUnionOrExceptionField denv infoReader isGeneratedUnionCaseField enclosingTcref -1 f | _ -> let isGenerated = if isUnionCase then isGeneratedUnionCaseField else isGeneratedExceptionField - sepListL (wordL (tagPunctuation "*")) (List.mapi (layoutUnionOrExceptionField denv isGenerated) fields) + sepListL (wordL (tagPunctuation "*")) (List.mapi (layoutUnionOrExceptionField denv infoReader isGenerated enclosingTcref) fields) - let layoutUnionCase denv prefixL (ucase: UnionCase) = + let layoutUnionCase denv infoReader prefixL enclosingTcref (ucase: UnionCase) = let nmL = DemangleOperatorNameAsLayout (tagUnionCase >> mkNav ucase.DefinitionRange) ucase.Id.idText //let nmL = layoutAccessibility denv ucase.Accessibility nmL let caseL = match ucase.RecdFields with | [] -> (prefixL ^^ nmL) - | fields -> (prefixL ^^ nmL ^^ WordL.keywordOf) --- layoutUnionCaseFields denv true fields - layoutXmlDoc denv ucase.XmlDoc caseL + | fields -> (prefixL ^^ nmL ^^ WordL.keywordOf) --- layoutUnionCaseFields denv infoReader true enclosingTcref fields + layoutXmlDocOfUnionCaseRef denv infoReader (UnionCaseRef(enclosingTcref, ucase.Id.idText)) caseL - let layoutUnionCases denv ucases = + let layoutUnionCases denv infoReader enclosingTcref ucases = let prefixL = WordL.bar // See bug://2964 - always prefix in case preceded by accessibility modifier - List.map (layoutUnionCase denv prefixL) ucases + List.map (layoutUnionCase denv infoReader prefixL enclosingTcref) ucases /// When to force a break? "type tyname = repn" /// When repn is class or datatype constructors (not single one). @@ -1453,7 +1532,9 @@ module private TastDefinitionPrinting = let typL = layoutType denv (e.FieldType(amap, m)) staticL ^^ WordL.keywordVal ^^ nameL ^^ WordL.colon ^^ typL - let private layoutEventInfo denv amap m (e: EventInfo) = + let private layoutEventInfo denv (infoReader: InfoReader) m (e: EventInfo) = + let amap = infoReader.amap + let staticL = if e.IsStatic then WordL.keywordStatic else emptyL let eventTag = @@ -1471,12 +1552,14 @@ module private TastDefinitionPrinting = let nameL = eventTag |> wordL let typL = layoutType denv (e.GetDelegateType(amap, m)) let overallL = staticL ^^ WordL.keywordMember ^^ nameL ^^ WordL.colon ^^ typL - layoutXmlDoc denv e.XmlDoc overallL + layoutXmlDocOfEventInfo denv infoReader e overallL + + let private layoutPropInfo denv (infoReader: InfoReader) m (p: PropInfo) = + let amap = infoReader.amap - let private layoutPropInfo denv amap m (p: PropInfo) = match p.ArbitraryValRef with - | Some v -> - PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv v.Deref + | Some vref -> + PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader vref | None -> let modifierAndMember = @@ -1494,11 +1577,12 @@ module private TastDefinitionPrinting = let typL = layoutType denv (p.GetPropertyType(amap, m)) // shouldn't happen let overallL = modifierAndMember ^^ nameL ^^ WordL.colon ^^ typL - layoutXmlDoc denv p.XmlDoc overallL + layoutXmlDocOfPropInfo denv infoReader p overallL - let layoutTycon (denv: DisplayEnv) (infoReader: InfoReader) ad m simplified typewordL (tycon: Tycon) = + let layoutTyconRef (denv: DisplayEnv) (infoReader: InfoReader) ad m simplified typewordL (tcref: TyconRef) = let g = denv.g - let _, ty = generalizeTyconRef (mkLocalTyconRef tycon) + let tycon = tcref.Deref + let _, ty = generalizeTyconRef tcref let start, name = let n = tycon.DisplayName if isStructTy g ty then @@ -1589,21 +1673,21 @@ module private TastDefinitionPrinting = let ctorLs = if denv.shrinkOverloads then ctors - |> shrinkOverloads (InfoMemberPrinting.layoutMethInfoFSharpStyle amap m denv) (fun _ xL -> xL) + |> shrinkOverloads (InfoMemberPrinting.layoutMethInfoFSharpStyle infoReader m denv) (fun _ xL -> xL) else ctors - |> List.map (fun ctor -> InfoMemberPrinting.layoutMethInfoFSharpStyle amap m denv ctor) + |> List.map (fun ctor -> InfoMemberPrinting.layoutMethInfoFSharpStyle infoReader m denv ctor) let methLs = meths |> List.groupBy (fun md -> md.DisplayName) |> List.collect (fun (_, group) -> if denv.shrinkOverloads then - shrinkOverloads (InfoMemberPrinting.layoutMethInfoFSharpStyle amap m denv) (fun x xL -> (sortKey x, xL)) group + shrinkOverloads (InfoMemberPrinting.layoutMethInfoFSharpStyle infoReader m denv) (fun x xL -> (sortKey x, xL)) group else group |> List.sortBy sortKey - |> List.map (fun methinfo -> ((not methinfo.IsConstructor, methinfo.IsInstance, methinfo.DisplayName, List.sum methinfo.NumArgs, methinfo.NumArgs.Length), InfoMemberPrinting.layoutMethInfoFSharpStyle amap m denv methinfo))) + |> List.map (fun methinfo -> ((not methinfo.IsConstructor, methinfo.IsInstance, methinfo.DisplayName, List.sum methinfo.NumArgs, methinfo.NumArgs.Length), InfoMemberPrinting.layoutMethInfoFSharpStyle infoReader m denv methinfo))) |> List.sortBy fst |> List.map snd @@ -1620,7 +1704,7 @@ module private TastDefinitionPrinting = else tycon.TrueFieldsAsList |> List.filter (fun f -> f.IsStatic && not (isDiscard f.Name)) - |> List.map (fun f -> WordL.keywordStatic ^^ WordL.keywordVal ^^ layoutRecdField true denv f) + |> List.map (fun f -> WordL.keywordStatic ^^ WordL.keywordVal ^^ layoutRecdField true denv infoReader tcref f) let instanceValsLs = if isRecdTy g ty then @@ -1628,17 +1712,17 @@ module private TastDefinitionPrinting = else tycon.TrueInstanceFieldsAsList |> List.filter (fun f -> not (isDiscard f.Name)) - |> List.map (fun f -> WordL.keywordVal ^^ layoutRecdField true denv f) + |> List.map (fun f -> WordL.keywordVal ^^ layoutRecdField true denv infoReader tcref f) let propLs = props - |> List.map (fun x -> (true, x.IsStatic, x.PropertyName, 0, 0), layoutPropInfo denv amap m x) + |> List.map (fun x -> (true, x.IsStatic, x.PropertyName, 0, 0), layoutPropInfo denv infoReader m x) |> List.sortBy fst |> List.map snd let eventLs = events - |> List.map (fun x -> (true, x.IsStatic, x.EventName, 0, 0), layoutEventInfo denv amap m x) + |> List.map (fun x -> (true, x.IsStatic, x.EventName, 0, 0), layoutEventInfo denv infoReader m x) |> List.sortBy fst |> List.map snd @@ -1716,7 +1800,7 @@ module private TastDefinitionPrinting = let denv = denv.AddAccessibility tycon.TypeReprAccessibility match repr with | TRecdRepr _ -> - let recdFieldRefL fld = layoutRecdField false denv fld + let recdFieldRefL fld = layoutRecdField false denv infoReader tcref fld let recdL = tycon.TrueFieldsAsList @@ -1730,7 +1814,7 @@ module private TastDefinitionPrinting = | TUnionRepr _ -> let layoutUnionCases = tycon.UnionCasesAsList - |> layoutUnionCases denv + |> layoutUnionCases denv infoReader tcref |> applyMaxMembers denv.maxMembers |> aboveListL Some (addMembersAsWithEnd (addReprAccessL layoutUnionCases)) @@ -1801,36 +1885,37 @@ module private TastDefinitionPrinting = (lhsL ^^ WordL.equals) --- (layoutType { denv with shortTypeNames = false } a) let attribsL = layoutAttribs denv false ty tycon.TypeOrMeasureKind tycon.Attribs reprL - layoutXmlDoc denv tycon.XmlDoc attribsL + layoutXmlDocOfEntityRef denv infoReader tcref attribsL // Layout: exception definition - let layoutExnDefn denv (exnc: Entity) = + let layoutExnDefn denv infoReader (exncref: EntityRef) = + let exnc = exncref.Deref let nm = exnc.LogicalName let nmL = wordL (tagClass nm) let nmL = layoutAccessibility denv exnc.TypeReprAccessibility nmL let exnL = wordL (tagKeyword "exception") ^^ nmL // need to tack on the Exception at the right of the name for goto definition let reprL = match exnc.ExceptionInfo with - | TExnAbbrevRepr ecref -> WordL.equals --- layoutTyconRef denv ecref + | TExnAbbrevRepr ecref -> WordL.equals --- layoutTyconRefImpl denv ecref | TExnAsmRepr _ -> WordL.equals --- wordL (tagText "(# ... #)") | TExnNone -> emptyL | TExnFresh r -> match r.TrueFieldsAsList with | [] -> emptyL - | r -> WordL.keywordOf --- layoutUnionCaseFields denv false r + | r -> WordL.keywordOf --- layoutUnionCaseFields denv infoReader false exncref r let overallL = exnL ^^ reprL - layoutXmlDoc denv exnc.XmlDoc overallL + layoutXmlDocOfEntityRef denv infoReader exncref overallL // Layout: module spec let layoutTyconDefns denv infoReader ad m (tycons: Tycon list) = match tycons with | [] -> emptyL - | [h] when h.IsExceptionDecl -> layoutExnDefn denv h + | [h] when h.IsExceptionDecl -> layoutExnDefn denv infoReader (mkLocalEntityRef h) | h :: t -> - let x = layoutTycon denv infoReader ad m false WordL.keywordType h - let xs = List.map (layoutTycon denv infoReader ad m false (wordL (tagKeyword "and"))) t + let x = layoutTyconRef denv infoReader ad m false WordL.keywordType (mkLocalEntityRef h) + let xs = List.map (mkLocalEntityRef >> layoutTyconRef denv infoReader ad m false (wordL (tagKeyword "and"))) t aboveListL (x :: xs) let rec layoutModuleOrNamespace (denv: DisplayEnv) (infoReader: InfoReader) ad m isFirstTopLevel (mspec: ModuleOrNamespace) = @@ -1898,7 +1983,7 @@ module private TastDefinitionPrinting = else mspec.ModuleOrNamespaceType.AllEntities |> QueueList.toList - |> List.map (fun entity -> layoutEntity denv infoReader ad m entity) + |> List.map (fun entity -> layoutEntityRef denv infoReader ad m (mkLocalEntityRef entity)) let valLs = if mspec.IsNamespace then [] @@ -1907,7 +1992,7 @@ module private TastDefinitionPrinting = |> QueueList.toList |> List.filter shouldShow |> List.sortBy (fun v -> v.DisplayName) - |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv) + |> List.map (mkLocalValRef >> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader) if List.isEmpty entityLs && List.isEmpty valLs then headerL @@ -1930,13 +2015,14 @@ module private TastDefinitionPrinting = else headerL @@---- entitiesL @@ valsL - and layoutEntity (denv: DisplayEnv) (infoReader: InfoReader) ad m (entity: Entity) = - if entity.IsModuleOrNamespace then - layoutModuleOrNamespace denv infoReader ad m false entity - elif entity.IsExceptionDecl then - layoutExnDefn denv entity + and layoutEntityRef (denv: DisplayEnv) (infoReader: InfoReader) ad m (eref: EntityRef) = + if eref.IsModuleOrNamespace then + layoutModuleOrNamespace denv infoReader ad m false eref.Deref + |> layoutXmlDocOfEntityRef denv infoReader eref + elif eref.IsExceptionDecl then + layoutExnDefn denv infoReader eref else - layoutTycon denv infoReader ad m true WordL.keywordType entity + layoutTyconRef denv infoReader ad m true WordL.keywordType eref //-------------------------------------------------------------------------- @@ -1972,13 +2058,15 @@ module private InferredSigPrinting = |> List.choose (function ModuleOrNamespaceBinding.Binding bind -> Some bind | _ -> None) |> valsOfBinds |> List.filter filterExtMem - |> TastDefinitionPrinting.layoutExtensionMembers denv) @@ + |> List.map mkLocalValRef + |> TastDefinitionPrinting.layoutExtensionMembers denv infoReader) @@ (mbinds |> List.choose (function ModuleOrNamespaceBinding.Binding bind -> Some bind | _ -> None) |> valsOfBinds |> List.filter filterVal - |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv) + |> List.map mkLocalValRef + |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader) |> aboveListL) @@ (mbinds @@ -1989,7 +2077,8 @@ module private InferredSigPrinting = | TMDefLet(bind, _) -> ([bind.Var] |> List.filter filterVal - |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv) + |> List.map mkLocalValRef + |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader) |> aboveListL) | TMDefs defs -> imdefsL denv defs @@ -2089,7 +2178,7 @@ module private PrintData = leftL (tagPunctuation "{") ^^ semiListL (List.map2 lay fields xs) ^^ rightL (tagPunctuation "}") | Expr.Op (TOp.ValFieldGet (RecdFieldRef.RecdFieldRef (tcref, name)), _, _, _) -> - (layoutTyconRef denv tcref) ^^ sepL (tagPunctuation ".") ^^ wordL (tagField name) + (layoutTyconRefImpl denv tcref) ^^ sepL (tagPunctuation ".") ^^ wordL (tagField name) | Expr.Op (TOp.Array, [_], xs, _) -> leftL (tagPunctuation "[|") ^^ semiListL (dataExprsL denv xs) ^^ RightL.rightBracketBar @@ -2103,44 +2192,44 @@ let dataExprL denv expr = PrintData.dataExprL denv expr // Print Signatures/Types - output functions //-------------------------------------------------------------------------- -let outputValOrMember denv os x = x |> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv |> bufferL os +let outputValOrMember denv infoReader os x = x |> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader |> bufferL os -let stringValOrMember denv x = x |> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv |> showL +let stringValOrMember denv infoReader x = x |> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader |> showL /// Print members with a qualification showing the type they are contained in -let layoutQualifiedValOrMember denv typarInst v = PrintTastMemberOrVals.prettyLayoutOfValOrMember { denv with showMemberContainers=true; } typarInst v +let layoutQualifiedValOrMember denv infoReader typarInst v = PrintTastMemberOrVals.prettyLayoutOfValOrMember { denv with showMemberContainers=true; } infoReader typarInst v -let outputQualifiedValOrMember denv os v = outputValOrMember { denv with showMemberContainers=true; } os v +let outputQualifiedValOrMember denv infoReader os v = outputValOrMember { denv with showMemberContainers=true; } infoReader os v -let outputQualifiedValSpec denv os v = outputQualifiedValOrMember denv os v +let outputQualifiedValSpec denv infoReader os v = outputQualifiedValOrMember denv infoReader os v -let stringOfQualifiedValOrMember denv v = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst { denv with showMemberContainers=true; } v |> showL +let stringOfQualifiedValOrMember denv infoReader v = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst { denv with showMemberContainers=true; } infoReader v |> showL /// Convert a MethInfo to a string -let formatMethInfoToBufferFreeStyle amap m denv buf d = InfoMemberPrinting.formatMethInfoToBufferFreeStyle amap m denv buf d +let formatMethInfoToBufferFreeStyle infoReader m denv buf d = InfoMemberPrinting.formatMethInfoToBufferFreeStyle infoReader m denv buf d -let prettyLayoutOfMethInfoFreeStyle amap m denv typarInst minfo = InfoMemberPrinting.prettyLayoutOfMethInfoFreeStyle amap m denv typarInst minfo +let prettyLayoutOfMethInfoFreeStyle infoReader m denv typarInst minfo = InfoMemberPrinting.prettyLayoutOfMethInfoFreeStyle infoReader m denv typarInst minfo /// Convert a PropInfo to a string let prettyLayoutOfPropInfoFreeStyle g amap m denv d = InfoMemberPrinting.prettyLayoutOfPropInfoFreeStyle g amap m denv d /// Convert a MethInfo to a string -let stringOfMethInfo amap m denv d = bufs (fun buf -> InfoMemberPrinting.formatMethInfoToBufferFreeStyle amap m denv buf d) +let stringOfMethInfo infoReader m denv d = bufs (fun buf -> InfoMemberPrinting.formatMethInfoToBufferFreeStyle infoReader m denv buf d) /// Convert a ParamData to a string let stringOfParamData denv paramData = bufs (fun buf -> InfoMemberPrinting.formatParamDataToBuffer denv buf paramData) let layoutOfParamData denv paramData = InfoMemberPrinting.layoutParamData denv paramData -let layoutExnDef denv x = x |> TastDefinitionPrinting.layoutExnDefn denv +let layoutExnDef denv infoReader x = x |> TastDefinitionPrinting.layoutExnDefn denv infoReader let stringOfTyparConstraints denv x = x |> PrintTypes.layoutConstraintsWithInfo denv SimplifyTypes.typeSimplificationInfo0 |> showL -let layoutTycon denv infoReader ad m (* width *) x = TastDefinitionPrinting.layoutTycon denv infoReader ad m true WordL.keywordType x (* |> Display.squashTo width *) +let layoutTycon denv infoReader ad m (* width *) x = TastDefinitionPrinting.layoutTyconRef denv infoReader ad m true WordL.keywordType (mkLocalEntityRef x) (* |> Display.squashTo width *) -let layoutEntity denv infoReader ad m x = TastDefinitionPrinting.layoutEntity denv infoReader ad m x +let layoutEntityRef denv infoReader ad m x = TastDefinitionPrinting.layoutEntityRef denv infoReader ad m x -let layoutUnionCases denv x = x |> TastDefinitionPrinting.layoutUnionCaseFields denv true +let layoutUnionCases denv infoReader enclosingTcref x = x |> TastDefinitionPrinting.layoutUnionCaseFields denv infoReader true enclosingTcref /// Pass negative number as pos in case of single cased discriminated unions let isGeneratedUnionCaseField pos f = TastDefinitionPrinting.isGeneratedUnionCaseField pos f @@ -2159,11 +2248,11 @@ let prettyStringOfTy denv x = x |> PrintTypes.prettyLayoutOfType denv |> showL let prettyStringOfTyNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv |> showL -let stringOfRecdField denv x = x |> TastDefinitionPrinting.layoutRecdField false denv |> showL +let stringOfRecdField denv infoReader enclosingTcref x = x |> TastDefinitionPrinting.layoutRecdField false denv infoReader enclosingTcref |> showL -let stringOfUnionCase denv x = x |> TastDefinitionPrinting.layoutUnionCase denv WordL.bar |> showL +let stringOfUnionCase denv infoReader enclosingTcref x = x |> TastDefinitionPrinting.layoutUnionCase denv infoReader WordL.bar enclosingTcref |> showL -let stringOfExnDef denv x = x |> TastDefinitionPrinting.layoutExnDefn denv |> showL +let stringOfExnDef denv infoReader x = x |> TastDefinitionPrinting.layoutExnDefn denv infoReader |> showL let stringOfFSAttrib denv x = x |> PrintTypes.layoutAttrib denv |> squareAngleL |> showL @@ -2171,9 +2260,9 @@ let stringOfILAttrib denv x = x |> PrintTypes.layoutILAttrib denv |> squareAngle let layoutInferredSigOfModuleExpr showHeader denv infoReader ad m expr = InferredSigPrinting.layoutInferredSigOfModuleExpr showHeader denv infoReader ad m expr -let prettyLayoutOfValOrMember denv typarInst v = PrintTastMemberOrVals.prettyLayoutOfValOrMember denv typarInst v +let prettyLayoutOfValOrMember denv infoReader typarInst v = PrintTastMemberOrVals.prettyLayoutOfValOrMember denv infoReader typarInst v -let prettyLayoutOfValOrMemberNoInst denv v = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv v +let prettyLayoutOfValOrMemberNoInst denv infoReader v = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader v let prettyLayoutOfMemberNoInstShort denv v = PrintTastMemberOrVals.prettyLayoutOfMemberNoInstShort denv v @@ -2232,16 +2321,16 @@ let minimalStringsOfTwoTypes denv t1 t2= (makeName t1, makeName t2, stringOfTyparConstraints denv tpcs) // Note: Always show imperative annotations when comparing value signatures -let minimalStringsOfTwoValues denv v1 v2= +let minimalStringsOfTwoValues denv infoReader v1 v2= let denvMin = { denv with showImperativeTyparAnnotations=true; showConstraintTyparAnnotations=false } - let min1 = bufs (fun buf -> outputQualifiedValOrMember denvMin buf v1) - let min2 = bufs (fun buf -> outputQualifiedValOrMember denvMin buf v2) + let min1 = bufs (fun buf -> outputQualifiedValOrMember denvMin infoReader buf v1) + let min2 = bufs (fun buf -> outputQualifiedValOrMember denvMin infoReader buf v2) if min1 <> min2 then (min1, min2) else let denvMax = { denv with showImperativeTyparAnnotations=true; showConstraintTyparAnnotations=true } - let max1 = bufs (fun buf -> outputQualifiedValOrMember denvMax buf v1) - let max2 = bufs (fun buf -> outputQualifiedValOrMember denvMax buf v2) + let max1 = bufs (fun buf -> outputQualifiedValOrMember denvMax infoReader buf v1) + let max2 = bufs (fun buf -> outputQualifiedValOrMember denvMax infoReader buf v2) max1, max2 let minimalStringOfType denv ty = diff --git a/src/fsharp/NicePrint.fsi b/src/fsharp/NicePrint.fsi index 5ddd1455c7..fd7fc1cbd8 100644 --- a/src/fsharp/NicePrint.fsi +++ b/src/fsharp/NicePrint.fsi @@ -40,39 +40,39 @@ val prettyLayoutsOfUnresolvedOverloading: denv:DisplayEnv -> argInfos:(TType * A val dataExprL: denv:DisplayEnv -> expr:Expr -> Layout -val outputValOrMember: denv:DisplayEnv -> os:StringBuilder -> x:Val -> unit +val outputValOrMember: denv:DisplayEnv -> infoReader:InfoReader -> os:StringBuilder -> x:ValRef -> unit -val stringValOrMember: denv:DisplayEnv -> x:Val -> string +val stringValOrMember: denv:DisplayEnv -> infoReader:InfoReader -> x:ValRef -> string -val layoutQualifiedValOrMember: denv:DisplayEnv -> typarInst:TyparInst -> v:Val -> TyparInst * Layout +val layoutQualifiedValOrMember: denv:DisplayEnv -> infoReader:InfoReader -> typarInst:TyparInst -> v:ValRef -> TyparInst * Layout -val outputQualifiedValOrMember: denv:DisplayEnv -> os:StringBuilder -> v:Val -> unit +val outputQualifiedValOrMember: denv:DisplayEnv -> infoReader:InfoReader -> os:StringBuilder -> v:ValRef -> unit -val outputQualifiedValSpec: denv:DisplayEnv -> os:StringBuilder -> v:Val -> unit +val outputQualifiedValSpec: denv:DisplayEnv -> infoReader:InfoReader -> os:StringBuilder -> v:ValRef -> unit -val stringOfQualifiedValOrMember: denv:DisplayEnv -> v:Val -> string +val stringOfQualifiedValOrMember: denv:DisplayEnv -> infoReader:InfoReader -> v:ValRef -> string -val formatMethInfoToBufferFreeStyle: amap:ImportMap -> m:range -> denv:DisplayEnv -> buf:StringBuilder -> d:MethInfo -> unit +val formatMethInfoToBufferFreeStyle: infoReader:InfoReader -> m:range -> denv:DisplayEnv -> buf:StringBuilder -> d:MethInfo -> unit -val prettyLayoutOfMethInfoFreeStyle: amap:ImportMap -> m:range -> denv:DisplayEnv -> typarInst:TyparInst -> minfo:MethInfo -> TyparInst * Layout +val prettyLayoutOfMethInfoFreeStyle: infoReader:InfoReader -> m:range -> denv:DisplayEnv -> typarInst:TyparInst -> minfo:MethInfo -> TyparInst * Layout val prettyLayoutOfPropInfoFreeStyle: g:TcGlobals -> amap:ImportMap -> m:range -> denv:DisplayEnv -> d:PropInfo -> Layout -val stringOfMethInfo: amap:ImportMap -> m:range -> denv:DisplayEnv -> d:MethInfo -> string +val stringOfMethInfo: infoReader:InfoReader -> m:range -> denv:DisplayEnv -> d:MethInfo -> string val stringOfParamData: denv:DisplayEnv -> paramData:ParamData -> string val layoutOfParamData: denv:DisplayEnv -> paramData:ParamData -> Layout -val layoutExnDef: denv:DisplayEnv -> x:Entity -> Layout +val layoutExnDef: denv:DisplayEnv -> infoReader:InfoReader -> x:EntityRef -> Layout val stringOfTyparConstraints: denv:DisplayEnv -> x:(Typar * TyparConstraint) list -> string val layoutTycon: denv:DisplayEnv -> infoReader:InfoReader -> ad:AccessorDomain -> m:range -> x:Tycon -> Layout -val layoutEntity: denv:DisplayEnv -> infoReader:InfoReader -> ad:AccessorDomain -> m:range -> x:Entity -> Layout +val layoutEntityRef: denv:DisplayEnv -> infoReader:InfoReader -> ad:AccessorDomain -> m:range -> x:EntityRef -> Layout -val layoutUnionCases: denv:DisplayEnv -> x:RecdField list -> Layout +val layoutUnionCases: denv:DisplayEnv -> infoReader:InfoReader -> enclosingTcref:TyconRef -> x:RecdField list -> Layout val isGeneratedUnionCaseField: pos:int -> f:RecdField -> bool @@ -90,11 +90,11 @@ val prettyStringOfTy: denv:DisplayEnv -> x:TType -> string val prettyStringOfTyNoCx: denv:DisplayEnv -> x:TType -> string -val stringOfRecdField: denv:DisplayEnv -> x:RecdField -> string +val stringOfRecdField: denv:DisplayEnv -> infoReader:InfoReader -> enclosingTcref:TyconRef -> x:RecdField -> string -val stringOfUnionCase: denv:DisplayEnv -> x:UnionCase -> string +val stringOfUnionCase: denv:DisplayEnv -> infoReader:InfoReader -> enclosingTcref:TyconRef -> x:UnionCase -> string -val stringOfExnDef: denv:DisplayEnv -> x:Entity -> string +val stringOfExnDef: denv:DisplayEnv -> infoReader:InfoReader -> x:EntityRef -> string val stringOfFSAttrib: denv:DisplayEnv -> x:Attrib -> string @@ -102,9 +102,9 @@ val stringOfILAttrib: denv:DisplayEnv -> ILType * ILAttribElem list -> string val layoutInferredSigOfModuleExpr: showHeader:bool -> denv:DisplayEnv -> infoReader:InfoReader -> ad:AccessorDomain -> m:range -> expr:ModuleOrNamespaceExprWithSig -> Layout -val prettyLayoutOfValOrMember: denv:DisplayEnv -> typarInst:TyparInst -> v:Val -> TyparInst * Layout +val prettyLayoutOfValOrMember: denv:DisplayEnv -> infoReader:InfoReader -> typarInst:TyparInst -> v:ValRef -> TyparInst * Layout -val prettyLayoutOfValOrMemberNoInst: denv:DisplayEnv -> v:Val -> Layout +val prettyLayoutOfValOrMemberNoInst: denv:DisplayEnv -> infoReader:InfoReader -> v:ValRef -> Layout val prettyLayoutOfMemberNoInstShort: denv:DisplayEnv -> v:Val -> Layout @@ -112,6 +112,6 @@ val prettyLayoutOfInstAndSig: denv:DisplayEnv -> TyparInst * TTypes * TType -> T val minimalStringsOfTwoTypes: denv:DisplayEnv -> t1:TType -> t2:TType -> string * string * string -val minimalStringsOfTwoValues: denv:DisplayEnv -> v1:Val -> v2:Val -> string * string +val minimalStringsOfTwoValues: denv:DisplayEnv -> infoReader:InfoReader -> v1:ValRef -> v2:ValRef -> string * string val minimalStringOfType: denv:DisplayEnv -> ty:TType -> string diff --git a/src/fsharp/ParseAndCheckInputs.fs b/src/fsharp/ParseAndCheckInputs.fs index 0572a5899b..8135290b01 100644 --- a/src/fsharp/ParseAndCheckInputs.fs +++ b/src/fsharp/ParseAndCheckInputs.fs @@ -34,6 +34,7 @@ open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TcGlobals @@ -735,7 +736,8 @@ let GetInitialTcState(m, ccuName, tcConfig: TcConfig, tcGlobals, tcImports: TcIm ILScopeRef=ILScopeRef.Local Contents=ccuContents MemberSignatureEquality= typeEquivAux EraseAll tcGlobals - TypeForwarders=Map.empty } + TypeForwarders=Map.empty + XmlDocumentationInfo = None } let ccu = CcuThunk.Create(ccuName, ccuData) diff --git a/src/fsharp/ParseHelpers.fs b/src/fsharp/ParseHelpers.fs index 0234e64aad..e9c841b7fb 100644 --- a/src/fsharp/ParseHelpers.fs +++ b/src/fsharp/ParseHelpers.fs @@ -5,12 +5,12 @@ module FSharp.Compiler.ParseHelpers open FSharp.Compiler.AbstractIL open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Features -open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.UnicodeLexing open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml open Internal.Utilities.Text.Lexing open Internal.Utilities.Text.Parsing diff --git a/src/fsharp/ParseHelpers.fsi b/src/fsharp/ParseHelpers.fsi index 9b03c0d6ed..c643552c9c 100644 --- a/src/fsharp/ParseHelpers.fsi +++ b/src/fsharp/ParseHelpers.fsi @@ -3,8 +3,8 @@ module internal FSharp.Compiler.ParseHelpers open FSharp.Compiler.AbstractIL.IL -open FSharp.Compiler.Syntax open FSharp.Compiler.Text +open FSharp.Compiler.Xml open Internal.Utilities.Text.Lexing open Internal.Utilities.Text.Parsing diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 09d6146b74..4be0190f7b 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1741,6 +1741,7 @@ and AdjustAccess isHidden (cpath: unit -> CompilationPath) access = access and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v, bindRhs, _) as bind) : Limit = + let vref = mkLocalValRef v let g = cenv.g let isTop = Option.isSome bind.Var.ValReprInfo //printfn "visiting %s..." v.DisplayName @@ -1748,9 +1749,9 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v, bindRhs, _) as let env = { env with external = env.external || g.attrib_DllImportAttribute |> Option.exists (fun attr -> HasFSharpAttribute g attr v.Attribs) } // Check that active patterns don't have free type variables in their result - match TryGetActivePatternInfo (mkLocalValRef v) with + match TryGetActivePatternInfo vref with | Some _apinfo when _apinfo.ActiveTags.Length > 1 -> - if doesActivePatternHaveFreeTypars g (mkLocalValRef v) then + if doesActivePatternHaveFreeTypars g vref then errorR(Error(FSComp.SR.activePatternChoiceHasFreeTypars(v.LogicalName), v.Range)) | _ -> () @@ -1767,7 +1768,7 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v, bindRhs, _) as // Check accessibility if (v.IsMemberOrModuleBinding || v.IsMember) && not v.IsIncrClassGeneratedMember then let access = AdjustAccess (IsHiddenVal env.sigToImplRemapInfo v) (fun () -> v.TopValDeclaringEntity.CompilationPath) v.Accessibility - CheckTypeForAccess cenv env (fun () -> NicePrint.stringOfQualifiedValOrMember cenv.denv v) access v.Range v.Type + CheckTypeForAccess cenv env (fun () -> NicePrint.stringOfQualifiedValOrMember cenv.denv cenv.infoReader vref) access v.Range v.Type let env = if v.IsConstructor && not v.IsIncrClassConstructor then { env with ctorLimitedZone=true } else env @@ -2189,7 +2190,7 @@ let CheckEntityDefn cenv env (tycon: Entity) = match parentMethsOfSameName |> List.tryFind (checkForDup EraseAll) with | None -> () | Some minfo -> - let mtext = NicePrint.stringOfMethInfo cenv.amap m cenv.denv minfo + let mtext = NicePrint.stringOfMethInfo cenv.infoReader m cenv.denv minfo if parentMethsOfSameName |> List.exists (checkForDup EraseNone) then warning(Error(FSComp.SR.tcNewMemberHidesAbstractMember mtext, m)) else diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index 61f71dff23..af0fe7fd5f 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -21,6 +21,7 @@ open FSharp.Compiler.Text open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps +open FSharp.Compiler.InfoReader #if !NO_EXTENSIONTYPING open FSharp.Compiler.ExtensionTyping @@ -28,13 +29,13 @@ open FSharp.Compiler.ExtensionTyping exception RequiredButNotSpecified of DisplayEnv * ModuleOrNamespaceRef * string * (StringBuilder -> unit) * range -exception ValueNotContained of DisplayEnv * ModuleOrNamespaceRef * Val * Val * (string * string * string -> string) +exception ValueNotContained of DisplayEnv * InfoReader * ModuleOrNamespaceRef * Val * Val * (string * string * string -> string) -exception ConstrNotContained of DisplayEnv * UnionCase * UnionCase * (string * string -> string) +exception ConstrNotContained of DisplayEnv * InfoReader * Tycon * UnionCase * UnionCase * (string * string -> string) -exception ExnconstrNotContained of DisplayEnv * Tycon * Tycon * (string * string -> string) +exception ExnconstrNotContained of DisplayEnv * InfoReader * Tycon * Tycon * (string * string -> string) -exception FieldNotContained of DisplayEnv * RecdField * RecdField * (string * string -> string) +exception FieldNotContained of DisplayEnv * InfoReader * Tycon * RecdField * RecdField * (string * string -> string) exception InterfaceNotRevealed of DisplayEnv * TType * range @@ -157,7 +158,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = true) && (not checkingSig || checkAttribs aenv implTypar.Attribs sigTypar.Attribs (fun attribs -> implTypar.SetAttribs attribs))) - and checkTypeDef (aenv: TypeEquivEnv) (implTycon: Tycon) (sigTycon: Tycon) = + and checkTypeDef (aenv: TypeEquivEnv) (infoReader: InfoReader) (implTycon: Tycon) (sigTycon: Tycon) = let m = implTycon.Range // Propagate defn location information from implementation to signature . @@ -174,7 +175,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = false else - checkExnInfo (fun f -> ExnconstrNotContained(denv, implTycon, sigTycon, f)) aenv implTycon.ExceptionInfo sigTycon.ExceptionInfo && + checkExnInfo (fun f -> ExnconstrNotContained(denv, infoReader, implTycon, sigTycon, f)) aenv infoReader implTycon implTycon.ExceptionInfo sigTycon.ExceptionInfo && let implTypars = implTycon.Typars m let sigTypars = sigTycon.Typars m @@ -255,10 +256,10 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = else checkTypars m aenv implTypars sigTypars && - checkTypeRepr m aenv implTycon sigTycon.TypeReprInfo && + checkTypeRepr m aenv infoReader implTycon sigTycon.TypeReprInfo && checkTypeAbbrev m aenv implTycon sigTycon && checkAttribs aenv implTycon.Attribs sigTycon.Attribs (fun attribs -> implTycon.entity_attribs <- attribs) && - checkModuleOrNamespaceContents implTycon.Range aenv (mkLocalEntityRef implTycon) sigTycon.ModuleOrNamespaceType + checkModuleOrNamespaceContents implTycon.Range aenv infoReader (mkLocalEntityRef implTycon) sigTycon.ModuleOrNamespaceType and checkValInfo aenv err (implVal : Val) (sigVal : Val) = let id = implVal.Id @@ -302,13 +303,13 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = implVal.SetValReprInfo (Some (ValReprInfo (sigTyparNames, implArgInfos, implRetInfo))) res - and checkVal implModRef (aenv: TypeEquivEnv) (implVal: Val) (sigVal: Val) = + and checkVal implModRef (aenv: TypeEquivEnv) (infoReader: InfoReader) (implVal: Val) (sigVal: Val) = // Propagate defn location information from implementation to signature . sigVal.SetOtherRange (implVal.Range, true) implVal.SetOtherRange (sigVal.Range, false) - let mk_err denv f = ValueNotContained(denv, implModRef, implVal, sigVal, f) + let mk_err denv f = ValueNotContained(denv, infoReader, implModRef, implVal, sigVal, f) let err denv f = errorR(mk_err denv f); false let m = implVal.Range if implVal.IsMutable <> sigVal.IsMutable then (err denv FSComp.SR.ValueNotContainedMutabilityAttributesDiffer) @@ -332,7 +333,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = else checkAttribs aenv implVal.Attribs sigVal.Attribs (fun attribs -> implVal.SetAttribs attribs) - and checkExnInfo err aenv implTypeRepr sigTypeRepr = + and checkExnInfo err aenv (infoReader: InfoReader) (enclosingTycon: Tycon) implTypeRepr sigTypeRepr = match implTypeRepr, sigTypeRepr with | TExnAsmRepr _, TExnFresh _ -> (errorR (err FSComp.SR.ExceptionDefsNotCompatibleHiddenBySignature); false) @@ -344,23 +345,23 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = if not (tcrefAEquiv g aenv ecr1 ecr2) then (errorR (err FSComp.SR.ExceptionDefsNotCompatibleSignaturesDiffer); false) else true - | TExnFresh r1, TExnFresh r2-> checkRecordFieldsForExn g denv err aenv r1 r2 + | TExnFresh r1, TExnFresh r2-> checkRecordFieldsForExn g denv err aenv infoReader enclosingTycon r1 r2 | TExnNone, TExnNone -> true | _ -> (errorR (err FSComp.SR.ExceptionDefsNotCompatibleExceptionDeclarationsDiffer); false) - and checkUnionCase aenv implUnionCase sigUnionCase = - let err f = errorR(ConstrNotContained(denv, implUnionCase, sigUnionCase, f));false + and checkUnionCase aenv infoReader (enclosingTycon: Tycon) implUnionCase sigUnionCase = + let err f = errorR(ConstrNotContained(denv, infoReader, enclosingTycon, implUnionCase, sigUnionCase, f));false sigUnionCase.OtherRangeOpt <- Some (implUnionCase.Range, true) implUnionCase.OtherRangeOpt <- Some (sigUnionCase.Range, false) if implUnionCase.Id.idText <> sigUnionCase.Id.idText then err FSComp.SR.ModuleContainsConstructorButNamesDiffer elif implUnionCase.RecdFieldsArray.Length <> sigUnionCase.RecdFieldsArray.Length then err FSComp.SR.ModuleContainsConstructorButDataFieldsDiffer - elif not (Array.forall2 (checkField aenv) implUnionCase.RecdFieldsArray sigUnionCase.RecdFieldsArray) then err FSComp.SR.ModuleContainsConstructorButTypesOfFieldsDiffer + elif not (Array.forall2 (checkField aenv infoReader enclosingTycon) implUnionCase.RecdFieldsArray sigUnionCase.RecdFieldsArray) then err FSComp.SR.ModuleContainsConstructorButTypesOfFieldsDiffer elif isLessAccessible implUnionCase.Accessibility sigUnionCase.Accessibility then err FSComp.SR.ModuleContainsConstructorButAccessibilityDiffers else checkAttribs aenv implUnionCase.Attribs sigUnionCase.Attribs (fun attribs -> implUnionCase.Attribs <- attribs) - and checkField aenv implField sigField = - let err f = errorR(FieldNotContained(denv, implField, sigField, f)); false + and checkField aenv infoReader (enclosingTycon: Tycon) implField sigField = + let err f = errorR(FieldNotContained(denv, infoReader, enclosingTycon, implField, sigField, f)); false sigField.rfield_other_range <- Some (implField.Range, true) implField.rfield_other_range <- Some (sigField.Range, false) if implField.rfield_id.idText <> sigField.rfield_id.idText then err FSComp.SR.FieldNotContainedNamesDiffer @@ -408,67 +409,67 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | _ -> false - and checkRecordFields m aenv (implTycon: Tycon) (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = + and checkRecordFields m aenv infoReader (implTycon: Tycon) (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = let implFields = implFields.TrueFieldsAsList let sigFields = sigFields.TrueFieldsAsList let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) NameMap.suball2 (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName), m)); false) - (checkField aenv) m1 m2 && + (checkField aenv infoReader implTycon) m1 m2 && NameMap.suball2 (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldWasPresent(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName), m)); false) - (fun x y -> checkField aenv y x) m2 m1 && + (fun x y -> checkField aenv infoReader implTycon y x) m2 m1 && // This check is required because constructors etc. are externally visible // and thus compiled representations do pick up dependencies on the field order - (if List.forall2 (checkField aenv) implFields sigFields + (if List.forall2 (checkField aenv infoReader implTycon) implFields sigFields then true else (errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false)) - and checkRecordFieldsForExn _g _denv err aenv (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = + and checkRecordFieldsForExn _g _denv err aenv (infoReader: InfoReader) (enclosingTycon: Tycon) (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = let implFields = implFields.TrueFieldsAsList let sigFields = sigFields.TrueFieldsAsList let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) - NameMap.suball2 (fun s _ -> errorR(err (fun (x, y) -> FSComp.SR.ExceptionDefsNotCompatibleFieldInSigButNotImpl(s, x, y))); false) (checkField aenv) m1 m2 && - NameMap.suball2 (fun s _ -> errorR(err (fun (x, y) -> FSComp.SR.ExceptionDefsNotCompatibleFieldInImplButNotSig(s, x, y))); false) (fun x y -> checkField aenv y x) m2 m1 && + NameMap.suball2 (fun s _ -> errorR(err (fun (x, y) -> FSComp.SR.ExceptionDefsNotCompatibleFieldInSigButNotImpl(s, x, y))); false) (checkField aenv infoReader enclosingTycon) m1 m2 && + NameMap.suball2 (fun s _ -> errorR(err (fun (x, y) -> FSComp.SR.ExceptionDefsNotCompatibleFieldInImplButNotSig(s, x, y))); false) (fun x y -> checkField aenv infoReader enclosingTycon y x) m2 m1 && // This check is required because constructors etc. are externally visible // and thus compiled representations do pick up dependencies on the field order - (if List.forall2 (checkField aenv) implFields sigFields + (if List.forall2 (checkField aenv infoReader enclosingTycon) implFields sigFields then true else (errorR(err (FSComp.SR.ExceptionDefsNotCompatibleFieldOrderDiffers)); false)) - and checkVirtualSlots denv m (implTycon: Tycon) implAbstractSlots sigAbstractSlots = + and checkVirtualSlots denv infoReader m (implTycon: Tycon) implAbstractSlots sigAbstractSlots = let m1 = NameMap.ofKeyedList (fun (v: ValRef) -> v.DisplayName) implAbstractSlots let m2 = NameMap.ofKeyedList (fun (v: ValRef) -> v.DisplayName) sigAbstractSlots (m1, m2) ||> NameMap.suball2 (fun _s vref -> let kindText = implTycon.TypeOrMeasureKind.ToString() - let valText = NicePrint.stringValOrMember denv vref.Deref + let valText = NicePrint.stringValOrMember denv infoReader vref errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl(kindText, implTycon.DisplayName, valText), m)); false) (fun _x _y -> true) && (m2, m1) ||> NameMap.suball2 (fun _s vref -> let kindText = implTycon.TypeOrMeasureKind.ToString() - let valText = NicePrint.stringValOrMember denv vref.Deref + let valText = NicePrint.stringValOrMember denv infoReader vref errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(kindText, implTycon.DisplayName, valText), m)); false) (fun _x _y -> true) - and checkClassFields isStruct m aenv (implTycon: Tycon) (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = + and checkClassFields isStruct m aenv infoReader (implTycon: Tycon) (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = let implFields = implFields.TrueFieldsAsList let sigFields = sigFields.TrueFieldsAsList let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) NameMap.suball2 (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName), m)); false) - (checkField aenv) m1 m2 && + (checkField aenv infoReader implTycon) m1 m2 && (if isStruct then NameMap.suball2 (fun fieldName _ -> warning(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName), m)); true) - (fun x y -> checkField aenv y x) m2 m1 + (fun x y -> checkField aenv infoReader implTycon y x) m2 m1 else true) - and checkTypeRepr m aenv (implTycon: Tycon) sigTypeRepr = + and checkTypeRepr m aenv (infoReader: InfoReader) (implTycon: Tycon) sigTypeRepr = let reportNiceError k s1 s2 = let aset = NameSet.ofList s1 let fset = NameSet.ofList s2 @@ -504,9 +505,9 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = if ucases1.Length <> ucases2.Length then let names (l: UnionCase list) = l |> List.map (fun c -> c.Id.idText) reportNiceError "union case" (names ucases1) (names ucases2) - else List.forall2 (checkUnionCase aenv) ucases1 ucases2 + else List.forall2 (checkUnionCase aenv infoReader implTycon) ucases1 ucases2 | (TRecdRepr implFields), (TRecdRepr sigFields) -> - checkRecordFields m aenv implTycon implFields sigFields + checkRecordFields m aenv infoReader implTycon implFields sigFields | (TFSharpObjectRepr r1), (TFSharpObjectRepr r2) -> if not (match r1.fsobjmodel_kind, r2.fsobjmodel_kind with | TTyconClass, TTyconClass -> true @@ -528,8 +529,8 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) else let isStruct = (match r1.fsobjmodel_kind with TTyconStruct -> true | _ -> false) - checkClassFields isStruct m aenv implTycon r1.fsobjmodel_rfields r2.fsobjmodel_rfields && - checkVirtualSlots denv m implTycon r1.fsobjmodel_vslots r2.fsobjmodel_vslots + checkClassFields isStruct m aenv infoReader implTycon r1.fsobjmodel_rfields r2.fsobjmodel_rfields && + checkVirtualSlots denv infoReader m implTycon r1.fsobjmodel_vslots r2.fsobjmodel_vslots | (TAsmRepr tcr1), (TAsmRepr tcr2) -> if tcr1 <> tcr2 then (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleILDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) else true | (TMeasureableRepr ty1), (TMeasureableRepr ty2) -> @@ -562,7 +563,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | Some _, None -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) | None, Some _ -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) - and checkModuleOrNamespaceContents m aenv (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = + and checkModuleOrNamespaceContents m aenv (infoReader: InfoReader) (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = let implModType = implModRef.ModuleOrNamespaceType (if implModType.ModuleOrNamespaceKind <> signModType.ModuleOrNamespaceKind then errorR(Error(FSComp.SR.typrelModuleNamespaceAttributesDifferInSigAndImpl(), m))) @@ -570,19 +571,19 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = (implModType.TypesByMangledName, signModType.TypesByMangledName) ||> NameMap.suball2 (fun s _fx -> errorR(RequiredButNotSpecified(denv, implModRef, "type", (fun os -> Printf.bprintf os "%s" s), m)); false) - (checkTypeDef aenv) && + (checkTypeDef aenv infoReader) && (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) ||> NameMap.suball2 (fun s fx -> errorR(RequiredButNotSpecified(denv, implModRef, (if fx.IsModule then "module" else "namespace"), (fun os -> Printf.bprintf os "%s" s), m)); false) - (fun x1 x2 -> checkModuleOrNamespace aenv (mkLocalModRef x1) x2) && + (fun x1 x2 -> checkModuleOrNamespace aenv infoReader (mkLocalModRef x1) x2) && let sigValHadNoMatchingImplementation (fx: Val) (_closeActualVal: Val option) = errorR(RequiredButNotSpecified(denv, implModRef, "value", (fun os -> (* In the case of missing members show the full required enclosing type and signature *) if fx.IsMember then - NicePrint.outputQualifiedValOrMember denv os fx + NicePrint.outputQualifiedValOrMember denv infoReader os (mkLocalValRef fx) else Printf.bprintf os "%s" fx.DisplayName), m)) @@ -601,7 +602,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | [], _ | _, [] -> failwith "unreachable" | [av], [fv] -> if valuesPartiallyMatch av fv then - checkVal implModRef aenv av fv + checkVal implModRef aenv infoReader av fv else sigValHadNoMatchingImplementation fv None false @@ -614,7 +615,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | Some av -> Some(fv, av)) // Check the ones with matching linkage - let allPairsOk = matchingPairs |> List.map (fun (fv, av) -> checkVal implModRef aenv av fv) |> List.forall id + let allPairsOk = matchingPairs |> List.map (fun (fv, av) -> checkVal implModRef aenv infoReader av fv) |> List.forall id let someNotOk = matchingPairs.Length < fvs.Length // Report an error for those that don't. Try pairing up by enclosing-type/name if someNotOk then @@ -624,28 +625,28 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | None -> Choice1Of2 fv | Some av -> Choice2Of2(fv, av)) for (fv, av) in partialMatchingPairs do - checkVal implModRef aenv av fv |> ignore + checkVal implModRef aenv infoReader av fv |> ignore for fv in noMatches do sigValHadNoMatchingImplementation fv None allPairsOk && not someNotOk) - and checkModuleOrNamespace aenv implModRef sigModRef = + and checkModuleOrNamespace aenv (infoReader: InfoReader) implModRef sigModRef = // Propagate defn location information from implementation to signature . sigModRef.SetOtherRange (implModRef.Range, true) implModRef.Deref.SetOtherRange (sigModRef.Range, false) - checkModuleOrNamespaceContents implModRef.Range aenv implModRef sigModRef.ModuleOrNamespaceType && + checkModuleOrNamespaceContents implModRef.Range aenv infoReader implModRef sigModRef.ModuleOrNamespaceType && checkAttribs aenv implModRef.Attribs sigModRef.Attribs implModRef.Deref.SetAttribs - member _.CheckSignature aenv (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = - checkModuleOrNamespaceContents implModRef.Range aenv implModRef signModType + member _.CheckSignature aenv (infoReader: InfoReader) (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = + checkModuleOrNamespaceContents implModRef.Range aenv infoReader implModRef signModType member _.CheckTypars m aenv (implTypars: Typars) (signTypars: Typars) = checkTypars m aenv implTypars signTypars /// Check the names add up between a signature and its implementation. We check this first. -let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = +let rec CheckNamesOfModuleOrNamespaceContents denv infoReader (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = let m = implModRef.Range let implModType = implModRef.ModuleOrNamespaceType NameMap.suball2 @@ -657,7 +658,7 @@ let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef: ModuleOrNamespac (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) ||> NameMap.suball2 (fun s fx -> errorR(RequiredButNotSpecified(denv, implModRef, (if fx.IsModule then "module" else "namespace"), (fun os -> Printf.bprintf os "%s" s), m)); false) - (fun x1 (x2: ModuleOrNamespace) -> CheckNamesOfModuleOrNamespace denv (mkLocalModRef x1) x2.ModuleOrNamespaceType) && + (fun x1 (x2: ModuleOrNamespace) -> CheckNamesOfModuleOrNamespace denv infoReader (mkLocalModRef x1) x2.ModuleOrNamespaceType) && (implModType.AllValsAndMembersByLogicalNameUncached, signModType.AllValsAndMembersByLogicalNameUncached) ||> NameMap.suball2 @@ -666,12 +667,12 @@ let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef: ModuleOrNamespac errorR(RequiredButNotSpecified(denv, implModRef, "value", (fun os -> // In the case of missing members show the full required enclosing type and signature if Option.isSome fx.MemberInfo then - NicePrint.outputQualifiedValOrMember denv os fx + NicePrint.outputQualifiedValOrMember denv infoReader os (mkLocalValRef fx) else Printf.bprintf os "%s" fx.DisplayName), m)); false) (fun _ _ -> true) -and CheckNamesOfModuleOrNamespace denv (implModRef: ModuleOrNamespaceRef) signModType = - CheckNamesOfModuleOrNamespaceContents denv implModRef signModType +and CheckNamesOfModuleOrNamespace denv (infoReader: InfoReader) (implModRef: ModuleOrNamespaceRef) signModType = + CheckNamesOfModuleOrNamespaceContents denv infoReader implModRef signModType diff --git a/src/fsharp/SignatureConformance.fsi b/src/fsharp/SignatureConformance.fsi index 23c99be854..673e6037d7 100644 --- a/src/fsharp/SignatureConformance.fsi +++ b/src/fsharp/SignatureConformance.fsi @@ -10,16 +10,17 @@ open FSharp.Compiler open FSharp.Compiler.Text open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps +open FSharp.Compiler.InfoReader exception RequiredButNotSpecified of DisplayEnv * ModuleOrNamespaceRef * string * (StringBuilder -> unit) * range -exception ValueNotContained of DisplayEnv * ModuleOrNamespaceRef * Val * Val * (string * string * string -> string) +exception ValueNotContained of DisplayEnv * InfoReader * ModuleOrNamespaceRef * Val * Val * (string * string * string -> string) -exception ConstrNotContained of DisplayEnv * UnionCase * UnionCase * (string * string -> string) +exception ConstrNotContained of DisplayEnv * InfoReader * Tycon * UnionCase * UnionCase * (string * string -> string) -exception ExnconstrNotContained of DisplayEnv * Tycon * Tycon * (string * string -> string) +exception ExnconstrNotContained of DisplayEnv * InfoReader * Tycon * Tycon * (string * string -> string) -exception FieldNotContained of DisplayEnv * RecdField * RecdField * (string * string -> string) +exception FieldNotContained of DisplayEnv * InfoReader * Tycon * RecdField * RecdField * (string * string -> string) exception InterfaceNotRevealed of DisplayEnv * TType * range @@ -27,11 +28,11 @@ type Checker = new: g:TcGlobals.TcGlobals * amap:Import.ImportMap * denv:DisplayEnv * remapInfo:SignatureRepackageInfo * checkingSig:bool -> Checker - member CheckSignature: aenv:TypeEquivEnv -> implModRef:ModuleOrNamespaceRef -> signModType:ModuleOrNamespaceType -> bool + member CheckSignature: aenv:TypeEquivEnv -> infoReader:InfoReader -> implModRef:ModuleOrNamespaceRef -> signModType:ModuleOrNamespaceType -> bool member CheckTypars: m:range -> aenv:TypeEquivEnv -> implTypars:Typars -> signTypars:Typars -> bool /// Check the names add up between a signature and its implementation. We check this first. -val CheckNamesOfModuleOrNamespaceContents: denv:DisplayEnv -> implModRef:ModuleOrNamespaceRef -> signModType:ModuleOrNamespaceType -> bool +val CheckNamesOfModuleOrNamespaceContents: denv:DisplayEnv -> infoReader:InfoReader -> implModRef:ModuleOrNamespaceRef -> signModType:ModuleOrNamespaceType -> bool -val CheckNamesOfModuleOrNamespace: denv:DisplayEnv -> implModRef:ModuleOrNamespaceRef -> signModType:ModuleOrNamespaceType -> bool +val CheckNamesOfModuleOrNamespace: denv:DisplayEnv -> infoReader:InfoReader -> implModRef:ModuleOrNamespaceRef -> signModType:ModuleOrNamespaceType -> bool diff --git a/src/fsharp/SyntaxTree.fs b/src/fsharp/SyntaxTree.fs index 47765814be..6f8962317e 100644 --- a/src/fsharp/SyntaxTree.fs +++ b/src/fsharp/SyntaxTree.fs @@ -7,6 +7,7 @@ open Internal.Utilities.Library open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml [] type Ident (text: string, range: range) = diff --git a/src/fsharp/SyntaxTree.fsi b/src/fsharp/SyntaxTree.fsi index 1acc931a9d..0305d91ec8 100644 --- a/src/fsharp/SyntaxTree.fsi +++ b/src/fsharp/SyntaxTree.fsi @@ -4,6 +4,7 @@ namespace rec FSharp.Compiler.Syntax open FSharp.Compiler.Syntax open FSharp.Compiler.Text +open FSharp.Compiler.Xml /// Represents an identifier in F# code [] diff --git a/src/fsharp/SyntaxTreeOps.fs b/src/fsharp/SyntaxTreeOps.fs index 2ecc64f458..5250d878c9 100644 --- a/src/fsharp/SyntaxTreeOps.fs +++ b/src/fsharp/SyntaxTreeOps.fs @@ -8,6 +8,7 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.Text open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml /// Generate implicit argument names in parsing type SynArgNameGenerator() = diff --git a/src/fsharp/SyntaxTreeOps.fsi b/src/fsharp/SyntaxTreeOps.fsi index 43c91a339a..90bbed0ff4 100644 --- a/src/fsharp/SyntaxTreeOps.fsi +++ b/src/fsharp/SyntaxTreeOps.fsi @@ -3,6 +3,7 @@ module internal FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.Syntax [] diff --git a/src/fsharp/TypedTree.fs b/src/fsharp/TypedTree.fs index 1903158772..47cc041125 100644 --- a/src/fsharp/TypedTree.fs +++ b/src/fsharp/TypedTree.fs @@ -25,6 +25,7 @@ open FSharp.Compiler.QuotationPickler open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml #if !NO_EXTENSIONTYPING open FSharp.Compiler.ExtensionTyping @@ -5084,7 +5085,9 @@ type CcuData = MemberSignatureEquality: (TType -> TType -> bool) /// The table of .NET CLI type forwarders for this assembly - TypeForwarders: CcuTypeForwarderTable } + TypeForwarders: CcuTypeForwarderTable + + XmlDocumentationInfo: XmlDocumentationInfo option } [] member x.DebugText = x.ToString() diff --git a/src/fsharp/TypedTreeOps.fs b/src/fsharp/TypedTreeOps.fs index 1bdf2416fc..12a2b46abe 100644 --- a/src/fsharp/TypedTreeOps.fs +++ b/src/fsharp/TypedTreeOps.fs @@ -27,6 +27,7 @@ open FSharp.Compiler.Text open FSharp.Compiler.Text.Layout open FSharp.Compiler.Text.LayoutRender open FSharp.Compiler.Text.TaggedText +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics #if !NO_EXTENSIONTYPING diff --git a/src/fsharp/TypedTreeOps.fsi b/src/fsharp/TypedTreeOps.fsi index 3838a7e094..02f2e60745 100755 --- a/src/fsharp/TypedTreeOps.fsi +++ b/src/fsharp/TypedTreeOps.fsi @@ -11,7 +11,7 @@ open FSharp.Compiler.AbstractIL open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.Syntax open FSharp.Compiler.Text -open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TcGlobals diff --git a/src/fsharp/TypedTreePickle.fs b/src/fsharp/TypedTreePickle.fs index ceb58d35cd..5ed7d5cb96 100644 --- a/src/fsharp/TypedTreePickle.fs +++ b/src/fsharp/TypedTreePickle.fs @@ -22,6 +22,7 @@ open FSharp.Compiler.Text.Range open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps diff --git a/src/fsharp/XmlDoc.fs b/src/fsharp/XmlDoc.fs index 1f9fabc379..72dd8b275e 100644 --- a/src/fsharp/XmlDoc.fs +++ b/src/fsharp/XmlDoc.fs @@ -1,14 +1,18 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -namespace FSharp.Compiler.Syntax +namespace FSharp.Compiler.Xml open System +open System.IO +open System.Xml open System.Xml.Linq open Internal.Utilities.Library +open Internal.Utilities.Collections open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range +open FSharp.Compiler.AbstractIL.IL /// Represents collected XmlDoc lines [] @@ -214,3 +218,61 @@ type PreXmlDoc = static member Merge a b = PreXmlMerge (a, b) +[] +type XmlDocumentationInfo private (tryGetXmlDocument: unit -> XmlDocument option) = + + // 2 and 4 are arbitrary but should be reasonable enough + [] + static let cacheStrongSize = 2 + [] + static let cacheMaxSize = 4 + static let cacheAreSimilar = + fun ((str1: string, dt1: DateTime), (str2: string, dt2: DateTime)) -> + str1.Equals(str2, StringComparison.OrdinalIgnoreCase) && + dt1 = dt2 + static let cache = AgedLookup(keepStrongly=cacheStrongSize, areSimilar=cacheAreSimilar, keepMax=cacheMaxSize) + + let tryGetSummaryNode xmlDocSig = + tryGetXmlDocument() + |> Option.bind (fun doc -> + match doc.SelectSingleNode(sprintf "doc/members/member[@name='%s']" xmlDocSig) with + | null -> None + | node when node.HasChildNodes -> Some node + | _ -> None) + + member _.TryGetXmlDocBySig(xmlDocSig: string) = + tryGetSummaryNode xmlDocSig + |> Option.map (fun node -> + let childNodes = node.ChildNodes + let lines = Array.zeroCreate childNodes.Count + for i = 0 to childNodes.Count - 1 do + let childNode = childNodes.[i] + lines.[i] <- childNode.OuterXml + XmlDoc(lines, range0) + ) + + static member TryCreateFromFile(xmlFileName: string) = + if not (File.Exists(xmlFileName)) || not (String.Equals(Path.GetExtension(xmlFileName), ".xml", StringComparison.OrdinalIgnoreCase)) then + None + else + let tryGetXmlDocument = + fun () -> + try + let lastWriteTime = File.GetLastWriteTimeUtc(xmlFileName) + let cacheKey = (xmlFileName, lastWriteTime) + match cache.TryGet((), cacheKey) with + | Some doc -> Some doc + | _ -> + let doc = XmlDocument() + use xmlStream = File.OpenRead(xmlFileName) + doc.Load(xmlStream) + cache.Put((), cacheKey, doc) + Some doc + with + | _ -> + None + Some(XmlDocumentationInfo(tryGetXmlDocument)) + +type IXmlDocumentationInfoLoader = + + abstract TryLoad : assemblyFileName: string * ILModuleDef -> XmlDocumentationInfo option diff --git a/src/fsharp/XmlDoc.fsi b/src/fsharp/XmlDoc.fsi index e607383e5d..17662aaa9a 100644 --- a/src/fsharp/XmlDoc.fsi +++ b/src/fsharp/XmlDoc.fsi @@ -1,8 +1,10 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -namespace FSharp.Compiler.Syntax +namespace FSharp.Compiler.Xml +open System.Xml open FSharp.Compiler.Text +open FSharp.Compiler.AbstractIL.IL /// Represents collected XmlDoc lines [] @@ -57,3 +59,14 @@ type public PreXmlDoc = member ToXmlDoc: check:bool * paramNamesOpt:string list option -> XmlDoc static member Empty: PreXmlDoc + +[] +type internal XmlDocumentationInfo = + + member TryGetXmlDocBySig : xmlDocSig: string -> XmlDoc option + + static member TryCreateFromFile : xmlFileName: string -> XmlDocumentationInfo option + +type internal IXmlDocumentationInfoLoader = + + abstract TryLoad : assemblyFileName: string * ILModuleDef -> XmlDocumentationInfo option diff --git a/src/fsharp/XmlDocFileWriter.fs b/src/fsharp/XmlDocFileWriter.fs index 8fe34b2866..5259f3b3ec 100644 --- a/src/fsharp/XmlDocFileWriter.fs +++ b/src/fsharp/XmlDocFileWriter.fs @@ -10,6 +10,7 @@ open Internal.Utilities.Library.Extras open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Syntax open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index f8c9d02d12..30ab44e9ff 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -63,6 +63,7 @@ open FSharp.Compiler.Text open FSharp.Compiler.Text.Range open FSharp.Compiler.Text open FSharp.Compiler.Text.Layout +open FSharp.Compiler.Xml open FSharp.Compiler.Tokenization open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps @@ -470,9 +471,9 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, tcConfigB: Tc Display.layout_to_string opts lay /// Fetch the saved value of an expression out of the 'it' register and show it. - member valuePrinter.InvokeExprPrinter (denv, emEnv, ilxGenerator: IlxAssemblyGenerator, vref) = + member valuePrinter.InvokeExprPrinter (denv, infoReader, emEnv, ilxGenerator: IlxAssemblyGenerator, vref: ValRef) = let opts = valuePrinter.GetFsiPrintOptions() - let res = ilxGenerator.LookupGeneratedValue (valuePrinter.GetEvaluationContext emEnv, vref) + let res = ilxGenerator.LookupGeneratedValue (valuePrinter.GetEvaluationContext emEnv, vref.Deref) let rhsL = match res with | None -> None @@ -483,9 +484,9 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, tcConfigB: Tc let denv = { denv with suppressInlineKeyword = false } // dont' suppress 'inline' in 'val inline f = ...' let fullL = if Option.isNone rhsL || isEmptyL rhsL.Value then - NicePrint.prettyLayoutOfValOrMemberNoInst denv vref (* the rhs was suppressed by the printer, so no value to print *) + NicePrint.prettyLayoutOfValOrMemberNoInst denv infoReader vref (* the rhs was suppressed by the printer, so no value to print *) else - (NicePrint.prettyLayoutOfValOrMemberNoInst denv vref ++ wordL (TaggedText.tagText "=")) --- rhsL.Value + (NicePrint.prettyLayoutOfValOrMemberNoInst denv infoReader vref ++ wordL (TaggedText.tagText "=")) --- rhsL.Value Utilities.colorPrintL outWriter opts fullL @@ -1407,7 +1408,8 @@ type internal FsiDynamicCompiler match istate.tcState.TcEnvFromImpls.NameEnv.FindUnqualifiedItem itName with | NameResolution.Item.Value vref -> if not tcConfig.noFeedback then - valuePrinter.InvokeExprPrinter (istate.tcState.TcEnvFromImpls.DisplayEnv, istate.emEnv, istate.ilxGenerator, vref.Deref) + let infoReader = InfoReader(istate.tcGlobals, istate.tcImports.GetImportMap()) + valuePrinter.InvokeExprPrinter (istate.tcState.TcEnvFromImpls.DisplayEnv, infoReader, istate.emEnv, istate.ilxGenerator, vref) /// Clear the value held in the previous "it" binding, if any, as long as it has never been referenced. match prevIt with diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index 089502f2c8..26b16bfbbc 100644 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -14,6 +14,7 @@ open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps @@ -29,6 +30,9 @@ type AssemblyLoader = /// Resolve an Abstract IL assembly reference to a Ccu abstract FindCcuFromAssemblyRef : CompilationThreadToken * range * ILAssemblyRef -> CcuResolutionResult + + abstract TryFindXmlDocumentationInfo : assemblyName: string -> XmlDocumentationInfo option + #if !NO_EXTENSIONTYPING /// Get a flag indicating if an assembly is a provided assembly, plus the @@ -579,7 +583,7 @@ let ImportILAssemblyTypeForwarders (amap, m, exportedTypes: ILExportedTypesAndFo ] |> Map.ofList /// Import an IL assembly as a new TAST CCU -let ImportILAssembly(amap: (unit -> ImportMap), m, auxModuleLoader, ilScopeRef, sourceDir, filename, ilModule: ILModuleDef, invalidateCcu: IEvent) = +let ImportILAssembly(amap: (unit -> ImportMap), m, auxModuleLoader, xmlDocInfoLoader: IXmlDocumentationInfoLoader option, ilScopeRef, sourceDir, filename, ilModule: ILModuleDef, invalidateCcu: IEvent) = invalidateCcu |> ignore let aref = match ilScopeRef with @@ -608,6 +612,11 @@ let ImportILAssembly(amap: (unit -> ImportMap), m, auxModuleLoader, ilScopeRef, FileName = filename MemberSignatureEquality= (fun ty1 ty2 -> typeEquivAux EraseAll (amap()).g ty1 ty2) TryGetILModuleDef = (fun () -> Some ilModule) - TypeForwarders = forwarders } + TypeForwarders = forwarders + XmlDocumentationInfo = + match xmlDocInfoLoader, filename with + | Some xmlDocInfoLoader, Some filename -> xmlDocInfoLoader.TryLoad(filename, ilModule) + | _ -> None + } CcuThunk.Create(nm, ccuData) diff --git a/src/fsharp/import.fsi b/src/fsharp/import.fsi index b27baece27..89d9fdb9ad 100644 --- a/src/fsharp/import.fsi +++ b/src/fsharp/import.fsi @@ -7,6 +7,7 @@ open Internal.Utilities.Library open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree #if !NO_EXTENSIONTYPING @@ -20,6 +21,8 @@ type AssemblyLoader = /// Resolve an Abstract IL assembly reference to a Ccu abstract FindCcuFromAssemblyRef : CompilationThreadToken * range * ILAssemblyRef -> CcuResolutionResult + abstract TryFindXmlDocumentationInfo : assemblyName: string -> XmlDocumentationInfo option + #if !NO_EXTENSIONTYPING /// Get a flag indicating if an assembly is a provided assembly, plus the /// table of information recording remappings from type names in the provided assembly to type @@ -76,7 +79,7 @@ val internal ImportProvidedMethodBaseAsILMethodRef : ImportMap -> range -> Taint val internal ImportILGenericParameters : (unit -> ImportMap) -> range -> ILScopeRef -> TType list -> ILGenericParameterDef list -> Typar list /// Import an IL assembly as a new TAST CCU -val internal ImportILAssembly : (unit -> ImportMap) * range * (ILScopeRef -> ILModuleDef) * ILScopeRef * sourceDir:string * filename: string option * ILModuleDef * IEvent -> CcuThunk +val internal ImportILAssembly : (unit -> ImportMap) * range * (ILScopeRef -> ILModuleDef) * IXmlDocumentationInfoLoader option * ILScopeRef * sourceDir:string * filename: string option * ILModuleDef * IEvent -> CcuThunk /// Import the type forwarder table for an IL assembly val internal ImportILAssemblyTypeForwarders : (unit -> ImportMap) * range * ILExportedTypesAndForwarders -> Map<(string array * string), Lazy> diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 78d3754baa..5f2c3cf146 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -13,6 +13,7 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps diff --git a/src/fsharp/infos.fsi b/src/fsharp/infos.fsi index d7bd498229..fb543c2c19 100644 --- a/src/fsharp/infos.fsi +++ b/src/fsharp/infos.fsi @@ -8,6 +8,7 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.Import open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index 9cf8717424..f50a8c8ca9 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -24,6 +24,7 @@ open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml #if DEBUG let debugPrint s = diff --git a/src/fsharp/service/IncrementalBuild.fs b/src/fsharp/service/IncrementalBuild.fs index 03403258ad..4acc4ed735 100644 --- a/src/fsharp/service/IncrementalBuild.fs +++ b/src/fsharp/service/IncrementalBuild.fs @@ -6,6 +6,7 @@ open System open System.Collections.Generic open System.Collections.Immutable open System.IO +open System.Xml open System.Runtime.InteropServices open System.Threading open Internal.Utilities.Library @@ -35,6 +36,7 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps @@ -1390,6 +1392,17 @@ type IncrementalBuilder(tcGlobals, // Never open PDB files for the language service, even if --standalone is specified tcConfigB.openDebugInformationForLaterStaticLinking <- false + tcConfigB.xmlDocInfoLoader <- + { new IXmlDocumentationInfoLoader with + /// Try to load xml documentation associated with an assembly by the same file path with the extension ".xml". + member _.TryLoad(assemblyFileName, _ilModule) = + let xmlFileName = Path.ChangeExtension(assemblyFileName, ".xml") + + // REVIEW: File IO - Will eventually need to change this to use a file system interface of some sort. + XmlDocumentationInfo.TryCreateFromFile(xmlFileName) + } + |> Some + tcConfigB, sourceFilesNew // If this is a builder for a script, re-apply the settings inferred from the diff --git a/src/fsharp/service/ServiceDeclarationLists.fs b/src/fsharp/service/ServiceDeclarationLists.fs index 5b92be0433..744c51c17c 100644 --- a/src/fsharp/service/ServiceDeclarationLists.fs +++ b/src/fsharp/service/ServiceDeclarationLists.fs @@ -101,7 +101,7 @@ module DeclarationListHelpers = let layouts = [ for minfo in minfos -> - let prettyTyparInst, layout = NicePrint.prettyLayoutOfMethInfoFreeStyle infoReader.amap m denv item.TyparInst minfo + let prettyTyparInst, layout = NicePrint.prettyLayoutOfMethInfoFreeStyle infoReader m denv item.TyparInst minfo let xml = GetXmlCommentForMethInfoItem infoReader m item.Item minfo let tpsL = FormatTyparMapping denv prettyTyparInst let layout = LayoutRender.toArray layout @@ -159,7 +159,7 @@ module DeclarationListHelpers = FormatItemDescriptionToToolTipElement isListItem infoReader m denv { item with Item = Item.Value vref } | Item.Value vref | Item.CustomBuilder (_, vref) -> - let prettyTyparInst, resL = NicePrint.layoutQualifiedValOrMember denv item.TyparInst vref.Deref + let prettyTyparInst, resL = NicePrint.layoutQualifiedValOrMember denv infoReader item.TyparInst vref let remarks = OutputFullName isListItem pubpathOfValRef fullDisplayTextOfValRefAsLayout vref let tpsL = FormatTyparMapping denv prettyTyparInst let tpsL = List.map LayoutRender.toArray tpsL @@ -178,7 +178,7 @@ module DeclarationListHelpers = sepL (tagPunctuation ".") ^^ wordL (tagUnionCase (DecompileOpName uc.Id.idText) |> mkNav uc.DefinitionRange) ^^ RightL.colon ^^ - (if List.isEmpty recd then emptyL else NicePrint.layoutUnionCases denv recd ^^ WordL.arrow) ^^ + (if List.isEmpty recd then emptyL else NicePrint.layoutUnionCases denv infoReader ucinfo.TyconRef recd ^^ WordL.arrow) ^^ NicePrint.layoutType denv rty let layout = LayoutRender.toArray layout ToolTipElement.Single (layout, xml) @@ -217,7 +217,7 @@ module DeclarationListHelpers = // F# exception names | Item.ExnCase ecref -> - let layout = NicePrint.layoutExnDef denv ecref.Deref + let layout = NicePrint.layoutExnDef denv infoReader ecref let remarks = OutputFullName isListItem pubpathOfTyconRef fullDisplayTextOfExnRefAsLayout ecref let layout = LayoutRender.toArray layout let remarks = LayoutRender.toArray remarks diff --git a/src/fsharp/service/ServiceXmlDocParser.fs b/src/fsharp/service/ServiceXmlDocParser.fs index dfa6568231..2971eb1679 100644 --- a/src/fsharp/service/ServiceXmlDocParser.fs +++ b/src/fsharp/service/ServiceXmlDocParser.fs @@ -6,6 +6,7 @@ open Internal.Utilities.Library open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml /// Represent an Xml documentation block in source code type XmlDocable = diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index 766c28bc47..17ec5893c3 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -17,7 +17,7 @@ open FSharp.Compiler open FSharp.Compiler.CompilerDiagnostics open FSharp.Compiler.Diagnostics open FSharp.Compiler.ErrorLogger -open FSharp.Compiler.Syntax +open FSharp.Compiler.Xml open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range @@ -233,13 +233,12 @@ open FSharp.Compiler.InfoReader open FSharp.Compiler.Infos open FSharp.Compiler.IO open FSharp.Compiler.NameResolution -open FSharp.Compiler.Syntax open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.Text open FSharp.Compiler.Text.Range -open FSharp.Compiler.Text open FSharp.Compiler.Text.Layout open FSharp.Compiler.Text.TaggedText +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps @@ -420,150 +419,30 @@ module internal SymbolHelpers = yield ParamNameAndType(argInfo.Name, ty) ] | _ -> [] - // Find the name of the metadata file for this external definition - let metaInfoOfEntityRef (infoReader: InfoReader) m tcref = - let g = infoReader.g - match tcref with - | ERefLocal _ -> None - | ERefNonLocal nlref -> - // Generalize to get a formal signature - let formalTypars = tcref.Typars m - let formalTypeInst = generalizeTypars formalTypars - let ty = TType_app(tcref, formalTypeInst) - if isILAppTy g ty then - let formalTypeInfo = ILTypeInfo.FromType g ty - Some(nlref.Ccu.FileName, formalTypars, formalTypeInfo) - else None - let mkXmlComment thing = match thing with | Some (Some fileName, xmlDocSig) -> FSharpXmlDoc.FromXmlFile(fileName, xmlDocSig) | _ -> FSharpXmlDoc.None - let GetXmlDocSigOfEntityRef infoReader m (eref: EntityRef) = - if eref.IsILTycon then - match metaInfoOfEntityRef infoReader m eref with - | None -> None - | Some (ccuFileName, _, formalTypeInfo) -> Some(ccuFileName, "T:"+formalTypeInfo.ILTypeRef.FullName) - else - let ccuFileName = libFileOfEntityRef eref - let m = eref.Deref - if m.XmlDocSig = "" then - m.XmlDocSig <- XmlDocSigOfEntity eref - Some (ccuFileName, m.XmlDocSig) - - let GetXmlDocSigOfScopedValRef g (tcref: TyconRef) (vref: ValRef) = - let ccuFileName = libFileOfEntityRef tcref - let v = vref.Deref - if v.XmlDocSig = "" && v.HasDeclaringEntity then - let ap = buildAccessPath vref.TopValDeclaringEntity.CompilationPathOpt - let path = - if vref.TopValDeclaringEntity.IsModule then - let sep = if ap.Length > 0 then "." else "" - ap + sep + vref.TopValDeclaringEntity.CompiledName - else - ap - v.XmlDocSig <- XmlDocSigOfVal g false path v - Some (ccuFileName, v.XmlDocSig) - - let GetXmlDocSigOfRecdFieldInfo (rfinfo: RecdFieldInfo) = - let tcref = rfinfo.TyconRef - let ccuFileName = libFileOfEntityRef tcref - if rfinfo.RecdField.XmlDocSig = "" then - rfinfo.RecdField.XmlDocSig <- XmlDocSigOfProperty [tcref.CompiledRepresentationForNamedType.FullName; rfinfo.Name] - Some (ccuFileName, rfinfo.RecdField.XmlDocSig) - - let GetXmlDocSigOfUnionCaseInfo (ucinfo: UnionCaseInfo) = - let tcref = ucinfo.TyconRef - let ccuFileName = libFileOfEntityRef tcref - if ucinfo.UnionCase.XmlDocSig = "" then - ucinfo.UnionCase.XmlDocSig <- XmlDocSigOfUnionCase [tcref.CompiledRepresentationForNamedType.FullName; ucinfo.Name] - Some (ccuFileName, ucinfo.UnionCase.XmlDocSig) - - let GetXmlDocSigOfMethInfo (infoReader: InfoReader) m (minfo: MethInfo) = - let amap = infoReader.amap - match minfo with - | FSMeth (g, _, vref, _) -> - GetXmlDocSigOfScopedValRef g minfo.DeclaringTyconRef vref - | ILMeth (g, ilminfo, _) -> - let actualTypeName = ilminfo.DeclaringTyconRef.CompiledRepresentationForNamedType.FullName - let fmtps = ilminfo.FormalMethodTypars - let genArity = if fmtps.Length=0 then "" else sprintf "``%d" fmtps.Length - - match metaInfoOfEntityRef infoReader m ilminfo.DeclaringTyconRef with - | None -> None - | Some (ccuFileName, formalTypars, formalTypeInfo) -> - let filminfo = ILMethInfo(g, formalTypeInfo.ToType, None, ilminfo.RawMetadata, fmtps) - let args = - match ilminfo.IsILExtensionMethod with - | true -> filminfo.GetRawArgTypes(amap, m, minfo.FormalMethodInst) - | false -> filminfo.GetParamTypes(amap, m, minfo.FormalMethodInst) - - // http://msdn.microsoft.com/en-us/library/fsbx0t7x.aspx - // If the name of the item itself has periods, they are replaced by the hash-sign ('#'). - // It is assumed that no item has a hash-sign directly in its name. For example, the fully - // qualified name of the String constructor would be "System.String.#ctor". - let normalizedName = ilminfo.ILName.Replace(".", "#") - - Some (ccuFileName, "M:"+actualTypeName+"."+normalizedName+genArity+XmlDocArgsEnc g (formalTypars, fmtps) args) - | DefaultStructCtor _ -> None -#if !NO_EXTENSIONTYPING - | ProvidedMeth _ -> None -#endif - - let GetXmlDocSigOfValRef g (vref: ValRef) = - if not vref.IsLocalRef then - let ccuFileName = vref.nlr.Ccu.FileName - let v = vref.Deref - if v.XmlDocSig = "" && v.HasDeclaringEntity then - v.XmlDocSig <- XmlDocSigOfVal g false vref.TopValDeclaringEntity.CompiledRepresentationForNamedType.Name v - Some (ccuFileName, v.XmlDocSig) - else - None - - let GetXmlDocSigOfProp infoReader m (pinfo: PropInfo) = - let g = pinfo.TcGlobals - match pinfo with -#if !NO_EXTENSIONTYPING - | ProvidedProp _ -> None // No signature is possible. If an xml comment existed it would have been returned by PropInfo.XmlDoc in infos.fs -#endif - | FSProp _ as fspinfo -> - match fspinfo.ArbitraryValRef with - | None -> None - | Some vref -> GetXmlDocSigOfScopedValRef g pinfo.DeclaringTyconRef vref - | ILProp(ILPropInfo(_, pdef)) -> - match metaInfoOfEntityRef infoReader m pinfo.DeclaringTyconRef with - | Some (ccuFileName, formalTypars, formalTypeInfo) -> - let filpinfo = ILPropInfo(formalTypeInfo, pdef) - Some (ccuFileName, "P:"+formalTypeInfo.ILTypeRef.FullName+"."+pdef.Name+XmlDocArgsEnc g (formalTypars, []) (filpinfo.GetParamTypes(infoReader.amap, m))) - | _ -> None - - let GetXmlDocSigOfEvent infoReader m (einfo: EventInfo) = - match einfo with - | ILEvent _ -> - match metaInfoOfEntityRef infoReader m einfo.DeclaringTyconRef with - | Some (ccuFileName, _, formalTypeInfo) -> - Some(ccuFileName, "E:"+formalTypeInfo.ILTypeRef.FullName+"."+einfo.EventName) - | _ -> None - | _ -> None - - let GetXmlDocSigOfILFieldInfo infoReader m (finfo: ILFieldInfo) = - match metaInfoOfEntityRef infoReader m finfo.DeclaringTyconRef with - | Some (ccuFileName, _, formalTypeInfo) -> - Some(ccuFileName, "F:"+formalTypeInfo.ILTypeRef.FullName+"."+finfo.FieldName) - | _ -> None + let GetXmlDocFromLoader (infoReader: InfoReader) xmlDoc = + match xmlDoc with + | FSharpXmlDoc.None + | FSharpXmlDoc.FromXmlText _ -> xmlDoc + | FSharpXmlDoc.FromXmlFile(dllName, xmlSig) -> + TryFindXmlDocByAssemblyNameAndSig infoReader (Path.GetFileNameWithoutExtension dllName) xmlSig + |> Option.map FSharpXmlDoc.FromXmlText + |> Option.defaultValue xmlDoc /// This function gets the signature to pass to Visual Studio to use its lookup functions for .NET stuff. let GetXmlDocHelpSigOfItemForLookup (infoReader: InfoReader) m d = let g = infoReader.g - match d with | Item.ActivePatternCase (APElemRef(_, vref, _)) | Item.Value vref | Item.CustomBuilder (_, vref) -> mkXmlComment (GetXmlDocSigOfValRef g vref) - | Item.UnionCase (ucinfo, _) -> mkXmlComment (GetXmlDocSigOfUnionCaseInfo ucinfo) + | Item.UnionCase (ucinfo, _) -> mkXmlComment (GetXmlDocSigOfUnionCaseRef ucinfo.UnionCaseRef) | Item.ExnCase tcref -> mkXmlComment (GetXmlDocSigOfEntityRef infoReader m tcref) - | Item.RecdField rfinfo -> mkXmlComment (GetXmlDocSigOfRecdFieldInfo rfinfo) + | Item.RecdField rfinfo -> mkXmlComment (GetXmlDocSigOfRecdFieldRef rfinfo.RecdFieldRef) | Item.NewDef _ -> FSharpXmlDoc.None | Item.ILField finfo -> mkXmlComment (GetXmlDocSigOfILFieldInfo infoReader m finfo) | Item.Types(_, ((TType_app(tcref, _)) :: _)) -> mkXmlComment (GetXmlDocSigOfEntityRef infoReader m tcref) @@ -580,9 +459,11 @@ module internal SymbolHelpers = match argContainer with | ArgumentContainer.Method minfo -> mkXmlComment (GetXmlDocSigOfMethInfo infoReader m minfo) | ArgumentContainer.Type tcref -> mkXmlComment (GetXmlDocSigOfEntityRef infoReader m tcref) - | Item.UnionCaseField (ucinfo, _) -> mkXmlComment (GetXmlDocSigOfUnionCaseInfo ucinfo) + | Item.UnionCaseField (ucinfo, _) -> mkXmlComment (GetXmlDocSigOfUnionCaseRef ucinfo.UnionCaseRef) | _ -> FSharpXmlDoc.None + |> GetXmlDocFromLoader infoReader + /// Produce an XmlComment with a signature or raw text, given the F# comment and the item let GetXmlCommentForItemAux (xmlDoc: XmlDoc option) (infoReader: InfoReader) m d = match xmlDoc with @@ -891,6 +772,8 @@ module internal SymbolHelpers = | _ -> GetXmlCommentForItemAux None infoReader m item + |> GetXmlDocFromLoader infoReader + let IsAttribute (infoReader: InfoReader) item = try let g = infoReader.g diff --git a/src/fsharp/symbols/SymbolHelpers.fsi b/src/fsharp/symbols/SymbolHelpers.fsi index 8a9c547ca3..d46e096e2a 100755 --- a/src/fsharp/symbols/SymbolHelpers.fsi +++ b/src/fsharp/symbols/SymbolHelpers.fsi @@ -114,7 +114,7 @@ namespace FSharp.Compiler.Symbols open FSharp.Compiler.InfoReader open FSharp.Compiler.Syntax open FSharp.Compiler.Text - open FSharp.Compiler.Text + open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps @@ -137,24 +137,6 @@ namespace FSharp.Compiler.Symbols module internal SymbolHelpers = val ParamNameAndTypesOfUnaryCustomOperation : TcGlobals -> MethInfo -> ParamNameAndType list - val GetXmlDocSigOfEntityRef : InfoReader -> range -> EntityRef -> (string option * string) option - - val GetXmlDocSigOfScopedValRef : TcGlobals -> TyconRef -> ValRef -> (string option * string) option - - val GetXmlDocSigOfILFieldInfo : InfoReader -> range -> ILFieldInfo -> (string option * string) option - - val GetXmlDocSigOfRecdFieldInfo : RecdFieldInfo -> (string option * string) option - - val GetXmlDocSigOfUnionCaseInfo : UnionCaseInfo -> (string option * string) option - - val GetXmlDocSigOfMethInfo : InfoReader -> range -> MethInfo -> (string option * string) option - - val GetXmlDocSigOfValRef : TcGlobals -> ValRef -> (string option * string) option - - val GetXmlDocSigOfProp : InfoReader -> range -> PropInfo -> (string option * string) option - - val GetXmlDocSigOfEvent : InfoReader -> range -> EventInfo -> (string option * string) option - val GetXmlCommentForItem : InfoReader -> range -> Item -> FSharpXmlDoc val RemoveDuplicateItems : TcGlobals -> ItemWithInst list -> ItemWithInst list diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index b713d121d4..4048b82726 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -19,7 +19,7 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text open FSharp.Compiler.Text.Range -open FSharp.Compiler.Text +open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TcGlobals @@ -197,7 +197,7 @@ module Impl = let getXmlDocSigForEntity (cenv: SymbolEnv) (ent:EntityRef)= - match SymbolHelpers.GetXmlDocSigOfEntityRef cenv.infoReader ent.Range ent with + match GetXmlDocSigOfEntityRef cenv.infoReader ent.Range ent with | Some (_, docsig) -> docsig | _ -> "" @@ -810,7 +810,7 @@ type FSharpEntity(cenv: SymbolEnv, entity:EntityRef) = member this.TryGetMetadataText() = match entity.TryDeref with - | ValueSome entity -> + | ValueSome _ -> if entity.IsNamespace then None else @@ -886,7 +886,7 @@ type FSharpEntity(cenv: SymbolEnv, entity:EntityRef) = [ (Layout.(^^) headerL (Layout.sepL TaggedText.lineBreak)) (Layout.(^^) openL (Layout.sepL TaggedText.lineBreak)) - (NicePrint.layoutEntity denv infoReader AccessibleFromSomewhere range0 entity) + (NicePrint.layoutEntityRef denv infoReader AccessibleFromSomewhere range0 entity) ] |> LayoutRender.showL |> SourceText.ofString @@ -955,7 +955,7 @@ type FSharpUnionCase(cenv, v: UnionCaseRef) = member _.XmlDocSig = checkIsResolved() let unionCase = UnionCaseInfo(generalizeTypars v.TyconRef.TyparsNoRange, v) - match SymbolHelpers.GetXmlDocSigOfUnionCaseInfo unionCase with + match GetXmlDocSigOfUnionCaseRef unionCase.UnionCaseRef with | Some (_, docsig) -> docsig | _ -> "" @@ -1130,12 +1130,12 @@ type FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = match d with | RecdOrClass v -> let recd = RecdFieldInfo(generalizeTypars v.TyconRef.TyparsNoRange, v) - SymbolHelpers.GetXmlDocSigOfRecdFieldInfo recd + GetXmlDocSigOfRecdFieldRef recd.RecdFieldRef | Union (v, _) -> let unionCase = UnionCaseInfo(generalizeTypars v.TyconRef.TyparsNoRange, v) - SymbolHelpers.GetXmlDocSigOfUnionCaseInfo unionCase + GetXmlDocSigOfUnionCaseRef unionCase.UnionCaseRef | ILField f -> - SymbolHelpers.GetXmlDocSigOfILFieldInfo cenv.infoReader range0 f + GetXmlDocSigOfILFieldInfo cenv.infoReader range0 f | AnonField _ -> None match xmlsig with | Some (_, docsig) -> docsig @@ -1272,7 +1272,7 @@ type FSharpActivePatternCase(cenv, apinfo: PrettyNaming.ActivePatternInfo, ty, n member _.XmlDocSig = let xmlsig = match valOpt with - | Some valref -> SymbolHelpers.GetXmlDocSigOfValRef cenv.g valref + | Some valref -> GetXmlDocSigOfValRef cenv.g valref | None -> None match xmlsig with | Some (_, docsig) -> docsig @@ -1961,23 +1961,23 @@ type FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = match d with | E e -> let range = defaultArg sym.DeclarationLocationOpt range0 - match SymbolHelpers.GetXmlDocSigOfEvent cenv.infoReader range e with + match GetXmlDocSigOfEvent cenv.infoReader range e with | Some (_, docsig) -> docsig | _ -> "" | P p -> let range = defaultArg sym.DeclarationLocationOpt range0 - match SymbolHelpers.GetXmlDocSigOfProp cenv.infoReader range p with + match GetXmlDocSigOfProp cenv.infoReader range p with | Some (_, docsig) -> docsig | _ -> "" | M m | C m -> let range = defaultArg sym.DeclarationLocationOpt range0 - match SymbolHelpers.GetXmlDocSigOfMethInfo cenv.infoReader range m with + match GetXmlDocSigOfMethInfo cenv.infoReader range m with | Some (_, docsig) -> docsig | _ -> "" | V v -> match v.DeclaringEntity with | Parent entityRef -> - match SymbolHelpers.GetXmlDocSigOfScopedValRef cenv.g entityRef v with + match GetXmlDocSigOfScopedValRef cenv.g entityRef v with | Some (_, docsig) -> docsig | _ -> "" | ParentNone -> "" diff --git a/tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs b/tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs index f539c4cf7f..35888b58b4 100644 --- a/tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs +++ b/tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs @@ -5018,8 +5018,8 @@ FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlFile: System.String dllName FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlFile: System.String get_dllName() FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlFile: System.String get_xmlSig() FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlFile: System.String xmlSig -FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlText: FSharp.Compiler.Syntax.XmlDoc Item -FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlText: FSharp.Compiler.Syntax.XmlDoc get_Item() +FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlText: FSharp.Compiler.Xml.XmlDoc Item +FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlText: FSharp.Compiler.Xml.XmlDoc get_Item() FSharp.Compiler.Symbols.FSharpXmlDoc+Tags: Int32 FromXmlFile FSharp.Compiler.Symbols.FSharpXmlDoc+Tags: Int32 FromXmlText FSharp.Compiler.Symbols.FSharpXmlDoc+Tags: Int32 None @@ -5033,7 +5033,7 @@ FSharp.Compiler.Symbols.FSharpXmlDoc: Boolean get_IsFromXmlFile() FSharp.Compiler.Symbols.FSharpXmlDoc: Boolean get_IsFromXmlText() FSharp.Compiler.Symbols.FSharpXmlDoc: Boolean get_IsNone() FSharp.Compiler.Symbols.FSharpXmlDoc: FSharp.Compiler.Symbols.FSharpXmlDoc NewFromXmlFile(System.String, System.String) -FSharp.Compiler.Symbols.FSharpXmlDoc: FSharp.Compiler.Symbols.FSharpXmlDoc NewFromXmlText(FSharp.Compiler.Syntax.XmlDoc) +FSharp.Compiler.Symbols.FSharpXmlDoc: FSharp.Compiler.Symbols.FSharpXmlDoc NewFromXmlText(FSharp.Compiler.Xml.XmlDoc) FSharp.Compiler.Symbols.FSharpXmlDoc: FSharp.Compiler.Symbols.FSharpXmlDoc None FSharp.Compiler.Symbols.FSharpXmlDoc: FSharp.Compiler.Symbols.FSharpXmlDoc get_None() FSharp.Compiler.Symbols.FSharpXmlDoc: FSharp.Compiler.Symbols.FSharpXmlDoc+FromXmlFile @@ -5305,12 +5305,12 @@ FSharp.Compiler.Syntax.ParsedImplFileFragment+NamedModule: FSharp.Compiler.Synta FSharp.Compiler.Syntax.ParsedImplFileFragment+NamedModule: FSharp.Compiler.Syntax.SynModuleOrNamespace namedModule FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: Boolean get_isRecursive() FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: Boolean isRecursive -FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: FSharp.Compiler.Syntax.SynModuleOrNamespaceKind get_kind() FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: FSharp.Compiler.Syntax.SynModuleOrNamespaceKind kind FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] get_longId() FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] longId FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes @@ -5328,7 +5328,7 @@ FSharp.Compiler.Syntax.ParsedImplFileFragment: Boolean get_IsNamedModule() FSharp.Compiler.Syntax.ParsedImplFileFragment: Boolean get_IsNamespaceFragment() FSharp.Compiler.Syntax.ParsedImplFileFragment: FSharp.Compiler.Syntax.ParsedImplFileFragment NewAnonModule(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleDecl], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.ParsedImplFileFragment: FSharp.Compiler.Syntax.ParsedImplFileFragment NewNamedModule(FSharp.Compiler.Syntax.SynModuleOrNamespace) -FSharp.Compiler.Syntax.ParsedImplFileFragment: FSharp.Compiler.Syntax.ParsedImplFileFragment NewNamespaceFragment(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Boolean, FSharp.Compiler.Syntax.SynModuleOrNamespaceKind, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleDecl], FSharp.Compiler.Syntax.PreXmlDoc, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.ParsedImplFileFragment: FSharp.Compiler.Syntax.ParsedImplFileFragment NewNamespaceFragment(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Boolean, FSharp.Compiler.Syntax.SynModuleOrNamespaceKind, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleDecl], FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.ParsedImplFileFragment: FSharp.Compiler.Syntax.ParsedImplFileFragment+AnonModule FSharp.Compiler.Syntax.ParsedImplFileFragment: FSharp.Compiler.Syntax.ParsedImplFileFragment+NamedModule FSharp.Compiler.Syntax.ParsedImplFileFragment: FSharp.Compiler.Syntax.ParsedImplFileFragment+NamespaceFragment @@ -5419,12 +5419,12 @@ FSharp.Compiler.Syntax.ParsedSigFileFragment+NamedModule: FSharp.Compiler.Syntax FSharp.Compiler.Syntax.ParsedSigFileFragment+NamedModule: FSharp.Compiler.Syntax.SynModuleOrNamespaceSig namedModule FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: Boolean get_isRecursive() FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: Boolean isRecursive -FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: FSharp.Compiler.Syntax.SynModuleOrNamespaceKind get_kind() FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: FSharp.Compiler.Syntax.SynModuleOrNamespaceKind kind FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] get_longId() FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] longId FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes @@ -5442,7 +5442,7 @@ FSharp.Compiler.Syntax.ParsedSigFileFragment: Boolean get_IsNamedModule() FSharp.Compiler.Syntax.ParsedSigFileFragment: Boolean get_IsNamespaceFragment() FSharp.Compiler.Syntax.ParsedSigFileFragment: FSharp.Compiler.Syntax.ParsedSigFileFragment NewAnonModule(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleSigDecl], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.ParsedSigFileFragment: FSharp.Compiler.Syntax.ParsedSigFileFragment NewNamedModule(FSharp.Compiler.Syntax.SynModuleOrNamespaceSig) -FSharp.Compiler.Syntax.ParsedSigFileFragment: FSharp.Compiler.Syntax.ParsedSigFileFragment NewNamespaceFragment(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Boolean, FSharp.Compiler.Syntax.SynModuleOrNamespaceKind, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleSigDecl], FSharp.Compiler.Syntax.PreXmlDoc, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.ParsedSigFileFragment: FSharp.Compiler.Syntax.ParsedSigFileFragment NewNamespaceFragment(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Boolean, FSharp.Compiler.Syntax.SynModuleOrNamespaceKind, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleSigDecl], FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.ParsedSigFileFragment: FSharp.Compiler.Syntax.ParsedSigFileFragment+AnonModule FSharp.Compiler.Syntax.ParsedSigFileFragment: FSharp.Compiler.Syntax.ParsedSigFileFragment+NamedModule FSharp.Compiler.Syntax.ParsedSigFileFragment: FSharp.Compiler.Syntax.ParsedSigFileFragment+NamespaceFragment @@ -5488,18 +5488,6 @@ FSharp.Compiler.Syntax.ParserDetail: Int32 GetHashCode(System.Collections.IEqual FSharp.Compiler.Syntax.ParserDetail: Int32 Tag FSharp.Compiler.Syntax.ParserDetail: Int32 get_Tag() FSharp.Compiler.Syntax.ParserDetail: System.String ToString() -FSharp.Compiler.Syntax.PreXmlDoc -FSharp.Compiler.Syntax.PreXmlDoc: Boolean Equals(FSharp.Compiler.Syntax.PreXmlDoc) -FSharp.Compiler.Syntax.PreXmlDoc: Boolean Equals(System.Object) -FSharp.Compiler.Syntax.PreXmlDoc: Boolean Equals(System.Object, System.Collections.IEqualityComparer) -FSharp.Compiler.Syntax.PreXmlDoc: FSharp.Compiler.Syntax.PreXmlDoc Create(System.String[], FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.PreXmlDoc: FSharp.Compiler.Syntax.PreXmlDoc Empty -FSharp.Compiler.Syntax.PreXmlDoc: FSharp.Compiler.Syntax.PreXmlDoc Merge(FSharp.Compiler.Syntax.PreXmlDoc, FSharp.Compiler.Syntax.PreXmlDoc) -FSharp.Compiler.Syntax.PreXmlDoc: FSharp.Compiler.Syntax.PreXmlDoc get_Empty() -FSharp.Compiler.Syntax.PreXmlDoc: FSharp.Compiler.Syntax.XmlDoc ToXmlDoc(Boolean, Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.String]]) -FSharp.Compiler.Syntax.PreXmlDoc: Int32 GetHashCode() -FSharp.Compiler.Syntax.PreXmlDoc: Int32 GetHashCode(System.Collections.IEqualityComparer) -FSharp.Compiler.Syntax.PreXmlDoc: System.String ToString() FSharp.Compiler.Syntax.PrettyNaming FSharp.Compiler.Syntax.PrettyNaming: Boolean IsActivePatternName(System.String) FSharp.Compiler.Syntax.PrettyNaming: Boolean IsCompilerGeneratedName(System.String) @@ -5652,9 +5640,7 @@ FSharp.Compiler.Syntax.SynBinding: Boolean isMutable FSharp.Compiler.Syntax.SynBinding: Boolean mustInline FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.DebugPointAtBinding get_seqPoint() FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.DebugPointAtBinding seqPoint -FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc -FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynBinding NewSynBinding(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Syntax.SynBindingKind, Boolean, Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.PreXmlDoc, FSharp.Compiler.Syntax.SynValData, FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynBindingReturnInfo], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtBinding) +FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynBinding NewSynBinding(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Syntax.SynBindingKind, Boolean, Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Syntax.SynValData, FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynBindingReturnInfo], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtBinding) FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynBindingKind get_kind() FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynBindingKind kind FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Syntax.SynExpr expr @@ -5671,6 +5657,8 @@ FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Text.Range get_RangeOfBinding FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Text.Range get_RangeOfHeadPattern() FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynBinding: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynBinding: Int32 Tag FSharp.Compiler.Syntax.SynBinding: Int32 get_Tag() FSharp.Compiler.Syntax.SynBinding: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes @@ -5745,13 +5733,13 @@ FSharp.Compiler.Syntax.SynByteStringKind: System.String ToString() FSharp.Compiler.Syntax.SynComponentInfo FSharp.Compiler.Syntax.SynComponentInfo: Boolean get_preferPostfix() FSharp.Compiler.Syntax.SynComponentInfo: Boolean preferPostfix -FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc -FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Syntax.SynComponentInfo NewSynComponentInfo(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynTyparDecl], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynTypeConstraint], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Syntax.PreXmlDoc, Boolean, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Syntax.SynComponentInfo NewSynComponentInfo(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynTyparDecl], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynTypeConstraint], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Xml.PreXmlDoc, Boolean, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Text.Range Range FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynComponentInfo: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynComponentInfo: Int32 Tag FSharp.Compiler.Syntax.SynComponentInfo: Int32 get_Tag() FSharp.Compiler.Syntax.SynComponentInfo: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] get_longId() @@ -5933,17 +5921,17 @@ FSharp.Compiler.Syntax.SynConst: System.String ToString() FSharp.Compiler.Syntax.SynEnumCase FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.Ident get_ident() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.Ident ident -FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.SynConst get_value() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.SynConst value -FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.SynEnumCase NewSynEnumCase(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.PreXmlDoc, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.SynEnumCase NewSynEnumCase(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range, FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range Range FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range get_valueRange() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range valueRange +FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynEnumCase: Int32 Tag FSharp.Compiler.Syntax.SynEnumCase: Int32 get_Tag() FSharp.Compiler.Syntax.SynEnumCase: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes @@ -5963,15 +5951,15 @@ FSharp.Compiler.Syntax.SynExceptionDefn: Microsoft.FSharp.Collections.FSharpList FSharp.Compiler.Syntax.SynExceptionDefn: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn] members FSharp.Compiler.Syntax.SynExceptionDefn: System.String ToString() FSharp.Compiler.Syntax.SynExceptionDefnRepr -FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc -FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Syntax.SynExceptionDefnRepr NewSynExceptionDefnRepr(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynUnionCase, Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident]], FSharp.Compiler.Syntax.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Syntax.SynExceptionDefnRepr NewSynExceptionDefnRepr(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynUnionCase, Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident]], FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Syntax.SynUnionCase caseName FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Syntax.SynUnionCase get_caseName() FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Text.Range Range FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynExceptionDefnRepr: Int32 Tag FSharp.Compiler.Syntax.SynExceptionDefnRepr: Int32 get_Tag() FSharp.Compiler.Syntax.SynExceptionDefnRepr: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes @@ -6815,13 +6803,13 @@ FSharp.Compiler.Syntax.SynField: Boolean get_isMutable() FSharp.Compiler.Syntax.SynField: Boolean get_isStatic() FSharp.Compiler.Syntax.SynField: Boolean isMutable FSharp.Compiler.Syntax.SynField: Boolean isStatic -FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc -FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Syntax.SynField NewSynField(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Boolean, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Syntax.SynType, Boolean, FSharp.Compiler.Syntax.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Syntax.SynField NewSynField(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Boolean, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Syntax.SynType, Boolean, FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Syntax.SynType fieldType FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Syntax.SynType get_fieldType() FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynField: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynField: Int32 Tag FSharp.Compiler.Syntax.SynField: Int32 get_Tag() FSharp.Compiler.Syntax.SynField: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes @@ -7009,14 +6997,14 @@ FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Boolean get_isStatic() FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Boolean isStatic FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Syntax.Ident get_ident() FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Syntax.Ident ident -FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Syntax.SynExpr get_synExpr() FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Syntax.SynExpr synExpr FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Syntax.SynMemberKind get_propKind() FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Syntax.SynMemberKind propKind FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] get_attributes() FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynMemberKind,FSharp.Compiler.Syntax.SynMemberFlags] get_memberFlags() @@ -7027,12 +7015,12 @@ FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Microsoft.FSharp.Core.FSharpO FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynType] typeOpt FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] getSetRange FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_getSetRange() -FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: FSharp.Compiler.Syntax.SynSimplePats ctorArgs FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: FSharp.Compiler.Syntax.SynSimplePats get_ctorArgs() FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] get_attributes() FSharp.Compiler.Syntax.SynMemberDefn+ImplicitCtor: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident] get_selfIdentifier() @@ -7119,8 +7107,8 @@ FSharp.Compiler.Syntax.SynMemberDefn: Boolean get_IsNestedType() FSharp.Compiler.Syntax.SynMemberDefn: Boolean get_IsOpen() FSharp.Compiler.Syntax.SynMemberDefn: Boolean get_IsValField() FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewAbstractSlot(FSharp.Compiler.Syntax.SynValSig, FSharp.Compiler.Syntax.SynMemberFlags, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewAutoProperty(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Boolean, FSharp.Compiler.Syntax.Ident, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynType], FSharp.Compiler.Syntax.SynMemberKind, Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynMemberKind,FSharp.Compiler.Syntax.SynMemberFlags], FSharp.Compiler.Syntax.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewImplicitCtor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynSimplePats, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Syntax.PreXmlDoc, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewAutoProperty(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Boolean, FSharp.Compiler.Syntax.Ident, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynType], FSharp.Compiler.Syntax.SynMemberKind, Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynMemberKind,FSharp.Compiler.Syntax.SynMemberFlags], FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewImplicitCtor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynSimplePats, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewImplicitInherit(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewInherit(FSharp.Compiler.Syntax.SynType, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewInterface(FSharp.Compiler.Syntax.SynType, Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn]], FSharp.Compiler.Text.Range) @@ -7366,15 +7354,15 @@ FSharp.Compiler.Syntax.SynModuleDecl: System.String ToString() FSharp.Compiler.Syntax.SynModuleOrNamespace FSharp.Compiler.Syntax.SynModuleOrNamespace: Boolean get_isRecursive() FSharp.Compiler.Syntax.SynModuleOrNamespace: Boolean isRecursive -FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc -FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespace NewSynModuleOrNamespace(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Boolean, FSharp.Compiler.Syntax.SynModuleOrNamespaceKind, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleDecl], FSharp.Compiler.Syntax.PreXmlDoc, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespace NewSynModuleOrNamespace(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Boolean, FSharp.Compiler.Syntax.SynModuleOrNamespaceKind, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleDecl], FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespaceKind get_kind() FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespaceKind kind FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Text.Range Range FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynModuleOrNamespace: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynModuleOrNamespace: Int32 Tag FSharp.Compiler.Syntax.SynModuleOrNamespace: Int32 get_Tag() FSharp.Compiler.Syntax.SynModuleOrNamespace: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] get_longId() @@ -7424,15 +7412,15 @@ FSharp.Compiler.Syntax.SynModuleOrNamespaceKind: System.String ToString() FSharp.Compiler.Syntax.SynModuleOrNamespaceSig FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: Boolean get_isRecursive() FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: Boolean isRecursive -FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceKind get_kind() FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceKind kind -FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceSig NewSynModuleOrNamespaceSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Boolean, FSharp.Compiler.Syntax.SynModuleOrNamespaceKind, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleSigDecl], FSharp.Compiler.Syntax.PreXmlDoc, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceSig NewSynModuleOrNamespaceSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], Boolean, FSharp.Compiler.Syntax.SynModuleOrNamespaceKind, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleSigDecl], FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Text.Range Range FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: Int32 Tag FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: Int32 get_Tag() FSharp.Compiler.Syntax.SynModuleOrNamespaceSig: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] get_longId() @@ -8526,15 +8514,15 @@ FSharp.Compiler.Syntax.SynTypeDefnSimpleRepr: System.String ToString() FSharp.Compiler.Syntax.SynUnionCase FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.Ident get_ident() FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.Ident ident -FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc -FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.SynUnionCase NewSynUnionCase(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.SynUnionCaseKind, FSharp.Compiler.Syntax.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.SynUnionCase NewSynUnionCase(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.SynUnionCaseKind, FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.SynUnionCaseKind caseType FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.SynUnionCaseKind get_caseType() FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Text.Range Range FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynUnionCase: Int32 Tag FSharp.Compiler.Syntax.SynUnionCase: Int32 get_Tag() FSharp.Compiler.Syntax.SynUnionCase: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes @@ -8596,8 +8584,6 @@ 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.PreXmlDoc get_xmlDoc() -FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Syntax.PreXmlDoc xmlDoc 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() @@ -8606,13 +8592,15 @@ 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.Syntax.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Text.Range) +FSharp.Compiler.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], 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 FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Text.Range get_RangeOfId() FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Text.Range range +FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Xml.PreXmlDoc get_xmlDoc() +FSharp.Compiler.Syntax.SynValSig: FSharp.Compiler.Xml.PreXmlDoc xmlDoc FSharp.Compiler.Syntax.SynValSig: Int32 Tag FSharp.Compiler.Syntax.SynValSig: Int32 get_Tag() FSharp.Compiler.Syntax.SynValSig: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] attributes @@ -8744,21 +8732,6 @@ FSharp.Compiler.Syntax.TyparStaticReq: Int32 GetHashCode(System.Collections.IEqu FSharp.Compiler.Syntax.TyparStaticReq: Int32 Tag FSharp.Compiler.Syntax.TyparStaticReq: Int32 get_Tag() FSharp.Compiler.Syntax.TyparStaticReq: System.String ToString() -FSharp.Compiler.Syntax.XmlDoc -FSharp.Compiler.Syntax.XmlDoc: Boolean IsEmpty -FSharp.Compiler.Syntax.XmlDoc: Boolean NonEmpty -FSharp.Compiler.Syntax.XmlDoc: Boolean get_IsEmpty() -FSharp.Compiler.Syntax.XmlDoc: Boolean get_NonEmpty() -FSharp.Compiler.Syntax.XmlDoc: FSharp.Compiler.Syntax.XmlDoc Empty -FSharp.Compiler.Syntax.XmlDoc: FSharp.Compiler.Syntax.XmlDoc Merge(FSharp.Compiler.Syntax.XmlDoc, FSharp.Compiler.Syntax.XmlDoc) -FSharp.Compiler.Syntax.XmlDoc: FSharp.Compiler.Syntax.XmlDoc get_Empty() -FSharp.Compiler.Syntax.XmlDoc: FSharp.Compiler.Text.Range Range -FSharp.Compiler.Syntax.XmlDoc: FSharp.Compiler.Text.Range get_Range() -FSharp.Compiler.Syntax.XmlDoc: System.String GetXmlText() -FSharp.Compiler.Syntax.XmlDoc: System.String[] GetElaboratedXmlLines() -FSharp.Compiler.Syntax.XmlDoc: System.String[] UnprocessedLines -FSharp.Compiler.Syntax.XmlDoc: System.String[] get_UnprocessedLines() -FSharp.Compiler.Syntax.XmlDoc: Void .ctor(System.String[], FSharp.Compiler.Text.Range) FSharp.Compiler.Text.ISourceText FSharp.Compiler.Text.ISourceText: Boolean ContentEquals(FSharp.Compiler.Text.ISourceText) FSharp.Compiler.Text.ISourceText: Boolean SubTextEquals(System.String, Int32) @@ -10281,5 +10254,32 @@ FSharp.Compiler.Tokenization.FSharpTokenizerLexState: Int64 PosBits FSharp.Compiler.Tokenization.FSharpTokenizerLexState: Int64 get_OtherBits() FSharp.Compiler.Tokenization.FSharpTokenizerLexState: Int64 get_PosBits() FSharp.Compiler.Tokenization.FSharpTokenizerLexState: System.String ToString() -FSharp.Compiler.Tokenization.FSharpTokenizerLexState: Void .ctor(Int64, Int64)" +FSharp.Compiler.Tokenization.FSharpTokenizerLexState: Void .ctor(Int64, Int64) +FSharp.Compiler.Xml.PreXmlDoc +FSharp.Compiler.Xml.PreXmlDoc: Boolean Equals(FSharp.Compiler.Xml.PreXmlDoc) +FSharp.Compiler.Xml.PreXmlDoc: Boolean Equals(System.Object) +FSharp.Compiler.Xml.PreXmlDoc: Boolean Equals(System.Object, System.Collections.IEqualityComparer) +FSharp.Compiler.Xml.PreXmlDoc: FSharp.Compiler.Xml.PreXmlDoc Create(System.String[], FSharp.Compiler.Text.Range) +FSharp.Compiler.Xml.PreXmlDoc: FSharp.Compiler.Xml.PreXmlDoc Empty +FSharp.Compiler.Xml.PreXmlDoc: FSharp.Compiler.Xml.PreXmlDoc Merge(FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Xml.PreXmlDoc) +FSharp.Compiler.Xml.PreXmlDoc: FSharp.Compiler.Xml.PreXmlDoc get_Empty() +FSharp.Compiler.Xml.PreXmlDoc: FSharp.Compiler.Xml.XmlDoc ToXmlDoc(Boolean, Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[System.String]]) +FSharp.Compiler.Xml.PreXmlDoc: Int32 GetHashCode() +FSharp.Compiler.Xml.PreXmlDoc: Int32 GetHashCode(System.Collections.IEqualityComparer) +FSharp.Compiler.Xml.PreXmlDoc: System.String ToString() +FSharp.Compiler.Xml.XmlDoc +FSharp.Compiler.Xml.XmlDoc: Boolean IsEmpty +FSharp.Compiler.Xml.XmlDoc: Boolean NonEmpty +FSharp.Compiler.Xml.XmlDoc: Boolean get_IsEmpty() +FSharp.Compiler.Xml.XmlDoc: Boolean get_NonEmpty() +FSharp.Compiler.Xml.XmlDoc: FSharp.Compiler.Text.Range Range +FSharp.Compiler.Xml.XmlDoc: FSharp.Compiler.Text.Range get_Range() +FSharp.Compiler.Xml.XmlDoc: FSharp.Compiler.Xml.XmlDoc Empty +FSharp.Compiler.Xml.XmlDoc: FSharp.Compiler.Xml.XmlDoc Merge(FSharp.Compiler.Xml.XmlDoc, FSharp.Compiler.Xml.XmlDoc) +FSharp.Compiler.Xml.XmlDoc: FSharp.Compiler.Xml.XmlDoc get_Empty() +FSharp.Compiler.Xml.XmlDoc: System.String GetXmlText() +FSharp.Compiler.Xml.XmlDoc: System.String[] GetElaboratedXmlLines() +FSharp.Compiler.Xml.XmlDoc: System.String[] UnprocessedLines +FSharp.Compiler.Xml.XmlDoc: System.String[] get_UnprocessedLines() +FSharp.Compiler.Xml.XmlDoc: Void .ctor(System.String[], FSharp.Compiler.Text.Range)" SurfaceArea.verify expected "netstandard" (System.IO.Path.Combine(__SOURCE_DIRECTORY__,__SOURCE_FILE__)) \ No newline at end of file diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index 341f5f236c..17bc0a1e9f 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -1559,7 +1559,7 @@ let ``Test complete active patterns' exact ranges from uses of symbols`` () = match oddActivePatternCase.XmlDoc with | FSharpXmlDoc.FromXmlText t -> t.GetElaboratedXmlLines() |> shouldEqual [|""; "Total active pattern for even/odd integers"; "" |] | _ -> failwith "wrong kind" - oddActivePatternCase.XmlDocSig |> shouldEqual "" + oddActivePatternCase.XmlDocSig |> shouldEqual "M:ActivePatterns.|Even|Odd|(System.Int32)" let oddGroup = oddActivePatternCase.Group oddGroup.IsTotal |> shouldEqual true oddGroup.Names |> Seq.toList |> shouldEqual ["Even"; "Odd"] @@ -1577,7 +1577,7 @@ let ``Test complete active patterns' exact ranges from uses of symbols`` () = t.UnprocessedLines |> shouldEqual [| "Total active pattern for even/odd integers" |] t.GetElaboratedXmlLines() |> shouldEqual [| ""; "Total active pattern for even/odd integers"; "" |] | _ -> failwith "wrong kind" - evenActivePatternCase.XmlDocSig |> shouldEqual "" + evenActivePatternCase.XmlDocSig |> shouldEqual "M:ActivePatterns.|Even|Odd|(System.Int32)" let evenGroup = evenActivePatternCase.Group evenGroup.IsTotal |> shouldEqual true evenGroup.Names |> Seq.toList |> shouldEqual ["Even"; "Odd"] @@ -1625,7 +1625,7 @@ let ``Test partial active patterns' exact ranges from uses of symbols`` () = t.UnprocessedLines |> shouldEqual [| "Partial active pattern for floats" |] t.GetElaboratedXmlLines() |> shouldEqual [| ""; "Partial active pattern for floats"; "" |] | _ -> failwith "wrong kind" - floatActivePatternCase.XmlDocSig |> shouldEqual "" + floatActivePatternCase.XmlDocSig |> shouldEqual "M:ActivePatterns.|Float|_|(System.String)" let floatGroup = floatActivePatternCase.Group floatGroup.IsTotal |> shouldEqual false floatGroup.Names |> Seq.toList |> shouldEqual ["Float"] diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs index 72d7feae3d..c82a299554 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs @@ -1948,8 +1948,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate [ "type KeyCollection<"; "member CopyTo"; - "[Filename:"; "mscorlib.dll]"; - "[Signature:T:System.Collections.Generic.Dictionary`2.KeyCollection]" + """Represents the collection of keys in a . This class cannot be inherited.""" ] ) @@ -1968,8 +1967,7 @@ let f (tp:ITypeProvider(*$$$*)) = tp.Invalidate [ "type ArgumentException"; "member Message"; - "[Filename"; "mscorlib.dll]"; - "[Signature:T:System.ArgumentException]" + "The exception that is thrown when one of the arguments provided to a method is not valid.Gets the current application domain for the current .""" ] ) @@ -2051,8 +2048,7 @@ query." "AcceptButton", (* expect to see in order... *) [ - "[Filename:"; "System.Windows.Forms.dll]" - "[Signature:P:System.Windows.Forms.Form.AcceptButton]" + "Gets or sets the button on the form that is clicked when the user presses the ENTER key." ] ) @@ -2883,7 +2879,7 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker0*)", "Test for members") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker1*)", "x1 param!") - this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker2*)", "[ParamName: arg1]") + this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker2*)", "Concatenates the string representations of two specified objects.") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker3*)", "str of case1") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker4*)", "str of case1") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker5*)", "value param") diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs index 0dff638c88..ea2d28ad60 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs @@ -907,9 +907,7 @@ type UsingMSBuild() as this = let (project, file) = createSingleFileFsxFromLines code MoveCursorToEndOfMarker(file, "System.ConsoleModifiers.Sh") let tooltip = GetQuickInfoAtCursor file - AssertContains(tooltip, @"[Signature:F:System.ConsoleModifiers.Shift]") // A message from the mock IDocumentationBuilder - AssertContains(tooltip, @"[Filename:") - AssertContains(tooltip, @"mscorlib.dll]") // The assembly we expect the documentation to get taken from + AssertContains(tooltip, @"The left or right SHIFT modifier key.") MoveCursorToEndOfMarker(file, "(3).ToString().Len") let tooltip = GetQuickInfoAtCursor file