TransparentCompiler: scripts read #load'ed files through the global FileSystem, and DocumentSource.Custom gives new versions on every call

Ouverte
#20,750 1 commentaire 1 réaction 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 2 jours

Personne n'a encore pris cette issue.

Évaluation

Difficulté
5/5
Temps estimé
Plus d'une semaine
Accessibilité débutants
8/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
Active
Domaine
compilers, devtools

Piste de recherche

Start with GetProjectSnapshotFromScript in src/Compiler/Service/service.fs, then the version logic in CreateFromDocumentSource in FSharpProjectSnapshot.fs and the None fallback in FSharpSource.fs. The issue asks maintainers to choose between several designs, so there is no single fix to make yet. Done means a decision on the API shape and a stable version scheme, with the TransparentCompiler caching and script #load behaviour covered by tests.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Needs-Triage

FsAutoComplete installs a process-wide FileSystemAutoOpens.FileSystem shim so FCS reads the in-memory text of open files. We would like to stop doing that and give each checker its own view of the files (ionide/FsAutoComplete#1555). With the TransparentCompiler, project files already come from snapshots we build ourselves. Scripts are the part that still goes through the global file system, and the per-checker alternative, DocumentSource.Custom, does not work well there yet.

Links are to main at 409c7a62.

1. GetProjectSnapshotFromScript ignores the checker's document source

FSharpChecker.GetProjectSnapshotFromScript falls back to DocumentSource.FileSystem when no documentSource is passed, also when the checker was created with DocumentSource.Custom (service.fs#L533). The TransparentCompiler's GetProjectOptionsFromScript always passes DocumentSource.FileSystem (TransparentCompiler.fs#L2377). So the files a script #loads are read through the global file system (FSharpProjectSnapshot.fs#L81-L89).

2. A custom document source gives every file snapshot a new version

FSharpFileSnapshot.CreateFromDocumentSource uses DateTime.Now.Ticks as the version (FSharpProjectSnapshot.fs#L95). Each call creates new versions for files that did not change, so the TransparentCompiler caches miss. This happens for:

3. None from a custom document source throws

When the function returns None, CreateFromDocumentSource fails with "Couldn't get source for file" (FSharpProjectSnapshot.fs#L104). The BackgroundCompiler reads the file from disk in that case (FSharpSource.fs#L69-L77). An editor only knows the text of its open files, so with the TransparentCompiler it has to read every other file itself.

Possible changes
  • Use the checker's document source in GetProjectSnapshotFromScript when none is passed.
  • Let a custom source return a version with the text, or use a stable version, for example the last write time for files read from disk.
  • Treat None as "read from the file system", as the BackgroundCompiler does.
  • Or, for the snapshot API: let the caller create the snapshots of the #loaded files (a string -> Async<FSharpFileSnapshot> callback), as it already does for project files.

documentSource on FSharpChecker.Create is marked experimental and "likely to be removed in the future" (service.fsi#L53). If that is still the plan, which way should an editor give the TransparentCompiler the text of open files that a script #loads?

Langage dominant
F#
Étoiles
4.3k
Forks
884
Merge moyen
2 j 11 h
PR mergées (30 j)
73

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de dotnet/fsharp

Toutes les issues de dotnet/fsharp

Issues similaires

Plus d'issues Compilers

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.