Skip to content

Commit e5d1bba

Browse files
auduchinoknojaf
authored andcommitted
tmp
1 parent 7bde8b4 commit e5d1bba

File tree

3 files changed

+84
-9
lines changed

3 files changed

+84
-9
lines changed

ReSharper.FSharp/src/FSharp/FSharp.Common/FSharp.Common.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<DisableImplicitFSharpCoreReference>true</DisableImplicitFSharpCoreReference>
1313
<RootNamespace>JetBrains.ReSharper.Plugins.FSharp</RootNamespace>
1414
<AssemblyName>JetBrains.ReSharper.Plugins.FSharp.Common</AssemblyName>
15+
<NoWarn>FS0057</NoWarn>
1516
</PropertyGroup>
1617

1718
<ItemGroup>

ReSharper.FSharp/src/FSharp/FSharp.Common/src/Checker/FcsCheckerService.fs

Lines changed: 75 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Shim.AssemblyReader
2525
open JetBrains.ReSharper.Plugins.FSharp.Util
2626
open JetBrains.ReSharper.Psi
2727
open JetBrains.ReSharper.Psi.CSharp
28+
open JetBrains.ReSharper.Psi.Caches
2829
open JetBrains.ReSharper.Psi.Modules
2930
open JetBrains.ReSharper.Psi.Tree
3031
open JetBrains.ReSharper.Psi.VB
@@ -36,6 +37,7 @@ module FcsCheckerService =
3637
SourceText.ofString(document.GetText())
3738

3839

40+
// add the project key?
3941
type FcsProject =
4042
{ OutputPath: VirtualFileSystemPath
4143
ProjectOptions: FSharpProjectOptions
@@ -74,6 +76,57 @@ type FcsProject =
7476
writer.WriteLine()
7577

7678

79+
[<SolutionComponent>]
80+
type FcsSnapshotCache(fcsProjectProvider: IFcsProjectProvider, locks: IShellLocks) =
81+
let snapshots = Dictionary<FcsProjectKey, FSharpProjectSnapshot>()
82+
83+
let remove (psiModule: IPsiModule) =
84+
let projectKey = FcsProjectKey.Create(psiModule)
85+
snapshots.Remove(projectKey) |> ignore
86+
87+
match fcsProjectProvider.GetReferencedModule(projectKey) with
88+
| None -> ()
89+
| Some referencedModule ->
90+
91+
// todo: recursive update?
92+
for referencingProject in referencedModule.ReferencingProjects do
93+
snapshots.Remove(referencingProject) |> ignore
94+
95+
member this.GetProjectSnapshot(projectKey: FcsProjectKey, options: FSharpProjectOptions) =
96+
// todo: use source files in file snapshots?
97+
lock this (fun _ ->
98+
snapshots.GetOrCreateValue(projectKey, fun (projectKey: FcsProjectKey) ->
99+
FSharpProjectSnapshot.FromOptions(options).RunAsTask()
100+
)
101+
)
102+
103+
interface IPsiSourceFileCache with
104+
member this.MarkAsDirty(sourceFile) =
105+
locks.AssertWriteAccessAllowed()
106+
remove sourceFile.PsiModule
107+
108+
member this.OnDocumentChange(sourceFile, _) =
109+
locks.AssertWriteAccessAllowed()
110+
remove sourceFile.PsiModule
111+
112+
member this.OnPsiChange(elementContainingChanges, _) =
113+
if isNotNull elementContainingChanges then
114+
locks.AssertWriteAccessAllowed()
115+
remove (elementContainingChanges.GetPsiModule())
116+
117+
member this.HasDirtyFiles = false
118+
member this.UpToDate _ = true
119+
member this.SyncUpdate _ = ()
120+
121+
member this.Build(_, _) = null
122+
member this.Drop _ = ()
123+
member this.Dump(_, _) = ()
124+
member this.Load(_, _) = null
125+
member this.Merge(_, _) = ()
126+
member this.MergeLoaded _ = ()
127+
member this.Save(_, _) = ()
128+
129+
77130
[<RequireQualifiedAccess>]
78131
type FcsProjectInvalidationType =
79132
/// Used when invalidation is needed for a project still known to FCS.
@@ -88,14 +141,16 @@ type FcsProjectInvalidationType =
88141
type FcsCheckerService(lifetime: Lifetime, logger: ILogger, onSolutionCloseNotifier: OnSolutionCloseNotifier,
89142
settingsStore: ISettingsStore, locks: IShellLocks, configurations: RunsProducts.ProductConfigurations) =
90143

91-
let checker =
92-
Environment.SetEnvironmentVariable("FCS_CheckFileInProjectCacheSize", "20")
144+
let settingsStoreLive = settingsStore.BindToContextLive(lifetime, ContextRange.ApplicationWide)
93145

94-
let settingsStoreLive = settingsStore.BindToContextLive(lifetime, ContextRange.ApplicationWide)
146+
let getSettingProperty name =
147+
let setting = SettingsUtil.getEntry<FSharpOptions> settingsStore name
148+
settingsStoreLive.GetValueProperty(lifetime, setting, null)
95149

96-
let getSettingProperty name =
97-
let setting = SettingsUtil.getEntry<FSharpOptions> settingsStore name
98-
settingsStoreLive.GetValueProperty(lifetime, setting, null)
150+
let useTransparentCompiler = true //(getSettingProperty "UseTransparentCompiler").Value
151+
152+
let checker =
153+
Environment.SetEnvironmentVariable("FCS_CheckFileInProjectCacheSize", "20")
99154

100155
let skipImpl = getSettingProperty "SkipImplementationAnalysis"
101156
let analyzerProjectReferencesInParallel = getSettingProperty "ParallelProjectReferencesAnalysis"
@@ -106,7 +161,8 @@ type FcsCheckerService(lifetime: Lifetime, logger: ILogger, onSolutionCloseNotif
106161
keepAllBackgroundResolutions = false,
107162
keepAllBackgroundSymbolUses = false,
108163
enablePartialTypeChecking = skipImpl.Value,
109-
parallelReferenceResolution = analyzerProjectReferencesInParallel.Value)
164+
parallelReferenceResolution = analyzerProjectReferencesInParallel.Value,
165+
useTransparentCompiler = useTransparentCompiler)
110166

