├── .gitattributes ├── .github └── ISSUE_TEMPLATE.md ├── .gitignore ├── .ionide.debug ├── .paket ├── paket.bootstrapper.exe └── paket.targets ├── .travis.yml ├── FsInteractiveService.sln ├── LICENSE.txt ├── README.md ├── RELEASE_NOTES.md ├── appveyor.yml ├── build.cmd ├── build.fsx ├── build.sh ├── docs ├── content │ ├── htmlprinter.fsx │ ├── http.fsx │ ├── index.fsx │ └── intelli.fsx ├── files │ └── img │ │ ├── atom.png │ │ ├── logo-template.pdn │ │ └── logo.png └── tools │ ├── generate.fsx │ └── templates │ └── template.cshtml ├── paket.dependencies ├── paket.lock ├── src ├── FsInteractiveService.Shared │ ├── AssemblyInfo.fs │ ├── Completions.fs │ ├── Extensions.fs │ ├── FSharpSymbolHelper.fs │ ├── FsInteractiveService.Shared.fsproj │ ├── KeywordList.fs │ ├── Lexer.fs │ ├── ParameterHinting.fs │ ├── Parser.fs │ ├── paket.references │ └── paket.template └── FsInteractiveService │ ├── App.config │ ├── AssemblyInfo.fs │ ├── FsInteractiveService.fsproj │ ├── Main.fs │ ├── paket.references │ └── paket.template └── tests └── FsInteractiveService.Tests ├── App.config ├── FsInteractiveService.Tests.fsproj ├── Tests.fs └── paket.references /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp text=auto eol=lf 6 | *.vb diff=csharp text=auto eol=lf 7 | *.fs diff=csharp text=auto eol=lf 8 | *.fsi diff=csharp text=auto eol=lf 9 | *.fsx diff=csharp text=auto eol=lf 10 | *.sln text eol=crlf merge=union 11 | *.csproj merge=union 12 | *.vbproj merge=union 13 | *.fsproj merge=union 14 | *.dbproj merge=union 15 | 16 | # Standard to msysgit 17 | *.doc diff=astextplain 18 | *.DOC diff=astextplain 19 | *.docx diff=astextplain 20 | *.DOCX diff=astextplain 21 | *.dot diff=astextplain 22 | *.DOT diff=astextplain 23 | *.pdf diff=astextplain 24 | *.PDF diff=astextplain 25 | *.rtf diff=astextplain 26 | *.RTF diff=astextplain 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Description 2 | 3 | Please provide a succinct description of your issue. 4 | 5 | ### Repro steps 6 | 7 | Please provide the steps required to reproduce the problem 8 | 9 | 1. Step A 10 | 11 | 2. Step B 12 | 13 | ### Expected behavior 14 | 15 | Please provide a description of the behavior you expect. 16 | 17 | ### Actual behavior 18 | 19 | Please provide a description of the actual behavior you observe. 20 | 21 | ### Known workarounds 22 | 23 | Please provide a description of any known workarounds. 24 | 25 | ### Related information 26 | 27 | * Operating system 28 | * Branch 29 | * .NET Runtime, CoreCLR or Mono Version 30 | * Performance information, links to performance testing scripts 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.sln.docstates 8 | 9 | # Xamarin Studio / monodevelop user-specific 10 | *.userprefs 11 | *.dll.mdb 12 | *.exe.mdb 13 | 14 | # Build results 15 | 16 | [Dd]ebug/ 17 | [Rr]elease/ 18 | x64/ 19 | build/ 20 | [Bb]in/ 21 | [Oo]bj/ 22 | 23 | # MSTest test Results 24 | [Tt]est[Rr]esult*/ 25 | [Bb]uild[Ll]og.* 26 | 27 | *_i.c 28 | *_p.c 29 | *.ilk 30 | *.meta 31 | *.obj 32 | *.pch 33 | *.pdb 34 | *.pgc 35 | *.pgd 36 | *.rsp 37 | *.sbr 38 | *.tlb 39 | *.tli 40 | *.tlh 41 | *.tmp 42 | *.tmp_proj 43 | *.log 44 | *.vspscc 45 | *.vssscc 46 | .builds 47 | *.pidb 48 | *.log 49 | *.scc 50 | 51 | # Visual C++ cache files 52 | ipch/ 53 | *.aps 54 | *.ncb 55 | *.opensdf 56 | *.sdf 57 | *.cachefile 58 | 59 | # Visual Studio profiler 60 | *.psess 61 | *.vsp 62 | *.vspx 63 | 64 | # Other Visual Studio data 65 | .vs/ 66 | 67 | # Guidance Automation Toolkit 68 | *.gpState 69 | 70 | # ReSharper is a .NET coding add-in 71 | _ReSharper*/ 72 | *.[Rr]e[Ss]harper 73 | 74 | # TeamCity is a build add-in 75 | _TeamCity* 76 | 77 | # DotCover is a Code Coverage Tool 78 | *.dotCover 79 | 80 | # NCrunch 81 | *.ncrunch* 82 | .*crunch*.local.xml 83 | 84 | # Installshield output folder 85 | [Ee]xpress/ 86 | 87 | # DocProject is a documentation generator add-in 88 | DocProject/buildhelp/ 89 | DocProject/Help/*.HxT 90 | DocProject/Help/*.HxC 91 | DocProject/Help/*.hhc 92 | DocProject/Help/*.hhk 93 | DocProject/Help/*.hhp 94 | DocProject/Help/Html2 95 | DocProject/Help/html 96 | 97 | # Click-Once directory 98 | publish/ 99 | 100 | # Publish Web Output 101 | *.Publish.xml 102 | 103 | # Enable nuget.exe in the .nuget folder (though normally executables are not tracked) 104 | !.nuget/NuGet.exe 105 | 106 | # Windows Azure Build Output 107 | csx 108 | *.build.csdef 109 | 110 | # Windows Store app package directory 111 | AppPackages/ 112 | 113 | # Others 114 | sql/ 115 | *.Cache 116 | ClientBin/ 117 | [Ss]tyle[Cc]op.* 118 | ~$* 119 | *~ 120 | *.dbmdl 121 | *.[Pp]ublish.xml 122 | *.pfx 123 | *.publishsettings 124 | 125 | # RIA/Silverlight projects 126 | Generated_Code/ 127 | 128 | # Backup & report files from converting an old project file to a newer 129 | # Visual Studio version. Backup files are not needed, because we have git ;-) 130 | _UpgradeReport_Files/ 131 | Backup*/ 132 | UpgradeLog*.XML 133 | UpgradeLog*.htm 134 | 135 | # SQL Server files 136 | App_Data/*.mdf 137 | App_Data/*.ldf 138 | 139 | 140 | #LightSwitch generated files 141 | GeneratedArtifacts/ 142 | _Pvt_Extensions/ 143 | ModelManifest.xml 144 | 145 | # ========================= 146 | # Windows detritus 147 | # ========================= 148 | 149 | # Windows image file caches 150 | Thumbs.db 151 | ehthumbs.db 152 | 153 | # Folder config file 154 | Desktop.ini 155 | 156 | # Recycle Bin used on file shares 157 | $RECYCLE.BIN/ 158 | 159 | # Mac desktop service store files 160 | .DS_Store 161 | 162 | # =================================================== 163 | # Exclude F# project specific directories and files 164 | # =================================================== 165 | 166 | # NuGet Packages Directory 167 | packages/ 168 | 169 | # Generated documentation folder 170 | docs/output/ 171 | 172 | # Temp folder used for publishing docs 173 | temp/ 174 | 175 | # Test results produced by build 176 | TestResults.xml 177 | 178 | # Nuget outputs 179 | nuget/*.nupkg 180 | release.cmd 181 | release.sh 182 | localpackages/ 183 | paket-files 184 | *.orig 185 | .paket/paket.exe 186 | docs/content/license.md 187 | docs/content/release-notes.md 188 | .fake 189 | docs/tools/FSharp.Formatting.svclog 190 | TestResult.xml 191 | *.bak 192 | lib -------------------------------------------------------------------------------- /.ionide.debug: -------------------------------------------------------------------------------- 1 | [20:05:11] SERVICE 2 | Sending request: [object Object] 3 | [20:05:14] SERVICE 4 | Sending request: [object Object] 5 | [20:05:18] SERVICE 6 | Got 'errors': [object Object] 7 | [20:05:18] SERVICE 8 | Sending request: [object Object] 9 | [20:05:18] SERVICE 10 | Got 'errors': [object Object] 11 | [20:05:18] SERVICE 12 | Sending request: [object Object] 13 | [20:05:18] SERVICE 14 | Got 'lint': [object Object] 15 | [20:05:18] SERVICE 16 | Got 'lint': [object Object] 17 | [20:22:48] SERVICE 18 | Sending request: [object Object] 19 | [20:22:48] SERVICE 20 | Sending request: [object Object] 21 | [20:22:48] SERVICE 22 | Sending request: [object Object] 23 | [20:22:49] SERVICE 24 | Got 'error': [object Object] 25 | [20:22:49] SERVICE 26 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\docs\\content\\index.fsx' not parsed"}': [object Object] 27 | [20:22:49] SERVICE 28 | Sending request: [object Object] 29 | [20:22:49] SERVICE 30 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\docs\\content\\index.fsx' not parsed"}': [object Object] 31 | [20:22:49] SERVICE 32 | Got 'error': [object Object] 33 | [20:22:49] SERVICE 34 | Got 'error': [object Object] 35 | [20:22:49] SERVICE 36 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\docs\\content\\index.fsx' not parsed"}': [object Object] 37 | [20:22:49] SERVICE 38 | Got 'errors': [object Object] 39 | [20:22:49] SERVICE 40 | Sending request: [object Object] 41 | [20:22:49] SERVICE 42 | Got 'lint': [object Object] 43 | [20:22:51] SERVICE 44 | Sending request: [object Object] 45 | [20:22:51] SERVICE 46 | Sending request: [object Object] 47 | [20:22:51] SERVICE 48 | Sending request: [object Object] 49 | [20:22:51] SERVICE 50 | Got 'errors': [object Object] 51 | [20:22:51] SERVICE 52 | Sending request: [object Object] 53 | [20:22:51] SERVICE 54 | Got 'lint': [object Object] 55 | [20:22:51] SERVICE 56 | Got 'info': [object Object] 57 | [20:22:51] SERVICE 58 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 59 | [20:22:51] SERVICE 60 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 61 | [20:22:51] SERVICE 62 | Got 'info': [object Object] 63 | [20:22:51] SERVICE 64 | Sending request: [object Object] 65 | [20:22:51] SERVICE 66 | Sending request: [object Object] 67 | [20:22:51] SERVICE 68 | Got 'info': [object Object] 69 | [20:22:51] SERVICE 70 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 71 | [20:22:51] SERVICE 72 | Got 'info': [object Object] 73 | [20:22:51] SERVICE 74 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 75 | [20:22:52] SERVICE 76 | Sending request: [object Object] 77 | [20:22:52] SERVICE 78 | Sending request: [object Object] 79 | [20:22:52] SERVICE 80 | Got 'info': [object Object] 81 | [20:22:52] SERVICE 82 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 83 | [20:22:52] SERVICE 84 | Got 'info': [object Object] 85 | [20:22:52] SERVICE 86 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 87 | [20:22:52] SERVICE 88 | Sending request: [object Object] 89 | [20:22:52] SERVICE 90 | Sending request: [object Object] 91 | [20:22:52] SERVICE 92 | Got 'info': [object Object] 93 | [20:22:52] SERVICE 94 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 95 | [20:22:52] SERVICE 96 | Got 'info': [object Object] 97 | [20:22:52] SERVICE 98 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 99 | [20:22:52] SERVICE 100 | Sending request: [object Object] 101 | [20:22:52] SERVICE 102 | Sending request: [object Object] 103 | [20:22:52] SERVICE 104 | Got 'info': [object Object] 105 | [20:22:52] SERVICE 106 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 107 | [20:22:52] SERVICE 108 | Got 'info': [object Object] 109 | [20:22:52] SERVICE 110 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 111 | [20:22:53] SERVICE 112 | Sending request: [object Object] 113 | [20:22:53] SERVICE 114 | Sending request: [object Object] 115 | [20:22:53] SERVICE 116 | Sending request: [object Object] 117 | [20:22:53] SERVICE 118 | Got 'info': [object Object] 119 | [20:22:53] SERVICE 120 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 121 | [20:22:53] SERVICE 122 | Got 'info': [object Object] 123 | [20:22:53] SERVICE 124 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 125 | [20:22:53] SERVICE 126 | Got 'errors': [object Object] 127 | [20:22:53] SERVICE 128 | Sending request: [object Object] 129 | [20:22:53] SERVICE 130 | Got 'lint': [object Object] 131 | [20:22:53] SERVICE 132 | Sending request: [object Object] 133 | [20:22:53] SERVICE 134 | Sending request: [object Object] 135 | [20:22:53] SERVICE 136 | Got 'info': [object Object] 137 | [20:22:53] SERVICE 138 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 139 | [20:22:53] SERVICE 140 | Got 'info': [object Object] 141 | [20:22:53] SERVICE 142 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 143 | [20:22:54] SERVICE 144 | Sending request: [object Object] 145 | [20:22:54] SERVICE 146 | Sending request: [object Object] 147 | [20:22:54] SERVICE 148 | Sending request: [object Object] 149 | [20:22:54] SERVICE 150 | Got 'info': [object Object] 151 | [20:22:54] SERVICE 152 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 153 | [20:22:54] SERVICE 154 | Got 'info': [object Object] 155 | [20:22:54] SERVICE 156 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 157 | [20:22:54] SERVICE 158 | Got 'errors': [object Object] 159 | [20:22:54] SERVICE 160 | Sending request: [object Object] 161 | [20:22:54] SERVICE 162 | Got 'lint': [object Object] 163 | [20:22:55] SERVICE 164 | Sending request: [object Object] 165 | [20:22:55] SERVICE 166 | Sending request: [object Object] 167 | [20:22:55] SERVICE 168 | Got 'info': [object Object] 169 | [20:22:55] SERVICE 170 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 171 | [20:22:55] SERVICE 172 | Got 'info': [object Object] 173 | [20:22:55] SERVICE 174 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 175 | [20:22:55] SERVICE 176 | Sending request: [object Object] 177 | [20:22:55] SERVICE 178 | Sending request: [object Object] 179 | [20:22:55] SERVICE 180 | Sending request: [object Object] 181 | [20:22:55] SERVICE 182 | Got 'info': [object Object] 183 | [20:22:55] SERVICE 184 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 185 | [20:22:55] SERVICE 186 | Got 'info': [object Object] 187 | [20:22:55] SERVICE 188 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 189 | [20:22:55] SERVICE 190 | Got 'errors': [object Object] 191 | [20:22:55] SERVICE 192 | Sending request: [object Object] 193 | [20:22:55] SERVICE 194 | Got 'lint': [object Object] 195 | [20:22:55] SERVICE 196 | Sending request: [object Object] 197 | [20:22:55] SERVICE 198 | Sending request: [object Object] 199 | [20:22:55] SERVICE 200 | Got 'info': [object Object] 201 | [20:22:55] SERVICE 202 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 203 | [20:22:55] SERVICE 204 | Got 'info': [object Object] 205 | [20:22:55] SERVICE 206 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 207 | [20:22:56] SERVICE 208 | Sending request: [object Object] 209 | [20:22:56] SERVICE 210 | Sending request: [object Object] 211 | [20:22:56] SERVICE 212 | Sending request: [object Object] 213 | [20:22:56] SERVICE 214 | Got 'info': [object Object] 215 | [20:22:56] SERVICE 216 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 217 | [20:22:56] SERVICE 218 | Sending request: [object Object] 219 | [20:22:56] SERVICE 220 | Got 'info': [object Object] 221 | [20:22:56] SERVICE 222 | Received info event '{"Kind":"info","Data":"No symbol information found"}': [object Object] 223 | [20:22:56] SERVICE 224 | Got 'errors': [object Object] 225 | [20:22:56] SERVICE 226 | Sending request: [object Object] 227 | [20:22:56] SERVICE 228 | Got 'errors': [object Object] 229 | [20:22:56] SERVICE 230 | Sending request: [object Object] 231 | [20:22:56] SERVICE 232 | Got 'lint': [object Object] 233 | [20:22:56] SERVICE 234 | Got 'lint': [object Object] 235 | [20:22:56] SERVICE 236 | Sending request: [object Object] 237 | [20:22:56] SERVICE 238 | Got 'errors': [object Object] 239 | [20:22:56] SERVICE 240 | Sending request: [object Object] 241 | [20:22:56] SERVICE 242 | Got 'lint': [object Object] 243 | [20:22:58] SERVICE 244 | Sending request: [object Object] 245 | [20:22:58] SERVICE 246 | Sending request: [object Object] 247 | [20:22:58] SERVICE 248 | Got 'info': [object Object] 249 | [20:22:58] SERVICE 250 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 251 | [20:22:58] SERVICE 252 | Got 'info': [object Object] 253 | [20:22:58] SERVICE 254 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 255 | [20:27:53] SERVICE 256 | Sending request: [object Object] 257 | [20:27:54] SERVICE 258 | Sending request: [object Object] 259 | [20:27:54] SERVICE 260 | Sending request: [object Object] 261 | [20:27:54] SERVICE 262 | Sending request: [object Object] 263 | [20:27:54] SERVICE 264 | Got 'error': [object Object] 265 | [20:27:54] SERVICE 266 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 267 | [20:27:54] SERVICE 268 | Got 'error': [object Object] 269 | [20:27:54] SERVICE 270 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 271 | [20:27:54] SERVICE 272 | Got 'error': [object Object] 273 | [20:27:54] SERVICE 274 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 275 | [20:27:55] SERVICE 276 | Sending request: [object Object] 277 | [20:27:55] SERVICE 278 | Got 'error': [object Object] 279 | [20:27:55] SERVICE 280 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 281 | [20:27:55] SERVICE 282 | Sending request: [object Object] 283 | [20:27:55] SERVICE 284 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 285 | [20:27:55] SERVICE 286 | Sending request: [object Object] 287 | [20:27:55] SERVICE 288 | Got 'error': [object Object] 289 | [20:27:55] SERVICE 290 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 291 | [20:27:55] SERVICE 292 | Got 'error': [object Object] 293 | [20:27:55] SERVICE 294 | Sending request: [object Object] 295 | [20:27:55] SERVICE 296 | Sending request: [object Object] 297 | [20:27:55] SERVICE 298 | Got 'error': [object Object] 299 | [20:27:55] SERVICE 300 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 301 | [20:27:55] SERVICE 302 | Got 'error': [object Object] 303 | [20:27:55] SERVICE 304 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 305 | [20:27:56] SERVICE 306 | Sending request: [object Object] 307 | [20:27:56] SERVICE 308 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 309 | [20:27:56] SERVICE 310 | Got 'error': [object Object] 311 | [20:27:56] SERVICE 312 | Sending request: [object Object] 313 | [20:27:56] SERVICE 314 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 315 | [20:27:56] SERVICE 316 | Got 'error': [object Object] 317 | [20:27:57] SERVICE 318 | Sending request: [object Object] 319 | [20:27:57] SERVICE 320 | Sending request: [object Object] 321 | [20:27:57] SERVICE 322 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 323 | [20:27:57] SERVICE 324 | Got 'error': [object Object] 325 | [20:27:57] SERVICE 326 | Sending request: [object Object] 327 | [20:27:57] SERVICE 328 | Got 'error': [object Object] 329 | [20:27:57] SERVICE 330 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 331 | [20:27:59] SERVICE 332 | Got 'errors': [object Object] 333 | [20:27:59] SERVICE 334 | Sending request: [object Object] 335 | [20:27:59] SERVICE 336 | Got 'errors': [object Object] 337 | [20:27:59] SERVICE 338 | Sending request: [object Object] 339 | [20:27:59] SERVICE 340 | Got 'lint': [object Object] 341 | [20:27:59] SERVICE 342 | Got 'lint': [object Object] 343 | [20:28:46] SERVICE 344 | Sending request: [object Object] 345 | [20:28:47] SERVICE 346 | Got 'tooltip': [object Object] 347 | [20:30:34] SERVICE 348 | Sending request: [object Object] 349 | [20:30:34] SERVICE 350 | Got 'info': [object Object] 351 | [20:30:34] SERVICE 352 | Received info event '{"Kind":"info","Data":"No tooltip information"}': [object Object] 353 | [20:31:04] SERVICE 354 | Sending request: [object Object] 355 | [20:31:04] SERVICE 356 | Got 'info': [object Object] 357 | [20:31:04] SERVICE 358 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 359 | [20:31:49] SERVICE 360 | Sending request: [object Object] 361 | [20:31:49] SERVICE 362 | Sending request: [object Object] 363 | [20:31:49] SERVICE 364 | Sending request: [object Object] 365 | [20:31:49] SERVICE 366 | Sending request: [object Object] 367 | [20:31:49] SERVICE 368 | Sending request: [object Object] 369 | [20:31:49] SERVICE 370 | Sending request: [object Object] 371 | [20:31:49] SERVICE 372 | Got 'error': [object Object] 373 | [20:31:49] SERVICE 374 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 375 | [20:31:49] SERVICE 376 | Got 'error': [object Object] 377 | [20:31:49] SERVICE 378 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 379 | [20:31:49] SERVICE 380 | Got 'error': [object Object] 381 | [20:31:49] SERVICE 382 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 383 | [20:31:49] SERVICE 384 | Got 'error': [object Object] 385 | [20:31:49] SERVICE 386 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 387 | [20:31:49] SERVICE 388 | Got 'error': [object Object] 389 | [20:31:49] SERVICE 390 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 391 | [20:31:50] SERVICE 392 | Sending request: [object Object] 393 | [20:31:50] SERVICE 394 | Sending request: [object Object] 395 | [20:31:50] SERVICE 396 | Got 'error': [object Object] 397 | [20:31:50] SERVICE 398 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 399 | [20:31:50] SERVICE 400 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 401 | [20:31:50] SERVICE 402 | Got 'error': [object Object] 403 | [20:31:51] SERVICE 404 | Sending request: [object Object] 405 | [20:31:51] SERVICE 406 | Got 'error': [object Object] 407 | [20:31:51] SERVICE 408 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 409 | [20:31:51] SERVICE 410 | Sending request: [object Object] 411 | [20:31:51] SERVICE 412 | Sending request: [object Object] 413 | [20:31:51] SERVICE 414 | Got 'error': [object Object] 415 | [20:31:51] SERVICE 416 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 417 | [20:31:51] SERVICE 418 | Got 'error': [object Object] 419 | [20:31:51] SERVICE 420 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 421 | [20:31:52] SERVICE 422 | Sending request: [object Object] 423 | [20:31:52] SERVICE 424 | Sending request: [object Object] 425 | [20:31:52] SERVICE 426 | Got 'error': [object Object] 427 | [20:31:52] SERVICE 428 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 429 | [20:31:52] SERVICE 430 | Got 'error': [object Object] 431 | [20:31:52] SERVICE 432 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 433 | [20:31:52] SERVICE 434 | Sending request: [object Object] 435 | [20:31:52] SERVICE 436 | Sending request: [object Object] 437 | [20:31:52] SERVICE 438 | Got 'error': [object Object] 439 | [20:31:52] SERVICE 440 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 441 | [20:31:52] SERVICE 442 | Got 'error': [object Object] 443 | [20:31:52] SERVICE 444 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 445 | [20:31:53] SERVICE 446 | Sending request: [object Object] 447 | [20:31:53] SERVICE 448 | Sending request: [object Object] 449 | [20:31:53] SERVICE 450 | Got 'error': [object Object] 451 | [20:31:53] SERVICE 452 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 453 | [20:31:53] SERVICE 454 | Got 'error': [object Object] 455 | [20:31:53] SERVICE 456 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 457 | [20:31:54] SERVICE 458 | Got 'errors': [object Object] 459 | [20:31:54] SERVICE 460 | Sending request: [object Object] 461 | [20:31:54] SERVICE 462 | Got 'lint': [object Object] 463 | [20:31:56] SERVICE 464 | Sending request: [object Object] 465 | [20:31:56] SERVICE 466 | Sending request: [object Object] 467 | [20:31:56] SERVICE 468 | Got 'info': [object Object] 469 | [20:31:56] SERVICE 470 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 471 | [20:31:56] SERVICE 472 | Got 'info': [object Object] 473 | [20:31:56] SERVICE 474 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 475 | [20:31:58] SERVICE 476 | Sending request: [object Object] 477 | [20:31:58] SERVICE 478 | Sending request: [object Object] 479 | [20:31:58] SERVICE 480 | Got 'info': [object Object] 481 | [20:31:58] SERVICE 482 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 483 | [20:31:58] SERVICE 484 | Got 'info': [object Object] 485 | [20:31:58] SERVICE 486 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 487 | [20:31:59] SERVICE 488 | Sending request: [object Object] 489 | [20:31:59] SERVICE 490 | Sending request: [object Object] 491 | [20:31:59] SERVICE 492 | Got 'info': [object Object] 493 | [20:31:59] SERVICE 494 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 495 | [20:31:59] SERVICE 496 | Got 'info': [object Object] 497 | [20:31:59] SERVICE 498 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 499 | [20:32:01] SERVICE 500 | Sending request: [object Object] 501 | [20:32:01] SERVICE 502 | Sending request: [object Object] 503 | [20:32:01] SERVICE 504 | Got 'info': [object Object] 505 | [20:32:01] SERVICE 506 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 507 | [20:32:01] SERVICE 508 | Got 'info': [object Object] 509 | [20:32:01] SERVICE 510 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 511 | [20:32:01] SERVICE 512 | Sending request: [object Object] 513 | [20:32:01] SERVICE 514 | Got 'info': [object Object] 515 | [20:32:01] SERVICE 516 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 517 | [20:32:04] SERVICE 518 | Sending request: [object Object] 519 | [20:32:04] SERVICE 520 | Sending request: [object Object] 521 | [20:32:04] SERVICE 522 | Got 'info': [object Object] 523 | [20:32:04] SERVICE 524 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 525 | [20:32:04] SERVICE 526 | Got 'info': [object Object] 527 | [20:32:04] SERVICE 528 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 529 | [20:32:05] SERVICE 530 | Sending request: [object Object] 531 | [20:32:05] SERVICE 532 | Sending request: [object Object] 533 | [20:32:05] SERVICE 534 | Got 'info': [object Object] 535 | [20:32:05] SERVICE 536 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 537 | [20:32:05] SERVICE 538 | Got 'info': [object Object] 539 | [20:32:05] SERVICE 540 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 541 | [20:32:08] SERVICE 542 | Sending request: [object Object] 543 | [20:32:08] SERVICE 544 | Sending request: [object Object] 545 | [20:32:08] SERVICE 546 | Sending request: [object Object] 547 | [20:32:08] SERVICE 548 | Got 'info': [object Object] 549 | [20:32:08] SERVICE 550 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 551 | [20:32:08] SERVICE 552 | Got 'info': [object Object] 553 | [20:32:08] SERVICE 554 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 555 | [20:32:08] SERVICE 556 | Got 'errors': [object Object] 557 | [20:32:08] SERVICE 558 | Sending request: [object Object] 559 | [20:32:08] SERVICE 560 | Got 'lint': [object Object] 561 | [20:32:09] SERVICE 562 | Sending request: [object Object] 563 | [20:32:09] SERVICE 564 | Sending request: [object Object] 565 | [20:32:09] SERVICE 566 | Sending request: [object Object] 567 | [20:32:09] SERVICE 568 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 569 | [20:32:09] SERVICE 570 | Got 'info': [object Object] 571 | [20:32:09] SERVICE 572 | Got 'info': [object Object] 573 | [20:32:09] SERVICE 574 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 575 | [20:32:09] SERVICE 576 | Got 'errors': [object Object] 577 | [20:32:09] SERVICE 578 | Sending request: [object Object] 579 | [20:32:09] SERVICE 580 | Got 'lint': [object Object] 581 | [20:32:10] SERVICE 582 | Sending request: [object Object] 583 | [20:32:10] SERVICE 584 | Sending request: [object Object] 585 | [20:32:10] SERVICE 586 | Got 'info': [object Object] 587 | [20:32:10] SERVICE 588 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 589 | [20:32:10] SERVICE 590 | Got 'info': [object Object] 591 | [20:32:10] SERVICE 592 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 593 | [20:32:11] SERVICE 594 | Sending request: [object Object] 595 | [20:32:11] SERVICE 596 | Sending request: [object Object] 597 | [20:32:11] SERVICE 598 | Got 'info': [object Object] 599 | [20:32:11] SERVICE 600 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 601 | [20:32:11] SERVICE 602 | Got 'info': [object Object] 603 | [20:32:11] SERVICE 604 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 605 | [20:32:11] SERVICE 606 | Sending request: [object Object] 607 | [20:32:11] SERVICE 608 | Received info event '{"Kind":"info","Data":"Cannot find ident for tooltip"}': [object Object] 609 | [20:32:11] SERVICE 610 | Got 'info': [object Object] 611 | [20:32:11] SERVICE 612 | Sending request: [object Object] 613 | [20:32:11] SERVICE 614 | Got 'info': [object Object] 615 | [20:32:11] SERVICE 616 | Received info event '{"Kind":"info","Data":"No ident at this location"}': [object Object] 617 | [20:32:11] SERVICE 618 | Sending request: [object Object] 619 | [20:32:11] SERVICE 620 | Got 'errors': [object Object] 621 | [20:32:11] SERVICE 622 | Sending request: [object Object] 623 | [20:32:11] SERVICE 624 | Got 'lint': [object Object] 625 | [23:42:08] SERVICE 626 | Sending request: [object Object] 627 | [23:42:08] SERVICE 628 | Sending request: [object Object] 629 | [23:42:08] SERVICE 630 | Sending request: [object Object] 631 | [23:42:09] SERVICE 632 | Sending request: [object Object] 633 | [23:42:09] SERVICE 634 | Sending request: [object Object] 635 | [23:42:09] SERVICE 636 | Got 'error': [object Object] 637 | [23:42:09] SERVICE 638 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 639 | [23:42:09] SERVICE 640 | Got 'error': [object Object] 641 | [23:42:09] SERVICE 642 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 643 | [23:42:09] SERVICE 644 | Got 'error': [object Object] 645 | [23:42:09] SERVICE 646 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 647 | [23:42:09] SERVICE 648 | Got 'error': [object Object] 649 | [23:42:09] SERVICE 650 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 651 | [23:42:09] SERVICE 652 | Got 'error': [object Object] 653 | [23:42:09] SERVICE 654 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 655 | [23:42:09] SERVICE 656 | Sending request: [object Object] 657 | [23:42:09] SERVICE 658 | Sending request: [object Object] 659 | [23:42:09] SERVICE 660 | Got 'error': [object Object] 661 | [23:42:09] SERVICE 662 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 663 | [23:42:09] SERVICE 664 | Sending request: [object Object] 665 | [23:42:09] SERVICE 666 | Got 'error': [object Object] 667 | [23:42:09] SERVICE 668 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 669 | [23:42:09] SERVICE 670 | Got 'error': [object Object] 671 | [23:42:09] SERVICE 672 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 673 | [23:42:09] SERVICE 674 | Sending request: [object Object] 675 | [23:42:10] SERVICE 676 | Sending request: [object Object] 677 | [23:42:10] SERVICE 678 | Sending request: [object Object] 679 | [23:42:10] SERVICE 680 | Got 'error': [object Object] 681 | [23:42:10] SERVICE 682 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 683 | [23:42:10] SERVICE 684 | Got 'error': [object Object] 685 | [23:42:10] SERVICE 686 | Received error event '{"Kind":"error","Data":"File 'C:\\Tomas\\Public\\ionide\\FsInteractiveService\\build.fsx' not parsed"}': [object Object] 687 | [23:42:14] SERVICE 688 | Got 'errors': [object Object] 689 | [23:42:14] SERVICE 690 | Sending request: [object Object] 691 | [23:42:15] SERVICE 692 | Got 'lint': [object Object] 693 | [23:42:23] SERVICE 694 | Sending request: [object Object] 695 | [23:42:23] SERVICE 696 | Sending request: [object Object] 697 | [23:42:23] SERVICE 698 | Sending request: [object Object] 699 | -------------------------------------------------------------------------------- /.paket/paket.bootstrapper.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionide/FsInteractiveService/55713d70a34d5846df57dfd4fb00fe546b94d2c2/.paket/paket.bootstrapper.exe -------------------------------------------------------------------------------- /.paket/paket.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | true 6 | 7 | true 8 | $(MSBuildThisFileDirectory) 9 | $(MSBuildThisFileDirectory)..\ 10 | 11 | 12 | 13 | $(PaketToolsPath)paket.exe 14 | $(PaketToolsPath)paket.bootstrapper.exe 15 | "$(PaketExePath)" 16 | mono --runtime=v4.0.30319 "$(PaketExePath)" 17 | "$(PaketBootStrapperExePath)" 18 | mono --runtime=v4.0.30319 $(PaketBootStrapperExePath) 19 | 20 | $(PaketCommand) restore 21 | $(PaketBootStrapperCommand) 22 | 23 | RestorePackages; $(BuildDependsOn); 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: csharp 2 | 3 | sudo: false # use the new container-based Travis infrastructure 4 | 5 | before_install: 6 | - chmod +x build.sh 7 | 8 | script: 9 | - ./build.sh All 10 | -------------------------------------------------------------------------------- /FsInteractiveService.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio 14 3 | VisualStudioVersion = 14.0.23107.0 4 | MinimumVisualStudioVersion = 10.0.40219.1 5 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".paket", ".paket", "{63297B98-5CED-492C-A5B7-A5B4F73CF142}" 6 | ProjectSection(SolutionItems) = preProject 7 | paket.dependencies = paket.dependencies 8 | paket.lock = paket.lock 9 | EndProjectSection 10 | EndProject 11 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}" 12 | EndProject 13 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsInteractiveService", "src\FsInteractiveService\FsInteractiveService.fsproj", "{020F5F39-566E-4604-8DF0-3274671000AF}" 14 | EndProject 15 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{BF60BC93-E09B-4E5F-9D85-95A519479D54}" 16 | ProjectSection(SolutionItems) = preProject 17 | build.fsx = build.fsx 18 | README.md = README.md 19 | RELEASE_NOTES.md = RELEASE_NOTES.md 20 | EndProjectSection 21 | EndProject 22 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{83F16175-43B1-4C90-A1EE-8E351C33435D}" 23 | ProjectSection(SolutionItems) = preProject 24 | docs\tools\generate.fsx = docs\tools\generate.fsx 25 | docs\tools\templates\template.cshtml = docs\tools\templates\template.cshtml 26 | EndProjectSection 27 | EndProject 28 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "content", "content", "{8E6D5255-776D-4B61-85F9-73C37AA1FB9A}" 29 | ProjectSection(SolutionItems) = preProject 30 | docs\content\htmlprinter.fsx = docs\content\htmlprinter.fsx 31 | docs\content\http.fsx = docs\content\http.fsx 32 | docs\content\index.fsx = docs\content\index.fsx 33 | docs\content\intelli.fsx = docs\content\intelli.fsx 34 | EndProjectSection 35 | EndProject 36 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{ED8079DD-2B06-4030-9F0F-DC548F98E1C4}" 37 | EndProject 38 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsInteractiveService.Tests", "tests\FsInteractiveService.Tests\FsInteractiveService.Tests.fsproj", "{51C80AEF-D584-4E95-991C-FD713A004C3B}" 39 | EndProject 40 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsInteractiveService.Shared", "src\FsInteractiveService.Shared\FsInteractiveService.Shared.fsproj", "{AF5FEAD5-B50E-4F07-A274-32F23D5C504D}" 41 | EndProject 42 | Global 43 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 44 | Debug|Any CPU = Debug|Any CPU 45 | Release|Any CPU = Release|Any CPU 46 | EndGlobalSection 47 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 48 | {020F5F39-566E-4604-8DF0-3274671000AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 49 | {020F5F39-566E-4604-8DF0-3274671000AF}.Debug|Any CPU.Build.0 = Debug|Any CPU 50 | {020F5F39-566E-4604-8DF0-3274671000AF}.Release|Any CPU.ActiveCfg = Release|Any CPU 51 | {020F5F39-566E-4604-8DF0-3274671000AF}.Release|Any CPU.Build.0 = Release|Any CPU 52 | {51C80AEF-D584-4E95-991C-FD713A004C3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 53 | {51C80AEF-D584-4E95-991C-FD713A004C3B}.Debug|Any CPU.Build.0 = Debug|Any CPU 54 | {51C80AEF-D584-4E95-991C-FD713A004C3B}.Release|Any CPU.ActiveCfg = Release|Any CPU 55 | {51C80AEF-D584-4E95-991C-FD713A004C3B}.Release|Any CPU.Build.0 = Release|Any CPU 56 | {AF5FEAD5-B50E-4F07-A274-32F23D5C504D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 57 | {AF5FEAD5-B50E-4F07-A274-32F23D5C504D}.Debug|Any CPU.Build.0 = Debug|Any CPU 58 | {AF5FEAD5-B50E-4F07-A274-32F23D5C504D}.Release|Any CPU.ActiveCfg = Release|Any CPU 59 | {AF5FEAD5-B50E-4F07-A274-32F23D5C504D}.Release|Any CPU.Build.0 = Release|Any CPU 60 | EndGlobalSection 61 | GlobalSection(SolutionProperties) = preSolution 62 | HideSolutionNode = FALSE 63 | EndGlobalSection 64 | GlobalSection(NestedProjects) = preSolution 65 | {83F16175-43B1-4C90-A1EE-8E351C33435D} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1} 66 | {8E6D5255-776D-4B61-85F9-73C37AA1FB9A} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1} 67 | {51C80AEF-D584-4E95-991C-FD713A004C3B} = {ED8079DD-2B06-4030-9F0F-DC548F98E1C4} 68 | EndGlobalSection 69 | EndGlobal 70 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Travis build status](https://travis-ci.org/ionide/FsInteractiveService.png)](https://travis-ci.org/ionide/FsInteractiveService) 2 | 3 | # FsInteractiveService 4 | 5 | The FsInteractiveService project provides a simple layer over the F# Interactive services 6 | from the [F# Compiler Services project](http://fsharp.github.io/FSharp.Compiler.Services). It makes the 7 | service available as a stand-alone process that can be started and called via HTTP requests. It is very 8 | similar to the [FsAutoComplete](https://github.com/fsharp/FsAutoComplete/) project, which provides similar 9 | out-of-process wrapper for F# Compiler IDE services. 10 | 11 | The FsInteractiveService project can be used to build F# Interactive editor integration for editors 12 | that are not based on .NET such as Atom. 13 | 14 | Documentation 15 | ------------- 16 | 17 | * [F# Interactive Service home](http://ionide.io/FsInteractiveService) is the homepage for the project. 18 | Go here to get started with FsInteractiveService. 19 | 20 | * [Creating HTML printers](http://ionide.io/FsInteractiveService/htmlprinter.html) discusses an extension that 21 | F# Interactive Service provides for formatting values as HTML objects. This can be done by registering a 22 | printer using `fsi.AddHtmlPrinter`. 23 | 24 | * [Evaluating snippets via HTTP API](http://ionide.io/FsInteractiveService/http.html) shows how to start the 25 | `FsInteractiveService.exe` process in background and how to communicate with it using REST-based API over 26 | network. It shows different commands you can send and responses you'll get back. 27 | 28 | * [Getting IntelliSense info via HTTP PI](http://ionide.io/FsInteractiveService/intelli.html) discusses 29 | IntelliSense functionality exposed by the `FsInteractiveService.exe` process. This lets you get auto-completion 30 | in F# Interactive, access tooltips for objects in completion lists and get hints on method parameters. 31 | -------------------------------------------------------------------------------- /RELEASE_NOTES.md: -------------------------------------------------------------------------------- 1 | #### 0.2.1 - June 7, 2016 2 | * ILRepack Newtonsoft.Json (to avoid loading it twice when used by users) 3 | * Use renamed version of Suave to avoid assembly loading clashes 4 | 5 | #### 0.2.0 - May 31, 2016 6 | * Change AddHtmlPrinter to support FsLab Journal integration 7 | 8 | #### 0.1.2 - May 23, 2016 9 | * Updated GitHub release 10 | 11 | #### 0.1.0 - May 23, 2016 12 | * Initial release of the FsInteractiveService NuGet package 13 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | init: 2 | - git config --global core.autocrlf input 3 | build_script: 4 | - cmd: build.cmd 5 | test: off 6 | version: 0.0.1.{build} 7 | artifacts: 8 | - path: bin 9 | name: bin 10 | -------------------------------------------------------------------------------- /build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | cls 3 | 4 | .paket\paket.bootstrapper.exe prerelease 5 | if errorlevel 1 ( 6 | exit /b %errorlevel% 7 | ) 8 | 9 | .paket\paket.exe restore 10 | if errorlevel 1 ( 11 | exit /b %errorlevel% 12 | ) 13 | 14 | IF NOT EXIST build.fsx ( 15 | .paket\paket.exe update 16 | packages\build\FAKE\tools\FAKE.exe init.fsx 17 | ) 18 | packages\build\FAKE\tools\FAKE.exe build.fsx %* 19 | -------------------------------------------------------------------------------- /build.fsx: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------- 2 | // FAKE build script 3 | // -------------------------------------------------------------------------------------- 4 | 5 | #r @"packages/build/FAKE/tools/FakeLib.dll" 6 | #r @"packages/build/Mono.Cecil/lib/net45/Mono.Cecil.dll" 7 | open Fake 8 | open Fake.Git 9 | open Fake.AssemblyInfoFile 10 | open Fake.ReleaseNotesHelper 11 | open Fake.UserInputHelper 12 | open System 13 | open System.IO 14 | open Mono.Cecil 15 | #if MONO 16 | #else 17 | #load "packages/build/SourceLink.Fake/tools/Fake.fsx" 18 | open SourceLink 19 | #endif 20 | 21 | // -------------------------------------------------------------------------------------- 22 | // START TODO: Provide project-specific details below 23 | // -------------------------------------------------------------------------------------- 24 | 25 | // Information about the project are used 26 | // - for version and project name in generated AssemblyInfo file 27 | // - by the generated NuGet package 28 | // - to run tests and to publish documentation on GitHub gh-pages 29 | // - for documentation, you also need to edit info in "docs/tools/generate.fsx" 30 | 31 | // The name of the project 32 | // (used by attributes in AssemblyInfo, name of a NuGet package and directory in 'src') 33 | let project = "FsInteractiveService" 34 | 35 | // Short summary of the project 36 | // (used as description in AssemblyInfo and as a short summary for NuGet package) 37 | let summary = "F# interactive service API exposed via a lightweight HTTP server" 38 | 39 | // Longer description of the project 40 | // (used as a description for NuGet package; line breaks are automatically cleaned up) 41 | let description = "F# interactive API exposed via a lightweight HTTP server" 42 | 43 | // List of author names (for NuGet package) 44 | let authors = [ "Tomas Petricek" ] 45 | 46 | // Tags for your project (for NuGet package) 47 | let tags = "fsi interactive fsharp f# service" 48 | 49 | // Pattern specifying assemblies to be tested using NUnit 50 | let testAssemblies = "tests/**/bin/Release/*Tests*.dll" 51 | 52 | // Git configuration (used for publishing documentation in gh-pages branch) 53 | // The profile where the project is posted 54 | let gitOwner = "ionide" 55 | let gitHome = "https://github.com/" + gitOwner 56 | 57 | // The name of the project on GitHub 58 | let gitName = "FsInteractiveService" 59 | 60 | // The url for the raw files hosted 61 | let gitRaw = environVarOrDefault "gitRaw" "https://raw.github.com/ionide" 62 | 63 | // -------------------------------------------------------------------------------------- 64 | // END TODO: The rest of the file includes standard build steps 65 | // -------------------------------------------------------------------------------------- 66 | 67 | // Read additional information from the release notes document 68 | System.Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ 69 | let release = LoadReleaseNotes "RELEASE_NOTES.md" 70 | 71 | // Helper active pattern for project types 72 | let (|Fsproj|Csproj|Vbproj|Shproj|) (projFileName:string) = 73 | match projFileName with 74 | | f when f.EndsWith("fsproj") -> Fsproj 75 | | f when f.EndsWith("csproj") -> Csproj 76 | | f when f.EndsWith("vbproj") -> Vbproj 77 | | f when f.EndsWith("shproj") -> Shproj 78 | | _ -> failwith (sprintf "Project file %s not supported. Unknown project type." projFileName) 79 | 80 | // Generate assembly info files with the right version & up-to-date information 81 | Target "AssemblyInfo" (fun _ -> 82 | let getAssemblyInfoAttributes projectName = 83 | [ Attribute.Title (projectName) 84 | Attribute.Product project 85 | Attribute.Description summary 86 | Attribute.Version release.AssemblyVersion 87 | Attribute.FileVersion release.AssemblyVersion ] 88 | 89 | let getProjectDetails projectPath = 90 | let projectName = System.IO.Path.GetFileNameWithoutExtension(projectPath) 91 | ( projectPath, 92 | projectName, 93 | System.IO.Path.GetDirectoryName(projectPath), 94 | (getAssemblyInfoAttributes projectName) 95 | ) 96 | 97 | !! "src/**/*.??proj" 98 | |> Seq.map getProjectDetails 99 | |> Seq.iter (fun (projFileName, projectName, folderName, attributes) -> 100 | match projFileName with 101 | | Fsproj -> CreateFSharpAssemblyInfo (folderName "AssemblyInfo.fs") attributes 102 | | Csproj -> CreateCSharpAssemblyInfo ((folderName "Properties") "AssemblyInfo.cs") attributes 103 | | Vbproj -> CreateVisualBasicAssemblyInfo ((folderName "My Project") "AssemblyInfo.vb") attributes 104 | | Shproj -> () 105 | ) 106 | ) 107 | 108 | // Copies binaries from default VS location to expected bin folder 109 | // But keeps a subdirectory structure for each project in the 110 | // src folder to support multiple project outputs 111 | Target "CopyBinaries" (fun _ -> 112 | !! "src/**/*.??proj" 113 | -- "src/**/*.shproj" 114 | |> Seq.map (fun f -> ((System.IO.Path.GetDirectoryName f) "bin/Release", "bin" (System.IO.Path.GetFileNameWithoutExtension f))) 115 | |> Seq.iter (fun (fromDir, toDir) -> CopyDir toDir fromDir (fun _ -> true)) 116 | ) 117 | 118 | // -------------------------------------------------------------------------------------- 119 | // Clean build results 120 | 121 | Target "Clean" (fun _ -> 122 | CleanDirs ["bin"; "temp"] 123 | ) 124 | 125 | Target "CleanDocs" (fun _ -> 126 | CleanDirs ["docs/output"] 127 | ) 128 | 129 | // -------------------------------------------------------------------------------------- 130 | // Build library & test project 131 | 132 | Target "RenameDependencies" (fun _ -> 133 | CreateDir "lib" 134 | DeleteFile "lib/FsInteractiveService.Suave.dll" 135 | 136 | let reader = new Mono.Cecil.DefaultAssemblyResolver() 137 | reader.AddSearchDirectory("packages/build/Suave/lib/net40") 138 | reader.AddSearchDirectory("packages/build/FSharp.Core/lib/net40") 139 | let readerParams = new Mono.Cecil.ReaderParameters(AssemblyResolver = reader) 140 | let asem = Mono.Cecil.AssemblyDefinition.ReadAssembly("packages/build/Suave/lib/net40/Suave.dll", readerParams) 141 | asem.Name <- new Mono.Cecil.AssemblyNameDefinition("FsInteractiveService.Suave", new System.Version(1,0,0,0)) 142 | asem.Write("lib/FsInteractiveService.Suave.dll") 143 | ) 144 | 145 | Target "BuildCore" (fun _ -> 146 | !! "src\FsInteractiveService\FsInteractiveService.fsproj" 147 | |> MSBuildRelease "" "Rebuild" 148 | |> ignore 149 | !! "src\FsInteractiveService.Shared\FsInteractiveService.Shared.fsproj" 150 | |> MSBuildRelease "" "Rebuild" 151 | |> ignore 152 | ) 153 | 154 | Target "BuildTests" (fun _ -> 155 | !! "tests\FsInteractiveService.Tests\FsInteractiveService.Tests.fsproj" 156 | |> MSBuildRelease "" "Rebuild" 157 | |> ignore 158 | ) 159 | 160 | Target "ILRepack" (fun _ -> 161 | let buildDir = "bin/FsInteractiveService" 162 | let buildMergedDir = "bin/FsInteractiveService.Merged" 163 | CreateDir buildMergedDir 164 | 165 | let internalizeIn filename = 166 | let toPack = 167 | [filename; "Newtonsoft.Json.dll"] 168 | |> List.map (fun l -> buildDir l) 169 | |> separated " " 170 | let targetFile = buildMergedDir filename 171 | 172 | let result = 173 | ExecProcess (fun info -> 174 | info.FileName <- currentDirectory "packages" "build" "ILRepack" "tools" "ILRepack.exe" 175 | info.Arguments <- 176 | sprintf "/lib:%s /ver:%s /out:%s %s" 177 | buildDir release.AssemblyVersion targetFile toPack) (System.TimeSpan.FromMinutes 5.) 178 | 179 | if result <> 0 then failwithf "Error during ILRepack execution." 180 | CopyFile (buildDir filename) targetFile 181 | 182 | internalizeIn "FsInteractiveService.exe" 183 | !! (buildDir "Newtonsoft.Json.**") |> Seq.iter DeleteFile 184 | DeleteDir buildMergedDir 185 | ) 186 | 187 | // -------------------------------------------------------------------------------------- 188 | // Run the unit tests using test runner 189 | 190 | Target "RunTests" (fun _ -> 191 | !! testAssemblies 192 | |> NUnit (fun p -> 193 | { p with 194 | DisableShadowCopy = true 195 | TimeOut = TimeSpan.FromMinutes 20. 196 | OutputFile = "TestResults.xml" }) 197 | ) 198 | 199 | #if MONO 200 | #else 201 | // -------------------------------------------------------------------------------------- 202 | // SourceLink allows Source Indexing on the PDB generated by the compiler, this allows 203 | // the ability to step through the source code of external libraries http://ctaggart.github.io/SourceLink/ 204 | 205 | Target "SourceLink" (fun _ -> 206 | let baseUrl = sprintf "%s/%s/{0}/%%var2%%" gitRaw project 207 | !! "src/**/*.??proj" 208 | -- "src/**/*.shproj" 209 | |> Seq.iter (fun projFile -> 210 | let proj = VsProj.LoadRelease projFile 211 | SourceLink.Index proj.CompilesNotLinked proj.OutputFilePdb __SOURCE_DIRECTORY__ baseUrl 212 | ) 213 | ) 214 | 215 | #endif 216 | 217 | // -------------------------------------------------------------------------------------- 218 | // Build a NuGet package 219 | 220 | Target "NuGet" (fun _ -> 221 | Paket.Pack(fun p -> 222 | { p with 223 | OutputPath = "bin" 224 | Version = release.NugetVersion 225 | ReleaseNotes = toLines release.Notes}) 226 | ) 227 | 228 | Target "PublishNuget" (fun _ -> 229 | Paket.Push(fun p -> 230 | { p with 231 | WorkingDir = "bin" }) 232 | ) 233 | 234 | 235 | // -------------------------------------------------------------------------------------- 236 | // Generate the documentation 237 | 238 | 239 | let fakePath = "packages" "build" "FAKE" "tools" "FAKE.exe" 240 | let fakeStartInfo script workingDirectory args fsiargs environmentVars = 241 | (fun (info: System.Diagnostics.ProcessStartInfo) -> 242 | info.FileName <- System.IO.Path.GetFullPath fakePath 243 | info.Arguments <- sprintf "%s --fsiargs -d:FAKE %s \"%s\"" args fsiargs script 244 | info.WorkingDirectory <- workingDirectory 245 | let setVar k v = 246 | info.EnvironmentVariables.[k] <- v 247 | for (k, v) in environmentVars do 248 | setVar k v 249 | setVar "MSBuild" msBuildExe 250 | setVar "GIT" Git.CommandHelper.gitPath 251 | setVar "FSI" fsiPath) 252 | 253 | /// Run the given buildscript with FAKE.exe 254 | let executeFAKEWithOutput workingDirectory script fsiargs envArgs = 255 | let exitCode = 256 | ExecProcessWithLambdas 257 | (fakeStartInfo script workingDirectory "" fsiargs envArgs) 258 | TimeSpan.MaxValue false ignore ignore 259 | System.Threading.Thread.Sleep 1000 260 | exitCode 261 | 262 | // Documentation 263 | let buildDocumentationTarget fsiargs target = 264 | trace (sprintf "Building documentation (%s), this could take some time, please wait..." target) 265 | let exit = executeFAKEWithOutput "docs/tools" "generate.fsx" fsiargs ["target", target] 266 | if exit <> 0 then 267 | failwith "generating reference documentation failed" 268 | () 269 | 270 | Target "GenerateReferenceDocs" (fun _ -> 271 | buildDocumentationTarget "-d:RELEASE -d:REFERENCE" "Default" 272 | ) 273 | 274 | let generateHelp' fail debug = 275 | let args = 276 | if debug then "--define:HELP" 277 | else "--define:RELEASE --define:HELP" 278 | try 279 | buildDocumentationTarget args "Default" 280 | traceImportant "Help generated" 281 | with 282 | | e when not fail -> 283 | traceImportant "generating help documentation failed" 284 | 285 | let generateHelp fail = 286 | generateHelp' fail false 287 | 288 | Target "GenerateHelp" (fun _ -> 289 | DeleteFile "docs/content/release-notes.md" 290 | CopyFile "docs/content/" "RELEASE_NOTES.md" 291 | Rename "docs/content/release-notes.md" "docs/content/RELEASE_NOTES.md" 292 | 293 | DeleteFile "docs/content/license.md" 294 | CopyFile "docs/content/" "LICENSE.txt" 295 | Rename "docs/content/license.md" "docs/content/LICENSE.txt" 296 | 297 | generateHelp true 298 | ) 299 | 300 | Target "GenerateHelpDebug" (fun _ -> 301 | DeleteFile "docs/content/release-notes.md" 302 | CopyFile "docs/content/" "RELEASE_NOTES.md" 303 | Rename "docs/content/release-notes.md" "docs/content/RELEASE_NOTES.md" 304 | 305 | DeleteFile "docs/content/license.md" 306 | CopyFile "docs/content/" "LICENSE.txt" 307 | Rename "docs/content/license.md" "docs/content/LICENSE.txt" 308 | 309 | generateHelp' true true 310 | ) 311 | 312 | Target "KeepRunning" (fun _ -> 313 | use watcher = !! "docs/content/**/*.*" |> WatchChanges (fun changes -> 314 | generateHelp' true true 315 | ) 316 | 317 | traceImportant "Waiting for help edits. Press any key to stop." 318 | 319 | System.Console.ReadKey() |> ignore 320 | 321 | watcher.Dispose() 322 | ) 323 | 324 | Target "GenerateDocs" DoNothing 325 | 326 | let createIndexFsx lang = 327 | let content = """(*** hide ***) 328 | // This block of code is omitted in the generated HTML documentation. Use 329 | // it to define helpers that you do not want to show in the documentation. 330 | #I "../../../bin" 331 | 332 | (** 333 | F# Project Scaffold ({0}) 334 | ========================= 335 | *) 336 | """ 337 | let targetDir = "docs/content" lang 338 | let targetFile = targetDir "index.fsx" 339 | ensureDirectory targetDir 340 | System.IO.File.WriteAllText(targetFile, System.String.Format(content, lang)) 341 | 342 | Target "AddLangDocs" (fun _ -> 343 | let args = System.Environment.GetCommandLineArgs() 344 | if args.Length < 4 then 345 | failwith "Language not specified." 346 | 347 | args.[3..] 348 | |> Seq.iter (fun lang -> 349 | if lang.Length <> 2 && lang.Length <> 3 then 350 | failwithf "Language must be 2 or 3 characters (ex. 'de', 'fr', 'ja', 'gsw', etc.): %s" lang 351 | 352 | let templateFileName = "template.cshtml" 353 | let templateDir = "docs/tools/templates" 354 | let langTemplateDir = templateDir lang 355 | let langTemplateFileName = langTemplateDir templateFileName 356 | 357 | if System.IO.File.Exists(langTemplateFileName) then 358 | failwithf "Documents for specified language '%s' have already been added." lang 359 | 360 | ensureDirectory langTemplateDir 361 | Copy langTemplateDir [ templateDir templateFileName ] 362 | 363 | createIndexFsx lang) 364 | ) 365 | 366 | // -------------------------------------------------------------------------------------- 367 | // Release Scripts 368 | 369 | Target "ReleaseDocs" (fun _ -> 370 | let tempDocsDir = "temp/gh-pages" 371 | CleanDir tempDocsDir 372 | Repository.cloneSingleBranch "" (gitHome + "/" + gitName + ".git") "gh-pages" tempDocsDir 373 | 374 | CopyRecursive "docs/output" tempDocsDir true |> tracefn "%A" 375 | StageAll tempDocsDir 376 | Git.Commit.Commit tempDocsDir (sprintf "Update generated documentation for version %s" release.NugetVersion) 377 | Branches.push tempDocsDir 378 | ) 379 | 380 | #load "paket-files/build/fsharp/FAKE/modules/Octokit/Octokit.fsx" 381 | open Octokit 382 | 383 | Target "ZipRelease" (fun _ -> 384 | !! ("bin/FsInteractiveService/*.*") 385 | -- ("bin/FsInteractiveService/App.config") 386 | |> Zip "bin/FsInteractiveService" ("temp" "fsinteractiveservice.zip") 387 | 388 | ) 389 | 390 | Target "Release" (fun _ -> 391 | let user = 392 | match getBuildParam "github-user" with 393 | | s when not (String.IsNullOrWhiteSpace s) -> s 394 | | _ -> getUserInput "Username: " 395 | let pw = 396 | match getBuildParam "github-pw" with 397 | | s when not (String.IsNullOrWhiteSpace s) -> s 398 | | _ -> getUserPassword "Password: " 399 | let remote = 400 | Git.CommandHelper.getGitResult "" "remote -v" 401 | |> Seq.filter (fun (s: string) -> s.EndsWith("(push)")) 402 | |> Seq.tryFind (fun (s: string) -> s.Contains(gitOwner + "/" + gitName)) 403 | |> function None -> gitHome + "/" + gitName | Some (s: string) -> s.Split().[0] 404 | 405 | StageAll "" 406 | Git.Commit.Commit "" (sprintf "Bump version to %s" release.NugetVersion) 407 | Branches.pushBranch "" remote (Information.getBranchName "") 408 | 409 | Branches.tag "" release.NugetVersion 410 | Branches.pushTag "" remote release.NugetVersion 411 | 412 | // release on github 413 | createClient user pw 414 | |> createDraft gitOwner gitName release.NugetVersion (release.SemVer.PreRelease <> None) release.Notes 415 | |> uploadFile "temp/fsinteractiveservice.zip" 416 | |> releaseDraft 417 | |> Async.RunSynchronously 418 | ) 419 | 420 | Target "BuildPackage" DoNothing 421 | 422 | // -------------------------------------------------------------------------------------- 423 | // Run all targets by default. Invoke 'build ' to override 424 | 425 | Target "All" DoNothing 426 | 427 | "Clean" 428 | ==> "AssemblyInfo" 429 | ==> "RenameDependencies" 430 | ==> "BuildCore" 431 | ==> "CopyBinaries" 432 | ==> "ILRepack" 433 | ==> "BuildTests" 434 | ==> "RunTests" 435 | ==> "All" 436 | ==> "GenerateReferenceDocs" 437 | ==> "GenerateDocs" 438 | =?> ("ReleaseDocs",isLocalBuild) 439 | 440 | "All" 441 | #if MONO 442 | #else 443 | =?> ("SourceLink", Pdbstr.tryFind().IsSome ) 444 | #endif 445 | ==> "NuGet" 446 | ==> "BuildPackage" 447 | 448 | "CleanDocs" 449 | ==> "GenerateHelp" 450 | ==> "GenerateReferenceDocs" 451 | ==> "GenerateDocs" 452 | 453 | "CleanDocs" 454 | ==> "GenerateHelpDebug" 455 | 456 | "GenerateHelpDebug" 457 | ==> "KeepRunning" 458 | 459 | "ReleaseDocs" 460 | ==> "ZipRelease" 461 | ==> "Release" 462 | 463 | "BuildPackage" 464 | ==> "PublishNuget" 465 | ==> "Release" 466 | 467 | RunTargetOrDefault "All" 468 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | cd `dirname $0` 7 | 8 | PAKET_BOOTSTRAPPER_EXE=.paket/paket.bootstrapper.exe 9 | PAKET_EXE=.paket/paket.exe 10 | FAKE_EXE=packages/build/FAKE/tools/FAKE.exe 11 | 12 | FSIARGS="" 13 | OS=${OS:-"unknown"} 14 | if [[ "$OS" != "Windows_NT" ]] 15 | then 16 | FSIARGS="--fsiargs -d:MONO" 17 | fi 18 | 19 | function run() { 20 | if [[ "$OS" != "Windows_NT" ]] 21 | then 22 | mono "$@" 23 | else 24 | "$@" 25 | fi 26 | } 27 | 28 | function yesno() { 29 | # NOTE: Defaults to NO 30 | read -p "$1 [y/N] " ynresult 31 | case "$ynresult" in 32 | [yY]*) true ;; 33 | *) false ;; 34 | esac 35 | } 36 | 37 | set +e 38 | run $PAKET_BOOTSTRAPPER_EXE prerelease 39 | bootstrapper_exitcode=$? 40 | set -e 41 | 42 | if [[ "$OS" != "Windows_NT" ]] && 43 | [ $bootstrapper_exitcode -ne 0 ] && 44 | [ $(certmgr -list -c Trust | grep X.509 | wc -l) -le 1 ] && 45 | [ $(certmgr -list -c -m Trust | grep X.509 | wc -l) -le 1 ] 46 | then 47 | echo "Your Mono installation has no trusted SSL root certificates set up." 48 | echo "This may result in the Paket bootstrapper failing to download Paket" 49 | echo "because Github's SSL certificate can't be verified. One way to fix" 50 | echo "this issue would be to download the list of SSL root certificates" 51 | echo "from the Mozilla project by running the following command:" 52 | echo "" 53 | echo " mozroots --import --sync" 54 | echo "" 55 | echo "This will import over 100 SSL root certificates into your Mono" 56 | echo "certificate repository." 57 | echo "" 58 | if yesno "Run 'mozroots --import --sync' now?" 59 | then 60 | mozroots --import --sync 61 | else 62 | echo "Attempting to continue without running mozroots. This might fail." 63 | fi 64 | # Re-run bootstrapper whether or not the user ran mozroots, because maybe 65 | # they fixed the problem in a separate terminal window. 66 | run $PAKET_BOOTSTRAPPER_EXE prerelease 67 | fi 68 | 69 | run $PAKET_EXE restore 70 | 71 | [ ! -e build.fsx ] && run $PAKET_EXE update 72 | [ ! -e build.fsx ] && run $FAKE_EXE init.fsx 73 | run $FAKE_EXE "$@" $FSIARGS build.fsx 74 | 75 | -------------------------------------------------------------------------------- /docs/content/htmlprinter.fsx: -------------------------------------------------------------------------------- 1 | (** 2 | Creating HTML printers 3 | ====================== 4 | 5 | The FsInteractiveService project extends F# Interactive with a feature that makes 6 | it possible to format objects as HTML. This follows very similar pattern to the 7 | `fsi.AddPrinter` function available in F# by default. 8 | 9 | The code that gets sent to FsInteractiveService can use an extension `fsi.AddHtmlPrinter`. 10 | The process also defines a `HAS_FSI_ADDHTMLPRINTER` symbol, so that you can detect whether 11 | the feature is available. 12 | 13 | Formatting HTML tables 14 | ---------------------- 15 | As an example, consider the following type that defines a very simple table of strings: 16 | *) 17 | type Table = Table of string[,] 18 | (** 19 | The typical pattern for registering a printer would be to call `fsi.AddHtmlPrinter` wrapped 20 | inside an `#if .. #endif` block for compatibility reasons: 21 | *) 22 | #if HAS_FSI_ADDHTMLPRINTER 23 | fsi.AddHtmlPrinter(fun (Table t) -> 24 | let body = 25 | [ yield "" 26 | for i in 0 .. t.GetLength(0)-1 do 27 | yield "" 28 | for j in 0 .. t.GetLength(1)-1 do 29 | yield "" 30 | yield "" 31 | yield "
" + t.[i,j] + "
" ] 32 | |> String.concat "" 33 | seq [ "style", "" ], 34 | body ) 35 | #endif 36 | (** 37 | This defines a HTML printer that formats values of type `Table`. The function passed to 38 | `AddHtmlPrinter` needs to return a value of type `seq * string`. This is 39 | a tuple consisting of two things: 40 | 41 | - The second element is the HTML body that represents the formatted value. Typically, 42 | editors will embed this into HTML output. 43 | 44 | - A sequence of key value pairs that represents additional styles and sripts used that 45 | are required by the body. The keys can be `style` or `script` (or other custom keys 46 | supported by editors) and can be treated in a special way by the editors (e.g. if 47 | loading JavaScript dynamically requires placing the HTML content in an `