anchor.diff:              | None -> None
   
       member x.GetDependentProjects (dte: DTE) (projects: IProjectProvider list) =
  -        let projectFileNames = projects |> List.map (fun p -> p.ProjectFileName.ToLower()) |> set
  +        let projectFileNames = projects |> List.map (fun p -> p.ProjectFileName.ToLowerInvariant()) |> set
           x.ListFSharpProjectsInSolution dte
           |> Seq.map x.CreateForProject
           |> Seq.filter (fun p -> 
               p.GetReferencedProjects() 
               |> List.exists (fun p -> 
  -                projectFileNames |> Set.contains (p.ProjectFileName.ToLower())))
  +                projectFileNames |> Set.contains (p.ProjectFileName.ToLowerInvariant())))
           |> Seq.append projects
  -        |> Seq.distinctBy (fun p -> p.ProjectFileName.ToLower())
  +        |> Seq.distinctBy (fun p -> p.ProjectFileName.ToLowerInvariant())
           |> Seq.toList
   
       interface IDisposable with
           member __.Dispose() = 
               (solutionBuildEventListener :> IDisposable).Dispose()
  -
  -
  -type BasicProjectFactory(events: EnvDTE80.Events2) =
  -    let fsharpProjectsCache = ref None
  -    let cache = Cache<ProjectUniqueName, ProjectProvider>()
  -
  -    let onProjectChanged (project: Project) = 
  -        debug "[ProjectFactory] %s changed." project.Name
  -        cache.Remove project.FullName
  -
  -    do events.SolutionEvents.add_AfterClosing (fun _ -> 
  -        fsharpProjectsCache := None
  -        cache.Clear())
  -
  -    member __.ListFSharpProjectsInSolution(dte: DTE) =
  -        let rec handleProject (p: Project) =
  -            if p === null then []
  -            elif isFSharpProject p then [ p ]
  -            elif p.Kind = EnvDTE80.ProjectKinds.vsProjectKindSolutionFolder then handleProjectItems p.ProjectItems
  -            else []
  -        
  -        and handleProjectItems (items: ProjectItems) = 
  -            [ for pi in items do
  -                    yield! handleProject pi.SubProject ]
  -
  -        match !fsharpProjectsCache with
  -        | Some x -> x
  -        | None ->
  -            let res = [ for p in dte.Solution.Projects do
  -                            yield! handleProject p ]
  -            fsharpProjectsCache := Some res
  -            res
  -
  -    member x.CreateForProject(project: Project): IProjectProvider = 
  -        cache.Get project.FullName (fun _ ->
  -            new ProjectProvider (project, x.CreateForProject, onProjectChanged, id)) :> _
  
positive.code:                     let allProjects = x.ListFSharpProjectsInSolution dte |> List.map x.CreateForProject
                      let allProjectFileNames =
                          lazy (allProjects |> List.map (fun p -> Path.GetFullPathSafe(p.ProjectFileName)))
                      Debug.Assert(allProjectFileNames.Value |> List.exists (fun projectFileName -> Path.GetFullPathSafe(currentProject.ProjectFileName) = projectFileName), 
                          sprintf "Current project '%s' should appear in the project list '%A'." currentProject.ProjectFileName allProjectFileNames.Value)
                      match allProjects |> List.filter (fun p -> p.SourceFiles |> Array.exists ((=) filePath)) with
                      | [] -> None
  
negative.code:             fsharpProjectsCache := Some res
              res
  
      member x.GetSymbolDeclarationLocation (symbol: FSharpSymbol) (currentFile: FilePath) (currentProject: IProjectProvider) =
          Debug.Assert(currentProject.SourceFiles |> Array.exists ((=) currentFile), 
              sprintf "Current file '%s' should be included in current project '%A'." currentFile currentProject.SourceFiles)
          let isPrivateToFile = 
  