From 5f122c361b5b724dd56533036d435344a2517a65 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sun, 17 Sep 2017 20:17:06 +0300 Subject: [PATCH 1/3] Do not infer record fields if the LRH type is already known (#3584) * do not infer record fields if the LRH type is already known * update tests * fix ResolveExprDotLongIdent * Revert "update tests" This reverts commit 03dcb7ba24f64e0ff571027d76b6b186473ec8c0. * add a test and code style --- src/fsharp/NameResolution.fs | 33 ++++++++++++++------------ tests/fsharp/tests.fs | 3 +++ tests/fsharp/typecheck/sigs/neg101.bsl | 2 ++ tests/fsharp/typecheck/sigs/neg101.fs | 9 +++++++ 4 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 tests/fsharp/typecheck/sigs/neg101.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg101.fs diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 3a191ec961a..cc50d5bb15d 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -3123,21 +3123,25 @@ let private ResolveExprDotLongIdent (ncenv:NameResolver) m ad nenv typ lid findF let typeNameResInfo = TypeNameResolutionInfo.Default let adhoctDotSearchAccessible = AtMostOneResult m (ResolveLongIdentInTypePrim ncenv nenv LookupKind.Expr ResolutionInfo.Empty 1 m ad lid findFlag typeNameResInfo typ) match adhoctDotSearchAccessible with - | Exception _ -> + | Exception _ -> // If the dot is not resolved by adhoc overloading then look for a record field // that can resolve the name. - let dotFieldIdSearch = - match lid with - // A unique record label access, e.g expr.field - | id::rest when nenv.eFieldLabels.ContainsKey(id.idText) -> - match nenv.eFieldLabels.[id.idText] with - | [] -> NoResultsOrUsefulErrors - | rfref :: _ -> - // NOTE (instantiationGenerator cleanup): we need to freshen here because we don't know the type. - // But perhaps the caller should freshen?? - let item = FreshenRecdFieldRef ncenv m rfref - OneSuccess (ResolutionInfo.Empty,item,rest) - | _ -> NoResultsOrUsefulErrors + let dotFieldIdSearch = + // If the type is already known, we should not try to lookup a record field + if isAppTy ncenv.g typ then + NoResultsOrUsefulErrors + else + match lid with + // A unique record label access, e.g expr.field + | id::rest when nenv.eFieldLabels.ContainsKey(id.idText) -> + match nenv.eFieldLabels.[id.idText] with + | [] -> NoResultsOrUsefulErrors + | rfref :: _ -> + // NOTE (instantiationGenerator cleanup): we need to freshen here because we don't know the type. + // But perhaps the caller should freshen?? + let item = FreshenRecdFieldRef ncenv m rfref + OneSuccess (ResolutionInfo.Empty,item,rest) + | _ -> NoResultsOrUsefulErrors let search = dotFieldIdSearch match AtMostOneResult m search with @@ -3145,8 +3149,7 @@ let private ResolveExprDotLongIdent (ncenv:NameResolver) m ad nenv typ lid findF | _ -> let adhocDotSearchAll = ResolveLongIdentInTypePrim ncenv nenv LookupKind.Expr ResolutionInfo.Empty 1 m AccessibleFromSomeFSharpCode lid findFlag typeNameResInfo typ ForceRaise (AtMostOneResult m (search +++ adhocDotSearchAll)) - - | Result _ -> + | _ -> ForceRaise adhoctDotSearchAccessible let ComputeItemRange wholem (lid: Ident list) rest = diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 9c8088a493a..8f8d0cd3dc1 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -2154,6 +2154,9 @@ module TypecheckTests = let cfg = { cfg with fsc_flags = cfg.fsc_flags + " --warnon:3218" } singleNegTest cfg "neg100" + [] + let ``type check neg101`` () = singleNegTest (testConfig "typecheck/sigs") "neg101" + [] let ``type check neg_byref_1`` () = singleNegTest (testConfig "typecheck/sigs") "neg_byref_1" diff --git a/tests/fsharp/typecheck/sigs/neg101.bsl b/tests/fsharp/typecheck/sigs/neg101.bsl new file mode 100644 index 00000000000..65e8cf1fd44 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg101.bsl @@ -0,0 +1,2 @@ + +neg101.fs(7,11,7,14): typecheck error FS0039: The field, constructor or member 'Foo' is not defined. \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg101.fs b/tests/fsharp/typecheck/sigs/neg101.fs new file mode 100644 index 00000000000..482d68a2f40 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg101.fs @@ -0,0 +1,9 @@ + +module M + +type MyRec = { Foo: string } + +let x: int = 1 +let y = x.Foo +let f1 z = z.Foo +let f2 (z: MyRec) = z.Foo From f52362ad50e51f897d2b624adecc8c15cab56fbe Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sun, 17 Sep 2017 10:18:10 -0700 Subject: [PATCH 2/3] Silverlight is not a thing (#3598) --- .../Vsix/RegisterFsharpPackage.pkgdef | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/vsintegration/Vsix/RegisterFsharpPackage.pkgdef b/vsintegration/Vsix/RegisterFsharpPackage.pkgdef index 824490807ca..156ece7c238 100644 --- a/vsintegration/Vsix/RegisterFsharpPackage.pkgdef +++ b/vsintegration/Vsix/RegisterFsharpPackage.pkgdef @@ -12,26 +12,6 @@ "{7651a701-06e5-11d1-8ebd-00a0c90f26ea}"="" "{7651a703-06e5-11d1-8ebd-00a0c90f26ea}"="" -[$RootKey$\Projects\{A1591282-1198-4647-A2B1-27E5FF5F6F3B}\LanguageTemplates] -"{F2A71F9B-5D33-465A-A702-920D77279786}"="{76B279E8-36ED-494E-B145-5344F8DEFCB6}" - -[$RootKey$\Projects\{349C5851-65DF-11DA-9384-00065B846F21}\LanguageTemplates] -"{F2A71F9B-5D33-465A-A702-920D77279786}"="{76B279E8-36ED-494E-B145-5344F8DEFCB6}" - -[$RootKey$\Projects\{76B279E8-36ED-494E-B145-5344F8DEFCB6}] -"Language(VsTemplate)"="FSharp" -"Package"="{91A04A73-4F2C-4E7C-AD38-C1A68E7DA05C}" -"ShowOnlySpecifiedTemplates(VsTemplate)"="00000000" -"TemplateGroupIDs(VsTemplate)"="Silverlight" -@="F# Silverlight Project Templates" - -[$RootKey$\Projects\{76B279E8-36ED-494E-B145-5344F8DEFCB6}\SilverlightProperties] -"CodeFileExtension"=".fs" -"TemplateFolder"="FSharp" -"DefaultProjectTemplate"="SilverlightLibrary\SilverlightLibrary.vstemplate" -"LanguageDisplayString"="Visual F#" -"PropertyPagesToRemove"="{6D2D9B56-2691-4624-A1BF-D07A14594748};{9CFBEB2A-6824-43e2-BD3B-B112FEBC3772}" - [$RootKey$\InstalledProducts\Microsoft Visual F#] "Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" "ProductDetails"="#9002" From 194fa62b3ec2fc228af0d491c85bb413f0802fdb Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Tue, 19 Sep 2017 10:09:56 -0700 Subject: [PATCH 3/3] Fix for: 3596 --- [.NET Framework Projects] IDE is confused about the last file to compile (#3603) --- .../FSharp.Editor/LanguageService/LanguageService.fs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 0b2d64bccb9..29658d69a56 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -273,9 +273,13 @@ type internal FSharpProjectOptionsManager } member this.UpdateProjectInfoWithProjectId(projectId:ProjectId, userOpName) = - let project = workspace.CurrentSolution.GetProject(projectId) - let siteProvider = this.ProvideProjectSiteProvider(project) - this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, siteProvider.GetProjectSite(), userOpName) + let hier = workspace.GetHierarchy(projectId) + match hier with + | h when (h.IsCapabilityMatch("CPS")) -> + let project = workspace.CurrentSolution.GetProject(projectId) + let siteProvider = this.ProvideProjectSiteProvider(project) + this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, siteProvider.GetProjectSite(), userOpName) + | _ -> () member this.UpdateProjectInfoWithPath(path, userOpName) = let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(path, projectDisplayNameOf path)