Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#编译器服务:获取作用域中可见的名称列表_F#_F# Compiler Services - Fatal编程技术网

F#编译器服务:获取作用域中可见的名称列表

F#编译器服务:获取作用域中可见的名称列表,f#,f#-compiler-services,F#,F# Compiler Services,如何获得FSC作用域中可见的名称列表? 我试过这个: #r "../../packages/FSharp.Compiler.Service.16.0.2/lib/net45/FSharp.Compiler.Service.dll" open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.SourceCodeServices do let file = "TestFileName.fsx" let checke

如何获得FSC作用域中可见的名称列表? 我试过这个:

#r "../../packages/FSharp.Compiler.Service.16.0.2/lib/net45/FSharp.Compiler.Service.dll"
open Microsoft.FSharp.Compiler
open Microsoft.FSharp.Compiler.SourceCodeServices

do 
    let file = "TestFileName.fsx"
    let checker = SourceCodeServices.FSharpChecker.Create()

    let code = 
        """
let testStr = "x"
t
"""
    async{  
        let! options, _ = checker.GetProjectOptionsFromScript(file,code)
        let! parseRes,checkAnser = checker.ParseAndCheckFileInProject(file, 0, code, options)                               
        match checkAnser with
        | FSharpCheckFileAnswer.Succeeded checkRes ->
            let! decls =
                checkRes.GetDeclarationListInfo(
                    Some parseRes,  //ParsedFileResultsOpt
                    3 ,              //line
                    1 ,              //colAtEndOfPartialName
                    "t" ,            //lineText
                    [ "t" ] ,        //qualifyingNames
                    "" ,             //partialName
                    ( fun _ -> [] )  //getAllSymbols: (unit -> AssemblySymbol list) 
                    )

            if Seq.isEmpty decls.Items then 
                printfn "*no declarations found*" 
            else
                decls.Items 
                |> Seq.sortBy (fun d -> d.Name) 
                |> Seq.truncate 10 
                |> Seq.iter (fun d -> printfn "decl: %s" d.Name)

        | _ -> failwithf "*Parsing did not finish... "        
        } |> Async.RunSynchronously
但它只打印“未找到声明”。我期望的不仅是
testStr
,还有默认情况下可用的所有其他名称。
我没有在中找到示例。

限定名称应为空列表,它用于点分隔前缀,不包括最后一个(可能是部分)标识。然而,在FCS中没有一种方法可以返回未过滤的范围名称列表,但添加一个列表却非常容易。

根据vasily kirichenko的回答,并使用当前的FCS 17.0.1,我提出了以下解决方案:

#r "../../packages/FSharp.Compiler.Service.17.0.1/lib/net45/FSharp.Compiler.Service.dll"
open Microsoft.FSharp.Compiler
open Microsoft.FSharp.Compiler.SourceCodeServices

do 
    let file = "TestFileName.fsx"
    let checker = SourceCodeServices.FSharpChecker.Create()

    let code = 
        """
let testStr = "x"
testStr.
"""
    async{  
        let! options, _ = checker.GetProjectOptionsFromScript(file,code)
        let! parseRes,checkAnser = checker.ParseAndCheckFileInProject(file, 0, code, options)                               
        match checkAnser with
        | FSharpCheckFileAnswer.Succeeded checkRes ->
            let! decls =
                let partialName = PartialLongName.Empty 6 //use any location before before the dot to get all declarations in scope
                //let partialName = PartialLongName.Empty 7 //use the loacation of the dot (7) to get memebers of string
                checkRes.GetDeclarationListInfo(
                    Some parseRes,  // ParsedFileResultsOpt
                    3 ,             // line                   
                    "testStr." ,    // lineText
                    partialName,    // PartialLongName
                    ( fun _ -> [] ) // getAllSymbols: (unit -> AssemblySymbol list) 
                    )

            if Seq.isEmpty decls.Items then 
                printfn "*no declarations found*" 
            else
                decls.Items 
                |> Seq.sortBy (fun d -> d.Name) 
                |> Seq.truncate 10 
                |> Seq.iter (fun d -> printfn "decl: %s" d.Name)


        | _ -> failwithf "*Parsing did not finish... "        
        } |> Async.RunSynchronously