111167
checker
112168

@@ -174,8 +230,19 @@ type FcsCheckerService(lifetime: Lifetime, logger: ILogger, onSolutionCloseNotif
174230
let source = FcsCheckerService.getSourceText sourceFile.Document
175231
logger.Trace("ParseAndCheckFile: start {0}, {1}", path, opName)
176232

233+
let getParseAndCheckResults () =
234+
if useTransparentCompiler then
235+
let projectKey = FcsProjectKey.Create(psiModule)
236+
let fcsSnapshotCache = sourceFile.GetSolution().GetComponent<FcsSnapshotCache>()
237+
let snapshot = fcsSnapshotCache.GetProjectSnapshot(projectKey, options)
238+
match x.Checker.ParseAndCheckFileInProject(path, snapshot).RunAsTask() with
239+
| _, FSharpCheckFileAnswer.Aborted -> None
240+
| parseFileResults, FSharpCheckFileAnswer.Succeeded checkFileResults -> Some(parseFileResults, checkFileResults)
241+
else
242+
x.Checker.ParseAndCheckDocument(path, source, options, allowStaleResults, opName).RunAsTask()
243+
177244
// todo: don't cancel the computation when file didn't change
178-
match x.Checker.ParseAndCheckDocument(path, source, options, allowStaleResults, opName).RunAsTask() with
245+
match getParseAndCheckResults () with
179246
| Some (parseResults, checkResults) ->
180247
logger.Trace("ParseAndCheckFile: finish {0}, {1}", path, opName)
181248
Some { ParseResults = parseResults; CheckResults = checkResults }

ReSharper.FSharp/src/FSharp/FSharp.Common/src/Settings/FSharpOptions.fs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module FSharpOptions =
2929
let [<Literal>] nonFSharpProjectInMemoryReferences = "Analyze C# and VB.NET project references in-memory"
3030
let [<Literal>] outOfScopeCompletion = "Enable out of scope items completion"
3131
let [<Literal>] topLevelOpenCompletion = "Add 'open' declarations to top level module or namespace"
32+
let [<Literal>] useTransparentCompilerDescription = "Use TransparentCompiler"
3233

3334

3435
[<SettingsKey(typeof<FSharpSettings>, "FSharpOptions")>]
@@ -46,7 +47,10 @@ type FSharpOptions =
4647
mutable EnableOutOfScopeCompletion: bool
4748

4849
[<SettingsEntry(true, topLevelOpenCompletion); DefaultValue>]
49-
mutable TopLevelOpenCompletion: bool }
50+
mutable TopLevelOpenCompletion: bool
51+
52+
[<SettingsEntry(false, useTransparentCompilerDescription)>]
53+
mutable UseTransparentCompiler: bool }
5054

5155
type FantomasLocationSettings =
5256
| AutoDetected = 0
@@ -155,6 +159,9 @@ type FSharpOptionsProvider(lifetime, solution, settings, settingsSchema) =
155159
member val NonFSharpProjectInMemoryReferences =
156160
base.GetValueProperty<bool>("NonFSharpProjectInMemoryReferences").Value with get, set
157161

162+
member val UseTransparentCompiler =
163+
base.GetValueProperty<bool>("UseTransparentCompiler").Value
164+
158165
member this.UpdateAssemblyReaderSetting() =
159166
this.NonFSharpProjectInMemoryReferences <-
160167
base.GetValueProperty<bool>("NonFSharpProjectInMemoryReferences").Value

0 commit comments

Comments
 (0)