From 19b843f85139130344e4238488a9b94aa4a5ff51 Mon Sep 17 00:00:00 2001 From: Buddy Sandidge Date: Tue, 2 Apr 2019 16:59:16 -0700 Subject: [PATCH] Squashed 'vim/bundle/tsuquyomi/' content from commit 2a3dcbc90 git-subtree-dir: vim/bundle/tsuquyomi git-subtree-split: 2a3dcbc9085975c3b1c49c382f6c87c69d199a44 --- .gitignore | 11 + .travis.yml | 16 + README.md | 336 +++++ autoload/tsuquyomi.vim | 1205 +++++++++++++++++ autoload/tsuquyomi/bufManager.vim | 165 +++ autoload/tsuquyomi/config.vim | 320 +++++ autoload/tsuquyomi/es6import.vim | 509 +++++++ autoload/tsuquyomi/perfLogger.vim | 32 + autoload/tsuquyomi/tsClient.vim | 940 +++++++++++++ autoload/unite/sources/outline/typescript.vim | 66 + autoload/unite/sources/tsproject.vim | 66 + autoload/vital.vim | 12 + autoload/vital/_tsuquyomi.vim | 5 + autoload/vital/_tsuquyomi/Data/List.vim | 457 +++++++ autoload/vital/_tsuquyomi/Data/String.vim | 633 +++++++++ autoload/vital/_tsuquyomi/Prelude.vim | 409 ++++++ autoload/vital/_tsuquyomi/Process.vim | 181 +++ autoload/vital/_tsuquyomi/ProcessManager.vim | 147 ++ autoload/vital/_tsuquyomi/System/Filepath.vim | 265 ++++ autoload/vital/_tsuquyomi/Web/JSON.vim | 184 +++ autoload/vital/tsuquyomi.vim | 339 +++++ autoload/vital/tsuquyomi.vital | 7 + capt_comp.png | Bin 0 -> 76575 bytes doc/tsuquyomi.jax | 519 +++++++ doc/tsuquyomi.txt | 511 +++++++ ftdetect/typescript.vim | 1 + ftplugin/javascript/tsuquyomi.vim | 16 + ftplugin/typescript/tsuquyomi.vim | 12 + package.json | 17 + plugin/tsuquyomi.vim | 94 ++ run-one-test.sh | 17 + runtest-all-ts.sh | 16 + runtest.sh | 104 ++ screen.gif | Bin 0 -> 400001 bytes syntax_checkers/typescript/tsuquyomi.vim | 36 + test/.vimrc | 27 + test/_runner | 29 + .../vest/checkExternalModule.spec.vim | 46 + .../vest/getImportDeclarations.spec.vim | 125 ++ .../importDecPatterns/decAndFunction.ts | 2 + .../importDecPatterns/decAndOther.ts | 4 + .../vest/resources/importDecPatterns/empty.ts | 1 + .../importDecPatterns/explictAlias.ts | 2 + .../resources/importDecPatterns/multiAlias.ts | 4 + .../resources/importDecPatterns/multiDec.ts | 2 + .../resources/importDecPatterns/multiline.ts | 7 + .../vest/resources/importDecPatterns/noDec.ts | 5 + .../resources/importDecPatterns/simple.ts | 1 + .../importDecPatterns/some-module.ts | 2 + .../resources/importDecPatterns/tsconfig.json | 19 + .../vest/resources/variousModules.d.ts | 19 + test/package.json | 22 + test/tsClient/vest/resources/SimpleModule.ts | 24 + .../vest/resources/SimpleModule_writing.ts | 24 + test/tsClient/vest/resources/codeFixTest.ts | 8 + .../tsClient/vest/resources/definitionTest.ts | 3 + .../vest/resources/referencesTestA.ts | 7 + .../vest/resources/referencesTestB.ts | 6 + test/tsClient/vest/resources/renameTest.ts | 20 + .../resources/samplePrjs/errorPrj/main.ts | 5 + .../vest/resources/samplePrjs/errorPrj/sub.ts | 1 + .../samplePrjs/errorPrj/tsconfig.json | 7 + .../vest/resources/samplePrjs/prj001/main.ts | 5 + .../resources/samplePrjs/prj001/tsconfig.json | 6 + .../resources/signatureHelpTest_overload.ts | 10 + .../resources/signatureHelpTest_writing.ts | 20 + test/tsClient/vest/sendCommand.spec.vim | 24 + test/tsClient/vest/sendRequest.spec.vim | 10 + test/tsClient/vest/startTss.spec.vim | 19 + .../vest/tsCompletionEntryDetails.spec.vim | 28 + test/tsClient/vest/tsCompletions.spec.vim | 27 + test/tsClient/vest/tsDefinition.spec.vim | 32 + test/tsClient/vest/tsGetCodeFixes.vim | 28 + .../tsClient/vest/tsGetSupportedCodeFixes.vim | 23 + test/tsClient/vest/tsGeterr.spec.vim | 36 + .../tsClient/vest/tsGeterrForProject.spec.vim | 26 + test/tsClient/vest/tsNavBar.spec.vim | 38 + test/tsClient/vest/tsNavto.spec.vim | 30 + test/tsClient/vest/tsProjectInfo.spec.vim | 24 + test/tsClient/vest/tsQuickinfo.spec.vim | 26 + test/tsClient/vest/tsReferences.spec.vim | 56 + test/tsClient/vest/tsReload.spec.vim | 22 + test/tsClient/vest/tsRename.spec.vim | 98 ++ test/tsClient/vest/tsSignatureHelp.spec.vim | 70 + test/yarn.lock | 68 + yarn.lock | 7 + 86 files changed, 8803 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 README.md create mode 100644 autoload/tsuquyomi.vim create mode 100644 autoload/tsuquyomi/bufManager.vim create mode 100644 autoload/tsuquyomi/config.vim create mode 100644 autoload/tsuquyomi/es6import.vim create mode 100644 autoload/tsuquyomi/perfLogger.vim create mode 100644 autoload/tsuquyomi/tsClient.vim create mode 100644 autoload/unite/sources/outline/typescript.vim create mode 100644 autoload/unite/sources/tsproject.vim create mode 100644 autoload/vital.vim create mode 100644 autoload/vital/_tsuquyomi.vim create mode 100644 autoload/vital/_tsuquyomi/Data/List.vim create mode 100644 autoload/vital/_tsuquyomi/Data/String.vim create mode 100644 autoload/vital/_tsuquyomi/Prelude.vim create mode 100644 autoload/vital/_tsuquyomi/Process.vim create mode 100644 autoload/vital/_tsuquyomi/ProcessManager.vim create mode 100644 autoload/vital/_tsuquyomi/System/Filepath.vim create mode 100644 autoload/vital/_tsuquyomi/Web/JSON.vim create mode 100644 autoload/vital/tsuquyomi.vim create mode 100644 autoload/vital/tsuquyomi.vital create mode 100644 capt_comp.png create mode 100644 doc/tsuquyomi.jax create mode 100644 doc/tsuquyomi.txt create mode 100644 ftdetect/typescript.vim create mode 100644 ftplugin/javascript/tsuquyomi.vim create mode 100644 ftplugin/typescript/tsuquyomi.vim create mode 100644 package.json create mode 100644 plugin/tsuquyomi.vim create mode 100755 run-one-test.sh create mode 100755 runtest-all-ts.sh create mode 100755 runtest.sh create mode 100644 screen.gif create mode 100644 syntax_checkers/typescript/tsuquyomi.vim create mode 100644 test/.vimrc create mode 100644 test/_runner create mode 100644 test/es6import/vest/checkExternalModule.spec.vim create mode 100644 test/es6import/vest/getImportDeclarations.spec.vim create mode 100644 test/es6import/vest/resources/importDecPatterns/decAndFunction.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/decAndOther.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/empty.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/explictAlias.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/multiAlias.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/multiDec.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/multiline.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/noDec.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/simple.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/some-module.ts create mode 100644 test/es6import/vest/resources/importDecPatterns/tsconfig.json create mode 100644 test/es6import/vest/resources/variousModules.d.ts create mode 100644 test/package.json create mode 100644 test/tsClient/vest/resources/SimpleModule.ts create mode 100644 test/tsClient/vest/resources/SimpleModule_writing.ts create mode 100644 test/tsClient/vest/resources/codeFixTest.ts create mode 100644 test/tsClient/vest/resources/definitionTest.ts create mode 100644 test/tsClient/vest/resources/referencesTestA.ts create mode 100644 test/tsClient/vest/resources/referencesTestB.ts create mode 100644 test/tsClient/vest/resources/renameTest.ts create mode 100644 test/tsClient/vest/resources/samplePrjs/errorPrj/main.ts create mode 100644 test/tsClient/vest/resources/samplePrjs/errorPrj/sub.ts create mode 100644 test/tsClient/vest/resources/samplePrjs/errorPrj/tsconfig.json create mode 100644 test/tsClient/vest/resources/samplePrjs/prj001/main.ts create mode 100644 test/tsClient/vest/resources/samplePrjs/prj001/tsconfig.json create mode 100644 test/tsClient/vest/resources/signatureHelpTest_overload.ts create mode 100644 test/tsClient/vest/resources/signatureHelpTest_writing.ts create mode 100644 test/tsClient/vest/sendCommand.spec.vim create mode 100644 test/tsClient/vest/sendRequest.spec.vim create mode 100644 test/tsClient/vest/startTss.spec.vim create mode 100644 test/tsClient/vest/tsCompletionEntryDetails.spec.vim create mode 100644 test/tsClient/vest/tsCompletions.spec.vim create mode 100644 test/tsClient/vest/tsDefinition.spec.vim create mode 100644 test/tsClient/vest/tsGetCodeFixes.vim create mode 100644 test/tsClient/vest/tsGetSupportedCodeFixes.vim create mode 100644 test/tsClient/vest/tsGeterr.spec.vim create mode 100644 test/tsClient/vest/tsGeterrForProject.spec.vim create mode 100644 test/tsClient/vest/tsNavBar.spec.vim create mode 100644 test/tsClient/vest/tsNavto.spec.vim create mode 100644 test/tsClient/vest/tsProjectInfo.spec.vim create mode 100644 test/tsClient/vest/tsQuickinfo.spec.vim create mode 100644 test/tsClient/vest/tsReferences.spec.vim create mode 100644 test/tsClient/vest/tsReload.spec.vim create mode 100644 test/tsClient/vest/tsRename.spec.vim create mode 100644 test/tsClient/vest/tsSignatureHelp.spec.vim create mode 100644 test/yarn.lock create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d0ce41 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.swp +*.swo +*.un~ +node_modules/ +NUL +.tmp* +*.log +neobundle.vim/ +bundle/ +vim/ +local/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..d8d9373 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,16 @@ +env: + global: + - GIT_COMMITTER_NAME=y-kurami + - GIT_COMMITTER_EMAIL=yosuke.kurami@gmail.com + - GIT_AUTHOR_NAME=Quramy + - GIT_AUTHOR_EMAIL=yosuke.kurami@gmail.com + - HIDE_VIM=1 +language: node_js +node_js: +- '11' +before_install: +- 'pushd test/ && yarn install && popd' +script: +- bash runtest-all-ts.sh +cache: + yarn: true diff --git a/README.md b/README.md new file mode 100644 index 0000000..b467f8d --- /dev/null +++ b/README.md @@ -0,0 +1,336 @@ +# Tsuquyomi [![Build Status](https://travis-ci.org/Quramy/tsuquyomi.svg?branch=master)](https://travis-ci.org/Quramy/tsuquyomi) [![Greenkeeper badge](https://badges.greenkeeper.io/Quramy/tsuquyomi.svg)](https://greenkeeper.io/) + + +Make your Vim a TypeScript IDE. + +![capture](screen.gif) +## Features + +Tsuquyomi works as a client for **TSServer** (which is an editor service bundled into TypeScript). +So, installing Tsuquyomi, your vim gets the following features provided by TSServer: + ++ Completion (omni-completion) ++ Navigate to the location where a symbol is defined. ++ Show location(s) where a symbol is referenced. ++ Display a list of syntax and semantics errors to Vim quickfix window. ++ and so on,,, + +### Relevant plugins +Tsuquyomi does not provide syntax-highlight nor indentation. You can use the following Vim plugins for writing .ts: + +* [leafgarland/typescript-vim](https://github.com/leafgarland/typescript-vim) provides syntax highlight. +* [Quramy/vim-js-pretty-template](https://github.com/Quramy/vim-js-pretty-template) provides syntax highlight for contents in Template Strings. +* [jason0x43/vim-js-indent](https://github.com/jason0x43/vim-js-indent) provides function of indent for both JavaScript and TypeScript. +* [Quramy/vim-dtsm](https://github.com/Quramy/vim-dtsm) provides `.d.ts` management for [dtsm](https://github.com/vvakame/dtsm) users. +* [mhartington/vim-typings](https://github.com/mhartington/vim-typings) provides `.d.ts` management for [typings](https://github.com/typings/typings) users. + +## How to install +Tsuquyomi requires the following: + ++ [Vim](http://www.vim.org/) (vim7.4 or later) ++ [Node.js](https://nodejs.org/) & [TypeScript](https://github.com/Microsoft/TypeScript) ++ [Shougo/vimproc.vim](https://github.com/Shougo/vimproc.vim) (Not required if you use vim8 or later) + +### Install TypeScript + +```bash +npm -g install typescript +``` + +### Install Tsuquyomi + +Download zip.file from [here](https://github.com/Quramy/tsuquyomi/archive/master.zip), or use your favorite Vim plugin manager. + +#### Pathogen + +See https://github.com/tpope/vim-pathogen for instructions to install pathogen itself +(very simple one-line install, one-line config) + +``` +# create bundle folder if it doesn't exist +mkdir -p ~/.vim/bundle + +# Install and compile procvim.vim +git clone https://github.com/Shougo/vimproc.vim.git ~/.vim/bundle/vimproc.vim +pushd ~/.vim/bundle/vimproc.vim +make +popd + +# Install tsuquyomi +git clone https://github.com/Quramy/tsuquyomi.git ~/.vim/bundle/tsuquyomi +``` + +#### NeoBundle + +If you use [NeoBundle](https://github.com/Shougo/neobundle.vim) for Vim plugin management, append the following to your `.vimrc`: + +```vim +NeoBundle 'Shougo/vimproc.vim', { +\ 'build' : { +\ 'windows' : 'tools\\update-dll-mingw', +\ 'cygwin' : 'make -f make_cygwin.mak', +\ 'mac' : 'make -f make_mac.mak', +\ 'linux' : 'make', +\ 'unix' : 'gmake', +\ }, +\ } + +NeoBundle 'Quramy/tsuquyomi' +``` + +And exec `:NeoBundleInstall`. + +(About vimproc installation, please see [the original install guide](https://github.com/Shougo/vimproc.vim#install).) + +## How to use + +### Completion +Tsuquyomi supports Omni-Completion. + +By the default, type ` ` in insert mode, Tsuquyomi shows completions. + +#### Customize completion +You can configure completion with the `completeopt` option. + +If you don't want the popup menu: + +```vim +autocmd FileType typescript setlocal completeopt-=menu +``` + +If you want to show a method's signature in the popup menu, set `g:tsuquyomi_completion_detail`. **Remarks: This option makes completion slow** + +```vim +let g:tsuquyomi_completion_detail = 1 +``` + +If you want to show a method's signature in the preview window when you complete this method's arguments (default): + +(The preview window isn't shown when completion properties or variables) + +```vim +autocmd FileType typescript setlocal completeopt+=menu,preview +``` + +### Navigations + +#### Definition +Type `` in normal mode or visual mode, Tsuquyomi navigates to the location where the symbol under the cursor is defined. + +Alternatively, call the Ex command `:TsuquyomiDefinition` or `:TsuDefinition`. +(All Tsuquyomi's commands have aliases with short prefix `'Tsu'`.) + +And type `` , Tsuquyomi moves the cursor to the location where the last `` was typed. + +#### Type Definition +`:TsuTypeDefinition` command is similar to `:TsuDefinition`. `:TsuTypeDefinition` navigates to the location where the type of the symbol under the cursor is defined. + +#### References +Type `` in normal mode or visual mode, Tsuquyomi shows a list of location where the symbol under the cursor is referenced. + +Alternatively, call the Ex command `:TsuReferences`. + +If you want where an interface is implemented, use `:TsuImplementation`. + +#### Keyword search +Call the Ex command `:TsuSearch {keyword}` to get the list of locations which contain the keyword. This command searches the keyword from opened or referenced files in your project. + +The search term minimum length can be configured with `let g:tsuquyomi_search_term_min_length = 3`. + +#### Disable default mappings +If you do not want to use the above key mappings please add `let g:tsuquyomi_disable_default_mappings = 1` to your `.vimrc` file. + +### Show compile errors +When a buffer is saved, Tsuquyomi checks syntax and semantics. Alternatively call the Ex command `:TsuGeterr`. +And if it contains errors, Tsuquyomi shows them to Vim quickfix window. + +If your use TypeScript v1.6.0 or later, you can use `:TsuGeterrProject` command. +This command shows all compilation errors contained in your project to quickfix window. + +#### Quick fix +If the cursor is on an error and TypeScript's LanguageService has a code fix for this error, call `:TsuQuickFix`. +The code fix will be applied. + +#### Configure compile options +Make [tsconfig.json](http://www.typescriptlang.org/docs/handbook/tsconfig-json.html). + +For example: + +```json +{ + "compilerOptions": { + "noImplicitAny": true, + "target": "es5", + "module": "commonjs" + } +} +``` + +When you change tsconfig.json after opening `*.ts` files, you should exec `:TsuquyomiReloadProject` command. +So, the changes of tsconfig.json are reflected in the TSServer. + +#### Integrate with syntastic +If you use [syntastic](https://github.com/scrooloose/syntastic), you can use syntastic for displaying syntax and semantics errors instead of vim's default quickfix window. To integrate syntastic, write the following setting to your .vimrc. + +```vim +let g:tsuquyomi_disable_quickfix = 1 +let g:syntastic_typescript_checkers = ['tsuquyomi'] " You shouldn't use 'tsc' checker. +``` + +syntastic has default TypeScript checker whose name is 'tsc'. You shouldn't use it with running Tusuquyomi because they don't share compile options. +Tusuquyomi's checker whose name is 'tsuquyomi' uses tsserver and your tsconfig.json. + +### Refactor +#### Rename symbols + +Using the command `:TsuRenameSymbol`, you can rename the identifier under the cursor to a new name. + +If you want to rename identifiers including in comments, you can use `:TsuRenameSymbolC` command. +For example, this command is useful when you want rename `opt` in the following code: + +```typescript +/** +* +* @param opt +* +**/ +var someFunc = (opt: any) => {...}; +``` + +This feature does not have the default key mapping. +If you need, configure your `.vimrc` . For example: + +```vim +autocmd FileType typescript nmap e (TsuquyomiRenameSymbol) +autocmd FileType typescript nmap E (TsuquyomiRenameSymbolC) +``` + +### Tooltip +Tsuquyomi can display tooltip window about symbol under the mouse cursor. If you want to use this feature, configure `.vimrc` as follows: + +```vim +set ballooneval +autocmd FileType typescript setlocal balloonexpr=tsuquyomi#balloonexpr() +``` + +The `ballonexpr` option is not available in terminal Vim. So, Tsuquyomi also provides a tooltip function `tsuquyomi#hint()`. + +For example: + +```vim +autocmd FileType typescript nmap t : echo tsuquyomi#hint() +``` + +The above example works in terminal Vim. + + +### Unite sources +Tsuquyomi provides some [unite](https://github.com/Shougo/unite.vim) sources. + +#### Show project information(a source of unite) + +Execute the following command, your project information is displayed. + +```vim +:Unite tsproject +``` + +The project information contains: + +* tsconfig.json which the current buffer use. +* .ts(or .tsx) source files which TypeScript compiles. These files are determined by tsconfig.json + +This feature requires TypeScript@1.6.0 or later. + +#### Show outline(an extension of unite-outline) +This feature requires Vim plugins: + +* [unite-outline](https://github.com/Shougo/unite-outline). + +If you have installed these plugins, calling the following Ex command, the outline of the current buffer is displayed. + +```vim +:Unite outline +``` + +### Use TypeScript installed locally +By the default, Tsuquyomi searches locally installed TypeScript. If not hit, Tsuquyomi uses TypeScript installed globally. + +And execute the following command, you can confirm the path of tsserver: + +```vim +:echo tsuquyomi#config#tsscmd() +``` + +### Create es6 import declaration +**It's highly experimental** + +For example, if your buffer is the following state: + +```ts +readFile('hoge', 'utf-8', (err, content) => { + if(!err) console.log(content); +}); +``` + +Move cursor onto `readFile` and call `:TsuImport`, so Tsuquyomi appends the import declaration. + +```ts +import { readFile } from 'fs'; +readFile('hoge', 'utf-8', (err, content) => { + if(!err) console.log(content); +}); +``` + +To allow Tsuquyomi to import the shortest path instead of the complete one (where the initial module declaration is) one, put this in your .vimrc: +``` +let g:tsuquyomi_shortest_import_path = 1 +``` + +For example, if your project has the following 2 files, the plugin will use: `import { foo } from './lib';` instead of: `import { foo } from './lib/foo';`. + +```ts +/* lib/index.ts */ +export * from './foo'; +``` + +```ts +/* lib/foo.ts */ +export const foo = 'FOO' +``` + +### More details +If you want more details, please see [doc](doc/tsuquyomi.txt). + +## Contribute +### How to test + +Prepare test + +```sh +cd test/ +yarn install +cd .. +``` + +Run test cases + +```sh +# Run all test cases with all supported TypeScript version +./runtest-all-ts.sh + +# Run all test cases with the latest TypeScript version +./runtest.sh + +# Run all test cases with the specified TypeScript version +VERSION=2.3 ./runtest.sh + +# Run a test file +./run-one-test.sh test/path/to/test.spec.vim + +# Run a test file with the specified TypeScript version +VERSION=2.3 ./run-one-test.sh +``` + +## License +MIT diff --git a/autoload/tsuquyomi.vim b/autoload/tsuquyomi.vim new file mode 100644 index 0000000..3ae388f --- /dev/null +++ b/autoload/tsuquyomi.vim @@ -0,0 +1,1205 @@ +"============================================================================ +" FILE: tsuquyomi.vim +" AUTHOR: Quramy +"============================================================================ + +scriptencoding utf-8 + +let s:save_cpo = &cpo +set cpo&vim + +let s:V = vital#of('tsuquyomi') +let s:Filepath = s:V.import('System.Filepath') +let s:script_dir = expand(':p:h') +"let s:root_dir = s:Filepath.join(s:script_dir, '../') +let s:root_dir = s:Filepath.dirname(s:Filepath.dirname(s:Filepath.remove_last_separator(s:Filepath.join(s:script_dir, '../')))) +" +" ### Utilites {{{ +function! s:error(msg) + echom (a:msg) + throw 'tsuquyomi: '.a:msg +endfunction + +function! s:normalizePath(path) + return substitute(a:path, '\\', '/', 'g') +endfunction + +function! s:joinParts(displayParts) + return join(map(a:displayParts, 'v:val.text'), '') +endfunction + +function! s:joinPartsIgnoreBreak(displayParts, replaceString) + let l:display = '' + for part in a:displayParts + if part.kind == 'lineBreak' + let l:display = l:display.a:replaceString + break + endif + let l:display = l:display.part.text + endfor + return l:display +endfunction + +" Check whether files are opened. +" Found not opend file, show message. +function! s:checkOpenAndMessage(filelist) + if tsuquyomi#tsClient#statusTss() == 'dead' + return [[], a:filelist] + endif + let opened = [] + let not_opend = [] + for file in a:filelist + if tsuquyomi#bufManager#isOpened(file) + call add(opened, file) + else + call add(not_opend, file) + endif + endfor + if len(not_opend) + for file in not_opend + if tsuquyomi#bufManager#isNotOpenable(file) + echom '[Tsuquyomi] The buffer "'.file.'" is not valid filepath, so tusuqoymi cannot open this buffer.' + return [opened, not_opend] + endif + endfor + echom '[Tsuquyomi] Buffers ['.join(not_opend, ', ').'] are not opened by TSServer. Please exec command ":TsuquyomiOpen '.join(not_opend).'" and retry.' + endif + return [opened, not_opend] +endfunction + +" Save current buffer to a temp file, and emit to reload TSServer. +" This function may be called for conversation with TSServer after user's change buffer. +function! s:flush() + if tsuquyomi#bufManager#isDirty(expand('%:p')) + let file_name = expand('%:p') + call tsuquyomi#bufManager#saveTmp(file_name) + call tsuquyomi#tsClient#tsReload(file_name, tsuquyomi#bufManager#tmpfile(file_name)) + call tsuquyomi#bufManager#setDirty(file_name, 0) + endif +endfunction + +function! s:is_valid_identifier(symbol_str) + return a:symbol_str =~ '^[A-Za-z_\$][A-Za-z_\$0-9]*$' +endfunction + +" Manually write content to the preview window. +" Opens a preview window to a scratch buffer named '__TsuquyomiScratch__' +function! s:writeToPreview(content) + silent pedit __TsuquyomiScratch__ + silent wincmd P + setlocal modifiable noreadonly + setlocal nobuflisted buftype=nofile bufhidden=wipe ft=typescript + put =a:content + 0d_ + setlocal nomodifiable readonly + silent wincmd p +endfunction + +function! s:setqflist(quickfix_list, ...) + " 0: Do not close cwindow automatically + " 1: Close cwindow automatically + let auto_close = len(a:000) ? a:0 : 0 + call setqflist(a:quickfix_list, 'r') + if len(a:quickfix_list) > 0 + cwindow + else + if auto_close != 0 + cclose + endif + endif +endfunction + +let s:diagnostics_queue = [] +let s:diagnostics_timer = -1 +function! s:addDiagnosticsQueue(delay, bufnum) + if index(s:diagnostics_queue, a:bufnum) != -1 + return + endif + + if s:diagnostics_timer != -1 + call timer_stop(s:diagnostics_timer) + let s:diagnostics_timer = -1 + endif + + call add(s:diagnostics_queue, a:bufnum) + + let s:diagnostics_timer = timer_start( + \ a:delay, + \ function('s:sendDiagnosticsQueue') + \ ) +endfunction + +function! s:sendDiagnosticsQueue(timer) abort + for l:bufnum in s:diagnostics_queue + if !bufexists(l:bufnum) + continue + endif + let l:file = tsuquyomi#emitChange(l:bufnum) + let l:delayMsec = 50 "TODO export global option + call tsuquyomi#tsClient#tsAsyncGeterr([l:file], l:delayMsec) + endfor + let s:diagnostics_queue = [] +endfunction + +" ### Utilites }}} + +" ### Public functions {{{ +" +function! tsuquyomi#rootDir() + return s:root_dir +endfunction + +" #### Server operations {{{ +function! tsuquyomi#startServer() + return tsuquyomi#tsClient#startTss() +endfunction + +function! tsuquyomi#stopServer() + call tsuquyomi#bufManager#clearMap() + return tsuquyomi#tsClient#stopTss() +endfunction + +function! tsuquyomi#statusServer() + return tsuquyomi#tsClient#statusTss() +endfunction + +" #### Server operations }}} + +" #### Notify changed {{{ +function! tsuquyomi#letDirty() + return tsuquyomi#bufManager#setDirty(expand('%:p'), 1) +endfunction + +function! tsuquyomi#flush() + call s:flush() +endfunction +" #### Notify changed }}} + +" #### File operations {{{ +function! tsuquyomi#open(...) + let filelist = a:0 ? map(range(1, a:{0}), 'expand(a:{v:val})') : [expand('%:p')] + return s:openFromList(filelist) +endfunction + +function! s:openFromList(filelist) + for file in a:filelist + if file == '' || tsuquyomi#bufManager#isNotOpenable(file) ||tsuquyomi#bufManager#isOpened(file) + continue + endif + call tsuquyomi#tsClient#tsOpen(file) + call tsuquyomi#bufManager#open(file) + endfor + return 1 +endfunction + +function! tsuquyomi#close(...) + let filelist = a:0 ? map(range(1, a:{0}), 'expand(a:{v:val})') : [expand('%:p')] + return s:closeFromList(filelist) +endfunction + +function! s:closeFromList(filelist) + let file_count = 0 + for file in a:filelist + if tsuquyomi#bufManager#isOpened(file) + call tsuquyomi#tsClient#tsClose(file) + call tsuquyomi#bufManager#close(file) + let file_count = file_count + 1 + endif + endfor + return file_count +endfunction + +function! s:reloadFromList(filelist) + let file_count = 0 + for file in a:filelist + if tsuquyomi#bufManager#isOpened(file) + call tsuquyomi#tsClient#tsReload(file, file) + else + call tsuquyomi#tsClient#tsOpen(file) + call tsuquyomi#bufManager#open(file) + endif + call tsuquyomi#bufManager#setDirty(file, 0) + let file_count = file_count + 1 + endfor + return file_count +endfunction + +function! tsuquyomi#reload(...) + let filelist = a:0 ? map(range(1, a:{0}), 'expand(a:{v:val})') : [expand('%:p')] + return s:reloadFromList(filelist) +endfunction + +function! tsuquyomi#reloadProject() + if tsuquyomi#config#isHigher(160) + call tsuquyomi#tsClient#tsReloadProjects() + else + let filelist = values(map(tsuquyomi#bufManager#openedFiles(), 'v:val.bufname')) + if len(filelist) + call s:closeFromList(filelist) + call s:openFromList(filelist) + endif + endif +endfunction + +function! tsuquyomi#dump(...) + let filelist = a:0 ? map(range(1, a:{0}), 'expand(a:{v:val})') : [expand('%:p')] + let [opend, not_opend] = s:checkOpenAndMessage(filelist) + + for file in opend + call tsuquyomi#tsClient#tsSaveto(file, file.'.dump') + endfor +endfunction +" #### File operations }}} + +" #### Project information {{{ +function! tsuquyomi#projectInfo(file) + if !tsuquyomi#config#isHigher(160) + echom '[Tsuquyomi] This feature requires TypeScript@1.6.0 or higher' + return {} + endif + if len(s:checkOpenAndMessage([a:file])[1]) + return {} + endif + let l:result = tsuquyomi#tsClient#tsProjectInfo(a:file, 1) + let l:result.filteredFileNames = [] + if has_key(l:result, 'fileNames') + for fileName in l:result.fileNames + if fileName =~ 'typescript/lib/lib.d.ts$' + else + call add(l:result.filteredFileNames, fileName) + endif + endfor + endif + return l:result +endfunction +" }}} + +" #### Complete {{{ +" +function! tsuquyomi#setPreviewOption() + " issue #41 + " I'll consider how to highlighting preview window without setting filetype. + " + " if &previewwindow + " setlocal ft=typescript + " endif +endfunction + +function! tsuquyomi#makeCompleteMenu(file, line, offset, entryNames) + call tsuquyomi#perfLogger#record('tsCompletionEntryDetail') + let res_list = tsuquyomi#tsClient#tsCompletionEntryDetails(a:file, a:line, a:offset, a:entryNames) + call tsuquyomi#perfLogger#record('tsCompletionEntryDetail_done') + let display_texts = [] + for result in res_list + call add(display_texts, s:joinPartsIgnoreBreak(result.displayParts, '{...}')) + endfor + return display_texts +endfunction + +" Get signature help information for preview window. +function! tsuquyomi#getSignatureHelp(file, line, offset) + + if stridx(&completeopt, 'preview') == -1 + return [0, ''] + endif + + let l:sig_dict = tsuquyomi#tsClient#tsSignatureHelp(a:file, a:line, a:offset) + let has_info = 0 + if has_key(l:sig_dict, 'items') && len(l:sig_dict.items) + let has_info = 1 + let info_lines = [] + + for sigitem in l:sig_dict.items + let siginfo_list = [] + let dispText = s:joinParts(sigitem.prefixDisplayParts) + let params_list = [] + for paramInfo in sigitem.parameters + let param_text = s:joinParts(paramInfo.displayParts) + if len(paramInfo.documentation) + let param_text = param_text.'/* '.s:joinPartsIgnoreBreak(paramInfo.documentation, ' ...').' */' + endif + call add(params_list, param_text) + endfor + let dispText = dispText.join(params_list, ', ').s:joinParts(sigitem.suffixDisplayParts) + if len(sigitem.documentation) + let dispText = dispText.'/* '.s:joinPartsIgnoreBreak(sigitem.documentation, ' ...').' */' + endif + call add(info_lines, dispText) + endfor + + let sigitem = l:sig_dict.items[0] + return [has_info, join(info_lines, "\n\n")] + endif + + return [has_info, ''] +endfunction + +" Comparator comparing on TypeScript CompletionEntry's 'sortText' property +" See https://github.com/Microsoft/TypeScript/blob/master/src/server/protocol.ts#L1483 +function! s:sortTextComparator(entry1, entry2) + if a:entry1.sortText < a:entry2.sortText + return -1 + elseif a:entry1.sortText > a:entry2.sortText + return 1 + else + return 0 + endif +endfunction + +function! tsuquyomi#signatureHelp() + pclose + + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return + endif + + call s:flush() + + let l:file = expand('%:p') + let l:line = line('.') + let l:offset = col('.') + let [has_info, siginfo] = tsuquyomi#getSignatureHelp(l:file, l:line, l:offset) + if has_info + call s:writeToPreview(siginfo) + endif +endfunction + +function! tsuquyomi#complete(findstart, base) + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return + endif + + let l:line_str = getline('.') + let l:line = line('.') + let l:offset = col('.') + + " search backwards for start of identifier (iskeyword pattern) + let l:start = l:offset + while l:start > 0 && l:line_str[l:start-2] =~ "\\k" + let l:start -= 1 + endwhile + + if(a:findstart) + call tsuquyomi#perfLogger#record('before_flush') + call s:flush() + call tsuquyomi#perfLogger#record('after_flush') + return l:start - 1 + else + let l:file = expand('%:p') + let l:res_dict = {'words': []} + call tsuquyomi#perfLogger#record('before_tsCompletions') + " By default the result list will be sorted by the 'name' properly alphabetically + let l:alpha_sorted_res_list = tsuquyomi#tsClient#tsCompletions(l:file, l:line, l:start, a:base) + call tsuquyomi#perfLogger#record('after_tsCompletions') + + let is_javascript = (&filetype == 'javascript') || (&filetype == 'jsx') || (&filetype == 'javascript.jsx') + if is_javascript + " Sort the result list according to how TypeScript suggests entries to be sorted + let l:res_list = sort(copy(l:alpha_sorted_res_list), 's:sortTextComparator') + else + let l:res_list = l:alpha_sorted_res_list + endif + + let enable_menu = stridx(&completeopt, 'menu') != -1 + let length = strlen(a:base) + if enable_menu + call tsuquyomi#perfLogger#record('start_menu') + if g:tsuquyomi_completion_preview + let [has_info, siginfo] = tsuquyomi#getSignatureHelp(l:file, l:line, l:start) + else + let [has_info, siginfo] = [0, ''] + endif + + let size = g:tsuquyomi_completion_chunk_size + let j = 0 + while j * size < len(l:res_list) + let entries = [] + let items = [] + let upper = min([(j + 1) * size, len(l:res_list)]) + for i in range(j * size, upper - 1) + let info = l:res_list[i] + if !length + \ || !g:tsuquyomi_completion_case_sensitive && info.name[0:length - 1] == a:base + \ || g:tsuquyomi_completion_case_sensitive && info.name[0:length - 1] ==# a:base + let l:item = {'word': info.name, 'menu': info.kind } + if has_info + let l:item.info = siginfo + endif + if is_javascript && info.kind == 'warning' + let l:item.menu = '' " Make display cleaner by not showing 'warning' as the type + endif + if !g:tsuquyomi_completion_detail + call complete_add(l:item) + else + " if file is TypeScript, then always add to entries list to + " fetch details. Or in the case of JavaScript, avoid adding to + " entries list if ScriptElementKind is 'warning'. Because those + " entries are just random identifiers that occur in the file. + if !is_javascript || info.kind != 'warning' + call add(entries, info.name) + endif + call add(items, l:item) + endif + endif + endfor + if g:tsuquyomi_completion_detail + call tsuquyomi#perfLogger#record('before_completeMenu'.j) + let menus = tsuquyomi#makeCompleteMenu(l:file, l:line, l:start, entries) + call tsuquyomi#perfLogger#record('after_completeMenu'.j) + let idx = 0 + for menu in menus + let items[idx].menu = menu + let items[idx].info = menu + call complete_add(items[idx]) + let idx = idx + 1 + endfor + " For JavaScript completion, there are entries whose + " ScriptElementKind is 'warning'. tsserver won't have any details + " returned for them, but they still need to be added at the end. + for i in range(idx, len(items) - 1) + call complete_add(items[i]) + endfor + endif + if complete_check() + break + endif + let j = j + 1 + endwhile + return [] + else + return filter(map(l:res_list, 'v:val.name'), 'stridx(v:val, a:base) == 0') + endif + + endif +endfunction +" ### Complete }}} + +" #### Definition {{{ +function! tsuquyomi#gotoDefinition(tsClientFunction, splitMode) + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return + endif + + call s:flush() + + let l:file = s:normalizePath(expand('%:p')) + let l:line = line('.') + let l:offset = col('.') + let l:res_list = a:tsClientFunction(l:file, l:line, l:offset) + let l:definition_split = a:splitMode > 0 ? a:splitMode : g:tsuquyomi_definition_split + + if(len(l:res_list) > 0) + " If get result, go to last location. + let l:info = l:res_list[len(l:res_list) - 1] + if a:splitMode == 0 && l:file == l:info.file + " Same file without split + call tsuquyomi#bufManager#winPushNavDef(bufwinnr(bufnr('%')), l:file, {'line': l:line, 'col': l:offset}) + call cursor(l:info.start.line, l:info.start.offset) + elseif l:definition_split == 0 + call tsuquyomi#bufManager#winPushNavDef(bufwinnr(bufnr('%')), l:file, {'line': l:line, 'col': l:offset}) + execute 'edit +call\ cursor('.l:info.start.line.','.l:info.start.offset.') '.l:info.file + elseif l:definition_split == 1 + execute 'split +call\ cursor('.l:info.start.line.','.l:info.start.offset.') '.l:info.file + elseif l:definition_split == 2 + execute 'vsplit +call\ cursor('.l:info.start.line.','.l:info.start.offset.') '.l:info.file + elseif l:definition_split == 3 + execute 'tabedit +call\ cursor('.l:info.start.line.','.l:info.start.offset.') '.l:info.file + endif + else + " If don't get result, do nothing. + endif +endfunction + +function! tsuquyomi#definition() + call tsuquyomi#gotoDefinition(function('tsuquyomi#tsClient#tsDefinition'), 0) +endfunction + +function! tsuquyomi#splitDefinition() + call tsuquyomi#gotoDefinition(function('tsuquyomi#tsClient#tsDefinition'), 1) +endfunction + +function! tsuquyomi#typeDefinition() + call tsuquyomi#gotoDefinition(function('tsuquyomi#tsClient#tsTypeDefinition'), 0) +endfunction + +function! tsuquyomi#goBack() + let [type, result] = tsuquyomi#bufManager#winPopNavDef(bufwinnr(bufnr('%'))) + if !type + echom '[Tsuquyomi] No items in navigation stack...' + return + endif + let [file_name, loc] = [result.file_name, result.loc] + if expand('%:p') == file_name + call cursor(loc.line, loc.col) + else + execute 'edit +call\ cursor('.loc.line.','.loc.col.') '.file_name + endif +endfunction + +" #### Definition }}} + +" #### References {{{ +" Show reference on a location window. +function! tsuquyomi#getLocations(tsClientFunction, functionTitle) + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return + endif + + call s:flush() + + let l:file = expand('%:p') + let l:line = line('.') + let l:offset = col('.') + + " 1. Fetch reference information. + let l:res = a:tsClientFunction(l:file, l:line, l:offset) + + let l:references = [] + if type(l:res) == v:t_dict && has_key(l:res, 'refs') + let l:references = l:res.refs + elseif type(l:res) == v:t_list + let l:references = l:res + endif + + if len(l:references) != 0 + let l:location_list = [] + " 2. Make a location list for `setloclist` + for reference in l:references + if has_key(reference, 'lineText') + let l:location_info = { + \'filename': fnamemodify(reference.file, ':~:.'), + \'lnum': reference.start.line, + \'col': reference.start.offset, + \'text': reference.lineText + \} + else + let l:location_info = { + \'filename': fnamemodify(reference.file, ':~:.'), + \'lnum': reference.start.line, + \'col': reference.start.offset + \} + endif + call add(l:location_list, l:location_info) + endfor + if len(l:location_list) > 0 + call setloclist(0, l:location_list, 'r') + "3. Open location window. + lwindow + endif + else + echom '[Tsuquyomi] '.a:functionTitle.': Not found...' + endif +endfunction + +function! tsuquyomi#references() + call tsuquyomi#getLocations(function('tsuquyomi#tsClient#tsReferences'), 'References') +endfunction + +function! tsuquyomi#implementation() + call tsuquyomi#getLocations(function('tsuquyomi#tsClient#tsImplementation'), 'Implementation') +endfunction + +" #### References }}} + +" #### Geterr {{{ + +function! tsuquyomi#asyncGeterr(...) + if g:tsuquyomi_is_available == 1 + call tsuquyomi#registerNotify(function('s:setqflist'), 'diagnostics') + + let l:delay = len(a:000) ? a:1 : 0 + call tsuquyomi#asyncCreateFixlist(l:delay) + endif +endfunction + +function! tsuquyomi#parseDiagnosticEvent(event, supportedCodes) + let quickfix_list = [] + let codes = len(a:supportedCodes) > 0 ? a:supportedCodes : s:supportedCodeFixes + if has_key(a:event, 'type') && a:event.type ==# 'event' && (a:event.event ==# 'syntaxDiag' || a:event.event ==# 'semanticDiag') + for diagnostic in a:event.body.diagnostics + if diagnostic.text =~ "Cannot find module" && g:tsuquyomi_ignore_missing_modules == 1 + continue + endif + let item = {} + let item.filename = a:event.body.file + let item.lnum = diagnostic.start.line + if(has_key(diagnostic.start, 'offset')) + let item.col = diagnostic.start.offset + endif + let item.text = diagnostic.text + if !has_key(diagnostic, 'code') + continue + endif + let item.code = diagnostic.code + let l:cfidx = index(codes, (diagnostic.code . '')) + if l:cfidx >= 0 + let l:qfmark = '[QF available]' + let item.text = diagnostic.code . l:qfmark . ': ' . item.text + endif + let item.availableCodeFix = l:cfidx >= 0 + let item.type = 'E' + call add(quickfix_list, item) + endfor + endif + return quickfix_list +endfunction + +function! tsuquyomi#registerNotify(callback, eventName) + call tsuquyomi#tsClient#registerNotify(a:callback, a:eventName) +endfunction + +function! tsuquyomi#emitChange(bufnum) + let l:input = join(getbufline(a:bufnum, 1, '$'), "\n") . "\n" + let l:file = expand('%:p') + + " file, line, offset, endLine, endOffset, insertString + call tsuquyomi#tsClient#tsAsyncChange(l:file, 1, 1, len(l:input), 1, l:input) + + return l:file +endfunction + +function! tsuquyomi#asyncCreateFixlist(...) + " Works only Vim8(+channel, +job) + " We must register callbacks(handler and callback) before execute this. + " See `tsuquyomi#config#initBuffer()` + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return [] + endif + + let l:delay = len(a:000) ? a:1 : 0 + let l:bufnum = bufnr('%') + + " Tell TSServer to change for get syntaxDiag and semanticDiag errors. + if delay > 0 + " Debunce request for Textchanged autocmd. + call s:addDiagnosticsQueue(l:delay, l:bufnum) + else + " Cancel current timer + if s:diagnostics_timer != -1 + call timer_stop(s:diagnostics_timer) + let s:diagnostics_timer = -1 + endif + + let l:file = tsuquyomi#emitChange(l:bufnum) + let l:delayMsec = 50 "TODO export global option + call tsuquyomi#tsClient#tsAsyncGeterr([l:file], l:delayMsec) + endif +endfunction + +function! tsuquyomi#createQuickFixListFromEvents(event_list) + if !len(a:event_list) + return [] + endif + let quickfix_list = [] + let supportedCodes = tsuquyomi#getSupportedCodeFixes() + for event_item in a:event_list + let items = tsuquyomi#parseDiagnosticEvent(event_item, supportedCodes) + let quickfix_list = quickfix_list + items + endfor + return quickfix_list +endfunction + +function! tsuquyomi#createFixlist() + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return [] + endif + call s:flush() + + let l:files = [expand('%:p')] + let l:delayMsec = 50 "TODO export global option + + " 1. Fetch error information from TSServer. + let result = tsuquyomi#tsClient#tsGeterr(l:files, l:delayMsec) + + " 2. Make a quick fix list for `setqflist`. + return tsuquyomi#createQuickFixListFromEvents(result) +endfunction + +function! tsuquyomi#geterr() + let quickfix_list = tsuquyomi#createFixlist() + + call s:setqflist(quickfix_list, 1) +endfunction + +function! tsuquyomi#geterrProject() + + if !tsuquyomi#config#isHigher(160) + echom '[Tsuquyomi] This feature requires TypeScript@1.6.0 or higher' + return + endif + + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return + endif + + call s:flush() + let l:file = expand('%:p') + + " 1. Fetch Project info for event count. + let l:pinfo = tsuquyomi#projectInfo(l:file) + if !has_key(l:pinfo, 'filteredFileNames') || !len(l:pinfo.filteredFileNames) + return + endif + + " 2. Fetch error information from TSServer. + let l:delayMsec = 50 "TODO export global option + let l:result = tsuquyomi#tsClient#tsGeterrForProject(l:file, l:delayMsec, len(l:pinfo.filteredFileNames)) + + " 3. Make a quick fix list for `setqflist`. + let quickfix_list = tsuquyomi#createQuickFixListFromEvents(result) + + call s:setqflist(quickfix_list, 1) +endfunction + +function! tsuquyomi#reloadAndGeterr() + if tsuquyomi#tsClient#statusTss() != 'dead' + return tsuquyomi#geterr() + endif +endfunction + +" #### Geterr }}} + +" #### Balloon {{{ +function! tsuquyomi#balloonexpr() + call s:flush() + let res = tsuquyomi#tsClient#tsQuickinfo(fnamemodify(buffer_name(v:beval_bufnr),":p"), v:beval_lnum, v:beval_col) + if has_key(res, 'displayString') + if (has_key(res, 'documentation') && res.documentation != '') + return join([res.documentation, res.displayString], "\n\n") + endif + + return res.displayString + endif +endfunction + +function! tsuquyomi#hint() + call s:flush() + let res = tsuquyomi#tsClient#tsQuickinfo(expand('%:p'), line('.'), col('.')) + if has_key(res, 'displayString') + if (has_key(res, 'documentation') && res.documentation != '') + return join([res.documentation, res.displayString], "\n\n") + endif + + return res.displayString + else + return '[Tsuquyomi] There is no hint at the cursor.' + endif +endfunction + +" #### Balloon }}} + +" #### Rename {{{ +function! tsuquyomi#renameSymbol() + return s:renameSymbolWithOptions(0, 0) +endfunction + +function! tsuquyomi#renameSymbolWithComments() + return s:renameSymbolWithOptions(1, 0) +endfunction + +function! tsuquyomi#renameSymbolWithStrings() + return s:renameSymbolWithOptions(0, 1) +endfunction + +function! tsuquyomi#renameSymbolWithCommentsStrings() + return s:renameSymbolWithOptions(1, 1) +endfunction + +function! s:renameSymbolWithOptions(findInComments, findInString) + + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return + endif + + call s:flush() + + let l:filename = expand('%:p') + let l:line = line('.') + let l:offset = col('.') + + " * Make a list of locations of symbols to be replaced. + let l:res_dict = tsuquyomi#tsClient#tsRename(l:filename, l:line, l:offset, a:findInComments, a:findInString) + + " * Check the symbol is renameable + if !has_key(l:res_dict, 'info') + echom '[Tsuquyomi] No symbol to be renamed' + return + elseif !l:res_dict.info.canRename + echom '[Tsuquyomi] '.l:res_dict.info.localizedErrorMessage + return + endif + + " * Check affection only current buffer. + if len(l:res_dict.locs) != 1 || s:normalizePath(expand('%:p')) != l:res_dict.locs[0].file + let file_list = map(copy(l:res_dict.locs), 'v:val.file') + let dirty_file_list = tsuquyomi#bufManager#whichDirty(file_list) + call s:reloadFromList(dirty_file_list) + endif + + " * Question user what new symbol name. + echohl String + let renameTo = input('[Tsuquyomi] New symbol name : ') + echohl none + if !s:is_valid_identifier(renameTo) + echo ' ' + echom '[Tsuquyomi] It is a not valid identifer.' + return + endif + + let s:locs_dict = {} + let s:rename_to = renameTo + let s:other_buf_list = [] + + " * Execute to replace symbols by location, by buffer + for fileLoc in l:res_dict.locs + let is_open = tsuquyomi#bufManager#isOpened(fileLoc.file) + if !is_open + let s:locs_dict[s:normalizePath(fileLoc.file)] = fileLoc.locs + call add(s:other_buf_list, s:normalizePath(fileLoc.file)) + continue + endif + let buffer_name = tsuquyomi#bufManager#bufName(fileLoc.file) + let s:locs_dict[buffer_name] = fileLoc.locs + "echom 'fileLoc.file '.fileLoc.file.', '.buffer_name + let changed_count = 0 + if buffer_name != expand('%:p') + call add(s:other_buf_list, buffer_name) + continue + endif + endfor + + if !g:tsuquyomi_save_onrename + let changed_count = s:renameLocal(0) + echohl String + echo ' ' + echo 'Changed '.changed_count.' locations.' + echohl none + for otherbuf in s:other_buf_list + execute('silent split +call\ s:renameLocal(0) '.otherbuf) + endfor + else + echohl String + let l:confirm = input('[Tsuquyomi] The symbol is located in '.(len(s:other_buf_list) + 1).' files. Really replace them? [Y/n]') + echohl none + if l:confirm != 'n' && l:confirm != 'no' + call s:renameLocalSeq(-1) + endif + endif +endfunction + +function! s:renameLocal(should_save) + let changed_count = 0 + let filename = expand('%:p') + let locations_in_buf = s:locs_dict[expand('%:p')] + let renameTo = s:rename_to + for span in locations_in_buf + if span.start.line != span.end.line + echom '[Tsuquyomi] this span is across multiple lines. ' + return + endif + + let lineidx = span.start.line + let linestr = getline(lineidx) + if span.start.offset - 1 + let pre = linestr[:(span.start.offset - 2)] + let post = linestr[(span.end.offset - 1):] + let linestr = pre.renameTo.post + else + let post = linestr[(span.end.offset - 1):] + let linestr = renameTo.post + endif + call setline(lineidx, linestr) + let changed_count = changed_count + 1 + endfor + call tsuquyomi#reload() + if a:should_save + write + endif + return changed_count +endfunction + +function! s:renameLocalSeq(index) + call s:renameLocal(1) + if a:index + 1 < len(s:other_buf_list) + let l:next = s:other_buf_list[a:index + 1] + execute('silent edit +call\ s:renameLocalSeq('.(a:index + 1).') '.l:next) + else + echohl String + echo ' ' + echo 'Changed '.(a:index + 2).' files successfuly.' + echohl none + endif +endfunction +" #### Rename }}} + +" #### NavBar {{{ +function! tsuquyomi#navBar() + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return [[], 0] + endif + + call s:flush() + + let l:filename = expand('%:p') + + let result_list = tsuquyomi#tsClient#tsNavBar(tsuquyomi#bufManager#normalizePath(l:filename)) + + if len(result_list) + return [result_list, 1] + else + return [[], 0] + endif + +endfunction +" #### NavBar }}} + +" #### Navto {{{ +function! tsuquyomi#navto(term, kindModifiers, matchKindType) + + if len(a:term) < g:tsuquyomi_search_term_min_length + echom "[Tsuquyomi] search term's length should be greater than ".g:tsuquyomi_search_term_min_length."." + return [[], 0] + endif + + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return [[], 0] + endif + + call s:flush() + + let l:filename = expand('%:p') + + let result_list = tsuquyomi#tsClient#tsNavto(tsuquyomi#bufManager#normalizePath(l:filename), a:term, 100) + + if len(result_list) + let list = [] + for result in result_list + let flg = 1 + if a:matchKindType == 1 + let flg = flg && (result.matchKind=='prefix' || result.matchKind=='exact') + elseif a:matchKindType == 2 + let flg = flg && (result.matchKind=='exact') + endif + if a:kindModifiers != '' + let flg = flg && has_key(result, 'kindModifiers') && result.kindModifiers=~a:kindModifiers + endif + if flg + call add(list, result) + endif + endfor + return [list, 1] + else + echohl Error + echom "[Tsuquyomi] Nothing was hit." + echohl none + return [[], 0] + endif + +endfunction + +function! tsuquyomi#navtoByLoclist(term, kindModifiers, matchKindType) + let [result_list, res_code] = tsuquyomi#navto(a:term, a:kindModifiers, a:matchKindType) + if res_code + let l:location_list = [] + for navtoItem in result_list + let text = navtoItem.kind.' '.navtoItem.name + if has_key(navtoItem, 'kindModifiers') + let text = navtoItem.kindModifiers.' '.text + endif + if has_key(navtoItem, 'containerName') + if has_key(navtoItem, 'containerKind') + let text = text.' in '.navtoItem.containerKind.' '.navtoItem.containerName + else + let text = text.' in '.navtoItem.containerName + endif + endif + let l:location_info = { + \'filename': navtoItem.file, + \'lnum': navtoItem.start.line, + \'col': navtoItem.start.offset, + \'text': text + \} + call add(l:location_list, l:location_info) + endfor + if(len(l:location_list) > 0) + call setloclist(0, l:location_list, 'r') + lwindow + endif + endif +endfunction + +function! tsuquyomi#navtoByLoclistContain(term) + call tsuquyomi#navtoByLoclist(a:term, '', 0) +endfunction + +function! tsuquyomi#navtoByLoclistPrefix(term) + call tsuquyomi#navtoByLoclist(a:term, '', 1) +endfunction + +function! tsuquyomi#navtoByLoclistExact(term) + call tsuquyomi#navtoByLoclist(a:term, '', 2) +endfunction + +" #### Navto }}} + +" #### Configure {{{ +function! tsuquyomi#sendConfigure() + let l:file = expand('%:p') + let l:hostInfo = &viminfo + let l:formatOptions = { } + let l:extraFileExtensions = [] + if exists('&shiftwidth') + let l:formatOptions.baseIndentSize = &shiftwidth + let l:formatOptions.indentSize = &shiftwidth + endif + if exists('&expandtab') + let l:formatOptions.convertTabsToSpaces = &expandtab + endif + call tsuquyomi#tsClient#tsConfigure(l:file, l:hostInfo, l:formatOptions, l:extraFileExtensions) +endfunction +" #### }}} + +" #### CodeFixes {{{ + +function! s:sortQfItemByColdiff(a, b) + if a:a.coldiff < a:b.coldiff + return -1 + endif + if a:a.coldiff == a:b.coldiff + return 0 + endif + if a:a.coldiff > a:b.coldiff + return 1 + endif +endfunction + +let s:supportedCodeFixes = [] +function! tsuquyomi#getSupportedCodeFixes() + if !tsuquyomi#config#isHigher(210) + return [] + endif + if len(s:supportedCodeFixes) + return s:supportedCodeFixes + endif + try + let s:supportedCodeFixes = tsuquyomi#tsClient#tsGetSupportedCodeFixes() + return s:supportedCodeFixes + catch + return [] + endtry +endfunction + +function! tsuquyomi#quickFix() + if !tsuquyomi#config#isHigher(210) + echom '[Tsuquyomi] This feature requires TypeScript@2.1.0 or higher' + return + endif + if len(s:checkOpenAndMessage([expand('%:p')])[1]) + return + endif + call s:flush() + let l:file = expand('%:p') + let l:line = line('.') + let l:col = col('.') + let l:qfList = tsuquyomi#createFixlist() + call filter(l:qfList, 'v:val.lnum == l:line') + if !len(l:qfList) + echom '[Tsuquyomi] There is no error to fix' + return + endif + if len(l:qfList) > 1 + let l:temp = [] + for qfItem in qfList + let qfItem.coldiff = abs(qfItem.col - l:col) + call add(l:temp, qfItem) + endfor + call sort(l:temp, function('s:sortQfItemByColdiff')) + let l:target = l:temp[0] + else + let l:target = l:qfList[0] + endif + let l:supportedCodes = copy(tsuquyomi#getSupportedCodeFixes()) + call filter(l:supportedCodes, 'v:val == l:target.code') + if !len(l:supportedCodes) + echom '[Tsuquyomi] '.l:target.code.' has no quick fixes...' + return + endif + let l:result_list = tsuquyomi#tsClient#tsGetCodeFixes(file, l:target.lnum, l:target.col, l:target.lnum, l:target.col, [l:target.code]) + if !len(l:result_list) + echom '[Tsuquyomi] '.l:target.code.' has no quick fixes...' + return + endif + let s:available_qf_descriptions = map(copy(l:result_list), 'v:val.description') + let [description, isSelect] = tsuquyomi#selectQfDescription() + if !isSelect + return + endif + let l:changes = filter(l:result_list, 'v:val.description ==# description')[0].changes + " TODO + " allow other file + for fileChange in l:changes + if tsuquyomi#bufManager#normalizePath(l:file) !=# fileChange.fileName + echom '[Tsuquyomi] Tsuquyomi does not support this code fix...' + return + endif + endfor + call tsuquyomi#applyQfChanges(l:changes) +endfunction + +function! tsuquyomi#applyQfChanges(changes) + for fileChange in a:changes + " TODO + " allow fileChange.fileName + for textChange in fileChange.textChanges + let linesCountForReplacement = textChange.end.line - textChange.start.line + 1 + let preSpan = strpart(getline(textChange.start.line), 0, textChange.start.offset - 1) + let postSpan = strpart(getline(textChange.end.line), textChange.end.offset - 1) + let repList = split(preSpan.textChange.newText.postSpan, '\n') + let l:count = textChange.start.line + for rLine in repList + if l:count <= textChange.end.line + call setline(l:count, rLine) + else + call append(l:count - 1, rLine) + endif + let l:count = l:count + 1 + endfor + endfor + endfor +endfunction + +let s:available_qf_descriptions = [] +function! tsuquyomi#selectQfComplete(arg_lead, cmd_line, cursor_pos) + return join(s:available_qf_descriptions, "\n") +endfunction + +function! tsuquyomi#selectQfDescription() + echohl String + if len(s:available_qf_descriptions) == 1 + let l:yn = input('[Tsuquyomi] Apply: "'.s:available_qf_descriptions[0].'" [y/N]') + echohl none + echo ' ' + if l:yn =~ 'N' + return ['', 0] + else + return [s:available_qf_descriptions[0], 1] + endif + endif + let l:selected_desc = input('[Tsuquyomi] You can apply 2 more than quick fixes. Select one (candidates are shown using TAB): ', '', 'custom,tsuquyomi#selectQfComplete') + echohl none + echo ' ' + if len(filter(copy(s:available_qf_descriptions), 'v:val==#l:selected_desc')) + return [l:selected_desc, 1] + else + echohl Error + echom '[Tsuquyomi] Invalid selection.' + echohl none + return ['', 0] + endif +endfunction +"#### CodeFixes }}} + +" ### Public functions }}} + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/autoload/tsuquyomi/bufManager.vim b/autoload/tsuquyomi/bufManager.vim new file mode 100644 index 0000000..94d471c --- /dev/null +++ b/autoload/tsuquyomi/bufManager.vim @@ -0,0 +1,165 @@ +"============================================================================ +" FILE: bufManager.vim +" AUTHOR: Quramy +"============================================================================ + +scriptencoding utf-8 + +let s:save_cpo = &cpo +set cpo&vim + +let s:buf_info_map = {} + +function! s:normalize(buf_name) + return substitute(a:buf_name, '\\', '/', 'g') +endfunction + +function! tsuquyomi#bufManager#normalizePath(buf_name) + return s:normalize(a:buf_name) +endfunction + + +function! tsuquyomi#bufManager#open(file_name) + if bufnr(a:file_name) == -1 + return 0 + endif + let info = { + \'is_opened': 1, + \'is_dirty': 0, + \'bufname': a:file_name, + \'nav_def_stack': [] + \} + let s:buf_info_map[s:normalize(a:file_name)] = info + return info +endfunction + +function! tsuquyomi#bufManager#isNotOpenable(file_name) + if (match(a:file_name, '^[^\/]*:\/\/') + 1) && !(match(a:file_name, '^file:\/\/') + 1) + return 1 + else + return 0 + endif +endfunction + +function! tsuquyomi#bufManager#openedFiles() + return filter(copy(s:buf_info_map), 'v:val.is_opened') +endfunction + +function! tsuquyomi#bufManager#clearMap() + let s:buf_info_map = {} + return 1 +endfunction + +function! tsuquyomi#bufManager#bufName(file_name) + let name = s:normalize(a:file_name) + if !has_key(s:buf_info_map, name) + return 0 + endif + return s:buf_info_map[name].bufname +endfunction + +function! tsuquyomi#bufManager#close(file_name) + let name = s:normalize(a:file_name) + if !has_key(s:buf_info_map, name) + return 0 + endif + let s:buf_info_map[name].is_opened = 0 + return 1 +endfunction + +function! tsuquyomi#bufManager#isOpened(file_name) + let name = s:normalize(a:file_name) + if !has_key(s:buf_info_map, name) + return 0 + endif + return s:buf_info_map[name].is_opened +endfunction + +function! tsuquyomi#bufManager#setDirty(file_name, state) + let name = s:normalize(a:file_name) + if !has_key(s:buf_info_map, name) + return 0 + endif + let s:buf_info_map[name].is_dirty = a:state + return 1 +endfunction + +function! tsuquyomi#bufManager#isDirty(file_name) + let name = s:normalize(a:file_name) + if !has_key(s:buf_info_map, name) + return 0 + endif + return s:buf_info_map[name].is_dirty +endfunction + +function! tsuquyomi#bufManager#whichDirty(file_name_list) + let result = [] + for file_name in a:file_name_list + if tsuquyomi#bufManager#isDirty(file_name) + call add(result, file_name) + endif + endfor + return result +endfunction + +function! tsuquyomi#bufManager#tmpfile(file_name) + let name = s:normalize(a:file_name) + if !has_key(s:buf_info_map, name) + return 0 + endif + if !has_key(s:buf_info_map[name], 'tmpfile') + let tmpfile = tempname() + let s:buf_info_map[name].tmpfile = tmpfile + return tmpfile + else + return s:buf_info_map[name].tmpfile + endif +endfunction + +function! tsuquyomi#bufManager#saveTmp(file_name) + let tmpfile = tsuquyomi#bufManager#tmpfile(a:file_name) + call writefile(getbufline(a:file_name, 1, '$'), tmpfile) + return 1 +endfunction + +function! tsuquyomi#bufManager#pushNavDef(file_name, loc) + let name = s:normalize(a:file_name) + if !has_key(s:buf_info_map, name) + return 0 + endif + call add(s:buf_info_map[name].nav_def_stack, a:loc) + return 1 +endfunction + +function! tsuquyomi#bufManager#popNavDef(file_name) + let name = s:normalize(a:file_name) + if !has_key(s:buf_info_map, name) + return {} + endif + if len(s:buf_info_map[name].nav_def_stack) + return remove(s:buf_info_map[name].nav_def_stack, -1) + else + return {} + endif +endfunction + +let s:win_nav_map = {} +function! tsuquyomi#bufManager#winPushNavDef(winnm, file_name, loc) + if !has_key(s:win_nav_map, a:winnm) + let s:win_nav_map[a:winnm] = [] + endif + call add(s:win_nav_map[a:winnm], {'file_name': a:file_name, 'loc': a:loc}) +endfunction + +function! tsuquyomi#bufManager#winPopNavDef(winnm) + if !has_key(s:win_nav_map, a:winnm) + return [0, {}] + endif + if !len(s:win_nav_map[a:winnm]) + return [0, {}] + endif + return [1, remove(s:win_nav_map[a:winnm], -1)] +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/autoload/tsuquyomi/config.vim b/autoload/tsuquyomi/config.vim new file mode 100644 index 0000000..c32a3a8 --- /dev/null +++ b/autoload/tsuquyomi/config.vim @@ -0,0 +1,320 @@ +"============================================================================ +" FILE: autoload/tsuquyomi/config.vim +" AUTHOR: Quramy +"============================================================================ +" +scriptencoding utf-8 + +let s:save_cpo = &cpo +set cpo&vim + +let s:V = vital#of('tsuquyomi') +let s:P = s:V.import('ProcessManager') +let s:Process = s:V.import('Process') +let s:Prelude = s:V.import('Prelude') +let s:Filepath = s:V.import('System.Filepath') +let s:script_dir = expand(':p:h') + +let s:tss_cmd = '' +let s:tss_version = {'is_valid': 0, 'out': '???'} + +let s:is_vim8 = has('patch-8.0.1') + +function! tsuquyomi#config#preconfig() + + if !exists('g:tsuquyomi_is_available') + if !s:is_vim8 && !s:P.is_available() + " 1. vimproc or vim8 installation check + let g:tsuquyomi_is_available = 0 + call s:deleteCommand() + echom '[Tsuquyomi] Shougo/vimproc.vim or vim8 is not installed. Please install it.' + return 0 + else + " 2. tsserver installation check + let s:tss_cmd = tsuquyomi#config#tsscmd() + if s:tss_cmd == '' + let g:tsuquyomi_is_available = 0 + call s:deleteCommand() + return 0 + endif + + " 3. TypeScript version check + call tsuquyomi#config#getVersion() + if !s:tss_version.is_valid + let g:tsuquyomi_is_available = 0 + call s:deleteCommand() + echom '[Tsuquyomi] Your TypeScript version is invalid. '.s:tss_version.out + return 0 + endif + if !tsuquyomi#config#isHigher(150) + let g:tsuquyomi_is_available = 0 + call s:deleteCommand() + echom '[Tsuquyomi] tsuquyomi requires typescript@~1.5.0' + return 0 + endif + let g:tsuquyomi_is_available = 1 + endif + endif + + return g:tsuquyomi_is_available +endfunction + +function! s:deleteCommand() + delc TsuquyomiStartServer + delc TsuStartServer + delc TsuquyomiStopServer + delc TsuStopServer + delc TsuquyomiStatusServer + delc TsuStatusServer + delc TsuquyomiReloadProject + delc TsuReloadProject +endfunction + +function! tsuquyomi#config#tssargs() + let args = [] + call add(args, '--locale '.g:tsuquyomi_locale) + return join(args, ' ') +endfunction + +" Search from cwd upward looking for first directory with package.json +function! tsuquyomi#config#_path2project_directory_ts() + let parent = getcwd() + + while 1 + let path = parent . '/package.json' + if filereadable(path) + return parent + endif + let next = fnamemodify(parent, ':h') + if next == parent + return '' + endif + let parent = next + endwhile +endfunction + +function! tsuquyomi#config#tsscmd() + if s:tss_cmd !=# '' + return s:tss_cmd + endif + if g:tsuquyomi_use_local_typescript != 0 + let l:prj_dir = tsuquyomi#config#_path2project_directory_ts() + + if l:prj_dir == '' + " Fallback to generic project root search + let l:prj_dir = s:Prelude.path2project_directory(getcwd(), 1) + endif + + if l:prj_dir !=# '' + let l:searched_tsserver_path = s:Filepath.join(l:prj_dir, 'node_modules/typescript/bin/tsserver') + if filereadable(l:searched_tsserver_path) + return g:tsuquyomi_nodejs_path.' "'.l:searched_tsserver_path.'"' + endif + endif + endif + if g:tsuquyomi_use_dev_node_module == 0 + let l:cmd = 'tsserver' + if has('win32') || has('win64') + let l:cmd .= '.cmd' + endif + if !executable(l:cmd) + echom '[Tsuquyomi] tsserver is not installed. Try "npm -g install typescript".' + return '' + endif + else + if g:tsuquyomi_use_dev_node_module == 1 + let l:path = s:Filepath.join(s:script_dir, '../../node_modules/typescript/bin/tsserver') + elseif g:tsuquyomi_use_dev_node_module == 2 + let l:path = g:tsuquyomi_tsserver_path + else + echom '[Tsuquyomi] Invalid option value "g:tsuquyomi_use_dev_node_module".' + return '' + endif + if (has('win32') || has('win64')) && l:path !~ '\.cmd$' + let l:path .= '.cmd' + endif + if filereadable(l:path) != 1 + echom '[Tsuquyomi] tsserver.js does not exist. Try "npm install"., '.l:path + return '' + endif + if !s:is_vim8 + let l:cmd = g:tsuquyomi_nodejs_path.' "'.l:path.'"' + else + let l:cmd = g:tsuquyomi_nodejs_path.' '.l:path + endif + endif + return l:cmd +endfunction + +function! tsuquyomi#config#getVersion() + if s:tss_version.is_valid + return s:tss_version + endif + let l:cmd = substitute(tsuquyomi#config#tsscmd(), 'tsserver', 'tsc', '') + let l:cmd = substitute(l:cmd, "\\", "/", "g") + let out = s:Process.system(l:cmd.' --version') + let pattern = '\vVersion\s+(\d+)\.(\d+)\.(\d+)-?([^\.\n\s]*)' + let matched = matchlist(out, pattern) + if !len(matched) + let s:tss_version = {'is_valid': 0, 'out': out} + return s:tss_version + endif + let [major, minor, patch] = [str2nr(matched[1]), str2nr(matched[2]), str2nr(matched[3])] + let s:tss_version = { + \ 'is_valid': 1, + \ 'major': major, 'minor': minor, 'patch': patch, + \ 'channel': matched[4], + \ } + return s:tss_version +endfunction + +function! tsuquyomi#config#isHigher(target) + if !s:tss_version.is_valid + return 0 + endif + let numeric_version = s:tss_version.major * 100 + s:tss_version.minor * 10 + s:tss_version.patch + return numeric_version >= a:target +endfunction + +function! tsuquyomi#config#createBufLocalCommand() + command! -buffer -nargs=* -complete=buffer TsuquyomiOpen :call tsuquyomi#open() + command! -buffer -nargs=* -complete=buffer TsuOpen :call tsuquyomi#open() + command! -buffer -nargs=* -complete=buffer TsuquyomiClose :call tsuquyomi#close() + command! -buffer -nargs=* -complete=buffer TsuClose :call tsuquyomi#close() + command! -buffer -nargs=* -complete=buffer TsuquyomiReload :call tsuquyomi#reload() + command! -buffer -nargs=* -complete=buffer TsuReload :call tsuquyomi#reload() + command! -buffer -nargs=* -complete=buffer TsuquyomiDump :call tsuquyomi#dump() + command! -buffer -nargs=* -complete=buffer TsuDump :call tsuquyomi#dump() + command! -buffer -nargs=1 TsuquyomiSearch :call tsuquyomi#navtoByLoclistContain() + command! -buffer -nargs=1 TsuSearch :call tsuquyomi#navtoByLoclistContain() + + command! -buffer TsuquyomiDefinition :call tsuquyomi#definition() + command! -buffer TsuDefinition :call tsuquyomi#definition() + command! -buffer TsuquyomiSplitDefinition :call tsuquyomi#splitDefinition() + command! -buffer TsuSplitDefinition :call tsuquyomi#splitDefinition() + command! -buffer TsuquyomiGoBack :call tsuquyomi#goBack() + command! -buffer TsuGoBack :call tsuquyomi#goBack() + command! -buffer TsuquyomiImplementation :call tsuquyomi#implementation() + command! -buffer TsuImplementation :call tsuquyomi#implementation() + command! -buffer TsuquyomiReferences :call tsuquyomi#references() + command! -buffer TsuReferences :call tsuquyomi#references() + command! -buffer TsuquyomiTypeDefinition :call tsuquyomi#typeDefinition() + command! -buffer TsuTypeDefinition :call tsuquyomi#typeDefinition() + command! -buffer TsuquyomiGeterr :call tsuquyomi#geterr() + command! -buffer TsuGeterr :call tsuquyomi#geterr() + command! -buffer TsuquyomiGeterrProject :call tsuquyomi#geterrProject() + command! -buffer TsuGeterrProject :call tsuquyomi#geterrProject() + command! -buffer TsuquyomiRenameSymbol :call tsuquyomi#renameSymbol() + command! -buffer TsuRenameSymbol :call tsuquyomi#renameSymbol() + command! -buffer TsuquyomiRenameSymbolC :call tsuquyomi#renameSymbolWithComments() + command! -buffer TsuRenameSymbolC :call tsuquyomi#renameSymbolWithComments() + command! -buffer TsuquyomiQuickFix :call tsuquyomi#quickFix() + command! -buffer TsuQuickFix :call tsuquyomi#quickFix() + command! -buffer TsuquyomiSignatureHelp :call tsuquyomi#signatureHelp() + command! -buffer TsuSignatureHelp :call tsuquyomi#signatureHelp() + command! -buffer TsuAsyncGeterr :call tsuquyomi#asyncGeterr() + command! -buffer TsuquyomiAsyncGeterr :call tsuquyomi#asyncGeterr() + + " TODO These commands don't work correctly. + command! -buffer TsuquyomiRenameSymbolS :call tsuquyomi#renameSymbolWithStrings() + command! -buffer TsuRenameSymbolS :call tsuquyomi#renameSymbolWithStrings() + command! -buffer TsuquyomiRenameSymbolCS :call tsuquyomi#renameSymbolWithCommentsStrings() + command! -buffer TsuRenameSymbolCS :call tsuquyomi#renameSymbolWithCommentsStrings() + + command! -buffer TsuquyomiImport :call tsuquyomi#es6import#complete() + command! -buffer TsuImport :call tsuquyomi#es6import#complete() +endfunction + +function! tsuquyomi#config#createBufLocalMap() + noremap (TsuquyomiDefinition) :TsuquyomiDefinition + noremap (TsuquyomiSplitDefinition) :TsuquyomiSplitDefinition + noremap (TsuquyomiTypeDefinition) :TsuquyomiTypeDefinition + noremap (TsuquyomiGoBack) :TsuquyomiGoBack + noremap (TsuquyomiImplementation) :TsuquyomiImplementation + noremap (TsuquyomiReferences) :TsuquyomiReferences + noremap (TsuquyomiRenameSymbol) :TsuquyomiRenameSymbol + noremap (TsuquyomiRenameSymbolC) :TsuquyomiRenameSymbolC + noremap (TsuquyomiQuickFix) :TsuquyomiQuickFix + noremap (TsuquyomiSignatureHelp) :TsuquyomiSignatureHelp + noremap (TsuquyomiImport) :TsuquyomiImport + + " TODO These commands don't work correctly. + noremap (TsuquyomiRenameSymbolS) :TsuquyomiRenameSymbolS + noremap (TsuquyomiRenameSymbolCS) :TsuquyomiRenameSymbolCS +endfunction + +function! tsuquyomi#config#applyBufLocalDefaultMap() + if(!exists('g:tsuquyomi_disable_default_mappings')) + if !hasmapto('(TsuquyomiDefinition)') + map (TsuquyomiDefinition) + endif + if !hasmapto('(TsuquyomiSplitDefinition)') + map ] (TsuquyomiSplitDefinition) + map (TsuquyomiSplitDefinition) + endif + if !hasmapto('(TsuquyomiGoBack)') + map (TsuquyomiGoBack) + endif + if !hasmapto('(TsuquyomiReferences)') + map (TsuquyomiReferences) + endif + endif +endfunction + +let s:autocmd_patterns = [] +function! tsuquyomi#config#applyBufLocalAutocmd(pattern) + if index(s:autocmd_patterns, a:pattern) == -1 + call add(s:autocmd_patterns, a:pattern) + endif + let all_patterns = join(s:autocmd_patterns, ",") + if !g:tsuquyomi_disable_quickfix + augroup tsuquyomi_geterr + autocmd! + execute 'autocmd BufWritePost '.all_patterns.' silent! call tsuquyomi#reloadAndGeterr()' + augroup END + endif + + augroup tsuquyomi_defaults + autocmd! + autocmd BufWinEnter * silent! call tsuquyomi#setPreviewOption() + execute 'autocmd TextChanged,TextChangedI '.all_patterns.' silent! call tsuquyomi#letDirty()' + augroup END +endfunction + +function! tsuquyomi#config#applyBufLocalFunctions() + setlocal omnifunc=tsuquyomi#complete + + if exists('+bexpr') + setlocal bexpr=tsuquyomi#balloonexpr() + endif +endfunction + +function! tsuquyomi#config#registerInitialCallback() + call tsuquyomi#tsClient#registerCallback('tsuquyomi#tsClient#readDiagnostics', 'diagnostics') +endfunction + +let s:async_initialized = 0 +function! tsuquyomi#config#initBuffer(opt) + if !has_key(a:opt, 'pattern') + echom '[Tsuquyomi] missing options. "pattern"' + return 0 + endif + let pattern = a:opt.pattern + call tsuquyomi#config#createBufLocalCommand() + call tsuquyomi#config#createBufLocalMap() + call tsuquyomi#config#applyBufLocalDefaultMap() + call tsuquyomi#config#applyBufLocalAutocmd(pattern) + call tsuquyomi#config#applyBufLocalFunctions() + if g:tsuquyomi_auto_open + silent! call tsuquyomi#open() + silent! call tsuquyomi#sendConfigure() + endif + if s:is_vim8 && g:tsuquyomi_use_vimproc == 0 && s:async_initialized == 0 + call tsuquyomi#config#registerInitialCallback() + let s:async_initialized = 1 + endif + return 1 +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/autoload/tsuquyomi/es6import.vim b/autoload/tsuquyomi/es6import.vim new file mode 100644 index 0000000..a447855 --- /dev/null +++ b/autoload/tsuquyomi/es6import.vim @@ -0,0 +1,509 @@ +"============================================================================ +" FILE: autoload/tsuquyomi/es6import.vim +" AUTHOR: Quramy +"============================================================================ + +scriptencoding utf-8 + +let s:save_cpo = &cpo +set cpo&vim + +let s:V = vital#of('tsuquyomi') +let s:Filepath = s:V.import('System.Filepath') +let s:JSON = s:V.import('Web.JSON') + +function! s:normalizePath(path) + return substitute(a:path, '\\', '/', 'g') +endfunction + +function! s:is_valid_identifier(symbol_str) + return a:symbol_str =~ '^[A-Za-z_\$][A-Za-z_\$0-9]*$' +endfunction + +function! s:get_keyword_under_cursor() + let l:line_str = getline('.') + let l:line = line('.') + let l:offset = col('.') + " search backwards for start of identifier (iskeyword pattern) + let l:start = l:offset + let l:end = l:offset + while l:start > 0 && l:line_str[l:start-2] =~ "\\k" + let l:start -= 1 + endwhile + while l:end <= strlen(l:line_str) && l:line_str[l:end] =~ "\\k" + let l:end += 1 + endwhile + return { + \ 'text': l:line_str[l:start-1:l:end-1], + \ 'start': { 'offset': l:start, 'line': l:line }, + \ 'end': { 'offset': l:end, 'line': l:line } + \ } +endfunction + +function! s:relativePath(from, to) + let l:from_parts = s:Filepath.split(s:Filepath.dirname(a:from)) + let l:to_parts = s:Filepath.split(a:to) + let l:count_node_modules = len(filter(copy(l:to_parts), 'v:val==#"node_modules"')) + if l:count_node_modules > 1 + return ['', 0] + elseif l:count_node_modules == 1 + return [substitute(a:to, '^.*\/node_modules\/', '', ''), 1] + endif + let l:idx = 0 + while idx < min([len(l:from_parts), len(l:to_parts)]) && l:from_parts[l:idx] ==# l:to_parts[l:idx] + let l:idx += 1 + endwhile + call remove(l:from_parts, 0, l:idx - 1) + call remove(l:to_parts, 0, l:idx - 1) + if len(l:from_parts) + return [join(map(l:from_parts, '"../"'), '').join(l:to_parts, '/'), 1] + else + return ['./'.join(l:to_parts, '/'), 1] + endif +endfunction + +let s:external_module_cache_dict = {} +function! tsuquyomi#es6import#checkExternalModule(name, file, no_use_cache) + let l:cache = s:external_module_cache_dict + if a:no_use_cache || !has_key(l:cache, a:file) || !has_key(l:cache[a:file], a:name) + if !has_key(l:cache, a:file) + let l:cache[a:file] = {} + endif + let l:result = tsuquyomi#tsClient#tsNavBar(a:file) + let l:modules = map(filter(l:result, 'v:val.kind==#"module"'), 'v:val.text') + let l:cache[a:file][a:name] = 0 + for module_name in l:modules + if module_name[0] ==# '"' || module_name[0] ==# "'" + if module_name[1:-2] ==# a:name + let l:cache[a:file][a:name] = 1 + break + endif + endif + endfor + endif + return l:cache[a:file][a:name] +endfunction + +function! tsuquyomi#es6import#createImportBlock(text) + let l:identifier = a:text + if !s:is_valid_identifier(l:identifier) + return [] + endif + let [l:nav_list, l:hit] = tsuquyomi#navto(l:identifier, 'export', 2) + if !l:hit || !len(l:nav_list) + return [] + endif + let l:from = s:normalizePath(expand('%:p')) + let l:result_list = [] + for nav in l:nav_list + if has_key(nav, 'containerKind') && nav.containerKind ==# 'module' + if tsuquyomi#es6import#checkExternalModule(nav.containerName, nav.file, 0) + let l:importDict = { + \ 'identifier': nav.name, + \ 'path': nav.containerName, + \ 'nav': nav + \ } + call add(l:result_list, l:importDict) + endif + else + let l:to = s:normalizePath(nav.file) + let [l:relative_path, l:result] = s:relativePath(l:from, l:to) + if !l:result + return [] + endif + let l:relative_path = s:removeTSExtensions(l:relative_path) + if g:tsuquyomi_shortest_import_path == 1 + let l:path = s:getShortestImportPath(l:to, l:identifier, l:relative_path) + elseif g:tsuquyomi_baseurl_import_path == 1 + let l:base_url_import_path = s:getBaseUrlImportPath(nav.file) + let l:path = l:base_url_import_path != '' ? l:base_url_import_path : l:relative_path + else + let l:path = l:relative_path + endif + let l:importDict = { + \ 'identifier': nav.name, + \ 'path': l:path, + \ 'nav': nav + \ } + call add(l:result_list, l:importDict) + endif + endfor + + if g:tsuquyomi_case_sensitive_imports == 1 + call filter(l:result_list, 'v:val.identifier ==# l:identifier') + endif + + " Make the possible imports list unique per path + let dictionary = {} + for i in l:result_list + let dictionary[i.path] = i + endfor + + let l:unique_result_list = [] + + if (exists('a:1')) + let l:unique_result_list = sort(values(dictionary), a:1) + else + let l:unique_result_list = sort(values(dictionary)) + endif + + return l:unique_result_list +endfunction + +function! s:removeTSExtensions(path) + let l:path = a:path + let l:path = substitute(l:path, '\.d\.ts$', '', '') + let l:path = substitute(l:path, '\.ts$', '', '') + let l:path = substitute(l:path, '\.tsx$', '', '') + let l:path = substitute(l:path, '^@types/', '', '') + let l:path = substitute(l:path, '/index$', '', '') + return l:path +endfunction + +function! s:getShortestImportPath(absolute_path, module_identifier, relative_path) + let l:splitted_relative_path = split(a:relative_path, '/') + if l:splitted_relative_path[0] == '..' + let l:paths_to_visit = substitute(a:relative_path, '\.\.\/', '', 'g') + let l:path_moves_to_do = len(split(l:paths_to_visit, '/')) + else + let l:path_moves_to_do = len(l:splitted_relative_path) - 1 + endif + let l:shortened_path = l:splitted_relative_path[len(l:splitted_relative_path) - 1] + let l:path_move_count = 0 + let l:splitted_absolute_path = split(a:absolute_path, '/') + while l:path_move_count != l:path_moves_to_do + let l:splitted_absolute_path = l:splitted_absolute_path[0:len(splitted_absolute_path) - 2] + let l:shortened_path = s:getShortenedPath(l:splitted_absolute_path, l:shortened_path, a:module_identifier) + let l:path_move_count += 1 + endwhile + let l:shortened_path = substitute(l:shortened_path, '\[\/\]\*\[\index\]\*', '', 'g') + if l:splitted_relative_path[0] == '.' + return './' . s:getPathWithSkippedRoot(l:shortened_path) + elseif l:splitted_relative_path[0] == '..' + let l:count = 0 + let l:current = '..' + let l:prefix = '' + while l:current == '..' || l:count == len(l:splitted_relative_path) - 1 + let l:current = l:splitted_relative_path[l:count] + if l:current == '..' + let l:prefix = l:prefix . l:current . '/' + endif + let l:count += 1 + endwhile + return l:prefix . s:getPathWithSkippedRoot(l:shortened_path) + endif + return l:shortened_path +endfunction + +function! s:getPathWithSkippedRoot(path) + return join(split(a:path, '/')[1:len(a:path) -1], '/') +endfunction + +function! s:getShortenedPath(splitted_absolute_path, previous_shortened_path, module_identifier) + let l:shortened_path = a:previous_shortened_path + let l:absolute_path_to_search_in = '/' . join(a:splitted_absolute_path, '/') . '/' + let l:found_module_reference = s:findExportingFileForModule(a:module_identifier, l:shortened_path, l:absolute_path_to_search_in) + let l:current_directory_name = a:splitted_absolute_path[len(a:splitted_absolute_path) -1] + let l:path_separator = '/' + while l:found_module_reference != '' + if l:found_module_reference == 'index' + let l:found_module_reference = '[index]*' + let l:path_separator = '[/]*' + else + let l:path_separator = '/' + endif + let l:shortened_path = l:found_module_reference + let l:found_module_reference = s:findExportingFileForModule(a:module_identifier, l:found_module_reference, l:absolute_path_to_search_in) + if l:found_module_reference != '' + let l:shortened_path = l:found_module_reference + endif + endwhile + return l:current_directory_name . l:path_separator . l:shortened_path +endfunction + +function! s:getBaseUrlImportPath(module_absolute_path) + let [l:tsconfig, l:tsconfig_file_path] = s:getTsconfig(a:module_absolute_path) + + if empty(l:tsconfig) || l:tsconfig_file_path == '' + return '' + endif + + let l:project_root_path = fnamemodify(l:tsconfig_file_path, ':h').'/' + " We assume that baseUrl is a path relative to tsconfig.json path. + let l:base_url_config = has_key(l:tsconfig.compilerOptions, 'baseUrl') ? l:tsconfig.compilerOptions.baseUrl : '.' + let l:base_url_path = simplify(l:project_root_path.l:base_url_config) + + return s:removeTSExtensions(substitute(a:module_absolute_path, l:base_url_path, '', '')) +endfunction + +let s:tsconfig = {} +let s:tsconfig_file_path = '' + +function! s:getTsconfig(module_absolute_path) + if empty(s:tsconfig) + let l:project_info = tsuquyomi#tsClient#tsProjectInfo(a:module_absolute_path, 0) + + if has_key(l:project_info, 'configFileName') + let s:tsconfig_file_path = l:project_info.configFileName + else + echom '[Tsuquyomi] Cannot find project’s tsconfig.json to compute baseUrl import path.' + endif + + let l:json = join(readfile(s:tsconfig_file_path),'') + + try + let s:tsconfig = s:JSON.decode(l:json) + catch + echom '[Tsuquyomi] Cannot parse project’s tsconfig.json. Does it have comments?' + endtry + + endif + + return [s:tsconfig, s:tsconfig_file_path] +endfunction + +function! s:findExportingFileForModule(module, current_module_file, module_directory_path) + execute + \"silent! noautocmd vimgrep /export\\s*\\({.*\\(\\s\\|,\\)" + \. a:module + \."\\(\\s\\|,\\)*.*}\\|\\*\\)\\s\\+from\\s\\+\\(\\'\\|\\\"\\)\\.\\\/" + \. substitute(a:current_module_file, '\/', '\\/', '') + \."[\\/]*\\(\\'\\|\\\"\\)[;]*/j " + \. a:module_directory_path + \. "*.ts" + redir => l:grep_result + silent! clist + redir END + if l:grep_result =~ 'No Errors' + return '' + endif + let l:raw_result = split(l:grep_result, ' ')[2] + let l:raw_result = split(l:raw_result, ':')[0] + let l:raw_result_parts = split(l:raw_result, '/') + let l:extracted_file_name = l:raw_result_parts[len(l:raw_result_parts) -1 ] + let l:extracted_file_name = s:removeTSExtensions(l:extracted_file_name) + return l:extracted_file_name +endfunction + +function! s:comp_alias(alias1, alias2) + return a:alias2.spans[0].end.line - a:alias1.spans[0].end.line +endfunction + +function! tsuquyomi#es6import#createImportPosition(nav_bar_list) + if !len(a:nav_bar_list) + return {} + endif + if len(a:nav_bar_list) == 1 + if a:nav_bar_list[0].kind ==# 'module' + if !len(filter(copy(a:nav_bar_list[0].childItems), 'v:val.kind ==#"alias"')) + let l:start_line = a:nav_bar_list[0].spans[0].start.line - 1 + let l:end_line = l:start_line + else + let l:start_line = a:nav_bar_list[0].spans[0].start.line + let l:end_line = a:nav_bar_list[0].spans[0].end.line + endif + else + let l:start_line = a:nav_bar_list[0].spans[0].start.line - 1 + let l:end_line = l:start_line + endif + elseif len(a:nav_bar_list) > 1 + let l:start_line = a:nav_bar_list[0].spans[0].start.line + let l:end_line = a:nav_bar_list[1].spans[0].start.line - 1 + endif + return { 'start': { 'line': l:start_line }, 'end': { 'line': l:end_line } } +endfunction + +function! tsuquyomi#es6import#getImportDeclarations(fileName, content_list) + let l:nav_bar_list = tsuquyomi#tsClient#tsNavBar(a:fileName) + if !len(l:nav_bar_list) + return [[], {}, 'no_nav_bar'] + endif + let l:position = tsuquyomi#es6import#createImportPosition(l:nav_bar_list) + let l:module_infos = filter(copy(l:nav_bar_list), 'v:val.kind ==# "module"') + if !len(l:module_infos) + return [[], l:position, 'no_module_info'] + endif + let l:result_list = [] + let l:alias_list = filter(l:module_infos[0].childItems, 'v:val.kind ==# "alias"') + let l:end_line = position.end.line + let l:last_module_end_line = 0 + for alias in sort(l:alias_list, "s:comp_alias") + let l:hit = 0 + let [l:has_brace, l:brace] = [0, {}] + let [l:has_from, l:from] = [0, { 'start': {}, 'end': {} }] + let [l:has_module, l:module] = [0, { 'name': '', 'start': {}, 'end': {} }] + let l:line = alias.spans[0].start.line + while !l:hit && l:line <= l:end_line + if !len(a:content_list) + let l:line_str = getline(l:line) + else + let l:line_str = a:content_list[l:line - 1] + endif + let l:brace_end_offset = match(l:line_str, "}") + let l:from_offset = match(l:line_str, 'from') + if l:brace_end_offset + 1 && !l:has_brace && !l:has_from + let l:has_brace = 1 + let l:brace = { + \ 'end': { 'offset': l:brace_end_offset + 1, 'line': l:line } + \ } + endif + if l:from_offset + 1 + let l:has_from = 1 + let l:from = { + \ 'start': { 'offset': l:from_offset + 1, 'line': l:line }, + \ 'end': { 'offset': l:from_offset + 4, 'line': l:line } + \ } + endif + if l:has_from + let l:module_name_sq = matchstr(l:line_str, "\\m'\\zs.*\\ze'") + if l:module_name_sq !=# '' + let l:has_module = 1 + let l:module_name = l:module_name_sq + else + let l:module_name_dq = matchstr(l:line_str, '\m"\zs.*\ze"') + if l:module_name_dq !=# '' + let l:has_module = 1 + let l:module_name = l:module_name_dq + endif + endif + endif + if l:has_module + let [l:hit, l:end_line] = [1, l:line] + let l:module = { + \ 'name': l:module_name, + \ 'start': { 'line': l:line }, + \ 'end': { 'line': l:line }, + \ } + if !l:last_module_end_line + let l:last_module_end_line = l:line + endif + else + let l:line += 1 + endif + endwhile + if l:hit + let l:info = { + \ 'module': l:module, + \ 'has_from': l:has_from, + \ 'from_span': l:from, + \ 'has_brace': l:has_brace, + \ 'brace': l:brace, + \ 'alias_info': alias, + \ 'is_oneliner': alias.spans[0].start.line == l:module.end.line + \ } + call add(l:result_list, l:info) + endif + endfor + if l:last_module_end_line + let l:position.end.line = l:last_module_end_line + endif + return [l:result_list, l:position, ''] +endfunction + +let s:importable_module_list = [] +function! tsuquyomi#es6import#moduleComplete(arg_lead, cmd_line, cursor_pos) + return join(s:importable_module_list, "\n") +endfunction + +function! tsuquyomi#es6import#selectModule() + echohl String + let l:selected_module = input("[Tsuquyomi] You can import from 2 or more modules.\n" . join(s:importable_module_list, "\n") . "\nSelect one: ", '', 'custom,tsuquyomi#es6import#moduleComplete') + echohl none + echo ' ' + if len(filter(copy(s:importable_module_list), 'v:val==#l:selected_module')) + return [l:selected_module, 1] + else + echohl Error + echom '[Tsuquyomi] Invalid module path.' + echohl none + return ['', 0] + endif +endfunction + +function! tsuquyomi#es6import#complete() + if !tsuquyomi#bufManager#isOpened(expand('%:p')) + return + end + call tsuquyomi#flush() + let l:identifier_info = s:get_keyword_under_cursor() + let l:list = tsuquyomi#es6import#createImportBlock(l:identifier_info.text) + if len(l:list) > 1 + let s:importable_module_list = map(copy(l:list), 'v:val.path') + let [l:selected_module, l:code] = tsuquyomi#es6import#selectModule() + if !l:code + echohl Error + echom '[Tsuquyomi] No search result.' + echohl none + return + endif + let l:block = filter(l:list, 'v:val.path==#l:selected_module')[0] + elseif len(l:list) == 1 + let l:block = l:list[0] + else + return + endif + let [l:import_list, l:dec_position, l:reason] = tsuquyomi#es6import#getImportDeclarations(expand('%:p'), []) + let l:module_end_line = has_key(l:dec_position, 'end') ? l:dec_position.end.line : 0 + let l:same_path_import_list = filter(l:import_list, 'v:val.has_brace && v:val.module.name ==# l:block.path') + if len(l:same_path_import_list) && len(filter(copy(l:same_path_import_list), 'v:val.alias_info.text ==# l:block.identifier')) + echohl Error + echom '[Tsuquyomi] '.l:block.identifier.' is already imported.' + echohl none + return + endif + + "Replace search keyword to hit result identifer + let l:line = getline(l:identifier_info.start.line) + let l:new_line = l:block.identifier + if l:identifier_info.start.offset > 1 + let l:new_line = l:line[0:l:identifier_info.start.offset - 2].l:new_line + endif + let l:new_line = l:new_line.l:line[l:identifier_info.end.offset: -1] + call setline(l:identifier_info.start.line, l:new_line) + + if g:tsuquyomi_import_curly_spacing == 0 + let l:curly_spacing = '' + else + let l:curly_spacing = ' ' + end + + "Add import declaration + if !len(l:same_path_import_list) + if g:tsuquyomi_semicolon_import + let l:semicolon = ';' + else + let l:semicolon = '' + endif + if g:tsuquyomi_single_quote_import + let l:expression = "import {".l:curly_spacing.l:block.identifier.l:curly_spacing."} from '".l:block.path."'".l:semicolon + else + let l:expression = 'import {'.l:curly_spacing.l:block.identifier.l:curly_spacing.'} from "'.l:block.path.'"'.l:semicolon + endif + call append(l:module_end_line, l:expression) + else + let l:target_import = l:same_path_import_list[0] + if l:target_import.is_oneliner + let l:line = getline(l:target_import.brace.end.line) + let l:injection_position = target_import.brace.end.offset - 2 - strlen(l:curly_spacing) + let l:expression = l:line[0:l:injection_position].', '.l:block.identifier.l:curly_spacing.l:line[l:target_import.brace.end.offset - 1: -1] + call setline(l:target_import.brace.end.line, l:expression) + else + let l:before_line = getline(l:target_import.brace.end.line - 1) + let l:indent = matchstr(l:before_line, '\m^\s*') + let l:before_has_trailing_comma = matchstr(l:before_line, ',\s*$') + if l:before_has_trailing_comma !=# '' + let l:prev_trailing_comma = '' + let l:new_trailing_comma = ',' + else + let l:prev_trailing_comma = ',' + let l:new_trailing_comma = '' + endif + + call setline(l:target_import.brace.end.line - 1, l:before_line.l:prev_trailing_comma) + call append(l:target_import.brace.end.line - 1, l:indent.l:block.identifier.l:new_trailing_comma) + endif + endif +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/autoload/tsuquyomi/perfLogger.vim b/autoload/tsuquyomi/perfLogger.vim new file mode 100644 index 0000000..cdedb21 --- /dev/null +++ b/autoload/tsuquyomi/perfLogger.vim @@ -0,0 +1,32 @@ +"============================================================================ +" FILE: perfLogger.vim +" AUTHOR: Quramy +"============================================================================ + +scriptencoding utf-8 + +let s:log_buffer = [] +let s:start_time = reltime() + +function! tsuquyomi#perfLogger#reset() + let s:log_buffer = [] + let s:start_time = reltime() +endfunction + +function! tsuquyomi#perfLogger#getTime() + let num_row = len(s:log_buffer) + let j = len(s:log_buffer) - num_row + 1 + while j < num_row + let t = s:log_buffer[j] + let prev = s:log_buffer[j - 1] + echo reltimestr(t.elapse) t.name reltimestr(reltime(prev.elapse, t.elapse)) + let j = j + 1 + endwhile +endfunction + +function! tsuquyomi#perfLogger#record(event_name) + if g:tsuquyomi_debug + call add(s:log_buffer, {'name': a:event_name, 'elapse': reltime(s:start_time)}) + endif +endfunction + diff --git a/autoload/tsuquyomi/tsClient.vim b/autoload/tsuquyomi/tsClient.vim new file mode 100644 index 0000000..e3ee1be --- /dev/null +++ b/autoload/tsuquyomi/tsClient.vim @@ -0,0 +1,940 @@ +"============================================================================ +" FILE: tsuquyomi.vim +" AUTHOR: Quramy +"============================================================================ + +scriptencoding utf-8 + +let s:save_cpo = &cpo +set cpo&vim + +if !tsuquyomi#config#preconfig() + finish +endif + +let s:script_dir = expand(':p:h') + +let s:V = vital#of('tsuquyomi') +let s:JSON = s:V.import('Web.JSON') +let s:Filepath = s:V.import('System.Filepath') + +let s:is_vim8 = !has('nvim') && has('patch-8.0.1') + +if !s:is_vim8 || g:tsuquyomi_use_vimproc + let s:P = s:V.import('ProcessManager') + let s:tsq = 'tsuquyomiTSServer' +else + let s:tsq = {'job':0} +endif + +let s:request_seq = 0 + +let s:ignore_response_conditions = [] +" ignore events configFileDiag triggered by reload event. See also #99 +call add(s:ignore_response_conditions, '"type":"event","event":"configFileDiag"') +call add(s:ignore_response_conditions, '"type":"event","event":"telemetry"') +call add(s:ignore_response_conditions, '"type":"event","event":"projectsUpdatedInBackground"') +call add(s:ignore_response_conditions, '"type":"event","event":"typingsInstallerPid"') +call add(s:ignore_response_conditions, 'npm notice created a lockfile') + +" ### Async variables +let s:callbacks = {} +let s:notify_callback = {} +let s:quickfix_list = [] +" ### }}} + +" ### Utilites {{{ +function! s:error(msg) + echoerr (a:msg) +endfunction + +function! s:debugLog(msg) + if g:tsuquyomi_debug + echom a:msg + endif +endfunction + +" ### Utilites }}} + +" ### Core Functions {{{ +" +" If not exsiting process of TSServer, create it. +function! s:startTssVimproc() + if s:P.state(s:tsq) == 'existing' + return 'existing' + endif + let l:cmd = substitute(tsuquyomi#config#tsscmd(), '\\', '\\\\', 'g').' '.tsuquyomi#config#tssargs() + let l:is_new = s:P.touch(s:tsq, l:cmd) + if l:is_new == 'new' + let [out, err, type] = s:P.read_wait(s:tsq, 0.1, []) + let st = tsuquyomi#tsClient#statusTss() + if !g:tsuquyomi_tsserver_debug + if err != '' + call s:error('Fail to start TSServer... '.err) + endif + endif + endif + return l:is_new +endfunction + +function! s:startTssVim8() + if type(s:tsq['job']) == 8 && job_info(s:tsq['job']).status == 'run' + return 'existing' + endif + let l:cmd = substitute(tsuquyomi#config#tsscmd(), '\\', '\\\\', 'g').' '.tsuquyomi#config#tssargs() + try + let s:tsq['job'] = job_start(l:cmd, { + \ 'out_cb': {ch, msg -> tsuquyomi#tsClient#handleMessage(ch, msg)}, + \ }) + + let s:tsq['channel'] = job_getchannel(s:tsq['job']) + + let out = ch_readraw(s:tsq['channel']) + let st = tsuquyomi#tsClient#statusTss() + if !g:tsuquyomi_tsserver_debug + if err != '' + call s:error('Fail to start TSServer... '.err) + return 0 + endif + endif + catch + return 0 + endtry + return 1 +endfunction + +function! s:getEventType(item) + if type(a:item) == v:t_dict + \ && has_key(a:item, 'type') + \ && a:item.type ==# 'event' + \ && (a:item.event ==# 'syntaxDiag' + \ || a:item.event ==# 'semanticDiag' + \ || a:item.event ==# 'requestCompleted') + return 'diagnostics' + endif + return 0 +endfunction + + +function! tsuquyomi#tsClient#startTss() + if !s:is_vim8 || g:tsuquyomi_use_vimproc + return s:startTssVimproc() + else + return s:startTssVim8() + endif +endfunction + +" +"Terminate TSServer process if it exsits. +function! tsuquyomi#tsClient#stopTss() + if tsuquyomi#tsClient#statusTss() != 'dead' + if !s:is_vim8 || g:tsuquyomi_use_vimproc + let l:res = s:P.term(s:tsq) + return l:res + else + let l:res = job_stop(s:tsq['job']) + return l:res + endif + endif +endfunction + +function! tsuquyomi#tsClient#stopTssSync() abort + let res = tsuquyomi#tsClient#stopTss() + call s:ensureStatus('dead') + return res +endfunction + +" Wait for the status to become the argument. +" Note: It throws an error to avoid infinite loop after 1s. +function! s:ensureStatus(expected) abort + let cnt = 0 + while v:true + let got = tsuquyomi#tsClient#statusTss() + if got ==# a:expected + return + endif + if cnt > 100 + throw "TSServer status does not become " . a:expected . " in 1s. It is " . got . "." + endif + let cnt += 1 + sleep 10m + endwhile +endfunction + +" RETURNS: {string} 'run' or 'dead' +function! tsuquyomi#tsClient#statusTss() + try + if !s:is_vim8 || g:tsuquyomi_use_vimproc + let stat = s:P.state(s:tsq) + if stat == 'undefined' + return 'dead' + elseif stat == 'reading' + return 'run' + else + return stat + endif + else + return job_info(s:tsq['job']).status + endif + catch + return 'dead' + endtry +endfunction + +" +"Read diagnostics and add to QuickList. +" +" PARAM: {dict} response +function! tsuquyomi#tsClient#readDiagnostics(item) + if a:item.event == 'requestCompleted' + if has_key(s:notify_callback, 'diagnostics') + let Callback = function(s:notify_callback['diagnostics'], [s:quickfix_list]) + call Callback() + let s:quickfix_list = [] + let s:request_seq = s:request_seq + 1 + endif + else + " Cache syntaxDiag and semanticDiag messages until request was completed. + let l:qflist = tsuquyomi#parseDiagnosticEvent(a:item, []) + let s:quickfix_list += l:qflist + endif +endfunction + +function! tsuquyomi#tsClient#registerNotify(callback, key) + let s:notify_callback[a:key] = a:callback +endfunction + +" +" Handle TSServer responses. +" +function! tsuquyomi#tsClient#handleMessage(ch, msg) + if type(a:msg) != 1 || a:msg == '' + " Not a string or blank message. + return + endif + let l:res_item = substitute(a:msg, 'Content-Length: \d\+', '', 'g') + if l:res_item == '' + " Ignore content-length. + return + endif + " Ignore messages. + let l:to_be_ignored = 0 + for ignore_reg in s:ignore_response_conditions + let l:to_be_ignored = l:to_be_ignored || (l:res_item =~ ignore_reg) + if l:to_be_ignored + return + endif + endfor + let l:item = json_decode(l:res_item) + let l:eventName = s:getEventType(l:item) + + if(has_key(s:callbacks, l:eventName)) + let Callback = function(s:callbacks[l:eventName], [l:item]) + call Callback() + endif +endfunction + +function! tsuquyomi#tsClient#clearCallbacks() + let s:callbacks = {} +endfunction + +function! tsuquyomi#tsClient#registerCallback(callback, eventName) + let s:callbacks[a:eventName] = a:callback +endfunction + +function! tsuquyomi#tsClient#sendAsyncRequest(line) + if s:is_vim8 && g:tsuquyomi_use_vimproc == 0 + call tsuquyomi#tsClient#startTss() + call ch_sendraw(s:tsq['channel'], a:line . "\n") + endif +endfunction + +" +"Write to stdin of tsserver proc, and return stdout. +" +" PARAM: {string} line Stdin input. +" PARAM: {float} delay Wait time(sec) after request, until response. +" PARAM: {int} retry_count Retry count. +" PARAM: {int} response_length The number of JSONs contained by this response. +" RETURNS: {list} A list of response. +function! tsuquyomi#tsClient#sendRequest(line, delay, retry_count, response_length) + "call s:debugLog('called! '.a:line) + call tsuquyomi#tsClient#startTss() + if !s:is_vim8 || g:tsuquyomi_use_vimproc + call s:P.writeln(s:tsq, a:line) + else + call ch_sendraw(s:tsq['channel'], a:line."\n") + endif + + let l:retry = 0 + let response_list = [] + + while len(response_list) < a:response_length + if !s:is_vim8 || g:tsuquyomi_use_vimproc + let [out, err, type] = s:P.read_wait(s:tsq, a:delay, ['Content-Length: \d\+']) + call s:debugLog('out: '.out.', type:'.type) + if type == 'timedout' + let retry_delay = 0.05 + while l:retry < a:retry_count + let [out, err, type] = s:P.read_wait(s:tsq, retry_delay, ['Content-Length: \d\+']) + if type == 'matched' + call tsuquyomi#perfLogger#record('tssMatched') + "call s:debugLog('retry: '.l:retry.', length: '.len(response_list)) + break + endif + let l:retry = l:retry + 1 + call tsuquyomi#perfLogger#record('tssRetry:'.l:retry) + endwhile + endif + else + let out = ch_readraw(s:tsq['channel']) + let type = 'matched' + endif + if type == 'matched' + let l:tmp1 = substitute(out, 'Content-Length: \d\+', '', 'g') + let l:tmp2 = substitute(l:tmp1, '\r', '', 'g') + let l:res_list = split(l:tmp2, '\n\+') + for res_item in l:res_list + let l:to_be_ignored = 0 + for ignore_reg in s:ignore_response_conditions + ['"type":"event","event":"requestCompleted"'] + let l:to_be_ignored = l:to_be_ignored || (res_item =~ ignore_reg) + if l:to_be_ignored + break + endif + endfor + let l:decoded_res_item = s:JSON.decode(res_item) + let l:to_be_ignored = l:to_be_ignored || (has_key(l:decoded_res_item, 'request_seq') && l:decoded_res_item.request_seq != s:request_seq) + if !l:to_be_ignored + call add(response_list, decoded_res_item) + endif + endfor + else + echom '[Tsuquyomi] TSServer request was timeout:'.a:line + return response_list + endif + + endwhile + "call s:debugLog(a:response_length.', '.len(response_list)) + let s:request_seq = s:request_seq + 1 + return response_list +endfunction + +" +" Send a command to TSServer. +" This function is called pseudo synchronously. +" PARAM: {string} cmd Command type. e.g. 'completion', etc... +" PARAM: {dictionary} args Arguments object. e.g. {'file': 'myApp.ts'}. +" RETURNS: {list} +function! tsuquyomi#tsClient#sendCommandSyncResponse(cmd, args) + let l:input = s:JSON.encode({'command': a:cmd, 'arguments': a:args, 'type': 'request', 'seq': s:request_seq}) + call tsuquyomi#perfLogger#record('beforeCmd:'.a:cmd) + let l:stdout_list = tsuquyomi#tsClient#sendRequest(l:input, str2float("0.0001"), 1000, 1) + call tsuquyomi#perfLogger#record('afterCmd:'.a:cmd) + let l:length = len(l:stdout_list) + if l:length == 1 + "if res.success == 0 + " echom '[Tsuquyomi] TSServer command fail. command: '.res.command.', message: '.res.message + "endif + call tsuquyomi#perfLogger#record('afterDecode:'.a:cmd) + return l:stdout_list + else + return [] + endif +endfunction + +function! tsuquyomi#tsClient#sendCommandSyncEvents(cmd, args, delay, length) + let l:input = s:JSON.encode({'command': a:cmd, 'arguments': a:args, 'type': 'request', 'seq': s:request_seq}) + let l:stdout_list = tsuquyomi#tsClient#sendRequest(l:input, a:delay, 2000, a:length) + "echo l:stdout_list + let l:length = len(l:stdout_list) + let l:result_list = [] + if l:length > 0 + for res in l:stdout_list + if res.type != 'event' + "echom '[Tsuquyomi] TSServer return invalid response: '.string(res) + else + call add(l:result_list, res) + endif + endfor + return l:result_list + else + return [] + endif + +endfunction + +function! tsuquyomi#tsClient#sendCommandOneWay(cmd, args) + let l:input = s:JSON.encode({'command': a:cmd, 'arguments': a:args, 'type': 'request', 'seq': s:request_seq}) + call tsuquyomi#tsClient#sendRequest(l:input, str2float("0.01"), 0, 0) + return [] +endfunction + +function! tsuquyomi#tsClient#getResponseBodyAsList(responses) + if len(a:responses) != 1 + return [] + endif + let response = a:responses[0] + if has_key(response, 'success') && response.success && has_key(response, 'body') + return response.body + else + return [] + endif +endfunction + +function! tsuquyomi#tsClient#getResponseBodyAsDict(responses) + if len(a:responses) != 1 + return {} + endif + let response = a:responses[0] + if has_key(response, 'success') && response.success && has_key(response, 'body') + return response.body + else + return {} + endif +endfunction + +" +" Send a command to TSServer. +" This function is called asynchronously. +" PARAM: {string} cmd Command type. e.g. 'completion', etc... +" PARAM: {dictionary} args Arguments object. e.g. {'file': 'myApp.ts'}. +function! tsuquyomi#tsClient#sendCommandAsyncEvents(cmd, args) + let s:quickfix_list = [] + let l:input = json_encode({'command': a:cmd, 'arguments': a:args, 'type': 'request', 'seq': s:request_seq}) + " call tsuquyomi#perfLogger#record('beforeCmd:'.a:cmd) + call tsuquyomi#tsClient#sendAsyncRequest(l:input) +endfunction + +" +" ### Core Functions }}} + +" ### TSServer command wrappers {{{ +" +" There are client's methods of TSServer. +" If you want to know details of APIs, see 'typescript/src/server/protocol.d.ts'. + +" +" Send oepn command to TSServer. +" This command does not return any response. +function! tsuquyomi#tsClient#tsOpen(file) + let l:args = {'file': a:file} + call tsuquyomi#tsClient#sendCommandOneWay('open', l:args) +endfunction + +" Send close command to TSServer. +" This command does not return any response. +function! tsuquyomi#tsClient#tsClose(file) + let l:args = {'file': a:file} + return tsuquyomi#tsClient#sendCommandOneWay('close', l:args) +endfunction + +" Save an opened file to tmpfile. +" This function can be called for only debugging. +" This command does not return any response. +function! tsuquyomi#tsClient#tsSaveto(file, tmpfile) + let l:args = {'file': a:file, 'tmpfile': a:tmpfile} + return tsuquyomi#tsClient#sendCommandOneWay('saveto', l:args) +endfunction + +" Fetch keywards to complete from TSServer. +" PARAM: {string} file File name. +" PARAM: {string} line The line number of location to complete. +" PARAM: {string} offset The col number of location to complete. +" PARAM: {string} prefix Prefix to filter result set. +" RETURNS: {list} A List of completion info Dictionary. +" e.g. : +" [ +" {'name': 'close', 'kindModifiers': 'declare', 'kind': 'function'}, +" {'name': 'clipboardData', 'kindModifiers': 'declare', 'kind': 'var'} +" ] +function! tsuquyomi#tsClient#tsCompletions(file, line, offset, prefix) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset, 'prefix': a:prefix} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('completions', l:args) + return tsuquyomi#tsClient#getResponseBodyAsList(l:result) +endfunction + +" Emmit to change file to TSServer. +" Param: {string} file File name to change. +" Param: {int} line The line number of starting point of range to change. +" Param: {int} offset The col number of starting point of range to change. +" Param: {int} endLine The line number of end point of range to change. +" Param: {int} endOffset The col number of end point of range to change. +" Param: {string} insertString String after replacing +" This command does not return any response. +function! tsuquyomi#tsClient#tsChange(file, line, offset, endLine, endOffset, insertString) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset, 'endLine': a:endLine, 'endOffset': a:endOffset, 'insertString': a:insertString} + return tsuquyomi#tsClient#sendCommandOneWay('change', l:args) +endfunction + +" Fetch details of completion from TSServer. +" PARAM: {string} file File name. +" PARAM: {int} line The line number of location to complete. +" PARAM: {int} offset The col number of location to complete. +" PARAM: {list} entryNames A list of names. These names may be fetched by tsuquyomi#tsClient#tsCompletions function. +" RETURNS: {list} A list of details. +" e.g. : +" [{ +" 'name': 'DOMError', +" 'kind': 'var', +" 'kindModifier': 'declare', +" 'displayParts': [ +" {'kind': 'keyword', 'text': 'interface'}, +" {'kind': 'space', 'text': ' '}, +" ... +" {'kind': 'lineBreak', 'text': '\n'}, +" ... +" ] +" }, ...] +function! tsuquyomi#tsClient#tsCompletionEntryDetails(file, line, offset, entryNames) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset, 'entryNames': a:entryNames} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('completionEntryDetails', l:args) + return tsuquyomi#tsClient#getResponseBodyAsList(l:result) +endfunction + +" Configure editor parameter +" PARAM: {string} file File name. +" PARAM: {string} hostInfo Information of Vim +" PARAM: {dict} formatOptions Options for editor. See the following FormatCodeSetting interface. +" PARAM: {list} extraFileExtensions List of extensions +" +" interface FormatCodeSetting { +" baseIndentSize?: number; +" indentSize?: number; +" tabSize?: number; +" newLineCharacter?: string; +" convertTabsToSpaces?: boolean; +" indentStyle?: IndentStyle | ts.IndentStyle; +" insertSpaceAfterCommaDelimiter?: boolean; +" insertSpaceAfterSemicolonInForStatements?: boolean; +" insertSpaceBeforeAndAfterBinaryOperators?: boolean; +" insertSpaceAfterConstructor?: boolean; +" insertSpaceAfterKeywordsInControlFlowStatements?: boolean; +" insertSpaceAfterFunctionKeywordForAnonymousFunctions?: boolean; +" insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis?: boolean; +" insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets?: boolean; +" insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces?: boolean; +" insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces?: boolean; +" insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces?: boolean; +" insertSpaceBeforeFunctionParenthesis?: boolean; +" placeOpenBraceOnNewLineForFunctions?: boolean; +" placeOpenBraceOnNewLineForControlBlocks?: boolean; +" } +let s:NON_BOOLEAN_KEYS_IN_FOPT = [ 'baseIndentSize', 'indentSize', 'tabSize', 'newLineCharacter', 'convertTabsToSpaces', 'indentStyle' ] +function! tsuquyomi#tsClient#tsConfigure(file, hostInfo, formatOptions, extraFileExtensions) + let fopt = { } + for k in keys(a:formatOptions) + if index(s:NON_BOOLEAN_KEYS_IN_FOPT, k) != -1 + let fopt[k] = a:formatOptions[k] + else + let fopt[k] = a:formatOptions[k] ? s:JSON.true : s.JSON.false + endif + endfor + let l:args = { + \ 'file': a:file, + \ 'hostInfo': a:hostInfo, + \ 'formatOptions': fopt, + \ 'extraFileExtensions': a:extraFileExtensions + \ } + return tsuquyomi#tsClient#sendCommandOneWay('configure', l:args) +endfunction + +" Fetch location where the symbol at cursor(line, offset) in file is defined. +" PARAM: {string} file File name. +" PARAM: {int} line The line number of location to complete. +" PARAM: {int} offset The col number of location to complete. +" RETURNS: {list} A list of dictionaries of definition location. +" e.g. : +" [{'file': 'hogehoge.ts', 'start': {'line': 3, 'offset': 2}, 'end': {'line': 3, 'offset': 10}}] +function! tsuquyomi#tsClient#tsDefinition(file, line, offset) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('definition', l:args) + return tsuquyomi#tsClient#getResponseBodyAsList(l:result) +endfunction + +" Format = "format"; +function! tsuquyomi#tsClient#tsFormat(file, line, offset, endLine, endOffset) + call s:error('not implemented!') +endfunction + +" Formatonkey = "formatonkey"; +function! tsuquyomi#tsClient#tsFormationkey(file, line, offset, key) + call s:error('not implemented!') +endfunction + +" Get error for files. +" PARAM: {list} files List of filename +" PARAM: {int} delay Delay time [msec]. +" PARAM: {list} error event list +function! tsuquyomi#tsClient#tsGeterr(files, delay) + let l:args = {'files': a:files, 'delay': a:delay} + let l:delaySec = a:delay * 1.0 / 1000.0 + let l:typeCount = tsuquyomi#config#isHigher(280) ? 3 : 2 + let l:result = tsuquyomi#tsClient#sendCommandSyncEvents('geterr', l:args, l:delaySec, len(a:files) * l:typeCount) + return l:result +endfunction + +" Get errors for project. +" This command is available only at tsserver ~v.1.6 +" PARAM: {string} file File name in target project. +" PARAM: {int} delay Delay time [msec]. +" PARAM: {count} count The number of files in the project(you can fetch this from tsProjectInfo). +" PARAM: {list} error event list +function! tsuquyomi#tsClient#tsGeterrForProject(file, delay, count) + let l:args = {'file': a:file, 'delay': a:delay} + let l:delaySec = a:delay * 1.0 / 1000.0 + let l:typeCount = tsuquyomi#config#isHigher(280) ? 3 : 2 + let l:result = tsuquyomi#tsClient#sendCommandSyncEvents('geterrForProject', l:args, l:delaySec, a:count * l:typeCount) + return l:result +endfunction + +" Fetch a list of implementations of an interface. +" PARAM: {string} file File name. +" PARAM: {int} line The line number of the symbol's position. +" PARAM: {int} offset The col number of the symbol's position. +" RETURNS: {list} Reference information. +" e.g. : +" [ +" { +" 'file': 'SomeClass.ts', +" 'start': {'offset': 11, 'line': 23}, 'end': {'offset': 5, 'line': 35} +" }, { +" 'file': 'OtherClass.ts', +" 'start': {'offset': 31, 'line': 26}, 'end': {'offset': 68, 'line': 26} +" } +" ] +function! tsuquyomi#tsClient#tsImplementation(file, line, offset) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('implementation', l:args) + return tsuquyomi#tsClient#getResponseBodyAsList(l:result) +endfunction + +" Fetch navigation list from TSServer. +" PARAM: {string} file File name. +" RETURNS: {list} Navigation info +" e.g. : +" [{ +" 'text': 'ModName', +" 'kind': 'module', +" 'kindModifiers: '', +" 'spans': [{ +" 'start': {'line': 1, 'offset': 5}, +" 'end': {'line': 1, 'offset': 12}, +" }], +" childItems: [ +" ... " REMAKS: childItems contains a recursive structure. +" ] +" }] +function! tsuquyomi#tsClient#tsNavBar(file) + let l:args = {'file': a:file} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('navbar', l:args) + return tsuquyomi#tsClient#getResponseBodyAsList(l:result) +endfunction + +" Navto = "navto"; +function! tsuquyomi#tsClient#tsNavto(file, searchValue, maxResultCount) + let l:args = {'file': a:file, 'searchValue': a:searchValue, 'maxResultCount': a:maxResultCount} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('navto', l:args) + return tsuquyomi#tsClient#getResponseBodyAsList(l:result) +endfunction + +" Fetch quickinfo from TSServer. +" PARAM: {string} file File name. +" PARAM: {int} line The line number of the symbol's position. +" PARAM: {int} offset The col number of the symbol's position. +" RETURNS: {dict} +" e.g. : +" { +" 'kind': 'method', +" 'kindModifiers': '', +" 'displayString': '(method) SimpleModule.MyClass.say(): string', +" 'start': {'line': 2, 'offset': 2}, +" 'start': {'line': 2, 'offset': 9} +" } +function! tsuquyomi#tsClient#tsQuickinfo(file, line, offset) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('quickinfo', l:args) + return tsuquyomi#tsClient#getResponseBodyAsDict(l:result) +endfunction + +" Fetch a list of references. +" PARAM: {string} file File name. +" PARAM: {int} line The line number of the symbol's position. +" PARAM: {int} offset The col number of the symbol's position. +" RETURNS: {dictionary} Reference information. +" e.g. : +" { +" 'symbolName': 'SomeClass', +" 'symbolDisplayString': 'SomeModule.SomeClass', +" 'refs': [ +" { +" 'file': 'SomeClass.ts', 'isWriteAccess': 1, +" 'start': {'line': 3', 'offset': 2}, 'end': {'line': 3, 'offset': 20}, +" 'lineText': 'export class SomeClass {' +" }, { +" 'file': 'OtherClass.ts', 'isWriteAccess': 0, +" 'start': {'line': 5', 'offset': 2}, 'end': {'line': 5, 'offset': 20}, +" 'lineText': 'export class OtherClass extends SomeClass{' +" } +" ] +" } +function! tsuquyomi#tsClient#tsReferences(file, line, offset) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('references', l:args) + return tsuquyomi#tsClient#getResponseBodyAsDict(l:result) +endfunction + +" Reload an opend file. +" It can be used for telling change of buffer to TSServer. +" PARAM: {string} file File name +" PARAM: {string} tmpfile +" RETURNS: {0|1} +function! tsuquyomi#tsClient#tsReload(file, tmpfile) + let l:arg = {'file': a:file, 'tmpfile': a:tmpfile} + " With ts > 2.6 and ts <=1.9, tsserver emit 2 responses by reload request. + " ignore 2nd response of reload command. See also #62 + if tsuquyomi#config#isHigher(260) || !tsuquyomi#config#isHigher(190) + let l:res_count = 1 + else + let l:res_count = 2 + endif + let l:result = tsuquyomi#tsClient#sendCommandSyncEvents('reload', l:arg, 0.01, l:res_count) + "echo l:result + if(len(l:result) >= 1) + if(has_key(l:result[0], 'success')) + return l:result[0].success + else + return 0 + endif + else + return 0 + endif +endfunction + +" Fetch locatoins of symbols to be replaced from TSServer. +" PARAM: {string} file File name. +" PARAM: {int} line The line number of the symbol's position. +" PARAM: {int} offset The col number of the symbol's position. +" PARAM: {0|1} findInComments Whether result contains word in comments. +" PARAM: {0|1} findInString Whether result contains word in String literals. +" RETURNS: {dict} Rename information dictionary. +" e.g.: +" { +" 'info': { +" 'canRename': 1, +" 'displayName': 'myApp', +" 'fullDisplayName': 'myApp', +" 'kind': 'class', +" 'kindModifiers': '', +" 'triggerSpan': { +" 'start': 44, +" 'length': 5 +" }, +" }, +" 'locs': [{ +" 'file': 'hoge.ts'', +" 'locs': [ +" {'start':{'line': 3, 'offset': 4}, 'end':{'line': 3, 'offset': 12}}, +" ... +" ] +" }, +" ..., +" ] +" } +function! tsuquyomi#tsClient#tsRename(file, line, offset, findInComments, findInString) + " TODO findInString parameter does not work... why? + let l:arg = {'file': a:file, 'line': a:line, 'offset': a:offset, + \ 'findInComments': a:findInComments ? s:JSON.true : s:JSON.false, + \ 'findInString' : a:findInString ? s:JSON.true : s:JSON.false + \ } + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('rename', l:arg) + return tsuquyomi#tsClient#getResponseBodyAsDict(l:result) +endfunction + +" Find brace matching pair. +" Vim has brace matching natively, so Tsuquyomi does not support this method. +function! tsuquyomi#tsClient#tsBrace(file, line, offset) + call s:error('not implemented!') +endfunction + +" This command is available only at tsserver ~v.1.6 +function! tsuquyomi#tsClient#tsDocumentHighlights(file, line, offset, filesToSearch) + call s:error('not implemented!') +endfunction + +" Fetch project information. +" This command is available only at tsserver ~v.1.6 +" PARAM: {string} file File name. +" PARAM: {0|1} needFileNameList Whether include list of files in response. +" RETURNS: dict Project information dictionary. +" e.g.: +" { +" 'configFileName': '/samplePrjs/prj001/tsconfig.json', +" 'fileNames': [ +" '/PATH_TO_TYPESCRIPT/node_modules/typescript/lib/lib.d.ts', +" '/samplePrjs/prj001/main.ts' +" ] +" } +function! tsuquyomi#tsClient#tsProjectInfo(file, needFileNameList) + let l:arg = {'file': a:file, + \ 'needFileNameList': a:needFileNameList ? s:JSON.true : s:JSON.false + \ } + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('projectInfo', l:arg) + return tsuquyomi#tsClient#getResponseBodyAsDict(l:result) +endfunction + +" Fetch method signature information from TSServer. +" PARAM: {string} file File name. +" PARAM: {int} line The line number of the symbol's position. +" PARAM: {int} offset The col number of the symbol's position. +" RETURNS: {dict} +" e.g. : +" { +" 'selectedItemIndex': 0, +" 'argumentCount': 1, +" 'argumentIndex': 0, +" 'applicableSpan': { +" 'start': { 'offset': 27, 'line': 25 }, 'end': { 'offset': 40, 'line': 25 } +" }, +" 'items': [{ +" 'tags': [], +" 'separatorDisplayParts': [ +" { 'kind': 'punctuation', 'text': ',' }, +" { 'kind': 'space', 'text': ' ' } +" ], +" 'prefixDisplayParts': [ +" { 'kind': 'methodName', 'text': 'deleteTerms' }, +" { 'kind': 'punctuation', 'text': '(' } +" ], +" 'parameters': [ +" { +" 'isOptional': 0, +" 'name': 'id', +" 'documentation': [], +" 'displayParts': [ +" { 'kind': 'parameterName', 'text': 'id' }, +" { 'kind': 'punctuation', 'text': ':' }, +" { 'kind': 'space', 'text': ' ' }, +" { 'kind': 'keyword', 'text': 'number' } +" ] +" } +" ], +" 'suffixDisplayParts': [ +" { 'kind': 'punctuation', 'text': ')' }, +" { 'kind': 'punctuation', 'text': ':' }, +" { 'kind': 'space', 'text': ' ' }, +" { 'kind': 'className', 'text': 'Observable' }, +" { 'kind': 'punctuation', 'text': '<' }, +" { 'kind': 'interfaceName', 'text': 'ApiResponseData' }, +" { 'kind': 'punctuation', 'text': '>' } +" ], +" 'isVariadic': 0, +" 'documentation': [] +" }] +" } +" +" This can be combined into a simple signature like this: +" deleteTerms(id: number): Observable +function! tsuquyomi#tsClient#tsSignatureHelp(file, line, offset) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('signatureHelp', l:args) + return tsuquyomi#tsClient#getResponseBodyAsDict(l:result) +endfunction + +" Fetch location where the type of the symbol at cursor(line, offset) in file is defined. +" PARAM: {string} file File name. +" PARAM: {int} line The line number of location to complete. +" PARAM: {int} offset The col number of location to complete. +" RETURNS: {list} A list of dictionaries of type definition location. +" e.g. : +" [{'file': 'hogehoge.ts', 'start': {'line': 3, 'offset': 2}, 'end': {'line': 3, 'offset': 10}}] +function! tsuquyomi#tsClient#tsTypeDefinition(file, line, offset) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset} + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('typeDefinition', l:args) + return tsuquyomi#tsClient#getResponseBodyAsList(l:result) +endfunction + +" Reload prjects. +" This command is available only at tsserver ~v.1.6 +" This command does not return any response. +function! tsuquyomi#tsClient#tsReloadProjects() + return tsuquyomi#tsClient#sendCommandOneWay('reloadProjects', {}) +endfunction + +" This command is available only at tsserver ~v.2.1 +" PARAM: {string} file File name. +" PARAM: {number} startLine The line number for the req +" PARAM: {number} startOffset The character offset for the req +" PARAM: {number} endLine The line number for the req +" PARAM: {number} endOffset The character offset for the req +" PARAM: {list} errorCodes Error codes we want to get the fixes for +" RETURNS: {list} +" e.g.: +" [ +" { +" 'description': 'Add missing ''super()'' call.', +" 'changes': [ +" { +" 'fileName': '/SamplePrj/codeFixesTest.ts', +" 'textChanges': [ +" { +" 'start': {'offset': 20, 'line': 6}, +" 'end': {'offset': 20, 'line': 6}, +" 'newText': 'super();' +" } +" ] +" } +" ] +" } +" ] +function! tsuquyomi#tsClient#tsGetCodeFixes(file, startLine, startOffset, endLine, endOffset, errorCodes) + let l:arg = { + \ 'file': a:file, + \ 'startLine': a:startLine, 'startOffset': a:startOffset, + \ 'endLine': a:endLine, 'endOffset': a:endOffset, + \ 'errorCodes': a:errorCodes + \ } + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('getCodeFixes', l:arg) + return tsuquyomi#tsClient#getResponseBodyAsList(l:result) +endfunction + +" Get available code fixes list +" This command is available only at tsserver ~v.2.1 +function! tsuquyomi#tsClient#tsGetSupportedCodeFixes() + let l:result = tsuquyomi#tsClient#sendCommandSyncResponse('getSupportedCodeFixes', {}) + let l:body = tsuquyomi#tsClient#getResponseBodyAsDict(l:result) + if (type(l:body) != v:t_list) + return [] + else + return l:body + endif +endfunction + +" +" Emmit to change file to TSServer. +" Param: {string} file File name to change. +" Param: {int} line The line number of starting point of range to change. +" Param: {int} offset The col number of starting point of range to change. +" Param: {int} endLine The line number of end point of range to change. +" Param: {int} endOffset The col number of end point of range to change. +" Param: {string} insertString String after replacing +" This command does not return any response. +function! tsuquyomi#tsClient#tsAsyncChange(file, line, offset, endLine, endOffset, insertString) + let l:args = {'file': a:file, 'line': a:line, 'offset': a:offset, 'endLine': a:endLine, 'endOffset': a:endOffset, 'insertString': a:insertString} + call tsuquyomi#tsClient#sendCommandAsyncEvents('change', l:args) +endfunction + +" +" Get error for files. +" PARAM: {list} files List of filename +" PARAM: {int} delay Delay time [msec]. +function! tsuquyomi#tsClient#tsAsyncGeterr(files, delay) + let l:args = {'files': a:files, 'delay': a:delay} + let l:delaySec = a:delay * 1.0 / 1000.0 + let l:typeCount = tsuquyomi#config#isHigher(280) ? 3 : 2 + call tsuquyomi#tsClient#sendCommandAsyncEvents('geterr', l:args) +endfunction + +" ### TSServer command wrappers }}} + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/autoload/unite/sources/outline/typescript.vim b/autoload/unite/sources/outline/typescript.vim new file mode 100644 index 0000000..017e6da --- /dev/null +++ b/autoload/unite/sources/outline/typescript.vim @@ -0,0 +1,66 @@ +"============================================================================ +" FILE: autoload/unite/sources/outline/typescript.vim +" AUTHOR: Quramy +"============================================================================ + +scriptencoding utf-8 + +" Tsuquyomi outline info for TypeScript. + +function! unite#sources#outline#typescript#outline_info() + return s:outline_info +endfunction + +let s:Tree = unite#sources#outline#import('Tree') + +let s:outline_info = { + \ 'is_volatile': 1, + \ 'auto_update': 0, + \ 'highlight_rules': [ + \ {'name': 'package', + \ 'pattern': '/\S\+\s\+:module/'}, + \ {'name': 'method', + \ 'pattern': '/\S\+\s\+:\%(method\|call\|construct\)/'}, + \ {'name': 'id', + \ 'pattern': '/\S\+\s\+:\%(var\|alias\)/'}, + \ {'name': 'expanded', + \ 'pattern': '/\S\+\s\+:\%(property\|index\)/'}, + \ {'name': 'type', + \ 'pattern': '/\S\+\s\+:\%(class\|interface\)/'} + \ ] + \ } + +function! s:createHeadingFromNavitem(navitem) + let heading = {} + let heading.word = a:navitem.text."\t:".a:navitem.kind + let heading.type = a:navitem.kind + if has_key(a:navitem, 'spans') && len(a:navitem.spans) + let heading.lnum = a:navitem.spans[0].start.line + endif + return heading +endfunction + +function! s:createNodeRecursive(parent_node, navitem_list) + for navitem in a:navitem_list + let heading = s:createHeadingFromNavitem(navitem) + call s:Tree.append_child(a:parent_node, heading) + if has_key(navitem, 'childItems') && len(navitem.childItems) + call s:createNodeRecursive(heading, navitem.childItems) + endif + endfor + return a:parent_node +endfunction + +function! s:outline_info.extract_headings(context) + let root = s:Tree.new() + + " 1. Fetch navigation info from TSServer. + let [navbar_list, is_success] = tsuquyomi#navBar() + + if is_success + let root = s:createNodeRecursive(root, navbar_list) + endif + + return root +endfunction + diff --git a/autoload/unite/sources/tsproject.vim b/autoload/unite/sources/tsproject.vim new file mode 100644 index 0000000..763c771 --- /dev/null +++ b/autoload/unite/sources/tsproject.vim @@ -0,0 +1,66 @@ +"============================================================================ +" FILE: autoload/unite/sources/tsproject.vim +" AUTHOR: Quramy +"============================================================================ + +scriptencoding utf-8 + +let s:source = { + \ 'name': 'tsproject', + \ 'is_grouped': 1, + \ 'description': 'TypeScript project information', + \ } + +function! s:source.gather_candidates(args, context) + if len(a:args) + let selected_group_name = a:args[0] + else + let selected_group_name = '.' + endif + + let buf_name = expand('%:p') + let pinfo = tsuquyomi#projectInfo(buf_name) + + let result = [] + + if has_key(pinfo, 'configFileName') + call add(result, { + \ 'group': 'tsconfig', + \ 'kind': 'file', + \ 'action__path': pinfo.configFileName, + \ 'word': pinfo.configFileName, + \ 'abbr': "\t".pinfo.configFileName, + \ 'source': 'tsproject' + \ }) + else + call add(result, { + \ 'group': 'tsconfig', + \ 'kind': 'common', + \ 'is_dummy': 1, + \ 'word': '(your project does not have tsconfig.json)', + \ 'abbr': "\t(your project does not have tsconfig.json)", + \ 'source': 'tsproject' + \ }) + endif + + if has_key(pinfo, 'filteredFileNames') + for fileName in sort(copy(pinfo.filteredFileNames)) + call add(result, { + \ 'group': 'files', + \ 'word': fileName, + \ 'abbr': "\t".fileName, + \ 'kind': 'file', + \ 'action__path': fileName, + \ 'source': 'tsproject' + \ }) + endfor + endif + return result +endfunction + +function! unite#sources#tsproject#define() + if tsuquyomi#config#isHigher(160) + return s:source + endif +endfunction + diff --git a/autoload/vital.vim b/autoload/vital.vim new file mode 100644 index 0000000..f1ba849 --- /dev/null +++ b/autoload/vital.vim @@ -0,0 +1,12 @@ +function! vital#of(name) abort + let files = globpath(&runtimepath, 'autoload/vital/' . a:name . '.vital', 1) + let file = split(files, "\n") + if empty(file) + throw 'vital: version file not found: ' . a:name + endif + let ver = readfile(file[0], 'b') + if empty(ver) + throw 'vital: invalid version file: ' . a:name + endif + return vital#_{substitute(ver[0], '\W', '', 'g')}#new() +endfunction diff --git a/autoload/vital/_tsuquyomi.vim b/autoload/vital/_tsuquyomi.vim new file mode 100644 index 0000000..9eba177 --- /dev/null +++ b/autoload/vital/_tsuquyomi.vim @@ -0,0 +1,5 @@ +let s:_plugin_name = expand(':t:r') + +function! vital#{s:_plugin_name}#new() abort + return vital#{s:_plugin_name[1:]}#new() +endfunction diff --git a/autoload/vital/_tsuquyomi/Data/List.vim b/autoload/vital/_tsuquyomi/Data/List.vim new file mode 100644 index 0000000..285b406 --- /dev/null +++ b/autoload/vital/_tsuquyomi/Data/List.vim @@ -0,0 +1,457 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_tsuquyomi#Data#List#import() abort + return map({'combinations': '', 'and': '', 'sort_by': '', 'foldr1': '', 'sort': '', 'flatten': '', 'has_index': '', 'find_indices': '', 'any': '', 'unshift': '', 'span': '', 'pop': '', 'binary_search': '', 'uniq_by': '', 'or': '', 'all': '', 'zip': '', 'find_last_index': '', 'find': '', 'partition': '', 'map_accum': '', 'permutations': '', 'break': '', 'max_by': '', 'foldl': '', 'foldr': '', 'find_index': '', 'group_by': '', 'take_while': '', 'conj': '', 'push': '', 'char_range': '', 'cons': '', 'foldl1': '', 'intersect': '', 'concat': '', 'shift': '', 'clear': '', 'has_common_items': '', 'product': '', 'zip_fill': '', 'uniq': '', 'has': '', 'min_by': '', 'with_index': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_tsuquyomi#Data#List#import() abort', printf("return map({'combinations': '', 'and': '', 'sort_by': '', 'foldr1': '', 'sort': '', 'flatten': '', 'has_index': '', 'find_indices': '', 'any': '', 'unshift': '', 'span': '', 'pop': '', 'binary_search': '', 'uniq_by': '', 'or': '', 'all': '', 'zip': '', 'find_last_index': '', 'find': '', 'partition': '', 'map_accum': '', 'permutations': '', 'break': '', 'max_by': '', 'foldl': '', 'foldr': '', 'find_index': '', 'group_by': '', 'take_while': '', 'conj': '', 'push': '', 'char_range': '', 'cons': '', 'foldl1': '', 'intersect': '', 'concat': '', 'shift': '', 'clear': '', 'has_common_items': '', 'product': '', 'zip_fill': '', 'uniq': '', 'has': '', 'min_by': '', 'with_index': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +" Utilities for list. + +let s:save_cpo = &cpo +set cpo&vim + +function! s:pop(list) abort + return remove(a:list, -1) +endfunction + +function! s:push(list, val) abort + call add(a:list, a:val) + return a:list +endfunction + +function! s:shift(list) abort + return remove(a:list, 0) +endfunction + +function! s:unshift(list, val) abort + return insert(a:list, a:val) +endfunction + +function! s:cons(x, xs) abort + return [a:x] + a:xs +endfunction + +function! s:conj(xs, x) abort + return a:xs + [a:x] +endfunction + +" Removes duplicates from a list. +function! s:uniq(list) abort + return s:uniq_by(a:list, 'v:val') +endfunction + +" Removes duplicates from a list. +function! s:uniq_by(list, f) abort + let list = map(copy(a:list), printf('[v:val, %s]', a:f)) + let i = 0 + let seen = {} + while i < len(list) + let key = string(list[i][1]) + if has_key(seen, key) + call remove(list, i) + else + let seen[key] = 1 + let i += 1 + endif + endwhile + return map(list, 'v:val[0]') +endfunction + +function! s:clear(list) abort + if !empty(a:list) + unlet! a:list[0 : len(a:list) - 1] + endif + return a:list +endfunction + +" Concatenates a list of lists. +" XXX: Should we verify the input? +function! s:concat(list) abort + let memo = [] + for Value in a:list + let memo += Value + endfor + return memo +endfunction + +" Take each elements from lists to a new list. +function! s:flatten(list, ...) abort + let limit = a:0 > 0 ? a:1 : -1 + let memo = [] + if limit == 0 + return a:list + endif + let limit -= 1 + for Value in a:list + let memo += + \ type(Value) == type([]) ? + \ s:flatten(Value, limit) : + \ [Value] + unlet! Value + endfor + return memo +endfunction + +" Sorts a list with expression to compare each two values. +" a:a and a:b can be used in {expr}. +function! s:sort(list, expr) abort + if type(a:expr) == type(function('function')) + return sort(a:list, a:expr) + endif + let s:expr = a:expr + return sort(a:list, 's:_compare') +endfunction + +function! s:_compare(a, b) abort + return eval(s:expr) +endfunction + +" Sorts a list using a set of keys generated by mapping the values in the list +" through the given expr. +" v:val is used in {expr} +function! s:sort_by(list, expr) abort + let pairs = map(a:list, printf('[v:val, %s]', a:expr)) + return map(s:sort(pairs, + \ 'a:a[1] ==# a:b[1] ? 0 : a:a[1] ># a:b[1] ? 1 : -1'), 'v:val[0]') +endfunction + +" Returns a maximum value in {list} through given {expr}. +" Returns 0 if {list} is empty. +" v:val is used in {expr} +function! s:max_by(list, expr) abort + if empty(a:list) + return 0 + endif + let list = map(copy(a:list), a:expr) + return a:list[index(list, max(list))] +endfunction + +" Returns a minimum value in {list} through given {expr}. +" Returns 0 if {list} is empty. +" v:val is used in {expr} +" FIXME: -0x80000000 == 0x80000000 +function! s:min_by(list, expr) abort + return s:max_by(a:list, '-(' . a:expr . ')') +endfunction + +" Returns List of character sequence between [a:from, a:to] +" e.g.: s:char_range('a', 'c') returns ['a', 'b', 'c'] +function! s:char_range(from, to) abort + return map( + \ range(char2nr(a:from), char2nr(a:to)), + \ 'nr2char(v:val)' + \) +endfunction + +" Returns true if a:list has a:value. +" Returns false otherwise. +function! s:has(list, value) abort + return index(a:list, a:value) isnot -1 +endfunction + +" Returns true if a:list[a:index] exists. +" Returns false otherwise. +" NOTE: Returns false when a:index is negative number. +function! s:has_index(list, index) abort + " Return true when negative index? + " let index = a:index >= 0 ? a:index : len(a:list) + a:index + return 0 <= a:index && a:index < len(a:list) +endfunction + +" similar to Haskell's Data.List.span +function! s:span(f, xs) abort + let border = len(a:xs) + for i in range(len(a:xs)) + if !eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g')) + let border = i + break + endif + endfor + return border == 0 ? [[], copy(a:xs)] : [a:xs[: border - 1], a:xs[border :]] +endfunction + +" similar to Haskell's Data.List.break +function! s:break(f, xs) abort + return s:span(printf('!(%s)', a:f), a:xs) +endfunction + +" similar to Haskell's Data.List.takeWhile +function! s:take_while(f, xs) abort + return s:span(a:f, a:xs)[0] +endfunction + +" similar to Haskell's Data.List.partition +function! s:partition(f, xs) abort + return [filter(copy(a:xs), a:f), filter(copy(a:xs), '!(' . a:f . ')')] +endfunction + +" similar to Haskell's Prelude.all +function! s:all(f, xs) abort + return !s:any(printf('!(%s)', a:f), a:xs) +endfunction + +" similar to Haskell's Prelude.any +function! s:any(f, xs) abort + return !empty(filter(map(copy(a:xs), a:f), 'v:val')) +endfunction + +" similar to Haskell's Prelude.and +function! s:and(xs) abort + return s:all('v:val', a:xs) +endfunction + +" similar to Haskell's Prelude.or +function! s:or(xs) abort + return s:any('v:val', a:xs) +endfunction + +function! s:map_accum(expr, xs, init) abort + let memo = [] + let init = a:init + for x in a:xs + let expr = substitute(a:expr, 'v:memo', init, 'g') + let expr = substitute(expr, 'v:val', x, 'g') + let [tmp, init] = eval(expr) + call add(memo, tmp) + endfor + return memo +endfunction + +" similar to Haskell's Prelude.foldl +function! s:foldl(f, init, xs) abort + let memo = a:init + for x in a:xs + let expr = substitute(a:f, 'v:val', string(x), 'g') + let expr = substitute(expr, 'v:memo', string(memo), 'g') + unlet memo + let memo = eval(expr) + endfor + return memo +endfunction + +" similar to Haskell's Prelude.foldl1 +function! s:foldl1(f, xs) abort + if len(a:xs) == 0 + throw 'vital: Data.List: foldl1' + endif + return s:foldl(a:f, a:xs[0], a:xs[1:]) +endfunction + +" similar to Haskell's Prelude.foldr +function! s:foldr(f, init, xs) abort + return s:foldl(a:f, a:init, reverse(copy(a:xs))) +endfunction + +" similar to Haskell's Prelude.fold11 +function! s:foldr1(f, xs) abort + if len(a:xs) == 0 + throw 'vital: Data.List: foldr1' + endif + return s:foldr(a:f, a:xs[-1], a:xs[0:-2]) +endfunction + +" similar to python's zip() +function! s:zip(...) abort + return map(range(min(map(copy(a:000), 'len(v:val)'))), "map(copy(a:000), 'v:val['.v:val.']')") +endfunction + +" similar to zip(), but goes until the longer one. +function! s:zip_fill(xs, ys, filler) abort + if empty(a:xs) && empty(a:ys) + return [] + elseif empty(a:ys) + return s:cons([a:xs[0], a:filler], s:zip_fill(a:xs[1 :], [], a:filler)) + elseif empty(a:xs) + return s:cons([a:filler, a:ys[0]], s:zip_fill([], a:ys[1 :], a:filler)) + else + return s:cons([a:xs[0], a:ys[0]], s:zip_fill(a:xs[1 :], a:ys[1: ], a:filler)) + endif +endfunction + +" Inspired by Ruby's with_index method. +function! s:with_index(list, ...) abort + let base = a:0 > 0 ? a:1 : 0 + return map(copy(a:list), '[v:val, v:key + base]') +endfunction + +" similar to Ruby's detect or Haskell's find. +function! s:find(list, default, f) abort + for x in a:list + if eval(substitute(a:f, 'v:val', string(x), 'g')) + return x + endif + endfor + return a:default +endfunction + +" Returns the index of the first element which satisfies the given expr. +function! s:find_index(xs, f, ...) abort + let len = len(a:xs) + let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : 0 + let default = a:0 > 1 ? a:2 : -1 + if start >=# len || start < 0 + return default + endif + for i in range(start, len - 1) + if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g')) + return i + endif + endfor + return default +endfunction + +" Returns the index of the last element which satisfies the given expr. +function! s:find_last_index(xs, f, ...) abort + let len = len(a:xs) + let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : len - 1 + let default = a:0 > 1 ? a:2 : -1 + if start >=# len || start < 0 + return default + endif + for i in range(start, 0, -1) + if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g')) + return i + endif + endfor + return default +endfunction + +" Similar to find_index but returns the list of indices satisfying the given expr. +function! s:find_indices(xs, f, ...) abort + let len = len(a:xs) + let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : 0 + let result = [] + if start >=# len || start < 0 + return result + endif + for i in range(start, len - 1) + if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g')) + call add(result, i) + endif + endfor + return result +endfunction + +" Return non-zero if a:list1 and a:list2 have any common item(s). +" Return zero otherwise. +function! s:has_common_items(list1, list2) abort + return !empty(filter(copy(a:list1), 'index(a:list2, v:val) isnot -1')) +endfunction + +function! s:intersect(list1, list2) abort + let items = [] + " for funcref + for X in a:list1 + if index(a:list2, X) != -1 && index(items, X) == -1 + let items += [X] + endif + endfor + return items +endfunction + +" similar to Ruby's group_by. +function! s:group_by(xs, f) abort + let result = {} + let list = map(copy(a:xs), printf('[v:val, %s]', a:f)) + for x in list + let Val = x[0] + let key = type(x[1]) !=# type('') ? string(x[1]) : x[1] + if has_key(result, key) + call add(result[key], Val) + else + let result[key] = [Val] + endif + unlet Val + endfor + return result +endfunction + +function! s:_default_compare(a, b) abort + return a:a <# a:b ? -1 : a:a ># a:b ? 1 : 0 +endfunction + +function! s:binary_search(list, value, ...) abort + let Predicate = a:0 >= 1 ? a:1 : 's:_default_compare' + let dic = a:0 >= 2 ? a:2 : {} + let start = 0 + let end = len(a:list) - 1 + + while 1 + if start > end + return -1 + endif + + let middle = (start + end) / 2 + + let compared = call(Predicate, [a:value, a:list[middle]], dic) + + if compared < 0 + let end = middle - 1 + elseif compared > 0 + let start = middle + 1 + else + return middle + endif + endwhile +endfunction + +function! s:product(lists) abort + let result = [[]] + for pool in a:lists + let tmp = [] + for x in result + let tmp += map(copy(pool), 'x + [v:val]') + endfor + let result = tmp + endfor + return result +endfunction + +function! s:permutations(list, ...) abort + if a:0 > 1 + throw 'vital: Data.List: too many arguments' + endif + let r = a:0 == 1 ? a:1 : len(a:list) + if r > len(a:list) + return [] + elseif r < 0 + throw 'vital: Data.List: {r} must be non-negative integer' + endif + let n = len(a:list) + let result = [] + for indices in s:product(map(range(r), 'range(n)')) + if len(s:uniq(indices)) == r + call add(result, map(indices, 'a:list[v:val]')) + endif + endfor + return result +endfunction + +function! s:combinations(list, r) abort + if a:r > len(a:list) + return [] + elseif a:r < 0 + throw 'vital: Data:List: {r} must be non-negative integer' + endif + let n = len(a:list) + let result = [] + for indices in s:permutations(range(n), a:r) + if s:sort(copy(indices), 'a:a - a:b') == indices + call add(result, map(indices, 'a:list[v:val]')) + endif + endfor + return result +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/autoload/vital/_tsuquyomi/Data/String.vim b/autoload/vital/_tsuquyomi/Data/String.vim new file mode 100644 index 0000000..49a3d18 --- /dev/null +++ b/autoload/vital/_tsuquyomi/Data/String.vim @@ -0,0 +1,633 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_tsuquyomi#Data#String#import() abort + return map({'starts_with': '', 'split3': '', 'replace_first': '', 'chop': '', 'unescape': '', 'split_posix_text': '', 'replace': '', 'scan': '', 'strwidthpart': '', 'common_head': '', 'reverse': '', 'escape_pattern': '', 'trim_end': '', '_vital_depends': '', 'wrap': '', 'join_posix_lines': '', 'contains_multibyte': '', 'truncate_skipping': '', 'split_leftright': '', 'ends_with': '', 'nsplit': '', 'strwidthpart_reverse': '', 'unescape_pattern': '', 'levenshtein_distance': '', 'trim_start': '', 'justify_equal_spacing': '', 'nr2hex': '', 'iconv': '', 'pad_left': '', 'nr2enc_char': '', 'lines': '', 'repair_posix_text': '', 'nr2byte': '', 'trim': '', 'diffidx': '', 'truncate': '', 'split_by_displaywidth': '', '_vital_created': '', 'padding_by_displaywidth': '', 'hash': '', 'chomp': '', 'pad_between_letters': '', 'dstring': '', 'pad_both_sides': '', 'substitute_last': '', 'pad_right': '', 'remove_ansi_sequences': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_tsuquyomi#Data#String#import() abort', printf("return map({'starts_with': '', 'split3': '', 'replace_first': '', 'chop': '', 'unescape': '', 'split_posix_text': '', 'replace': '', 'scan': '', 'strwidthpart': '', 'common_head': '', 'reverse': '', 'escape_pattern': '', 'trim_end': '', '_vital_depends': '', 'wrap': '', 'join_posix_lines': '', 'contains_multibyte': '', 'truncate_skipping': '', 'split_leftright': '', 'ends_with': '', 'nsplit': '', 'strwidthpart_reverse': '', 'unescape_pattern': '', 'levenshtein_distance': '', 'trim_start': '', 'justify_equal_spacing': '', 'nr2hex': '', 'iconv': '', 'pad_left': '', 'nr2enc_char': '', 'lines': '', 'repair_posix_text': '', 'nr2byte': '', 'trim': '', 'diffidx': '', 'truncate': '', 'split_by_displaywidth': '', '_vital_created': '', 'padding_by_displaywidth': '', 'hash': '', 'chomp': '', 'pad_between_letters': '', 'dstring': '', 'pad_both_sides': '', 'substitute_last': '', 'pad_right': '', 'remove_ansi_sequences': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +" Utilities for string. + +let s:save_cpo = &cpo +set cpo&vim + +function! s:_vital_loaded(V) abort + let s:V = a:V + let s:L = s:V.import('Data.List') +endfunction + +function! s:_vital_depends() abort + return ['Data.List'] +endfunction + +function! s:_vital_created(module) abort + " Expose script-local funcref + if exists('s:strchars') + let a:module.strchars = s:strchars + endif + if exists('s:wcswidth') + let a:module.wcswidth = s:wcswidth + endif +endfunction + +" Substitute a:from => a:to by string. +" To substitute by pattern, use substitute() instead. +function! s:replace(str, from, to) abort + return s:_replace(a:str, a:from, a:to, 'g') +endfunction + +" Substitute a:from => a:to only once. +" cf. s:replace() +function! s:replace_first(str, from, to) abort + return s:_replace(a:str, a:from, a:to, '') +endfunction + +" implement of replace() and replace_first() +function! s:_replace(str, from, to, flags) abort + return substitute(a:str, '\V'.escape(a:from, '\'), escape(a:to, '\'), a:flags) +endfunction + +function! s:scan(str, pattern) abort + let list = [] + call substitute(a:str, a:pattern, '\=add(list, submatch(0)) == [] ? "" : ""', 'g') + return list +endfunction + +function! s:reverse(str) abort + return join(reverse(split(a:str, '.\zs')), '') +endfunction + +function! s:starts_with(str, prefix) abort + return stridx(a:str, a:prefix) == 0 +endfunction + +function! s:ends_with(str, suffix) abort + let idx = strridx(a:str, a:suffix) + return 0 <= idx && idx + len(a:suffix) == len(a:str) +endfunction + +function! s:common_head(strs) abort + if empty(a:strs) + return '' + endif + let len = len(a:strs) + if len == 1 + return a:strs[0] + endif + let strs = len == 2 ? a:strs : sort(copy(a:strs)) + let pat = substitute(strs[0], '.', '\="[" . escape(submatch(0), "^\\") . "]"', 'g') + return pat ==# '' ? '' : matchstr(strs[-1], '\C^\%[' . pat . ']') +endfunction + +" Split to two elements of List. ([left, right]) +" e.g.: s:split3('neocomplcache', 'compl') returns ['neo', 'compl', 'cache'] +function! s:split_leftright(expr, pattern) abort + let [left, _, right] = s:split3(a:expr, a:pattern) + return [left, right] +endfunction + +function! s:split3(expr, pattern) abort + let ERROR = ['', '', ''] + if a:expr ==# '' || a:pattern ==# '' + return ERROR + endif + let begin = match(a:expr, a:pattern) + if begin is -1 + return ERROR + endif + let end = matchend(a:expr, a:pattern) + let left = begin <=# 0 ? '' : a:expr[: begin - 1] + let right = a:expr[end :] + return [left, a:expr[begin : end-1], right] +endfunction + +" Slices into strings determines the number of substrings. +" e.g.: s:nsplit("neo compl cache", 2, '\s') returns ['neo', 'compl cache'] +function! s:nsplit(expr, n, ...) abort + let pattern = get(a:000, 0, '\s') + let keepempty = get(a:000, 1, 1) + let ret = [] + let expr = a:expr + if a:n <= 1 + return [expr] + endif + while 1 + let pos = match(expr, pattern) + if pos == -1 + if expr !~ pattern || keepempty + call add(ret, expr) + endif + break + elseif pos >= 0 + let left = pos > 0 ? expr[:pos-1] : '' + if pos > 0 || keepempty + call add(ret, left) + endif + let ml = len(matchstr(expr, pattern)) + if pos == 0 && ml == 0 + let pos = 1 + endif + let expr = expr[pos+ml :] + endif + if len(expr) == 0 + break + endif + if len(ret) == a:n - 1 + call add(ret, expr) + break + endif + endwhile + return ret +endfunction + +" Returns the number of character in a:str. +" NOTE: This returns proper value +" even if a:str contains multibyte character(s). +" s:strchars(str) {{{ +if exists('*strchars') + let s:strchars = function('strchars') +else + function! s:strchars(str) abort + return strlen(substitute(copy(a:str), '.', 'x', 'g')) + endfunction +endif "}}} + +" Returns the bool of contains any multibyte character in s:str +function! s:contains_multibyte(str) abort "{{{ + return strlen(a:str) != s:strchars(a:str) +endfunction "}}} + +" Remove last character from a:str. +" NOTE: This returns proper value +" even if a:str contains multibyte character(s). +function! s:chop(str) abort "{{{ + return substitute(a:str, '.$', '', '') +endfunction "}}} + +" Remove last \r,\n,\r\n from a:str. +function! s:chomp(str) abort "{{{ + return substitute(a:str, '\%(\r\n\|[\r\n]\)$', '', '') +endfunction "}}} + +" wrap() and its internal functions +" * _split_by_wcswidth_once() +" * _split_by_wcswidth() +" * _concat() +" * wrap() +" +" NOTE _concat() is just a copy of Data.List.concat(). +" FIXME don't repeat yourself +function! s:_split_by_wcswidth_once(body, x) abort + let fst = s:strwidthpart(a:body, a:x) + let snd = s:strwidthpart_reverse(a:body, s:wcswidth(a:body) - s:wcswidth(fst)) + return [fst, snd] +endfunction + +function! s:_split_by_wcswidth(body, x) abort + let memo = [] + let body = a:body + while s:wcswidth(body) > a:x + let [tmp, body] = s:_split_by_wcswidth_once(body, a:x) + call add(memo, tmp) + endwhile + call add(memo, body) + return memo +endfunction + +function! s:trim(str) abort + return matchstr(a:str,'^\s*\zs.\{-}\ze\s*$') +endfunction + +function! s:trim_start(str) abort + return matchstr(a:str,'^\s*\zs.\{-}$') +endfunction + +function! s:trim_end(str) abort + return matchstr(a:str,'^.\{-}\ze\s*$') +endfunction + +function! s:wrap(str,...) abort + let _columns = a:0 > 0 ? a:1 : &columns + return s:L.concat( + \ map(split(a:str, '\r\n\|[\r\n]'), 's:_split_by_wcswidth(v:val, _columns - 1)')) +endfunction + +function! s:nr2byte(nr) abort + if a:nr < 0x80 + return nr2char(a:nr) + elseif a:nr < 0x800 + return nr2char(a:nr/64+192).nr2char(a:nr%64+128) + else + return nr2char(a:nr/4096%16+224).nr2char(a:nr/64%64+128).nr2char(a:nr%64+128) + endif +endfunction + +function! s:nr2enc_char(charcode) abort + if &encoding ==# 'utf-8' + return nr2char(a:charcode) + endif + let char = s:nr2byte(a:charcode) + if strlen(char) > 1 + let char = strtrans(iconv(char, 'utf-8', &encoding)) + endif + return char +endfunction + +function! s:nr2hex(nr) abort + let n = a:nr + let r = '' + while n + let r = '0123456789ABCDEF'[n % 16] . r + let n = n / 16 + endwhile + return r +endfunction + +" If a ==# b, returns -1. +" If a !=# b, returns first index of different character. +function! s:diffidx(a, b) abort + return a:a ==# a:b ? -1 : strlen(s:common_head([a:a, a:b])) +endfunction + +function! s:substitute_last(expr, pat, sub) abort + return substitute(a:expr, printf('.*\zs%s', a:pat), a:sub, '') +endfunction + +function! s:dstring(expr) abort + let x = substitute(string(a:expr), "^'\\|'$", '', 'g') + let x = substitute(x, "''", "'", 'g') + return printf('"%s"', escape(x, '"')) +endfunction + +function! s:lines(str) abort + return split(a:str, '\r\?\n') +endfunction + +function! s:_pad_with_char(str, left, right, char) abort + return repeat(a:char, a:left). a:str. repeat(a:char, a:right) +endfunction + +function! s:pad_left(str, width, ...) abort + let char = get(a:, 1, ' ') + if strdisplaywidth(char) != 1 + throw "vital: Data.String: Can't use non-half-width characters for padding." + endif + let left = max([0, a:width - strdisplaywidth(a:str)]) + return s:_pad_with_char(a:str, left, 0, char) +endfunction + +function! s:pad_right(str, width, ...) abort + let char = get(a:, 1, ' ') + if strdisplaywidth(char) != 1 + throw "vital: Data.String: Can't use non-half-width characters for padding." + endif + let right = max([0, a:width - strdisplaywidth(a:str)]) + return s:_pad_with_char(a:str, 0, right, char) +endfunction + +function! s:pad_both_sides(str, width, ...) abort + let char = get(a:, 1, ' ') + if strdisplaywidth(char) != 1 + throw "vital: Data.String: Can't use non-half-width characters for padding." + endif + let space = max([0, a:width - strdisplaywidth(a:str)]) + let left = space / 2 + let right = space - left + return s:_pad_with_char(a:str, left, right, char) +endfunction + +function! s:pad_between_letters(str, width, ...) abort + let char = get(a:, 1, ' ') + if strdisplaywidth(char) != 1 + throw "vital: Data.String: Can't use non-half-width characters for padding." + endif + let letters = split(a:str, '\zs') + let each_width = a:width / len(letters) + let str = join(map(letters, 's:pad_both_sides(v:val, each_width, char)'), '') + if a:width - strdisplaywidth(str) > 0 + return char. s:pad_both_sides(str, a:width - 1, char) + endif + return str +endfunction + +function! s:justify_equal_spacing(str, width, ...) abort + let char = get(a:, 1, ' ') + if strdisplaywidth(char) != 1 + throw "vital: Data.String: Can't use non-half-width characters for padding." + endif + let letters = split(a:str, '\zs') + let first_letter = letters[0] + " {width w/o the first letter} / {length w/o the first letter} + let each_width = (a:width - strdisplaywidth(first_letter)) / (len(letters) - 1) + let remainder = (a:width - strdisplaywidth(first_letter)) % (len(letters) - 1) + return first_letter. join(s:L.concat([ +\ map(letters[1:remainder], 's:pad_left(v:val, each_width + 1, char)'), +\ map(letters[remainder + 1:], 's:pad_left(v:val, each_width, char)') +\ ]), '') +endfunction + +function! s:levenshtein_distance(str1, str2) abort + let letters1 = split(a:str1, '\zs') + let letters2 = split(a:str2, '\zs') + let length1 = len(letters1) + let length2 = len(letters2) + let distances = map(range(1, length1 + 1), 'map(range(1, length2 + 1), ''0'')') + + for i1 in range(0, length1) + let distances[i1][0] = i1 + endfor + for i2 in range(0, length2) + let distances[0][i2] = i2 + endfor + + for i1 in range(1, length1) + for i2 in range(1, length2) + let cost = (letters1[i1 - 1] ==# letters2[i2 - 1]) ? 0 : 1 + + let distances[i1][i2] = min([ + \ distances[i1 - 1][i2 ] + 1, + \ distances[i1 ][i2 - 1] + 1, + \ distances[i1 - 1][i2 - 1] + cost, + \]) + endfor + endfor + + return distances[length1][length2] +endfunction + +function! s:padding_by_displaywidth(expr, width, float) abort + let padding_char = ' ' + let n = a:width - strdisplaywidth(a:expr) + if n <= 0 + let n = 0 + endif + if a:float < 0 + return a:expr . repeat(padding_char, n) + elseif 0 < a:float + return repeat(padding_char, n) . a:expr + else + if n % 2 is 0 + return repeat(padding_char, n / 2) . a:expr . repeat(padding_char, n / 2) + else + return repeat(padding_char, (n - 1) / 2) . a:expr . repeat(padding_char, (n - 1) / 2) . padding_char + endif + endif +endfunction + +function! s:split_by_displaywidth(expr, width, float, is_wrap) abort + if a:width is 0 + return [''] + endif + + let lines = [] + + let cs = split(a:expr, '\zs') + let cs_index = 0 + + let text = '' + while cs_index < len(cs) + if cs[cs_index] is# "\n" + let text = s:padding_by_displaywidth(text, a:width, a:float) + let lines += [text] + let text = '' + else + let w = strdisplaywidth(text . cs[cs_index]) + + if w < a:width + let text .= cs[cs_index] + elseif a:width < w + let text = s:padding_by_displaywidth(text, a:width, a:float) + else + let text .= cs[cs_index] + endif + + if a:width <= w + let lines += [text] + let text = '' + if a:is_wrap + if a:width < w + if a:width < strdisplaywidth(cs[cs_index]) + while get(cs, cs_index, "\n") isnot# "\n" + let cs_index += 1 + endwhile + continue + else + let text = cs[cs_index] + endif + endif + else + while get(cs, cs_index, "\n") isnot# "\n" + let cs_index += 1 + endwhile + continue + endif + endif + + endif + let cs_index += 1 + endwhile + + if !empty(text) + let lines += [ s:padding_by_displaywidth(text, a:width, a:float) ] + endif + + return lines +endfunction + +function! s:hash(str) abort + if exists('*sha256') + return sha256(a:str) + else + " This gives up sha256ing but just adds up char with index. + let sum = 0 + for i in range(len(a:str)) + let sum += char2nr(a:str[i]) * (i + 1) + endfor + + return printf('%x', sum) + endif +endfunction + +function! s:truncate(str, width) abort + " Original function is from mattn. + " http://github.com/mattn/googlereader-vim/tree/master + + if a:str =~# '^[\x00-\x7f]*$' + return len(a:str) < a:width + \ ? printf('%-' . a:width . 's', a:str) + \ : strpart(a:str, 0, a:width) + endif + + let ret = a:str + let width = s:wcswidth(a:str) + if width > a:width + let ret = s:strwidthpart(ret, a:width) + let width = s:wcswidth(ret) + endif + + if width < a:width + let ret .= repeat(' ', a:width - width) + endif + + return ret +endfunction + +function! s:truncate_skipping(str, max, footer_width, separator) abort + let width = s:wcswidth(a:str) + if width <= a:max + let ret = a:str + else + let header_width = a:max - s:wcswidth(a:separator) - a:footer_width + let ret = s:strwidthpart(a:str, header_width) . a:separator + \ . s:strwidthpart_reverse(a:str, a:footer_width) + endif + return s:truncate(ret, a:max) +endfunction + +function! s:strwidthpart(str, width) abort + let str = tr(a:str, "\t", ' ') + let vcol = a:width + 2 + return matchstr(str, '.*\%<' . (vcol < 0 ? 0 : vcol) . 'v') +endfunction + +function! s:strwidthpart_reverse(str, width) abort + let str = tr(a:str, "\t", ' ') + let vcol = s:wcswidth(str) - a:width + return matchstr(str, '\%>' . (vcol < 0 ? 0 : vcol) . 'v.*') +endfunction + +if v:version >= 703 + " Use builtin function. + let s:wcswidth = function('strwidth') +else + function! s:wcswidth(str) abort + if a:str =~# '^[\x00-\x7f]*$' + return strlen(a:str) + endif + let mx_first = '^\(.\)' + let str = a:str + let width = 0 + while 1 + let ucs = char2nr(substitute(str, mx_first, '\1', '')) + if ucs == 0 + break + endif + let width += s:_wcwidth(ucs) + let str = substitute(str, mx_first, '', '') + endwhile + return width + endfunction + + " UTF-8 only. + function! s:_wcwidth(ucs) abort + let ucs = a:ucs + if (ucs >= 0x1100 + \ && (ucs <= 0x115f + \ || ucs == 0x2329 + \ || ucs == 0x232a + \ || (ucs >= 0x2e80 && ucs <= 0xa4cf + \ && ucs != 0x303f) + \ || (ucs >= 0xac00 && ucs <= 0xd7a3) + \ || (ucs >= 0xf900 && ucs <= 0xfaff) + \ || (ucs >= 0xfe30 && ucs <= 0xfe6f) + \ || (ucs >= 0xff00 && ucs <= 0xff60) + \ || (ucs >= 0xffe0 && ucs <= 0xffe6) + \ || (ucs >= 0x20000 && ucs <= 0x2fffd) + \ || (ucs >= 0x30000 && ucs <= 0x3fffd) + \ )) + return 2 + endif + return 1 + endfunction +endif + +function! s:remove_ansi_sequences(text) abort + return substitute(a:text, '\e\[\%(\%(\d;\)\?\d\{1,2}\)\?[mK]', '', 'g') +endfunction + +function! s:escape_pattern(str) abort + " escape characters for no-magic + return escape(a:str, '^$~.*[]\') +endfunction + +function! s:unescape_pattern(str) abort + " unescape characters for no-magic + return s:unescape(a:str, '^$~.*[]\') +endfunction + +function! s:unescape(str, chars) abort + let chars = map(split(a:chars, '\zs'), 'escape(v:val, ''^$~.*[]\'')') + return substitute(a:str, '\\\(' . join(chars, '\|') . '\)', '\1', 'g') +endfunction + +function! s:iconv(expr, from, to) abort + if a:from ==# '' || a:to ==# '' || a:from ==? a:to + return a:expr + endif + let result = iconv(a:expr, a:from, a:to) + return empty(result) ? a:expr : result +endfunction + +" NOTE: +" A definition of a TEXT file is "A file that contains characters organized +" into one or more lines." +" A definition of a LINE is "A sequence of zero or more non- s +" plus a terminating " +" That's why {stdin} always ends with ideally. However, there are +" some programs which does not follow the POSIX rule and a Vim's way to join +" List into TEXT; join({text}, "\n"); does not add to the end of +" the last line. +" That's why add a trailing if it does not exist. +" REF: +" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_392 +" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_205 +" :help split() +" NOTE: +" it does nothing if the text is a correct POSIX text +function! s:repair_posix_text(text, ...) abort + let newline = get(a:000, 0, "\n") + return a:text =~# '\n$' ? a:text : a:text . newline +endfunction + +" NOTE: +" A definition of a TEXT file is "A file that contains characters organized +" into one or more lines." +" A definition of a LINE is "A sequence of zero or more non- s +" plus a terminating " +" REF: +" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_392 +" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_205 +function! s:join_posix_lines(lines, ...) abort + let newline = get(a:000, 0, "\n") + return join(a:lines, newline) . newline +endfunction + +" NOTE: +" A definition of a TEXT file is "A file that contains characters organized +" into one or more lines." +" A definition of a LINE is "A sequence of zero or more non- s +" plus a terminating " +" TEXT into List; split({text}, '\r\?\n', 1); add an extra empty line at the +" end of List because the end of TEXT ends with and keepempty=1 is +" specified. (btw. keepempty=0 cannot be used because it will remove +" emptylines in the head and the tail). +" That's why removing a trailing before proceeding to 'split' is required +" REF: +" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_392 +" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_205 +function! s:split_posix_text(text, ...) abort + let newline = get(a:000, 0, '\r\?\n') + let text = substitute(a:text, newline . '$', '', '') + return split(text, newline, 1) +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/autoload/vital/_tsuquyomi/Prelude.vim b/autoload/vital/_tsuquyomi/Prelude.vim new file mode 100644 index 0000000..513b864 --- /dev/null +++ b/autoload/vital/_tsuquyomi/Prelude.vim @@ -0,0 +1,409 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_tsuquyomi#Prelude#import() abort + return map({'escape_pattern': '', 'is_funcref': '', 'path2directory': '', 'wcswidth': '', 'is_string': '', 'input_helper': '', 'is_number': '', 'is_cygwin': '', 'path2project_directory': '', 'strwidthpart_reverse': '', 'input_safe': '', 'is_list': '', 'truncate_skipping': '', 'glob': '', 'truncate': '', 'is_dict': '', 'set_default': '', 'is_numeric': '', 'getchar_safe': '', 'substitute_path_separator': '', 'is_mac': '', 'strwidthpart': '', 'getchar': '', 'is_unix': '', 'is_windows': '', 'globpath': '', 'escape_file_searching': '', 'is_float': '', 'smart_execute_command': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_tsuquyomi#Prelude#import() abort', printf("return map({'escape_pattern': '', 'is_funcref': '', 'path2directory': '', 'wcswidth': '', 'is_string': '', 'input_helper': '', 'is_number': '', 'is_cygwin': '', 'path2project_directory': '', 'strwidthpart_reverse': '', 'input_safe': '', 'is_list': '', 'truncate_skipping': '', 'glob': '', 'truncate': '', 'is_dict': '', 'set_default': '', 'is_numeric': '', 'getchar_safe': '', 'substitute_path_separator': '', 'is_mac': '', 'strwidthpart': '', 'getchar': '', 'is_unix': '', 'is_windows': '', 'globpath': '', 'escape_file_searching': '', 'is_float': '', 'smart_execute_command': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +let s:save_cpo = &cpo +set cpo&vim + +if v:version > 703 || +\ (v:version == 703 && has('patch465')) + function! s:glob(expr) abort + return glob(a:expr, 1, 1) + endfunction +else + function! s:glob(expr) abort + return split(glob(a:expr, 1), '\n') + endfunction +endif + +if v:version > 704 || +\ (v:version == 704 && has('patch279')) + function! s:globpath(path, expr) abort + return globpath(a:path, a:expr, 1, 1) + endfunction +else + function! s:globpath(path, expr) abort + return split(globpath(a:path, a:expr, 1), '\n') + endfunction +endif + +" Wrapper functions for type(). +let [ +\ s:__TYPE_NUMBER, +\ s:__TYPE_STRING, +\ s:__TYPE_FUNCREF, +\ s:__TYPE_LIST, +\ s:__TYPE_DICT, +\ s:__TYPE_FLOAT] = [ + \ type(3), + \ type(''), + \ type(function('tr')), + \ type([]), + \ type({}), + \ has('float') ? type(str2float('0')) : -1] +" __TYPE_FLOAT = -1 when -float +" This doesn't match to anything. + +" Number or Float +function! s:is_numeric(Value) abort + let _ = type(a:Value) + return _ ==# s:__TYPE_NUMBER + \ || _ ==# s:__TYPE_FLOAT +endfunction + +" Number +function! s:is_number(Value) abort + return type(a:Value) ==# s:__TYPE_NUMBER +endfunction + +" Float +function! s:is_float(Value) abort + return type(a:Value) ==# s:__TYPE_FLOAT +endfunction +" String +function! s:is_string(Value) abort + return type(a:Value) ==# s:__TYPE_STRING +endfunction +" Funcref +function! s:is_funcref(Value) abort + return type(a:Value) ==# s:__TYPE_FUNCREF +endfunction +" List +function! s:is_list(Value) abort + return type(a:Value) ==# s:__TYPE_LIST +endfunction +" Dictionary +function! s:is_dict(Value) abort + return type(a:Value) ==# s:__TYPE_DICT +endfunction + +function! s:truncate_skipping(str, max, footer_width, separator) abort + call s:_warn_deprecated('truncate_skipping', 'Data.String.truncate_skipping') + + let width = s:wcswidth(a:str) + if width <= a:max + let ret = a:str + else + let header_width = a:max - s:wcswidth(a:separator) - a:footer_width + let ret = s:strwidthpart(a:str, header_width) . a:separator + \ . s:strwidthpart_reverse(a:str, a:footer_width) + endif + + return s:truncate(ret, a:max) +endfunction + +function! s:truncate(str, width) abort + " Original function is from mattn. + " http://github.com/mattn/googlereader-vim/tree/master + + call s:_warn_deprecated('truncate', 'Data.String.truncate') + + if a:str =~# '^[\x00-\x7f]*$' + return len(a:str) < a:width ? + \ printf('%-'.a:width.'s', a:str) : strpart(a:str, 0, a:width) + endif + + let ret = a:str + let width = s:wcswidth(a:str) + if width > a:width + let ret = s:strwidthpart(ret, a:width) + let width = s:wcswidth(ret) + endif + + if width < a:width + let ret .= repeat(' ', a:width - width) + endif + + return ret +endfunction + +function! s:strwidthpart(str, width) abort + call s:_warn_deprecated('strwidthpart', 'Data.String.strwidthpart') + + if a:width <= 0 + return '' + endif + let ret = a:str + let width = s:wcswidth(a:str) + while width > a:width + let char = matchstr(ret, '.$') + let ret = ret[: -1 - len(char)] + let width -= s:wcswidth(char) + endwhile + + return ret +endfunction +function! s:strwidthpart_reverse(str, width) abort + call s:_warn_deprecated('strwidthpart_reverse', 'Data.String.strwidthpart_reverse') + + if a:width <= 0 + return '' + endif + let ret = a:str + let width = s:wcswidth(a:str) + while width > a:width + let char = matchstr(ret, '^.') + let ret = ret[len(char) :] + let width -= s:wcswidth(char) + endwhile + + return ret +endfunction + +if v:version >= 703 + " Use builtin function. + function! s:wcswidth(str) abort + call s:_warn_deprecated('wcswidth', 'Data.String.wcswidth') + return strwidth(a:str) + endfunction +else + function! s:wcswidth(str) abort + call s:_warn_deprecated('wcswidth', 'Data.String.wcswidth') + + if a:str =~# '^[\x00-\x7f]*$' + return strlen(a:str) + end + + let mx_first = '^\(.\)' + let str = a:str + let width = 0 + while 1 + let ucs = char2nr(substitute(str, mx_first, '\1', '')) + if ucs == 0 + break + endif + let width += s:_wcwidth(ucs) + let str = substitute(str, mx_first, '', '') + endwhile + return width + endfunction + + " UTF-8 only. + function! s:_wcwidth(ucs) abort + let ucs = a:ucs + if (ucs >= 0x1100 + \ && (ucs <= 0x115f + \ || ucs == 0x2329 + \ || ucs == 0x232a + \ || (ucs >= 0x2e80 && ucs <= 0xa4cf + \ && ucs != 0x303f) + \ || (ucs >= 0xac00 && ucs <= 0xd7a3) + \ || (ucs >= 0xf900 && ucs <= 0xfaff) + \ || (ucs >= 0xfe30 && ucs <= 0xfe6f) + \ || (ucs >= 0xff00 && ucs <= 0xff60) + \ || (ucs >= 0xffe0 && ucs <= 0xffe6) + \ || (ucs >= 0x20000 && ucs <= 0x2fffd) + \ || (ucs >= 0x30000 && ucs <= 0x3fffd) + \ )) + return 2 + endif + return 1 + endfunction +endif + +let s:is_windows = has('win16') || has('win32') || has('win64') || has('win95') +let s:is_cygwin = has('win32unix') +let s:is_mac = !s:is_windows && !s:is_cygwin + \ && (has('mac') || has('macunix') || has('gui_macvim') || + \ (!isdirectory('/proc') && executable('sw_vers'))) +let s:is_unix = has('unix') + +function! s:is_windows() abort + return s:is_windows +endfunction + +function! s:is_cygwin() abort + return s:is_cygwin +endfunction + +function! s:is_mac() abort + return s:is_mac +endfunction + +function! s:is_unix() abort + return s:is_unix +endfunction + +function! s:_warn_deprecated(name, alternative) abort + try + echohl Error + echomsg 'Prelude.' . a:name . ' is deprecated! Please use ' . a:alternative . ' instead.' + finally + echohl None + endtry +endfunction + +function! s:smart_execute_command(action, word) abort + execute a:action . ' ' . (a:word ==# '' ? '' : '`=a:word`') +endfunction + +function! s:escape_file_searching(buffer_name) abort + return escape(a:buffer_name, '*[]?{}, ') +endfunction + +function! s:escape_pattern(str) abort + call s:_warn_deprecated( + \ 'escape_pattern', + \ 'Data.String.escape_pattern', + \) + return escape(a:str, '~"\.^$[]*') +endfunction + +function! s:getchar(...) abort + let c = call('getchar', a:000) + return type(c) == type(0) ? nr2char(c) : c +endfunction + +function! s:getchar_safe(...) abort + let c = s:input_helper('getchar', a:000) + return type(c) == type('') ? c : nr2char(c) +endfunction + +function! s:input_safe(...) abort + return s:input_helper('input', a:000) +endfunction + +function! s:input_helper(funcname, args) abort + let success = 0 + if inputsave() !=# success + throw 'vital: Prelude: inputsave() failed' + endif + try + return call(a:funcname, a:args) + finally + if inputrestore() !=# success + throw 'vital: Prelude: inputrestore() failed' + endif + endtry +endfunction + +function! s:set_default(var, val) abort + if !exists(a:var) || type({a:var}) != type(a:val) + let {a:var} = a:val + endif +endfunction + +function! s:substitute_path_separator(path) abort + return s:is_windows ? substitute(a:path, '\\', '/', 'g') : a:path +endfunction + +function! s:path2directory(path) abort + return s:substitute_path_separator(isdirectory(a:path) ? a:path : fnamemodify(a:path, ':p:h')) +endfunction + +function! s:_path2project_directory_git(path) abort + let parent = a:path + + while 1 + let path = parent . '/.git' + if isdirectory(path) || filereadable(path) + return parent + endif + let next = fnamemodify(parent, ':h') + if next == parent + return '' + endif + let parent = next + endwhile +endfunction + +function! s:_path2project_directory_svn(path) abort + let search_directory = a:path + let directory = '' + + let find_directory = s:escape_file_searching(search_directory) + let d = finddir('.svn', find_directory . ';') + if d ==# '' + return '' + endif + + let directory = fnamemodify(d, ':p:h:h') + + " Search parent directories. + let parent_directory = s:path2directory( + \ fnamemodify(directory, ':h')) + + if parent_directory !=# '' + let d = finddir('.svn', parent_directory . ';') + if d !=# '' + let directory = s:_path2project_directory_svn(parent_directory) + endif + endif + return directory +endfunction + +function! s:_path2project_directory_others(vcs, path) abort + let vcs = a:vcs + let search_directory = a:path + + let find_directory = s:escape_file_searching(search_directory) + let d = finddir(vcs, find_directory . ';') + if d ==# '' + return '' + endif + return fnamemodify(d, ':p:h:h') +endfunction + +function! s:path2project_directory(path, ...) abort + let is_allow_empty = get(a:000, 0, 0) + let search_directory = s:path2directory(a:path) + let directory = '' + + " Search VCS directory. + for vcs in ['.git', '.bzr', '.hg', '.svn'] + if vcs ==# '.git' + let directory = s:_path2project_directory_git(search_directory) + elseif vcs ==# '.svn' + let directory = s:_path2project_directory_svn(search_directory) + else + let directory = s:_path2project_directory_others(vcs, search_directory) + endif + if directory !=# '' + break + endif + endfor + + " Search project file. + if directory ==# '' + for d in ['build.xml', 'prj.el', '.project', 'pom.xml', 'package.json', + \ 'Makefile', 'configure', 'Rakefile', 'NAnt.build', + \ 'P4CONFIG', 'tags', 'gtags'] + let d = findfile(d, s:escape_file_searching(search_directory) . ';') + if d !=# '' + let directory = fnamemodify(d, ':p:h') + break + endif + endfor + endif + + if directory ==# '' + " Search /src/ directory. + let base = s:substitute_path_separator(search_directory) + if base =~# '/src/' + let directory = base[: strridx(base, '/src/') + 3] + endif + endif + + if directory ==# '' && !is_allow_empty + " Use original path. + let directory = search_directory + endif + + return s:substitute_path_separator(directory) +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/autoload/vital/_tsuquyomi/Process.vim b/autoload/vital/_tsuquyomi/Process.vim new file mode 100644 index 0000000..679fbb4 --- /dev/null +++ b/autoload/vital/_tsuquyomi/Process.vim @@ -0,0 +1,181 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_tsuquyomi#Process#import() abort + return map({'shellescape': '', 'has_vimproc': '', 'system': '', 'iconv': '', 'spawn': '', 'get_last_status': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_tsuquyomi#Process#import() abort', printf("return map({'shellescape': '', 'has_vimproc': '', 'system': '', 'iconv': '', 'spawn': '', 'get_last_status': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +" TODO: move all comments to doc file. +" +" +" FIXME: This module name should be Vital.System ? +" But the name has been already taken. + +let s:save_cpo = &cpo +set cpo&vim + + +" FIXME: Unfortunately, can't use s:_vital_loaded() for this purpose. +" Because these variables are used when this script file is loaded. +let s:is_windows = has('win16') || has('win32') || has('win64') || has('win95') +let s:is_unix = has('unix') +" As of 7.4.122, the system()'s 1st argument is converted internally by Vim. +" Note that Patch 7.4.122 does not convert system()'s 2nd argument and +" return-value. We must convert them manually. +let s:need_trans = v:version < 704 || (v:version == 704 && !has('patch122')) + +let s:TYPE_DICT = type({}) +let s:TYPE_LIST = type([]) +let s:TYPE_STRING = type('') + +function! s:spawn(expr, ...) abort + let shellslash = 0 + if s:is_windows + let shellslash = &l:shellslash + setlocal noshellslash + endif + try + if type(a:expr) is s:TYPE_LIST + let special = 1 + let cmdline = join(map(a:expr, 'shellescape(v:val, special)'), ' ') + elseif type(a:expr) is s:TYPE_STRING + let cmdline = a:expr + if a:0 && a:1 + " for :! command + let cmdline = substitute(cmdline, '\([!%#]\|<[^<>]\+>\)', '\\\1', 'g') + endif + else + throw 'Process.spawn(): invalid argument (value type:'.type(a:expr).')' + endif + if s:is_windows + silent execute '!start' cmdline + else + silent execute '!' cmdline '&' + endif + finally + if s:is_windows + let &l:shellslash = shellslash + endif + endtry + return '' +endfunction + +" iconv() wrapper for safety. +function! s:iconv(expr, from, to) abort + if a:from ==# '' || a:to ==# '' || a:from ==? a:to + return a:expr + endif + let result = iconv(a:expr, a:from, a:to) + return result !=# '' ? result : a:expr +endfunction + +" Check vimproc. +function! s:has_vimproc() abort + if !exists('s:exists_vimproc') + try + call vimproc#version() + let s:exists_vimproc = 1 + catch + let s:exists_vimproc = 0 + endtry + endif + return s:exists_vimproc +endfunction + +" * {command} [, {input} [, {timeout}]] +" * {command} [, {dict}] +" {dict} = { +" use_vimproc: bool, +" input: string, +" timeout: bool, +" background: bool, +" } +function! s:system(str, ...) abort + " Process optional arguments at first + " because use_vimproc is required later + " for a:str argument. + let input = '' + let use_vimproc = s:has_vimproc() + let background = 0 + let args = [] + if a:0 ==# 1 + " {command} [, {dict}] + " a:1 = {dict} + if type(a:1) is s:TYPE_DICT + if has_key(a:1, 'use_vimproc') + let use_vimproc = a:1.use_vimproc + endif + if has_key(a:1, 'input') + let args += [s:iconv(a:1.input, &encoding, 'char')] + endif + if use_vimproc && has_key(a:1, 'timeout') + " ignores timeout unless you have vimproc. + let args += [a:1.timeout] + endif + if has_key(a:1, 'background') + let background = a:1.background + endif + elseif type(a:1) is s:TYPE_STRING + let args += [s:iconv(a:1, &encoding, 'char')] + else + throw 'Process.system(): invalid argument (value type:'.type(a:1).')' + endif + elseif a:0 >= 2 + " {command} [, {input} [, {timeout}]] + " a:000 = [{input} [, {timeout}]] + let [input; rest] = a:000 + let input = s:iconv(input, &encoding, 'char') + let args += [input] + rest + endif + + " Process a:str argument. + if type(a:str) is s:TYPE_LIST + let expr = use_vimproc ? '"''" . v:val . "''"' : 's:shellescape(v:val)' + let command = join(map(copy(a:str), expr), ' ') + elseif type(a:str) is s:TYPE_STRING + let command = a:str + else + throw 'Process.system(): invalid argument (value type:'.type(a:str).')' + endif + if s:need_trans + let command = s:iconv(command, &encoding, 'char') + endif + let args = [command] + args + if background && (use_vimproc || !s:is_windows) + let args[0] = args[0] . ' &' + endif + + let funcname = use_vimproc ? 'vimproc#system' : 'system' + let output = call(funcname, args) + let output = s:iconv(output, 'char', &encoding) + return output +endfunction + +function! s:get_last_status() abort + return s:has_vimproc() ? + \ vimproc#get_last_status() : v:shell_error +endfunction + +if s:is_windows + function! s:shellescape(command) abort + return substitute(a:command, '[&()[\]{}^=;!''+,`~]', '^\0', 'g') + endfunction +else + function! s:shellescape(...) abort + return call('shellescape', a:000) + endfunction +endif + + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/autoload/vital/_tsuquyomi/ProcessManager.vim b/autoload/vital/_tsuquyomi/ProcessManager.vim new file mode 100644 index 0000000..5b4c081 --- /dev/null +++ b/autoload/vital/_tsuquyomi/ProcessManager.vim @@ -0,0 +1,147 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_tsuquyomi#ProcessManager#import() abort + return map({'read': '', '_vital_depends': '', 'touch': '', 'read_wait': '', 'writeln': '', 'write': '', 'kill': '', 'state': '', 'term': '', 'is_available': '', 'debug_processes': '', 'status': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_tsuquyomi#ProcessManager#import() abort', printf("return map({'read': '', '_vital_depends': '', 'touch': '', 'read_wait': '', 'writeln': '', 'write': '', 'kill': '', 'state': '', 'term': '', 'is_available': '', 'debug_processes': '', 'status': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +let s:save_cpo = &cpo +set cpo&vim + +let s:_processes = {} + +function! s:_vital_loaded(V) abort + let s:V = a:V + let s:S = s:V.import('Data.String') + let s:P = s:V.import('Process') +endfunction + +function! s:_vital_depends() abort + return ['Data.String', 'Process'] +endfunction + +function! s:is_available() abort + return s:P.has_vimproc() +endfunction + +function! s:touch(name, cmd) abort + if has_key(s:_processes, a:name) + return 'existing' + else + let p = vimproc#popen3(a:cmd) + let s:_processes[a:name] = p + return 'new' + endif +endfunction + +function! s:_stop(i, ...) abort + let p = s:_processes[a:i] + call p.kill(get(a:000, 0, 0) ? g:vimproc#SIGKILL : g:vimproc#SIGTERM) + " call p.waitpid() + unlet s:_processes[a:i] + if has_key(s:state, a:i) + unlet s:state[a:i] + endif +endfunction + +function! s:term(i) abort + return s:_stop(a:i, 0) +endfunction + +function! s:kill(i) abort + return s:_stop(a:i, 1) +endfunction + +function! s:read(i, endpatterns) abort + return s:read_wait(a:i, 0.05, a:endpatterns) +endfunction + +let s:state = {} + +function! s:read_wait(i, wait, endpatterns) abort + if !has_key(s:_processes, a:i) + throw printf("vital: ProcessManager: doesn't know about %s", a:i) + endif + + let p = s:_processes[a:i] + + if s:status(a:i) ==# 'inactive' + let s:state[a:i] = 'inactive' + return [p.stdout.read(), p.stderr.read(), 'inactive'] + endif + + let out_memo = '' + let err_memo = '' + let lastchanged = reltime() + while 1 + let [x, y] = [p.stdout.read(-1, 0), p.stderr.read(-1, 0)] + if x ==# '' && y ==# '' + if str2float(reltimestr(reltime(lastchanged))) > a:wait + let s:state[a:i] = 'reading' + return [out_memo, err_memo, 'timedout'] + endif + else + let lastchanged = reltime() + let out_memo .= x + let err_memo .= y + for pattern in a:endpatterns + if out_memo =~ ("\\(^\\|\n\\)" . pattern) + let s:state[a:i] = 'idle' + return [s:S.substitute_last(out_memo, pattern, ''), err_memo, 'matched'] + endif + endfor + endif + endwhile +endfunction + +function! s:state(i) abort + return get(s:state, a:i, 'undefined') +endfunction + +function! s:write(i, str) abort + if !has_key(s:_processes, a:i) + throw printf("vital: ProcessManager: doesn't know about %s", a:i) + endif + if s:status(a:i) ==# 'inactive' + return 'inactive' + endif + + let p = s:_processes[a:i] + call p.stdin.write(a:str) + + return 'active' +endfunction + +function! s:writeln(i, str) abort + return s:write(a:i, a:str . "\n") +endfunction + +function! s:status(i) abort + if !has_key(s:_processes, a:i) + throw printf("vital: ProcessManager: doesn't know about %s", a:i) + endif + let p = s:_processes[a:i] + " vimproc.kill isn't to stop but to ask for the current state. + " return p.kill(0) ? 'inactive' : 'active' + " ... checkpid() checks if the process is running AND does waitpid() in C, + " so it solves zombie processes. + return get(p.checkpid(), 0, '') ==# 'run' + \ ? 'active' + \ : 'inactive' +endfunction + +function! s:debug_processes() abort + return s:_processes +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/autoload/vital/_tsuquyomi/System/Filepath.vim b/autoload/vital/_tsuquyomi/System/Filepath.vim new file mode 100644 index 0000000..5965842 --- /dev/null +++ b/autoload/vital/_tsuquyomi/System/Filepath.vim @@ -0,0 +1,265 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_tsuquyomi#System#Filepath#import() abort + return map({'path_separator': '', 'is_case_tolerant': '', 'dirname': '', 'abspath': '', 'relpath': '', 'realpath': '', 'unify_separator': '', 'is_root_directory': '', 'split': '', 'path_extensions': '', 'unixpath': '', 'which': '', 'winpath': '', 'join': '', 'separator': '', 'is_relative': '', 'basename': '', 'remove_last_separator': '', 'is_absolute': '', 'contains': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_tsuquyomi#System#Filepath#import() abort', printf("return map({'path_separator': '', 'is_case_tolerant': '', 'dirname': '', 'abspath': '', 'relpath': '', 'realpath': '', 'unify_separator': '', 'is_root_directory': '', 'split': '', 'path_extensions': '', 'unixpath': '', 'which': '', 'winpath': '', 'join': '', 'separator': '', 'is_relative': '', 'basename': '', 'remove_last_separator': '', 'is_absolute': '', 'contains': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +" You should check the following related builtin functions. +" fnamemodify() +" resolve() +" simplify() + +let s:save_cpo = &cpo +set cpo&vim + +let s:path_sep_pattern = (exists('+shellslash') ? '[\\/]' : '/') . '\+' +let s:is_windows = has('win16') || has('win32') || has('win64') || has('win95') +let s:is_cygwin = has('win32unix') +let s:is_mac = !s:is_windows && !s:is_cygwin + \ && (has('mac') || has('macunix') || has('gui_macvim') || + \ (!isdirectory('/proc') && executable('sw_vers'))) +let s:is_case_tolerant = filereadable(expand(':r') . '.VIM') + +" Get the directory separator. +function! s:separator() abort + return fnamemodify('.', ':p')[-1 :] +endfunction + +" Get the path separator. +let s:path_separator = s:is_windows ? ';' : ':' +function! s:path_separator() abort + return s:path_separator +endfunction + +" Get the path extensions +function! s:path_extensions() abort + if !exists('s:path_extensions') + if s:is_windows + if exists('$PATHEXT') + let pathext = $PATHEXT + else + " get default PATHEXT + let pathext = matchstr(system('set pathext'), '\C^pathext=\zs.*\ze\n', 'i') + endif + let s:path_extensions = map(split(pathext, s:path_separator), 'tolower(v:val)') + elseif s:is_cygwin + " cygwin is not use $PATHEXT + let s:path_extensions = ['', '.exe'] + else + let s:path_extensions = [''] + endif + endif + return s:path_extensions +endfunction + +" Convert all directory separators to "/". +function! s:unify_separator(path) abort + return substitute(a:path, s:path_sep_pattern, '/', 'g') +endfunction + +" Get the full path of command. +if exists('*exepath') + function! s:which(str) abort + return exepath(a:str) + endfunction +else + function! s:which(command, ...) abort + let pathlist = a:command =~# s:path_sep_pattern ? [''] : + \ !a:0 ? split($PATH, s:path_separator) : + \ type(a:1) == type([]) ? copy(a:1) : + \ split(a:1, s:path_separator) + + let pathext = s:path_extensions() + if index(pathext, '.' . tolower(fnamemodify(a:command, ':e'))) != -1 + let pathext = [''] + endif + + let dirsep = s:separator() + for dir in pathlist + let head = dir ==# '' ? '' : dir . dirsep + for ext in pathext + let full = fnamemodify(head . a:command . ext, ':p') + if filereadable(full) + if s:is_case_tolerant() + let full = glob(substitute( + \ toupper(full), '\u:\@!', '[\0\L\0]', 'g'), 1) + endif + if full !=# '' + return full + endif + endif + endfor + endfor + + return '' + endfunction +endif + +" Split the path with directory separator. +" Note that this includes the drive letter of MS Windows. +function! s:split(path) abort + return split(a:path, s:path_sep_pattern) +endfunction + +" Join the paths. +" join('foo', 'bar') => 'foo/bar' +" join('foo/', 'bar') => 'foo/bar' +" join('/foo/', ['bar', 'buz/']) => '/foo/bar/buz/' +function! s:join(...) abort + let sep = s:separator() + let path = '' + for part in a:000 + let path .= sep . + \ (type(part) is type([]) ? call('s:join', part) : + \ part) + unlet part + endfor + return substitute(path[1 :], s:path_sep_pattern, sep, 'g') +endfunction + +" Check if the path is absolute path. +if s:is_windows + function! s:is_absolute(path) abort + return a:path =~# '^[a-zA-Z]:[/\\]' + endfunction +else + function! s:is_absolute(path) abort + return a:path[0] ==# '/' + endfunction +endif + +function! s:is_relative(path) abort + return !s:is_absolute(a:path) +endfunction + +" Return the parent directory of the path. +" NOTE: fnamemodify(path, ':h') does not return the parent directory +" when path[-1] is the separator. +function! s:dirname(path) abort + let path = a:path + let orig = a:path + + let path = s:remove_last_separator(path) + if path ==# '' + return orig " root directory + endif + + let path = fnamemodify(path, ':h') + return path +endfunction + +" Return the basename of the path. +" NOTE: fnamemodify(path, ':h') does not return basename +" when path[-1] is the separator. +function! s:basename(path) abort + let path = a:path + let orig = a:path + + let path = s:remove_last_separator(path) + if path ==# '' + return orig " root directory + endif + + let path = fnamemodify(path, ':t') + return path +endfunction + +" Remove the separator at the end of a:path. +function! s:remove_last_separator(path) abort + let sep = s:separator() + let pat = escape(sep, '\') . '\+$' + return substitute(a:path, pat, '', '') +endfunction + + +" Return true if filesystem ignores alphabetic case of a filename. +" Return false otherwise. +function! s:is_case_tolerant() abort + return s:is_case_tolerant +endfunction + + +function! s:abspath(path) abort + if s:is_absolute(a:path) + return a:path + endif + " Note: + " the behavior of ':p' for non existing file path is not defined + return filereadable(a:path) + \ ? fnamemodify(a:path, ':p') + \ : s:join(fnamemodify(getcwd(), ':p'), a:path) +endfunction + +function! s:relpath(path) abort + if s:is_relative(a:path) + return a:path + endif + return fnamemodify(a:path, ':~:.') +endfunction + +function! s:unixpath(path) abort + return fnamemodify(a:path, ':gs?\\?/?') +endfunction + +function! s:winpath(path) abort + return fnamemodify(a:path, ':gs?/?\\?') +endfunction + +if s:is_windows + function! s:realpath(path) abort + if exists('&shellslash') && &shellslash + return s:unixpath(a:path) + else + return s:winpath(a:path) + endif + endfunction +else + function! s:realpath(path) abort + return s:unixpath(a:path) + endfunction +endif + +if s:is_windows + function! s:is_root_directory(path) abort + return a:path =~# '^[a-zA-Z]:[/\\]$' + endfunction +else + function! s:is_root_directory(path) abort + return a:path ==# '/' + endfunction +endif + +function! s:contains(path, base) abort + if a:path ==# '' || a:base ==# '' + return 0 + endif + let pathlist = s:split(a:path) + let baselist = s:split(a:base) + let pathlistlen = len(pathlist) + let baselistlen = len(baselist) + if pathlistlen < baselistlen + return 0 + endif + if baselistlen == 0 + return 1 + endif + if s:is_case_tolerant + call map(pathlist, 'tolower(v:val)') + call map(baselist, 'tolower(v:val)') + endif + return pathlist[: baselistlen - 1] ==# baselist +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/autoload/vital/_tsuquyomi/Web/JSON.vim b/autoload/vital/_tsuquyomi/Web/JSON.vim new file mode 100644 index 0000000..37c1945 --- /dev/null +++ b/autoload/vital/_tsuquyomi/Web/JSON.vim @@ -0,0 +1,184 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_tsuquyomi#Web#JSON#import() abort + return map({'decode': '', '_vital_depends': '', '_vital_created': '', 'encode': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_tsuquyomi#Web#JSON#import() abort', printf("return map({'decode': '', '_vital_depends': '', '_vital_created': '', 'encode': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +let s:save_cpo = &cpo +set cpo&vim + +function! s:_true() abort + return 1 +endfunction + +function! s:_false() abort + return 0 +endfunction + +function! s:_null() abort + return 0 +endfunction + +function! s:_resolve(val, prefix) abort + let t = type(a:val) + if t == type('') + let m = matchlist(a:val, '^' . a:prefix . '\(null\|true\|false\)$') + if !empty(m) + return s:const[m[1]] + endif + elseif t == type([]) || t == type({}) + return map(a:val, 's:_resolve(v:val, a:prefix)') + endif + return a:val +endfunction + + +function! s:_vital_created(module) abort + " define constant variables + if !exists('s:const') + let s:const = {} + let s:const.true = function('s:_true') + let s:const.false = function('s:_false') + let s:const.null = function('s:_null') + lockvar s:const + endif + call extend(a:module, s:const) +endfunction + +function! s:_vital_loaded(V) abort + let s:V = a:V + let s:string = s:V.import('Data.String') +endfunction + +function! s:_vital_depends() abort + return ['Data.String'] +endfunction + +" @vimlint(EVL102, 1, l:null) +" @vimlint(EVL102, 1, l:true) +" @vimlint(EVL102, 1, l:false) +function! s:decode(json, ...) abort + let settings = extend({ + \ 'use_token': 0, + \}, get(a:000, 0, {})) + let json = iconv(a:json, 'utf-8', &encoding) + let json = join(split(json, "\n"), '') + let json = substitute(json, '\\u34;', '\\"', 'g') + let json = substitute(json, '\\u\(\x\x\x\x\)', '\=s:string.nr2enc_char("0x".submatch(1))', 'g') + if settings.use_token + let prefix = '__Web.JSON__' + while stridx(json, prefix) != -1 + let prefix .= '_' + endwhile + let [null,true,false] = map(['null','true','false'], 'prefix . v:val') + sandbox return s:_resolve(eval(json), prefix) + else + let [null,true,false] = [s:const.null(),s:const.true(),s:const.false()] + sandbox return eval(json) + endif +endfunction +" @vimlint(EVL102, 0, l:null) +" @vimlint(EVL102, 0, l:true) +" @vimlint(EVL102, 0, l:false) + +function! s:encode(val, ...) abort + let settings = extend({ + \ 'indent': 0, + \}, get(a:000, 0, {}) + \) + if type(a:val) == 0 + return a:val + elseif type(a:val) == 1 + let json = '"' . escape(a:val, '\"') . '"' + let json = substitute(json, "\r", '\\r', 'g') + let json = substitute(json, "\n", '\\n', 'g') + let json = substitute(json, "\t", '\\t', 'g') + return iconv(json, &encoding, 'utf-8') + elseif type(a:val) == 2 + if s:const.true == a:val + return 'true' + elseif s:const.false == a:val + return 'false' + elseif s:const.null == a:val + return 'null' + else + " backward compatibility + return string(a:val) + endif + elseif type(a:val) == 3 + return s:_encode_list(a:val, settings) + elseif type(a:val) == 4 + return s:_encode_dict(a:val, settings) + else + return string(a:val) + endif +endfunction + +" @vimlint(EVL102, 1, l:ns) +function! s:_encode_list(val, settings) abort + if empty(a:val) + return '[]' + elseif !a:settings.indent + let encoded_candidates = map(copy(a:val), 's:encode(v:val, a:settings)') + return printf('[%s]', join(encoded_candidates, ',')) + else + let previous_indent = get(a:settings, '_previous_indent') + let indent = previous_indent + a:settings.indent + let ns = extend(copy(a:settings), { + \ '_previous_indent': indent, + \}) + let encoded_candidates = map( + \ copy(a:val), + \ printf('''%s'' . s:encode(v:val, ns)', repeat(' ', indent)), + \) + return printf( + \ "[\n%s\n%s]", + \ join(encoded_candidates, ",\n"), + \ repeat(' ', previous_indent) + \) + endif +endfunction +" @vimlint(EVL102, 0, l:ns) + +" @vimlint(EVL102, 1, l:ns) +function! s:_encode_dict(val, settings) abort + if empty(a:val) + return '{}' + elseif !a:settings.indent + let encoded_candidates = map(keys(a:val), + \ 's:encode(v:val, a:settings) . '':'' . s:encode(a:val[v:val], a:settings)' + \) + return printf('{%s}', join(encoded_candidates, ',')) + else + let previous_indent = get(a:settings, '_previous_indent') + let indent = previous_indent + a:settings.indent + let ns = extend(copy(a:settings), { + \ '_previous_indent': indent, + \}) + let encoded_candidates = map(keys(a:val), + \ printf( + \ '''%s'' . s:encode(v:val, ns) . '': '' . s:encode(a:val[v:val], ns)', + \ repeat(' ', indent), + \ ), + \) + return printf("{\n%s\n%s}", + \ join(encoded_candidates, ",\n"), + \ repeat(' ', previous_indent), + \) + endif +endfunction +" @vimlint(EVL102, 0, l:ns) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/autoload/vital/tsuquyomi.vim b/autoload/vital/tsuquyomi.vim new file mode 100644 index 0000000..d428cc2 --- /dev/null +++ b/autoload/vital/tsuquyomi.vim @@ -0,0 +1,339 @@ +let s:plugin_name = expand(':t:r') +let s:vital_base_dir = expand(':h') +let s:project_root = expand(':h:h:h') +let s:is_vital_vim = s:plugin_name is# 'vital' + +let s:loaded = {} +let s:cache_sid = {} + +" function() wrapper +if v:version > 703 || v:version == 703 && has('patch1170') + function! s:_function(fstr) abort + return function(a:fstr) + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + let s:_s = '' . s:_SID() . '_' + function! s:_function(fstr) abort + return function(substitute(a:fstr, 's:', s:_s, 'g')) + endfunction +endif + +function! vital#{s:plugin_name}#new() abort + return s:new(s:plugin_name) +endfunction + +function! vital#{s:plugin_name}#import(...) abort + if !exists('s:V') + let s:V = s:new(s:plugin_name) + endif + return call(s:V.import, a:000, s:V) +endfunction + +let s:Vital = {} + +function! s:new(plugin_name) abort + let base = deepcopy(s:Vital) + let base._plugin_name = a:plugin_name + return base +endfunction + +function! s:vital_files() abort + if !exists('s:vital_files') + let s:vital_files = map( + \ s:is_vital_vim ? s:_global_vital_files() : s:_self_vital_files(), + \ 'fnamemodify(v:val, ":p:gs?[\\\\/]?/?")') + endif + return copy(s:vital_files) +endfunction +let s:Vital.vital_files = s:_function('s:vital_files') + +function! s:import(name, ...) abort dict + let target = {} + let functions = [] + for a in a:000 + if type(a) == type({}) + let target = a + elseif type(a) == type([]) + let functions = a + endif + unlet a + endfor + let module = self._import(a:name) + if empty(functions) + call extend(target, module, 'keep') + else + for f in functions + if has_key(module, f) && !has_key(target, f) + let target[f] = module[f] + endif + endfor + endif + return target +endfunction +let s:Vital.import = s:_function('s:import') + +function! s:load(...) abort dict + for arg in a:000 + let [name; as] = type(arg) == type([]) ? arg[: 1] : [arg, arg] + let target = split(join(as, ''), '\W\+') + let dict = self + let dict_type = type({}) + while !empty(target) + let ns = remove(target, 0) + if !has_key(dict, ns) + let dict[ns] = {} + endif + if type(dict[ns]) == dict_type + let dict = dict[ns] + else + unlet dict + break + endif + endwhile + if exists('dict') + call extend(dict, self._import(name)) + endif + unlet arg + endfor + return self +endfunction +let s:Vital.load = s:_function('s:load') + +function! s:unload() abort dict + let s:loaded = {} + let s:cache_sid = {} + unlet! s:vital_files +endfunction +let s:Vital.unload = s:_function('s:unload') + +function! s:exists(name) abort dict + if a:name !~# '\v^\u\w*%(\.\u\w*)*$' + throw 'vital: Invalid module name: ' . a:name + endif + return s:_module_path(a:name) isnot# '' +endfunction +let s:Vital.exists = s:_function('s:exists') + +function! s:search(pattern) abort dict + let paths = s:_extract_files(a:pattern, self.vital_files()) + let modules = sort(map(paths, 's:_file2module(v:val)')) + return s:_uniq(modules) +endfunction +let s:Vital.search = s:_function('s:search') + +function! s:plugin_name() abort dict + return self._plugin_name +endfunction +let s:Vital.plugin_name = s:_function('s:plugin_name') + +function! s:_self_vital_files() abort + let builtin = printf('%s/__%s__/', s:vital_base_dir, s:plugin_name) + let installed = printf('%s/_%s/', s:vital_base_dir, s:plugin_name) + let base = builtin . ',' . installed + return split(globpath(base, '**/*.vim', 1), "\n") +endfunction + +function! s:_global_vital_files() abort + let pattern = 'autoload/vital/__*__/**/*.vim' + return split(globpath(&runtimepath, pattern, 1), "\n") +endfunction + +function! s:_extract_files(pattern, files) abort + let tr = {'.': '/', '*': '[^/]*', '**': '.*'} + let target = substitute(a:pattern, '\.\|\*\*\?', '\=tr[submatch(0)]', 'g') + let regexp = printf('autoload/vital/[^/]\+/%s.vim$', target) + return filter(a:files, 'v:val =~# regexp') +endfunction + +function! s:_file2module(file) abort + let filename = fnamemodify(a:file, ':p:gs?[\\/]?/?') + let tail = matchstr(filename, 'autoload/vital/_\w\+/\zs.*\ze\.vim$') + return join(split(tail, '[\\/]\+'), '.') +endfunction + +" @param {string} name e.g. Data.List +function! s:_import(name) abort dict + if has_key(s:loaded, a:name) + return copy(s:loaded[a:name]) + endif + let module = self._get_module(a:name) + if has_key(module, '_vital_created') + call module._vital_created(module) + endif + let export_module = filter(copy(module), 'v:key =~# "^\\a"') + " Cache module before calling module.vital_loaded() to avoid cyclic + " dependences but remove the cache if module._vital_loaded() fails. + " let s:loaded[a:name] = export_module + let s:loaded[a:name] = export_module + if has_key(module, '_vital_loaded') + try + call module._vital_loaded(vital#{s:plugin_name}#new()) + catch + unlet s:loaded[a:name] + throw 'vital: fail to call ._vital_loaded(): ' . v:exception + endtry + endif + return copy(s:loaded[a:name]) +endfunction +let s:Vital._import = s:_function('s:_import') + +" s:_get_module() returns module object wihch has all script local functions. +function! s:_get_module(name) abort dict + let funcname = s:_import_func_name(self.plugin_name(), a:name) + if s:_exists_autoload_func_with_source(funcname) + return call(funcname, []) + else + return s:_get_builtin_module(a:name) + endif +endfunction + +function! s:_get_builtin_module(name) abort + return s:sid2sfuncs(s:_module_sid(a:name)) +endfunction + +if s:is_vital_vim + " For vital.vim, we can use s:_get_builtin_module directly + let s:Vital._get_module = s:_function('s:_get_builtin_module') +else + let s:Vital._get_module = s:_function('s:_get_module') +endif + +function! s:_import_func_name(plugin_name, module_name) abort + return printf('vital#_%s#%s#import', a:plugin_name, s:_dot_to_sharp(a:module_name)) +endfunction + +function! s:_module_sid(name) abort + let path = s:_module_path(a:name) + if !filereadable(path) + throw 'vital: module not found: ' . a:name + endif + let vital_dir = s:is_vital_vim ? '__\w\+__' : printf('_\{1,2}%s\%%(__\)\?', s:plugin_name) + let base = join([vital_dir, ''], '[/\\]\+') + let p = base . substitute('' . a:name, '\.', '[/\\\\]\\+', 'g') + let sid = s:_sid(path, p) + if !sid + call s:_source(path) + let sid = s:_sid(path, p) + if !sid + throw printf('vital: cannot get from path: %s', path) + endif + endif + return sid +endfunction + +function! s:_module_path(name) abort + return get(s:_extract_files(a:name, s:vital_files()), 0, '') +endfunction + +function! s:_module_sid_base_dir() abort + return s:is_vital_vim ? &rtp : s:project_root +endfunction + +function! s:_dot_to_sharp(name) abort + return substitute(a:name, '\.', '#', 'g') +endfunction + +" It will sources autoload file if a given func is not already defined. +function! s:_exists_autoload_func_with_source(funcname) abort + if exists('*' . a:funcname) + " Return true if a given func is already defined + return 1 + endif + " source a file which may include a given func definition and try again. + let path = 'autoload/' . substitute(substitute(a:funcname, '#[^#]*$', '.vim', ''), '#', '/', 'g') + call s:_runtime(path) + return exists('*' . a:funcname) +endfunction + +function! s:_runtime(path) abort + execute 'runtime' fnameescape(a:path) +endfunction + +function! s:_source(path) abort + execute 'source' fnameescape(a:path) +endfunction + +" @vimlint(EVL102, 1, l:_) +" @vimlint(EVL102, 1, l:__) +function! s:_sid(path, filter_pattern) abort + let unified_path = s:_unify_path(a:path) + if has_key(s:cache_sid, unified_path) + return s:cache_sid[unified_path] + endif + for line in filter(split(s:_redir(':scriptnames'), "\n"), 'v:val =~# a:filter_pattern') + let [_, sid, path; __] = matchlist(line, '^\s*\(\d\+\):\s\+\(.\+\)\s*$') + if s:_unify_path(path) is# unified_path + let s:cache_sid[unified_path] = sid + return s:cache_sid[unified_path] + endif + endfor + return 0 +endfunction + +function! s:_redir(cmd) abort + let [save_verbose, save_verbosefile] = [&verbose, &verbosefile] + set verbose=0 verbosefile= + redir => res + silent! execute a:cmd + redir END + let [&verbose, &verbosefile] = [save_verbose, save_verbosefile] + return res +endfunction + +if filereadable(expand(':r') . '.VIM') " is case-insensitive or not + let s:_unify_path_cache = {} + " resolve() is slow, so we cache results. + " Note: On windows, vim can't expand path names from 8.3 formats. + " So if getting full path via and $HOME was set as 8.3 format, + " vital load duplicated scripts. Below's :~ avoid this issue. + function! s:_unify_path(path) abort + if has_key(s:_unify_path_cache, a:path) + return s:_unify_path_cache[a:path] + endif + let value = tolower(fnamemodify(resolve(fnamemodify( + \ a:path, ':p')), ':~:gs?[\\/]?/?')) + let s:_unify_path_cache[a:path] = value + return value + endfunction +else + function! s:_unify_path(path) abort + return resolve(fnamemodify(a:path, ':p:gs?[\\/]?/?')) + endfunction +endif + +" copied and modified from Vim.ScriptLocal +let s:SNR = join(map(range(len("\")), '"[\\x" . printf("%0x", char2nr("\"[v:val])) . "]"'), '') +function! s:sid2sfuncs(sid) abort + let fs = split(s:_redir(printf(':function /^%s%s_', s:SNR, a:sid)), "\n") + let r = {} + let pattern = printf('\m^function\s%d_\zs\w\{-}\ze(', a:sid) + for fname in map(fs, 'matchstr(v:val, pattern)') + let r[fname] = function(s:_sfuncname(a:sid, fname)) + endfor + return r +endfunction + +"" Return funcname of script local functions with SID +function! s:_sfuncname(sid, funcname) abort + return printf('%s_%s', a:sid, a:funcname) +endfunction + +if exists('*uniq') + function! s:_uniq(list) abort + return uniq(a:list) + endfunction +else + function! s:_uniq(list) abort + let i = len(a:list) - 1 + while 0 < i + if a:list[i] ==# a:list[i - 1] + call remove(a:list, i) + endif + let i -= 1 + endwhile + return a:list + endfunction +endif diff --git a/autoload/vital/tsuquyomi.vital b/autoload/vital/tsuquyomi.vital new file mode 100644 index 0000000..fd99e5a --- /dev/null +++ b/autoload/vital/tsuquyomi.vital @@ -0,0 +1,7 @@ +tsuquyomi +bd6fd747ba07d5124619347efa32c2f068e22318 + +Web.JSON +ProcessManager +System.Filepath +Prelude diff --git a/capt_comp.png b/capt_comp.png new file mode 100644 index 0000000000000000000000000000000000000000..23726f22bd70f7811519c4065704531d37403d2d GIT binary patch literal 76575 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
%o9v~Kbi8B`@}v+T@Jv}
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%0AZ}SL
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

literal 0
HcmV?d00001

diff --git a/doc/tsuquyomi.jax b/doc/tsuquyomi.jax
new file mode 100644
index 0000000..e40794f
--- /dev/null
+++ b/doc/tsuquyomi.jax
@@ -0,0 +1,519 @@
+*tsuquyomi* はTypeScript向けのVim plugin です.
+
+Version: 0.5.1
+Author : Quramy 
+License: MIT license  {{{
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    "Software"), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Software, and to
+    permit persons to whom the Software is furnished to do so, subject to
+    the following conditions:
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+}}}
+
+目次 						*tsuquyomi-contents*
+
+概要			|tsuquyomi-introduction|
+インストール		|tsuquyomi-install|
+インターフェイス	|tsuquyomi-interface|
+  コマンド 		  |tsuquyomi-commands|
+  オプション 		  |tsuquyomi-variables|
+  キーマッピング	  |tsuquyomi-key-mappings|
+  関数			  |tsuquyomi-functions|
+設定例			|tsuquyomi-examples|
+
+==============================================================================
+概要 						*tsuquyomi-introduction*
+
+tsuquyomi は TSServer のclient として動作します
+(TSServerはTypeScriptにバンドルされているエディタ向けツールです).
+
+tsuquyomi は以下の機能を提供します.
+
++ TSServer からソースコードが持つ情報を参照します.
+  (補完, 定義/参照箇所, エラー, etc...)
+
++ TSServerの起動や停止を行う機能
+
+==============================================================================
+インストール 						*tsuquyomi-install*
+
+tsuquyomiのインストールには下記が必要です.
+* Vim (v.7.4.0 or later)
+* Shougo/vimproc.vim (https://github.com/Shougo/vimproc.vim)
+  (vim8 もしくはそれ以降をお使いならば必要ありません)
+* Node.js and TypeScript (v.1.5.0 or later)
+
+最初に, |vimproc|が未インストールであれば, インストールしてください.
+(インストール方法は https://github.com/Shougo/vimproc.vim を参考にしてください)
+
+次に,  最新の TypeScript をインストールします.
+
+Prompt:
+>
+    	$ npm -g install typescript
+<
+最後に, tsuquyomiをVim plugin用のディレクトリに配置します.
+もし |NeoBundle| でプラグイン管理をしているのであれば,
+`.vimrc` に以下を追記します
+>
+	NeoBundle 'Shougo/vimproc.vim', {
+	\ 'build' : {
+	\     'windows' : 'tools\\update-dll-mingw',
+	\     'cygwin' : 'make -f make_cygwin.mak',
+	\     'mac' : 'make -f make_mac.mak',
+	\     'linux' : 'make',
+	\     'unix' : 'gmake',
+	\    },
+	\ }
+
+	NeoBundle 'Quramy/tsuquyomi'
+>
+|:NeoBundleInstall| を実行し,  プラグインをインストールしてください.
+
+また, tsuquyomi は|unite-outline|の拡張機能を提供します.
+|unite| と |unite-outline| がインストールされていれば, |:Unite outline| を実行
+することでカレントバッファをOutline 表示できます.
+
+==============================================================================
+インターフェイス 				*tsuquyomi-interface*
+
+------------------------------------------------------------------------------
+コマンド 					*tsuquyomi-commands*
+
+						*:TsuquyomiStartServer*
+						*:TsuStartServer*
+:TsuquyomiStartServer
+		TSServerのプロセスを起動します.
+		すでにプロセスが起動している場合は何もしません.
+
+						*:TsuquyomiStopServer*
+						*:TsuStopServer*
+:TsuquyomiStopServer
+		TSServerのプロセスが存在する場合, 停止させます.
+
+						*:TsuquyomiStatusServer*
+						*:TsuStatusServer*
+:TsuquyomiStatusServer
+		TSServerの起動状態を表示します.
+		TSServerが起動している場合, "reading" のメッセージが
+		表示されます.
+
+						*:TsuquyomiOpen*
+						*:TsuOpen*
+:TsuquyomiOpen [{file} ...]
+		TSServerで{file}を開きます.
+		TSServerでファイルを開くと, ファイルに対する様々な処理が
+		行えるようになります.
+		引数{file}を省略すると, TSServerはカレントバッファのファイルを
+		開きます.
+		デフォルトでは, |g:tsuquyomi_auto_open| が有効化されています.
+		このため, 通常は明示的にこのコマンドを実行する必要は
+		ありません.
+
+						*:TsuquyomiClose*
+						*:TsuClose*
+:TsuquyomiClose [{file} ...]
+		既に開いている{file}をTSServer上でクローズします.
+		引数{file}を省略すると, TSServerはカレントバッファに紐づいた
+		ファイルをクローズします.
+
+						*:TsuquyomiReload*
+						*:TsuReload*
+:TsuquyomiReload [{file} ...]
+		TSServerに{file}をリロードさせます.
+		引数{file}を省略すると, TSServerにカレントバッファを
+		リロードさせます.
+
+						*:TsuquyomiDump*
+						*:TsuDump*
+:TsuquyomiDump [{file} ...]
+		TSServerのバッファをファイルに保存します.
+		デバッグのために利用します.
+		引数{file}を省略すると, カレントバッファに紐づくファイルを
+		ダンプします.
+		Note: ダンプされるファイル名は下記となります:
+		      `オリジナルファイル名` + `'.dump'`.
+
+						*:TsuquyomiDefinition*
+						*:TsuDefinition*
+:TsuquyomiDefinition
+		シンボルが定義された場所へ遷移させます.
+
+						*:TsuquyomiSplitDefinition*
+						*:TsuSplitDefinition*
+:TsuquyomiSplitDefinition
+                現在のウィンドウを2つに分割し、片方にシンボルが定義された
+		場所を表示します.
+
+						*:TsuquyomiTypeDefinition*
+						*:TsuTypeDefinition*
+:TsuquyomiTypeDefinition
+		シンボルの型が定義されている場所へ遷移させます.
+
+						*:TsuquyomiGoBack*
+						*:TsuGoBack*
+:TsuquyomiGoBack
+		最後に|:TsuquyomiDefinition|, |:TsuTypeDefinition|
+		を実行した箇所へカーソルを移動させます.
+
+						*:TsuquyomiImplementation*
+						*:TsuImplementation*
+:TsuquyomiImplementation
+		interfaceの実装箇所へナビゲートします.
+		参照箇所の結果は|location-list|に表示されます.
+
+						*:TsuquyomiReferences*
+						*:TsuReferences*
+:TsuquyomiReferences
+		シンボルを参照している箇所へナビゲートします.
+		参照箇所の結果は|location-list|に表示されます.
+
+						*:TsuquyomiRenameSymbol*
+						*:TsuRenameSymbol*
+:TsuquyomiRenameSymbol
+		カーソル直下の識別子を別名に変更します.
+		対象の識別子が別の.tsファイルから参照されている場合,
+		このコマンドを実行するより前に対象ファイルをバッファに
+		開いておく必要があります.
+
+						*:TsuquyomiRenameSymbolC*
+						*:TsuRenameSymbolC*
+:TsuquyomiRenameSymbolC
+		カーソル直下の識別子を別名に変更します.
+		コメントに含まれている識別子も含めて変更されます.
+
+						*:TsuquyomiReloadProject*
+						*:TsuReloadProject*
+:TsuquyomiReloadProject
+		TSServerで開かれている全てのファイルを一度閉じ,
+		再度開きます.
+		`*.ts`をバッファに開いた後に, `tsconfig.json` を編集した場合,
+		このコマンドを実行する必要があります.
+		このコマンドを実行すると, `tsconfig.json` の変更が
+		TSServerに反映されます.
+
+						*:TsuquyomiGeterr*
+						*:TsuGeterr*
+:TsuquyomiGeterr
+		カレントバッファのコンパイルエラー情報をQuickFixウィンドウへ
+		表示します.
+
+						*:TsuquyomiGeterrProject*
+						*:TsuGeterrProject*
+:TsuquyomiGeterrProject
+		プロジェクトのコンパイルエラー情報全てをQuickFixウィンドウへ
+		表示します.
+		このコマンドにはTypeScript@v1.6.0以上が必要です.
+
+						*:TsuquyomiAsyncGeterr*
+						*:TsuAsyncGeterr*
+:TsuquyomiAsyncGeterr
+		カレントバッファのコンパイルエラー情報を非同期で
+		QuickFixウィンドウへ表示します.
+
+						*:TsuquyomiSeaarch*
+						*:TsuSearch*
+:TsuquyomiSearch {keyword}
+		プロジェクトで {keyword} を含んでいる箇所を検索します.
+
+						*:TsuquyomiQuickFix*
+						*:TsuQuickFix*
+:TsuquyomiQuickFix
+		カーソル配下にエラーが存在し、且つ適用可能なQuickFixが
+		存在する場合に、このQuickFixを適用します.
+		このコマンドにはTypeScript@v2.1.0以上が必要です.
+
+						*:TsuquyomiSignatureHelp*
+						*:TsuSignatureHelp*
+:TsuquyomiSignatureHelp
+		カーソル上のメソッドのシグネチャを、プレビューウィンドウへ表示
+		します。もし複数のオーバーロードされた候補が存在する場合は、
+		それらをドキュメントと共に表示します。
+		Note
+		カーソルはメソッド呼び出しのカッコの間にあるか、少なくとも書き
+		かけのメソッド呼び出しの開きカッコの後になければいけません。
+
+------------------------------------------------------------------------------
+オプション						*tsuquyomi-variables*
+
+						*g:tsuquyomi_auto_open*
+g:tsuquyomi_auto_open		(デフォルト値 1)
+		Vimでバッファを開く際にTSServerでそのファイルを開くかどうか.
+		この値を0とした場合, バッファを開いた後に|:TsuquyomiOpen|
+		コマンドを実行すると必要があります.
+
+					*g:tsuquyomi_use_local_typescript*
+g:tsuquyomi_use_local_typescript (default 1)
+		プロジェクト用にローカルインストールした`tsserver.js` を
+		利用するかどうか.
+		* 0: tsuquyomiは `tsserver.js`の探索を行いません.
+		* 1: tsuquyomiはカレントディレクトリを起点にプロジェクトの
+		     ルートディレクトリ(`package.json`を含むディレクトリ)を
+		     探索します. 次にプロジェクトルートから
+		     `node_modules/typescript/bin/tsserver.js`
+                     を探索します. 見つからない場合は,
+		     |g:tsuquyomi_use_dev_node_module| に従って`tsserver.js`の
+		     パスを決定します.
+
+					*g:tsuquyomi_use_dev_node_module*
+g:tsuquyomi_use_dev_node_module	(デフォルト値 0)
+		手動でインストールした`tsserver.js` を利用するかどうか.
+		* 0: tsuquyomi はグローバルインストールされた
+		     `tsserver` コマンドを利用します(デフォルト).
+		* 1: tsuquyomiは
+		     `tsuquyomi/node_modules/typescript/bin/tsserver.js` .
+		     を利用します.
+		     このモードを利用する場合,  下記を実行してください:
+>
+		     :cd ~/.vim/bundle/tsuquyomi
+		     :!npm install
+<
+		* 2: tsuquyomiは|g:tsuquyomi_tsserver_path| で指定された
+		     `tsserver.js` を利用します.
+
+						*g:tsuquyomi_tsserver_path*
+g:tsuquyomi_tsserver_path	(デフォルト値 `''`)
+		|g:tsuquyomi_use_dev_node_module|を`2`とした場合,
+		このオプションで`tsserver.js`のパスを設定する必要があります.
+		設定例:
+>
+		let g:tsuquyomi_use_dev_node_module = 2
+		let g:tsuquyomi_tsserver_path =
+		\ '~/typescript/built/local/tsserver.js'
+<
+
+						*g:tsuquyomi_nodejs_path*
+g:tsuquyomi_nodejs_path		(デフォルト値 "node")
+		Node.js の実行パス.
+
+						*g:tsuquyomi_definition_split*
+g:tsuquyomi_definition_split	(デフォルト値 0)
+		|:TsuquyomiDefinition| にて別ファイル定義への遷移時,
+		ウィンドウをどのように開くか.
+		* 0: |:edit|
+		* 1: |:split|
+		* 2: |:vsplit|
+		* 3: |:tabedit|
+
+					*g:tsuquyomi_completion_detail*
+g:tsuquyomi_completion_detail		(デフォルト値 0)
+		|tsuquyomi#complete|実行時に詳細な補完メニューを作成するかどうか.
+		このオプションは 'completeopt' に "menu" が含まれるときにのみ
+		意味を持つ.
+		NOTE: このオプションを1に設定した場合, 補完速度は遅くなる
+
+					*g:tsuquyomi_completion_case_sensitive*
+g:tsuquyomi_completion_case_sensitive	(デフォルト値 0)
+		|tsuquyomi#complete|実行時に補完候補をcase-sensitiveに
+		探索するかどうか.
+
+					*g:tsuquyomi_case_sensitive_imports*
+g:tsuquyomi_case_sensitive_imports	(default 0)
+		|tsuquyomi#es6import#complete|実行時に補完候補をcase-sensitive
+		に探索するかどうか.
+
+					*g:tsuquyomi_completion_preview*
+g:tsuquyomi_completion_preview		(デフォルト値 0)
+		|tsuquyomi#complete|実行時にシグネチャの情報をプレビューに表示
+		するかどうか.
+		このオプションは 'completeopt' に "menu" と "preview" が含まれ
+		るときにのみ意味を持つ.
+		NOTE: このオプションを1に設定した場合, 補完速度は少し遅くなる
+
+						*g:tsuquyomi_disable_default_mappings*
+g:tsuquyomi_disable_default_mappings	(デフォルト値 0)
+		デフォルトキーマッピングを適用するかどうか.
+
+						*g:tsuquyomi_disable_quickfix*
+g:tsuquyomi_disable_quickfix	(デフォルト値 0)
+		値をセットするとバッファ保存時に |:TsuquyomiGeterr| が
+		実行されなくなる.
+
+						*g:tsuquyomi_save_onrename*
+g:tsuquyomi_save_onrename	(デフォルト値 0)
+		値をセットすると |:TsuquyomiRenameSymbol| の実行時に書き換え
+		られたファイルが自動で保存される.
+		値がセットされていない場合は, 書き換えられたファイルを|:split|
+		で表示すため, ユーザは変更箇所を確認してから, ファイルを
+		|:wa| 等で保存すればよい.
+
+						*g:tsuquyomi_single_quote_import*
+g:tsuquyomi_single_quote_import		(デフォルト値 0)
+		値をセットすると、|:TsuquyomiImport| 利用時にダブルクォートで
+		はなくシングルクォートを使って import blockが生成される.
+
+g:tsuquyomi_semicolon_import		(default 1)
+		値をセットすると、|:TsuquyomiImport| 利用時に行末にセミコロン
+		を追加して import blockが生成される.
+
+						*g:tsuquyomi_baseurl_import_path*
+g:tsuquyomi_baseurl_import_path		(default 0)
+		値をセットすると、|:TsuquyomiImport|が tsconfig.jsonで指定され
+		た`baseUrl`からの相対パスをモジュールのパスとして使用するよう
+		になる.
+
+						*g:tsuquyomi_javascript_support*
+g:tsuquyomi_javascript_support	(デフォルト値 0)
+		値をセットすると、JavaScriptファイルに対しても動作するようになる
+		tsconfig.jsonやjsconfig.jsonによる詳細設定が可能。
+
+						*g:tsuquyomi_ignore_missing_modules*
+g:tsuquyomi_ignore_missing_modules (デフォルト値 0)
+		値をセットすると、"Cannot find module"で始まる
+		エラーメッセージを無視するようになる。
+		import対象の型定義ファイルが存在していないケースで有用。
+
+						*g:tsuquyomi_use_vimproc*
+g:tsuquyomi_use_vimproc (default 0)
+		値をセットすると、Vim8のjob機能の代わりに |vimproc| を使用する.
+
+						*g:tsuquyomi_locale*
+g:tsuquyomi_locale (デフォルト値 "en")
+		エラーメッセージのLCID。
+
+------------------------------------------------------------------------------
+キーマッピング					*tsuquyomi-key-mappings*
+
+ノーマルモードのキーマッピング:
+
+						*(TsuquyomiDefinition)*
+(TsuquyomiDefinition)
+		カーソル直下のシンボルが定義された箇所へ遷移.
+		|:TsuquyomiDefinition|を参照のこと.
+
+						*(TsuquyomiSplitDefinition)*
+(TsuquyomiSplitDefinition)
+		カーソル直下のシンボルが定義された箇所へ遷移.
+		|:TsuquyomiSplitDefinition|を参照のこと.
+
+					*(TsuquyomiTypeDefinition)*
+(TsuquyomiTypeDefinition)
+		カーソル直下のシンボルの型定義箇所へ遷移.
+		|:TsuquyomiTypeDefinition|を参照のこと.
+
+						*(TsuquyomiGoBack)*
+(TsuquyomiGoBack)
+		|:TsuquyomiGoBack|を参照のこと.
+
+						*(TsuquyomiImplementation)*
+(TsuquyomiImplementation)
+		カーソル直下のinerfaceが実装されている場所の一覧を表示.
+		|:TsuquyomiImplementation|を参照のこと.
+
+
+						*(TsuquyomiReferences)*
+(TsuquyomiReferences)
+		カーソル直下のシンボルが参照されている場所の一覧を表示.
+		|:TsuquyomiReferences| を参照のこと.
+
+					*(TsuquyomiRenameSymbol)*
+(TsuquyomiRenameSymbol)
+		カーソル直下のシンボルを別名に変更する.
+		|:TsuquyomiRenameSymbol|を参照のこと.
+
+					*(TsuquyomiRenameSymbolC)*
+(TsuquyomiRenameSymbolC)
+		カーソル直下のシンボルをコメントも含めて別名に変更する.
+		|:TsuquyomiRenameSymbolC|を参照のこと.
+
+						*(TsuquyomiQuickFix)*
+(TsuquyomiQuickFix)
+		カーソル直下でQuickFixが適用可能な場合に、これを適用する.
+		|:TsuquyomiQuickFix|を参照のこと.
+
+						*(TsuquyomiImport)*
+(TsuquyomiImport)
+		カーソル直下のシンボルに対応するES6 import文を生成する.
+		|:TsuquyomiImport|を参照のこと.
+
+						*(TsuquyomiSignatureHelp)*
+(TsuquyomiSignatureHelp)
+		カーソル下のメソッド引数のシグネチャを表示.
+		|:TsuquyomiSignatureHelp|を参照のこと.
+
+デフォルトキーマップは下記の通り:
+
+ノーマルモード:
+{lhs}			{rhs}
+--------		-----------------------------
+			(TsuquyomiDefinition)
+]			(TsuquyomiSplitDefinition)
+			(TsuquyomiGoBack)
+			(TsuquyomiReferences)
+
+------------------------------------------------------------------------------
+関数 							*tsuquyomi-functions*
+
+tsuquyomi#complete					*tsuquyomi#complete*
+		'completefunc' や 'omnifunc' オプションに適用可能な関数.
+		デフォルトでは, 'omnifunc' オプションにこの関数をセットしてい
+		る補完の挙動をカスタマイズする場合,
+		|tsuquyomi-examples-complete| を参照の事.
+
+tsuquyomi#balloonexpr	 			*tsuquyomi#balloonexpr*
+		マウスカーソル直下のシンボルについて, ツールチップにシンボルの
+		情報を表示させる.  'balloonexpr' にセットして利用する.
+		設定例:
+>
+		set ballooneval
+		autocmd BufNewFile,BufRead *.ts
+		\ setlocal balloonexpr=tsuquyomi#balloonexpr()
+<
+		Note: この関数はVimが|+balloon_eval| オプション付きでコンパイル
+		      されている場合のみ利用可能である.
+
+tsuquyomi#hint					*tsuquyomi#hint*
+		カーソル上のシンボルの情報を返却する. |tsuquyomi#balloonexpr|
+		と似ているが, この関数はGVim, 端末上のVimのどちらでも動作する.
+
+		設定例:
+>
+		autocmd FileType typescript nmap  t :
+		\ echo tsuquyomi#hint()
+<
+		Note: This function works in not only GVim but also
+		      terminal Vim.
+
+tsuquyomi#getSupportedCodeFixes		 *tsuquyomi#getSupportedCodeFixes*
+		QuickFixが利用可能なコード値のリストを返却する.
+		このリストに属するコードのエラーは|:TsuquyomiQuickFix|により
+		修正可能である.
+
+Todo
+
+==============================================================================
+EXAMPLES					*tsuquyomi-examples*
+
+						*tsuquyomi-examples-complete*
+補完の挙動は 'completeopt' オプションで設定する.
+
+	メソッド呼び出しの補完時, メソッド定義をプレビューウィンドウに表示.
+>
+	autocmd FileType typescript setlocal completeopt+=preview
+<
+	補完時, ポップアップメニューを表示しない.
+>
+	autocmd FileType typescript setlocal completeopt-=menu
+<
+
+						*tsuquyomi-examples-async*
+Vim8 の Job / Channel を利用し非同期でカレントバッファのコンパイルエラー情報を
+QuickFixウィンドウへ表示します.
+
+>
+	autocmd InsertLeave,BufWritePost *.ts,*.tsx call tsuquyomi#asyncGeterr()
+<
+==============================================================================
+vim:tw=78:ts=8:ft=help:norl:noet:fen:
diff --git a/doc/tsuquyomi.txt b/doc/tsuquyomi.txt
new file mode 100644
index 0000000..a2390f1
--- /dev/null
+++ b/doc/tsuquyomi.txt
@@ -0,0 +1,511 @@
+*tsuquyomi* is a Vim plugin for TypeScript.
+
+Version: 0.6.0
+Author : Quramy 
+License: MIT license  {{{
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    "Software"), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Software, and to
+    permit persons to whom the Software is furnished to do so, subject to
+    the following conditions:
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+}}}
+
+CONTENTS 					*tsuquyomi-contents*
+
+Introduction		|tsuquyomi-introduction|
+Install			|tsuquyomi-install|
+Interface		|tsuquyomi-interface|
+  Commands		  |tsuquyomi-commands|
+  Variables		  |tsuquyomi-variables|
+  Key Mappings		  |tsuquyomi-key-mappings|
+  Functions		  |tsuquyomi-functions|
+Examples		|tsuquyomi-examples|
+
+==============================================================================
+INTRODUCTION					*tsuquyomi-introduction*
+
+Tsuquyomi works as a client for TSServer(which is an editor service bundled into TypeScript).
+
+This plugin provides the following functions:
+
++ Functions to fetch information of your source codes from TSServer.
+  (compeletions, locations of definition or references, error, etc...)
+
++ Functions to start or stop the TSServer process.
+
+
+==============================================================================
+INSTALL						*tsuquyomi-install*
+
+Tsuquyomi requires the following:
+* Vim (v.7.4.0 or later)
+* Shougo/vimproc.vim (https://github.com/Shougo/vimproc.vim)
+  (Not required if you use vim8 or later)
+* Node.js and TypeScript (v.1.5.0 or later)
+
+First of all, if you haven't installed |vimproc|, please install it.
+(Please see https://github.com/Shougo/vimproc.vim)
+
+Secondly, install the latest version of TypeScript.
+
+Prompt:
+>
+    	$ npm -g install typescript
+<
+Thirdly, locate Tsuquyomi to your Vim plugin directory.
+If you use |NeoBundle| for plugin management, append the following to `.vimrc` .
+>
+	NeoBundle 'Shougo/vimproc.vim', {
+	\ 'build' : {
+	\     'windows' : 'tools\\update-dll-mingw',
+	\     'cygwin' : 'make -f make_cygwin.mak',
+	\     'mac' : 'make -f make_mac.mak',
+	\     'linux' : 'make',
+	\     'unix' : 'gmake',
+	\    },
+	\ }
+
+	NeoBundle 'Quramy/tsuquyomi'
+>
+And execute the Ex command |:NeoBundleInstall| .
+
+Also, Tsuquyomi is an extension of |unite-outline|.
+If you have installed |unite| and |unite-outline| , you can get the outline of
+the current buffer calling ':Unite outline'.
+
+==============================================================================
+INTERFACE					*tsuquyomi-interface*
+
+
+------------------------------------------------------------------------------
+COMMANDS					*tsuquyomi-commands*
+
+						*:TsuquyomiStartServer*
+						*:TsuStartServer*
+:TsuquyomiStartServer
+		Start TSServer process.
+		If the process is already running, this command doesn't
+		do anything.
+
+						*:TsuquyomiStopServer*
+						*:TsuStopServer*
+:TsuquyomiStopServer
+		Stop TSServer process if it exists.
+
+						*:TsuquyomiStatusServer*
+						*:TsuStatusServer*
+:TsuquyomiStatusServer
+		Show TSServer status.
+		When TSServer is running, the message "reading" will be
+		displayed.
+
+						*:TsuquyomiOpen*
+						*:TsuOpen*
+:TsuquyomiOpen [{file} ...]
+		Let TSServer open {file}s.
+		Once TSServer opens files, you can start a variety of
+		operations on them.
+		If you omit the argument {file}, TSServer opens the current
+		buffer.
+		By default, |g:tsuquyomi_auto_open| is enabled,
+		so usually users don't need to exec this command manually.
+
+						*:TsuquyomiClose*
+						*:TsuClose*
+:TsuquyomiClose [{file} ...]
+		Let TSServer release opened {file}s.
+		If you omit the argument {file}, TSServer closes the file
+		related to the current buffer.
+
+						*:TsuquyomiReload*
+						*:TsuReload*
+:TsuquyomiReload [{file} ...]
+		Let TSServer reload files.
+		If you omit the argument {file}, TSServer reloads the current
+		buffer.
+
+						*:TsuquyomiDump*
+						*:TsuDump*
+:TsuquyomiDump [{file} ...]
+		Save TSServer's buffer to files.
+		This command can be executed only for debugging purposes.
+		If you omit the argument {file}, TSServer saves the file
+		related to the current buffer.
+		Note: Dumped filename is `originalFileName` + `'.dump'` .
+
+						*:TsuquyomiDefinition*
+						*:TsuDefinition*
+:TsuquyomiDefinition
+		Navigate to the location where the symbol is defined.
+
+						*:TsuquyomiSplitDefinition*
+						*:TsuSplitDefinition*
+:TsuquyomiSplitDefinition
+		Split current window in two. Navigate to the location where
+		the symbol is defined.
+
+						*:TsuquyomiTypeDefinition*
+						*:TsuTypeDefinition*
+:TsuquyomiTypeDefinition
+		Navigate to the location where the type of the symbol is
+		defined.
+
+						*:TsuquyomiGoBack*
+						*:TsuGoBack*
+:TsuquyomiGoBack
+		Move the cursor position to the location where
+		the last |:TsuquyomiDefinition| or |:TsuquyomiTypeDefinition|
+		was called.
+
+						*:TsuquyomiImplementation*
+						*:TsuImplementation*
+:TsuquyomiImplementation
+		Navigate to the locations where an interface is implemented.
+		The result is loaded into the |location-list| .
+
+						*:TsuquyomiReferences*
+						*:TsuReferences*
+:TsuquyomiReferences
+		Navigate to the locations where the symbol is referenced.
+		The result is loaded into the |location-list| .
+
+						*:TsuquyomiRenameSymbol*
+						*:TsuRenameSymbol*
+:TsuquyomiRenameSymbol
+		Rename the identifier under the cursor to a new name.
+		If the identifier is referenced by other .ts files,
+		you should open them before executing this command.
+
+						*:TsuquyomiRenameSymbolC*
+						*:TsuRenameSymbolC*
+:TsuquyomiRenameSymbolC
+		Rename the identifier under the cursor to a new name.
+		This command renames the identifiers including comments.
+
+						*:TsuquyomiReloadProject*
+						*:TsuReloadProject*
+:TsuquyomiReloadProject
+		Close and re-open all files opened by |:TsuquyomiOpen|.
+		If you change your `tsconfig.json` after opening any `*.ts` files,
+		you should execute this command so the changes of `tsconfig.json`
+		are reflected in the TSServer.
+
+						*:TsuquyomiGeterr*
+						*:TsuGeterr*
+:TsuquyomiGeterr
+		Show compilation errors of current buffer in QuickFix window.
+
+						*:TsuquyomiAsynGeterr*
+						*:TsuAsyncGeterr*
+:TsuquyomiAsyncGeterr
+		Show compilation errors of current buffer in QuickFix window
+		asynchronous.
+
+						*:TsuquyomiGeterrProject*
+						*:TsuGeterrProject*
+:TsuquyomiGeterrProject
+		Show all compilation errors of your project in QuickFix window.
+		This command requires TypeScript@v1.6.0 or later.
+
+						*:TsuquyomiSeaarch*
+						*:TsuSearch*
+:TsuquyomiSearch {keyword}
+		Search locations which contain {keyword} from project.
+
+						*:TsuquyomiQuickFix*
+						*:TsuQuickFix*
+:TsuquyomiQuickFix
+		If the cursor is over an error and there is a  quick fix is
+		for it, apply it.
+		This command requires TypeScript@v2.1.0 or later.
+
+						*:TsuquyomiSignatureHelp*
+						*:TsuSignatureHelp*
+:TsuquyomiSignatureHelp
+		Display signature help for the method signature the cursor is
+		currently inside, and display the output in the preview
+		window. If there are multiple, overloads they will be
+		displayed along with any documentation.
+		Note that the cursor must be between the method parentheses,
+		or at least after the opening parenthesis of a partially
+		written method call.
+
+------------------------------------------------------------------------------
+VARIABLES					*tsuquyomi-variables*
+
+						*g:tsuquyomi_auto_open*
+g:tsuquyomi_auto_open		(default 1)
+		Whether TSServer automatically opens the file of the current
+		buffer when the buffer is opened in Vim.
+		If you set this option to 0, you should manually exec the
+		|:TsuquyomiOpen| command after opening buffers.
+
+					*g:tsuquyomi_use_local_typescript*
+g:tsuquyomi_use_local_typescript (default 1)
+		Whether to use `tsserver.js`that was installed for project
+		locally.
+		* 0: Tsuquyomi does not search `tsserver.js`.
+		* 1: Tsuquyomi searches the root directory(which has
+		     `package.json`) of the project from the current directory.
+		     Then, it searches
+		     `node_modules/typescript/bin/tsserver.js` from the
+		     project root.
+		     If not hit, Tsuquyomi determines `tsserver.js` path from
+		     |g:tsuquyomi_use_dev_node_module| option.
+
+					*g:tsuquyomi_use_dev_node_module*
+g:tsuquyomi_use_dev_node_module	(default 0)
+		Whether to use `tsserver.js` that was installed manually.
+		* 0: Tsuquyomi uses global installed `tsserver` command(default).
+		* 1: Tsuquyomi uses
+		     `tsuquyomi/node_modules/typescript/bin/tsserver.js` .
+		     If you use this mode, exec the following:
+>
+		     :cd ~/.vim/bundle/tsuquyomi
+		     :!npm install
+<
+		* 2: Tsuquyomi uses `tsserver.js` whose path is
+		     |g:tsuquyomi_tsserver_path| .
+
+						*g:tsuquyomi_tsserver_path*
+g:tsuquyomi_tsserver_path	(default `''`)
+		If |g:tsuquyomi_use_dev_node_module| equals `2`,
+		user should set path of `tsserver.js` to this variable.
+		For example,
+>
+		let g:tsuquyomi_use_dev_node_module = 2
+		let g:tsuquyomi_tsserver_path =
+		\ '~/typescript/built/local/tsserver.js'
+<
+
+						*g:tsuquyomi_nodejs_path*
+g:tsuquyomi_nodejs_path		(default "node")
+		A path to Node.js.
+
+						*g:tsuquyomi_definition_split*
+g:tsuquyomi_definition_split	(default 0)
+		A way to open a target file when navigating with
+		|:TsuquyomiDefinition| or |:TsuquyomiTypeDefinition|.
+		* 0: |:edit|
+		* 1: |:split|
+		* 2: |:vsplit|
+		* 3: |:tabedit|
+
+					*g:tsuquyomi_completion_detail*
+g:tsuquyomi_completion_detail		(default 0)
+		Whether to show details of complete menu when |tsuquyomi#complete|.
+		This option makes sense when 'completeopt' includes "menu".
+		NOTE: If it's set, completions get slow.
+
+					*g:tsuquyomi_completion_case_sensitive*
+g:tsuquyomi_completion_case_sensitive	(default 0)
+		Whether to search completion case-sensitively when
+		|tsuquyomi#complete|.
+
+					*g:tsuquyomi_case_sensitive_imports*
+g:tsuquyomi_case_sensitive_imports	(default 0)
+		Whether to search imports case-sensitively when
+		|tsuquyomi#es6import#complete|.
+
+					*g:tsuquyomi_completion_preview*
+g:tsuquyomi_completion_preview		(default 0)
+		Whether to show signature in preview when |tsuquyomi#complete|.
+		This option makes sense when 'completeopt' includes "menu"
+		and "preview".
+		NOTE: If it's set, completions get a little slow.
+
+						*g:tsuquyomi_disable_default_mappings*
+g:tsuquyomi_disable_default_mappings	(default 0)
+		If set no keys are mapped.
+
+						*g:tsuquyomi_disable_quickfix*
+g:tsuquyomi_disable_quickfix	(default 0)
+		If set, |:TsuquyomiGeterr| isn't called when you save buffers.
+
+						*g:tsuquyomi_save_onrename*
+g:tsuquyomi_save_onrename	(default 0)
+		If set, Tsuquyomi automatically saves files in which symbols
+		are replaced when |:TsuquyomiRenameSymbol| is used.
+		If not set, Tsuquyomi shows replaced files with |:split|.
+		You can save them with |:wa| after your review changes.
+
+						*g:tsuquyomi_single_quote_import*
+g:tsuquyomi_single_quote_import		(default 0)
+		If set, Tsuquyomi generates import blocks using single quotes
+		instead of double quotes when |:TsuquyomiImport|.
+
+						*g:tsuquyomi_semicolon_import*
+g:tsuquyomi_semicolon_import		(default 1)
+		If set, Tsuquyomi generates import block using a semicolon at
+		the end when |:TsuquyomiImport|.
+
+						*g:tsuquyomi_baseurl_import_path*
+g:tsuquyomi_baseurl_import_path		(default 0)
+		If set, |:TsuquyomiImport| will use module paths relative to
+		`baseUrl` setting in tsconfig.json.
+
+						*g:tsuquyomi_javascript_support*
+g:tsuquyomi_javascript_support	(default 0)
+		If set, Tsuquyomi will also be enabled for JavaScript files.
+		You can further configure tsserver's behavior using
+		tsconfig.json or jsconfig.json in your project.
+
+						*g:tsuquyomi_ignore_missing_modules*
+g:tsuquyomi_ignore_missing_modules (default 0)
+		If set, Tsuquyomi will ignore any error that starts with
+		"Cannot find module". Useful when you don't have type
+		definitions for all of your imports.
+
+						*g:tsuquyomi_use_vimproc*
+g:tsuquyomi_use_vimproc (default 0)
+		If set, Tsuquyomi will use |vimproc| instead of vim8 default
+		jobs.
+
+						*g:tsuquyomi_locale*
+g:tsuquyomi_locale (default "en")
+		LCID for deagonistics localization.
+
+------------------------------------------------------------------------------
+KEY MAPPINGS					*tsuquyomi-key-mappings*
+
+Normal mode key mappings.
+
+						*(TsuquyomiDefinition)*
+(TsuquyomiDefinition)
+		Navigate to the location where the symbol under the cursor is
+		defined. See |:TsuquyomiDefinition|.
+
+						*(TsuquyomiSplitDefinition)*
+(TsuquyomiSplitDefinition)
+		Split current window in two. Navigate to the location where
+		the symbol under the cursor is defined. See
+		|:TsuquyomiSplitDefinition|.
+
+						*(TsuquyomiTypeDefinition)*
+(TsuquyomiTypeDefinition)
+		Navigate to the location where the type of the symbol under the
+		cursor is defined. See |:TsuquyomiTypeDefinition|.
+
+(TsuquyomiGoBack)				*(TsuquyomiGoBack)*
+		See |:TsuquyomiGoBack|.
+
+						*(TsuquyomiImplementation)*
+(TsuquyomiImplementation)
+		Show a list of locations where the interface under the cursor is
+		implemented. See |:TsuquyomiImplementation|.
+
+						*(TsuquyomiReferences)*
+(TsuquyomiReferences)
+		Show a list of locations where the symbol under the cursor is
+		referenced. See |:TsuquyomiReferences|.
+
+					*(TsuquyomiRenameSymbol)*
+(TsuquyomiRenameSymbol)
+		Rename the identifier under the cursor to a new name.
+		See |:TsuquyomiRenameSymbol|.
+
+					*(TsuquyomiRenameSymbolC)*
+(TsuquyomiRenameSymbolC)
+		Rename the identifier under the cursor to a new name.
+		See |:TsuquyomiRenameSymbolC|.
+
+						*(TsuquyomiQuickFix)*
+(TsuquyomiQuickFix)
+		Apply quick fix under the cursor if it's available.
+		See |:TsuquyomiQuickFix|.
+
+						*(TsuquyomiImport)*
+(TsuquyomiImport)
+		Generate ES6 import declaration whose alias is under
+		the cursor. See |:TsuquyomiImport|.
+
+						*(TsuquyomiSignatureHelp)*
+(TsuquyomiSignatureHelp)
+		Display signature help for the method arguments under the
+		cursor. See |:TsuquyomiSignatureHelp|.
+
+The following keymappings are default keymappings.
+
+Normal mode default mappings.
+{lhs}			{rhs}
+--------		-----------------------------
+			(TsuquyomiDefinition)
+]			(TsuquyomiSplitDefinition)
+		(TsuquyomiSplitDefinition)
+			(TsuquyomiGoBack)
+			(TsuquyomiReferences)
+
+------------------------------------------------------------------------------
+FUNCTIONS					*tsuquyomi-functions*
+
+tsuquyomi#complete				*tsuquyomi#complete*
+		It's applicable for the 'completefunc' or 'omnifunc' option.
+		By default, Tsuquyomi sets this function to the 'omnifunc'
+		option.
+		If you want to customize completions, see
+		|tsuquyomi-examples-complete|.
+
+tsuquyomi#balloonexpr	 			*tsuquyomi#balloonexpr*
+		Returns information about the symbol under the mouse cursor for
+		tooltip popover window.
+		This is used as the rhs for 'balloonexpr'.
+		For example,
+>
+		set ballooneval
+		autocmd BufNewFile,BufRead *.ts
+		\ setlocal balloonexpr=tsuquyomi#balloonexpr()
+<
+		Note: This function works only if your Vim is compiled with
+		      |+balloon_eval|.
+
+tsuquyomi#hint					*tsuquyomi#hint*
+		Returns information about the symbol under the cursor. This
+		function is similar to |tsuquyomi#balloonexpr|, but
+		works not only in GVim but also in terminal Vim.
+
+		For example,
+>
+		autocmd FileType typescript nmap  t :
+		\ echo tsuquyomi#hint()
+<
+tsuquyomi#getSupportedCodeFixes		 *tsuquyomi#getSupportedCodeFixes*
+		Returns a list of all code quick fixes available.
+		An error whose code is in this list can be fixed via
+		|:TsuquyomiQuickFix| command.
+
+Todo
+
+==============================================================================
+EXAMPLES					*tsuquyomi-examples*
+
+						*tsuquyomi-examples-complete*
+You can configure tsuquyomi completion, using 'completeopt' .
+
+	When completion in call of some method, show the method signature to
+	the preview window.
+>
+	autocmd FileType typescript setlocal completeopt+=preview
+<
+	When completion, don't show the popup menu of completions.
+>
+	autocmd FileType typescript setlocal completeopt-=menu
+<
+Show compile errors to QuickFix window asynchronous by Vim8's Job/Channel
+feature.
+>
+	autocmd InsertLeave,BufWritePost *.ts,*.tsx call tsuquyomi#asyncGeterr()
+<
+==============================================================================
+vim:tw=78:ts=8:ft=help:norl:noet:fen:
diff --git a/ftdetect/typescript.vim b/ftdetect/typescript.vim
new file mode 100644
index 0000000..fd73285
--- /dev/null
+++ b/ftdetect/typescript.vim
@@ -0,0 +1 @@
+autocmd BufNewFile,BufRead *.ts,*.tsx setfiletype typescript
diff --git a/ftplugin/javascript/tsuquyomi.vim b/ftplugin/javascript/tsuquyomi.vim
new file mode 100644
index 0000000..e821515
--- /dev/null
+++ b/ftplugin/javascript/tsuquyomi.vim
@@ -0,0 +1,16 @@
+"============================================================================
+" FILE: ftplugin/javascript.vim
+" AUTHOR: Quramy 
+"============================================================================
+
+scriptencoding utf-8
+
+if !g:tsuquyomi_javascript_support
+  finish
+endif
+
+if !tsuquyomi#config#preconfig()
+  finish
+endif
+
+call tsuquyomi#config#initBuffer({ 'pattern': '*.js,*.jsx' })
diff --git a/ftplugin/typescript/tsuquyomi.vim b/ftplugin/typescript/tsuquyomi.vim
new file mode 100644
index 0000000..47b0f9a
--- /dev/null
+++ b/ftplugin/typescript/tsuquyomi.vim
@@ -0,0 +1,12 @@
+"============================================================================
+" FILE: ftplugin/typescript.vim
+" AUTHOR: Quramy 
+"============================================================================
+
+scriptencoding utf-8
+
+if !tsuquyomi#config#preconfig()
+  finish
+endif
+
+call tsuquyomi#config#initBuffer({ 'pattern': '*.ts,*.tsx' })
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..459a12a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,17 @@
+{
+  "name": "tsuquyomi",
+  "version": "0.7.0",
+  "description": "Vim plugin for typescript",
+  "directories": {
+    "test": "vest"
+  },
+  "repository": "https://github.com/Quramy/tsuquyomi.git",
+  "devDependencies": {
+    "typescript": "~3.0.1"
+  },
+  "scripts": {
+    "test": "bash runtest.sh"
+  },
+  "author": "Quramy",
+  "license": "MIT"
+}
diff --git a/plugin/tsuquyomi.vim b/plugin/tsuquyomi.vim
new file mode 100644
index 0000000..473d96d
--- /dev/null
+++ b/plugin/tsuquyomi.vim
@@ -0,0 +1,94 @@
+"============================================================================
+" FILE: tsuquyomi.vim
+" AUTHOR: Quramy 
+"============================================================================
+
+scriptencoding utf-8
+
+" Preprocessing {{{
+if exists('g:loaded_tsuquyomi')
+  finish
+elseif v:version < 704
+  echoerr 'Tsuquyomi does not work this version of Vim "' . v:version . '".'
+  finish
+endif
+
+let g:loaded_tsuquyomi = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+" Preprocessing }}}
+
+" Global options defintion. {{{
+let g:tsuquyomi_auto_open =
+      \ get(g:, 'tsuquyomi_auto_open', 1)
+let g:tsuquyomi_use_local_typescript =
+      \ get(g:, 'tsuquyomi_use_local_typescript', 1)
+let g:tsuquyomi_use_dev_node_module =
+      \ get(g:, 'tsuquyomi_use_dev_node_module', 0)
+let g:tsuquyomi_tsserver_path =
+      \ get(g:, 'tsuquyomi_tsserver_path', '')
+let g:tsuquyomi_debug = 
+      \ get(g:, 'tsuquyomi_debug', 0)
+let g:tsuquyomi_tsserver_debug = 
+      \ get(g:, 'tsuquyomi_tsserver_debug', 0)
+let g:tsuquyomi_nodejs_path = 
+      \ get(g:, 'tsuquyomi_nodejs_path', 'node')
+let g:tsuquyomi_waittime_after_open = 
+      \ get(g:, 'tsuquyomi_waittime_after_open', str2float("0.01"))
+let g:tsuquyomi_completion_chunk_size = 
+      \ get(g:, 'tsuquyomi_completion_chunk_size', 20)
+let g:tsuquyomi_completion_detail = 
+      \ get(g:, 'tsuquyomi_completion_detail', 0)
+let g:tsuquyomi_completion_case_sensitive = 
+      \ get(g:, 'tsuquyomi_completion_case_sensitive', 0)
+let g:tsuquyomi_case_sensitive_imports =
+      \ get(g:, 'tsuquyomi_case_sensitive_imports', 0)
+let g:tsuquyomi_completion_preview = 
+      \ get(g:, 'tsuquyomi_completion_preview', 0)
+let g:tsuquyomi_definition_split =
+      \ get(g:, 'tsuquyomi_definition_split', 0)
+let g:tsuquyomi_disable_quickfix =
+      \ get(g:, 'tsuquyomi_disable_quickfix', 0)
+let g:tsuquyomi_save_onrename =
+      \ get(g:, 'tsuquyomi_save_onrename', 0)
+let g:tsuquyomi_single_quote_import =
+      \ get(g:, 'tsuquyomi_single_quote_import', 0)
+let g:tsuquyomi_semicolon_import =
+      \ get(g:, 'tsuquyomi_semicolon_import', 1)
+let g:tsuquyomi_import_curly_spacing =
+      \ get(g:, 'tsuquyomi_import_curly_spacing', 1)
+let g:tsuquyomi_javascript_support =
+      \ get(g:, 'tsuquyomi_javascript_support', 0)
+let g:tsuquyomi_ignore_missing_modules =
+      \ get(g:, 'tsuquyomi_ignore_missing_modules', 0)
+let g:tsuquyomi_shortest_import_path = 
+      \ get(g:, 'tsuquyomi_shortest_import_path', 0)
+let g:tsuquyomi_baseurl_import_path = 
+      \ get(g:, 'tsuquyomi_baseurl_import_path', 0)
+let g:tsuquyomi_use_vimproc =
+      \ get(g:, 'tsuquyomi_use_vimproc', 0)
+let g:tsuquyomi_locale =
+      \ get(g:, 'tsuquyomi_locale', 'en')
+let g:tsuquyomi_search_term_min_length =
+      \ get(g:, 'tsuquyomi_search_term_min_length', 3)
+" Global options defintion. }}}
+
+" augroup tsuquyomi_global_command_group
+"   autocmd!
+" augroup END
+
+" Define commands to operate TSServer
+command! TsuquyomiStartServer  : call tsuquyomi#startServer()
+command! TsuStartServer        : call tsuquyomi#startServer()
+command! TsuquyomiStatusServer : echom tsuquyomi#statusServer()
+command! TsuStatusServer       : echom tsuquyomi#statusServer()
+command! TsuquyomiStopServer   : call tsuquyomi#stopServer()
+command! TsuStopServer         : call tsuquyomi#stopServer()
+
+" Close and re-open all buffers
+command! TsuquyomiReloadProject : call tsuquyomi#reloadProject()
+command! TsuReloadProject       : call tsuquyomi#reloadProject()
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/run-one-test.sh b/run-one-test.sh
new file mode 100755
index 0000000..d62d6be
--- /dev/null
+++ b/run-one-test.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+set -xe
+
+if [ "${VERSION}" == "" ]; then
+  VERSION=3.2
+fi
+
+TSSERVER_PATH="$(pwd)/test/node_modules/typescript-${VERSION}/bin/tsserver"
+
+vim -u test/.vimrc \
+  -c 'let g:tsuquyomi_use_local_typescript = 0' \
+  -c 'let g:tsuquyomi_use_dev_node_module = 2' \
+  -c "let g:tsuquyomi_tsserver_path = \"${TSSERVER_PATH}\""  \
+  -c 'call vesting#load()' \
+  -c 'call vesting#init()' \
+  -c "so $1" -c 'echom string(vesting#get_result())'
diff --git a/runtest-all-ts.sh b/runtest-all-ts.sh
new file mode 100755
index 0000000..aad59a6
--- /dev/null
+++ b/runtest-all-ts.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+set -xe
+VERSION=2.0 ./runtest.sh
+VERSION=2.1 ./runtest.sh
+VERSION=2.2 ./runtest.sh
+VERSION=2.3 ./runtest.sh
+VERSION=2.4 ./runtest.sh
+VERSION=2.5 ./runtest.sh
+VERSION=2.6 ./runtest.sh
+VERSION=2.7 ./runtest.sh
+VERSION=2.8 ./runtest.sh
+VERSION=2.9 ./runtest.sh
+VERSION=3.0 ./runtest.sh
+VERSION=3.1 ./runtest.sh
+VERSION=3.2 ./runtest.sh
diff --git a/runtest.sh b/runtest.sh
new file mode 100755
index 0000000..747dcec
--- /dev/null
+++ b/runtest.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+VIMRC_FILE="test/.vimrc"
+DRIVER_FILE="test/_runner"
+RESULT_FILE="test/test_result.log"
+VIM_BUILD=1
+VIM_INSTALL_DIR=`pwd`/local
+if [ "${VERSION}" == "" ]; then
+  VERSION=3.2
+fi
+TSSERVER_PATH="$(pwd)/test/node_modules/typescript-${VERSION}/bin/tsserver"
+
+echo "Run test with ${TSSERVER_PATH}"
+
+if [ "${VIM_BUILD}" -eq 1 ]; then
+  echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Use local Vim."
+  if [ ! -d "./local" ]; then
+    echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Installing Vim"
+    if [ ! -d "./vim" ]; then
+      echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Clonning Vim source from Github"
+      git clone --depth 1 https://github.com/vim/vim.git
+    fi
+    cd vim
+    ./configure --prefix=${VIM_INSTALL_DIR}
+    if [ ! $? -eq 0 ]; then
+      exit $?
+    fi
+    make
+    if [ ! $? -eq 0 ]; then
+      exit $?
+    fi
+    make install
+    if [ ! $? -eq 0 ]; then
+      exit $?
+    fi
+    echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Vim was created successfully."
+    cd ..
+  fi
+  VIM_CMD="${VIM_INSTALL_DIR}/bin/vim"
+else
+  echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Use system Vim."
+  VIM_CMD="vim"
+fi
+
+${VIM_CMD} --version
+
+if [ ! -d "./neobundle.vim" ]; then
+  echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Installing neobundle"
+  git clone --depth 1 https://github.com/Shougo/neobundle.vim
+fi
+
+if [ "${HIDE_VIM}" == "" ]; then
+  ${VIM_CMD} -u ${VIMRC_FILE} -c NeoBundleInstall -c q
+else
+  ${VIM_CMD} -u ${VIMRC_FILE} -c NeoBundleInstall -c q > /dev/null
+fi
+
+if [ -f "${RESULT_FILE}" ]; then
+  rm ${RESULT_FILE}
+fi
+
+echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Run vesting."
+# In CI, displaying Vim UI is meaningless and it makes CI logs dirty.
+# So hide Vim UI.
+if [ "${HIDE_VIM}" == "" ]; then
+  ${VIM_CMD} \
+    -c 'let g:tsuquyomi_use_local_typescript = 0' \
+    -c 'let g:tsuquyomi_use_dev_node_module = 2' \
+    -c "let g:tsuquyomi_tsserver_path = \"${TSSERVER_PATH}\""  \
+    -u ${VIMRC_FILE} \
+    -s ${DRIVER_FILE}
+else
+  ${VIM_CMD} \
+    -c 'let g:tsuquyomi_use_local_typescript = 0' \
+    -c 'let g:tsuquyomi_use_dev_node_module = 2' \
+    -c "let g:tsuquyomi_tsserver_path = \"${TSSERVER_PATH}\""  \
+    -u ${VIMRC_FILE} \
+    -s ${DRIVER_FILE} > /dev/null
+fi
+if [ $? -ne 0 ]; then
+  echo "Vim exited with non-zero status."
+  exit 1
+fi
+echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Done."
+echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Result: (${RESULT_FILE})"
+cat ${RESULT_FILE}
+
+grep -E "\[Fail\]" ${RESULT_FILE} > /dev/null
+
+if [ $? -eq 0 ]; then
+  echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Test was failed."
+  exit 1
+fi
+
+grep -E "\[Error\]" ${RESULT_FILE} > /dev/null
+
+if [ $? -eq 0 ]; then
+  echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Test was failed."
+  exit 1
+fi
+
+echo "`date "+[%Y-%m-%dT%H:%M:%S]"` Test was succeeded."
+exit 0
+
diff --git a/screen.gif b/screen.gif
new file mode 100644
index 0000000000000000000000000000000000000000..9609cda719a3b301936f6c3917d1a9d30d47692b
GIT binary patch
literal 400001
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%0DbABT}N
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 *YVsFpB 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 z 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 nUp-mcSmP0C=9vy5bQEubh_oV_aK +"============================================================================ + +" Preprocessing {{{ +scriptencoding utf-8 +if exists('g:loaded_syntastic_tsuquyomi_syntax_checker') + finish +endif + +let g:loaded_syntastic_tsuquyomi_syntax_checker = 1 +let s:save_cpo = &cpo +set cpo&vim +" Preprocessing }}} + +function! SyntaxCheckers_typescript_tsuquyomi_IsAvailable() dict abort + return 1 +endfunction + +function! SyntaxCheckers_typescript_tsuquyomi_GetLocList() dict abort + let quickfix_list = tsuquyomi#createFixlist() + for qf in quickfix_list + let qf.valid = 1 + let qf.bufnr = bufnr('%') + endfor + return quickfix_list +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'typescript', + \ 'name': 'tsuquyomi' + \ }) + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/test/.vimrc b/test/.vimrc new file mode 100644 index 0000000..7fccc74 --- /dev/null +++ b/test/.vimrc @@ -0,0 +1,27 @@ + +set nocompatible +let s:basedir = expand(':p:h').'/../' + +execute('set runtimepath+='.s:basedir) +execute('set runtimepath+='.s:basedir.'neobundle.vim') +call neobundle#begin(expand(s:basedir.'bundle')) + +NeoBundle 'Shougo/unite.vim' +NeoBundle 'Shougo/vesting' + +NeoBundle 'Shougo/vimproc.vim', { + \ 'build' : { + \ 'windows' : 'tools\\update-dll-mingw', + \ 'cygwin' : 'make -f make_cygwin.mak', + \ 'mac' : 'make -f make_mac.mak', + \ 'linux' : 'make', + \ 'unix' : 'gmake', + \ }, + \ } + +call neobundle#end() + +let g:tsuquyomi_use_dev_node_module = 1 +source plugin/tsuquyomi.vim + + diff --git a/test/_runner b/test/_runner new file mode 100644 index 0000000..6aa78c4 --- /dev/null +++ b/test/_runner @@ -0,0 +1,29 @@ +:Unite vesting:./test/tsClient +* +:call unite#action#do('start') +k +ygg +:winc j +p +:%s/\n\s*\[OK\].*\s/+/g +:%s/\s\+/ /g +:%s/^\s\+\[Vest\]/[Vest]/g +:w! test/test_result.log +gg +dG +:winc k +q +q +:Unite vesting:./test/es6import +* +:call unite#action#do('start') +k +ygg +:winc j +p +:%s/\n\s*\[OK\].*\s/+/g +:%s/\s\+/ /g +:%s/^\s\+\[Vest\]/[Vest]/g +:w! >> test/test_result.log +:quitall! +vim:ft=vim diff --git a/test/es6import/vest/checkExternalModule.spec.vim b/test/es6import/vest/checkExternalModule.spec.vim new file mode 100644 index 0000000..8ac51ea --- /dev/null +++ b/test/es6import/vest/checkExternalModule.spec.vim @@ -0,0 +1,46 @@ +scriptencoding utf-8 + +let s:V = vital#of('tsuquyomi') +let s:Filepath = s:V.import('System.Filepath') +let s:script_dir = s:Filepath.join(tsuquyomi#rootDir(), 'test/es6import/vest') + +" FIXME +" Context tsuquyomi#es6import#checkExternalModule(moduleName, file, no_use_cache) +" let s:input_file = s:Filepath.join(s:script_dir, 'resources/variousModules.d.ts') +" +" It returns 0 when the file does not have the given module +" call tsuquyomi#tsClient#tsOpen(s:input_file) +" let code = tsuquyomi#es6import#checkExternalModule('__NO_MODULE__', s:input_file, 1) +" Should code == 0 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns 1 when the file has single-quated module +" call tsuquyomi#tsClient#tsOpen(s:input_file) +" let code = tsuquyomi#es6import#checkExternalModule('external-module', s:input_file, 1) +" Should code == 1 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns 1 when the file has a double-quated module +" call tsuquyomi#tsClient#tsOpen(s:input_file) +" let code = tsuquyomi#es6import#checkExternalModule('external-module/alt', s:input_file, 1) +" Should code == 1 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns 0 when the file has a namespace +" call tsuquyomi#tsClient#tsOpen(s:input_file) +" let code = tsuquyomi#es6import#checkExternalModule('NS', s:input_file, 1) +" Should code == 0 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns 0 when the file has an internal module +" call tsuquyomi#tsClient#tsOpen(s:input_file) +" let code = tsuquyomi#es6import#checkExternalModule('InternalModule', s:input_file, 1) +" Should code == 0 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" End diff --git a/test/es6import/vest/getImportDeclarations.spec.vim b/test/es6import/vest/getImportDeclarations.spec.vim new file mode 100644 index 0000000..7338ead --- /dev/null +++ b/test/es6import/vest/getImportDeclarations.spec.vim @@ -0,0 +1,125 @@ +scriptencoding utf-8 + +let s:V = vital#of('tsuquyomi') +let s:Filepath = s:V.import('System.Filepath') +let s:script_dir = s:Filepath.join(tsuquyomi#rootDir(), 'test/es6import/vest') + +" FIXME +" Context tsuquyomi#es6import#getImportDeclarations(file) +" let s:resource_dir = s:Filepath.join(s:script_dir, 'resources/importDecPatterns') +" +" " It returns 'no_nav_bar' reason when input files is empty +" " let s:file = s:Filepath.join(s:resource_dir, 'empty.ts') +" " call tsuquyomi#tsClient#tsOpen(s:file) +" " let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" " Should reason ==# 'no_module_info' +" " call tsuquyomi#tsClient#stopTssSync() +" " End +" +" " It returns 'no_module_info' reason and position info when input file doesn't have aliases +" " let s:file = s:Filepath.join(s:resource_dir, 'noDec.ts') +" " call tsuquyomi#tsClient#tsOpen(s:file) +" " let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" " Should reason ==# 'no_module_info' +" " Should position.start.line == 1 +" " Should position.end.line == 3 +" " call tsuquyomi#tsClient#stopTssSync() +" " End +" +" It returns position when input file has import declaration and other declarations +" let s:file = s:Filepath.join(s:resource_dir, 'decAndOther.ts') +" call tsuquyomi#tsClient#tsOpen(s:file) +" let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" Should reason ==# '' +" Should position.start.line == 1 +" Should position.end.line == 1 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns position when input file has import declaration and expression +" let s:file = s:Filepath.join(s:resource_dir, 'decAndFunction.ts') +" call tsuquyomi#tsClient#tsOpen(s:file) +" let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" Should reason ==# '' +" Should position.start.line == 1 +" Should position.end.line == 1 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns declaration_info list +" let s:file = s:Filepath.join(s:resource_dir, 'simple.ts') +" call tsuquyomi#tsClient#tsOpen(s:file) +" let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" Should reason ==# '' +" Should position.start.line == 1 +" Should position.end.line == 1 +" Should len(result_list) == 1 +" Should result_list[0].is_oneliner == 1 +" Should result_list[0].module.name ==# './some-module' +" Should result_list[0].module.start.line == 1 +" Should result_list[0].module.end.line == 1 +" Should result_list[0].has_brace == 1 +" Should result_list[0].brace.end.line == 1 +" Should result_list[0].brace.end.offset == 18 +" Should result_list[0].has_from == 1 +" Should result_list[0].from_span.start.offset == 20 +" Should result_list[0].from_span.start.line == 1 +" Should result_list[0].from_span.end.offset == 23 +" Should result_list[0].from_span.end.line == 1 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns a info whose 'is_oneliner' is 0 when input declaration contains multipule lines +" let s:file = s:Filepath.join(s:resource_dir, 'multiline.ts') +" call tsuquyomi#tsClient#tsOpen(s:file) +" let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" Should reason ==# '' +" Should position.start.line == 1 +" Should position.end.line == 7 +" Should result_list[0].is_oneliner == 0 +" Should result_list[0].module.start.line == 7 +" Should result_list[0].module.end.line == 7 +" Should result_list[0].has_brace == 1 +" Should result_list[0].brace.end.line == 3 +" Should result_list[0].brace.end.offset == 13 +" Should result_list[0].has_from == 1 +" Should result_list[0].from_span.start.offset == 1 +" Should result_list[0].from_span.start.line == 5 +" Should result_list[0].from_span.end.offset == 4 +" Should result_list[0].from_span.end.line == 5 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns the list whoes has multiple module infos when input declaration contains multiple aliases in one module +" let s:file = s:Filepath.join(s:resource_dir, 'multiAlias.ts') +" call tsuquyomi#tsClient#tsOpen(s:file) +" let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" Should len(result_list) == 2 +" Should result_list[0].alias_info.text ==# 'altVar' +" Should result_list[1].alias_info.text ==# 'someVar' +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns the list whoes has multiple module infos when input has 2 declaration +" let s:file = s:Filepath.join(s:resource_dir, 'multiDec.ts') +" call tsuquyomi#tsClient#tsOpen(s:file) +" let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" Should len(result_list) == 2 +" Should result_list[0].alias_info.text ==# 'altVar' +" Should result_list[1].alias_info.text ==# 'someVar' +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" It returns explict alias info when declarations use 'as' keyword +" let s:file = s:Filepath.join(s:resource_dir, 'explictAlias.ts') +" call tsuquyomi#tsClient#tsOpen(s:file) +" let [result_list, position, reason] = tsuquyomi#es6import#getImportDeclarations(s:file, readfile(s:file)) +" Should len(result_list) == 2 +" Should result_list[0].alias_info.text ==# '$var' +" Should result_list[0].has_brace == 0 +" Should result_list[1].alias_info.text ==# '_var' +" Should result_list[1].has_brace == 1 +" call tsuquyomi#tsClient#stopTssSync() +" End +" +" End diff --git a/test/es6import/vest/resources/importDecPatterns/decAndFunction.ts b/test/es6import/vest/resources/importDecPatterns/decAndFunction.ts new file mode 100644 index 0000000..86f6186 --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/decAndFunction.ts @@ -0,0 +1,2 @@ +import {someVar} from './some-module'; +document.getElementById('myApp'); diff --git a/test/es6import/vest/resources/importDecPatterns/decAndOther.ts b/test/es6import/vest/resources/importDecPatterns/decAndOther.ts new file mode 100644 index 0000000..7b17c00 --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/decAndOther.ts @@ -0,0 +1,4 @@ +import { someVar } from './some-module'; +class Hoge { + private hoge: string; +} diff --git a/test/es6import/vest/resources/importDecPatterns/empty.ts b/test/es6import/vest/resources/importDecPatterns/empty.ts new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/empty.ts @@ -0,0 +1 @@ + diff --git a/test/es6import/vest/resources/importDecPatterns/explictAlias.ts b/test/es6import/vest/resources/importDecPatterns/explictAlias.ts new file mode 100644 index 0000000..d3188e8 --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/explictAlias.ts @@ -0,0 +1,2 @@ +import { someVar as _var } from './some-module'; +import * as $var from './some-module'; diff --git a/test/es6import/vest/resources/importDecPatterns/multiAlias.ts b/test/es6import/vest/resources/importDecPatterns/multiAlias.ts new file mode 100644 index 0000000..c5e30ab --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/multiAlias.ts @@ -0,0 +1,4 @@ +import { + someVar, + altVar +} from './some-module'; diff --git a/test/es6import/vest/resources/importDecPatterns/multiDec.ts b/test/es6import/vest/resources/importDecPatterns/multiDec.ts new file mode 100644 index 0000000..51f796a --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/multiDec.ts @@ -0,0 +1,2 @@ +import { someVar } from './some-module'; +import { altVar } from './some-module'; diff --git a/test/es6import/vest/resources/importDecPatterns/multiline.ts b/test/es6import/vest/resources/importDecPatterns/multiline.ts new file mode 100644 index 0000000..346034d --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/multiline.ts @@ -0,0 +1,7 @@ +import { + someVar + } + +from + +'./some-module'; diff --git a/test/es6import/vest/resources/importDecPatterns/noDec.ts b/test/es6import/vest/resources/importDecPatterns/noDec.ts new file mode 100644 index 0000000..f876f51 --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/noDec.ts @@ -0,0 +1,5 @@ +/// + +"use strict"; +class TestClass { +} diff --git a/test/es6import/vest/resources/importDecPatterns/simple.ts b/test/es6import/vest/resources/importDecPatterns/simple.ts new file mode 100644 index 0000000..393fc71 --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/simple.ts @@ -0,0 +1 @@ +import { someVar } from './some-module'; diff --git a/test/es6import/vest/resources/importDecPatterns/some-module.ts b/test/es6import/vest/resources/importDecPatterns/some-module.ts new file mode 100644 index 0000000..11bbaf5 --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/some-module.ts @@ -0,0 +1,2 @@ +export var someVar: any = null; +export var altVar: any = null; diff --git a/test/es6import/vest/resources/importDecPatterns/tsconfig.json b/test/es6import/vest/resources/importDecPatterns/tsconfig.json new file mode 100644 index 0000000..b1a3a00 --- /dev/null +++ b/test/es6import/vest/resources/importDecPatterns/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "noImplicitAny": false, + "sourceMap": false + }, + "files": [ + "decAndFunction.ts", + "decAndOther.ts", + "empty.ts", + "explictAlias.ts", + "multiAlias.ts", + "multiline.ts", + "noDec.ts", + "simple.ts", + "some-module.ts" + ] +} diff --git a/test/es6import/vest/resources/variousModules.d.ts b/test/es6import/vest/resources/variousModules.d.ts new file mode 100644 index 0000000..dd9ec4b --- /dev/null +++ b/test/es6import/vest/resources/variousModules.d.ts @@ -0,0 +1,19 @@ +declare namespace NS { + namespace nestedNS { + } +} + +declare namespace NS.nestedNS { +} + +declare module InternalModule { +} + +declare module InternalModule.SubModule { +} + +declare module 'external-module' { +} + +declare module "external-module/alt" { +} diff --git a/test/package.json b/test/package.json new file mode 100644 index 0000000..904bc21 --- /dev/null +++ b/test/package.json @@ -0,0 +1,22 @@ +{ + "name": "tsuquyomi-test", + "version": "0.0.0", + "description": "package.json file for testing tsuquyomi", + "main": "index.js", + "license": "MIT", + "dependencies": { + "typescript-2.0": "npm:typescript@2.0", + "typescript-2.1": "npm:typescript@2.1", + "typescript-2.2": "npm:typescript@2.2", + "typescript-2.3": "npm:typescript@2.3", + "typescript-2.4": "npm:typescript@2.4", + "typescript-2.5": "npm:typescript@2.5", + "typescript-2.6": "npm:typescript@2.6", + "typescript-2.7": "npm:typescript@2.7", + "typescript-2.8": "npm:typescript@2.8", + "typescript-2.9": "npm:typescript@2.9", + "typescript-3.0": "npm:typescript@3.0", + "typescript-3.1": "npm:typescript@3.1", + "typescript-3.2": "npm:typescript@3.2" + } +} diff --git a/test/tsClient/vest/resources/SimpleModule.ts b/test/tsClient/vest/resources/SimpleModule.ts new file mode 100644 index 0000000..c28a36a --- /dev/null +++ b/test/tsClient/vest/resources/SimpleModule.ts @@ -0,0 +1,24 @@ +module SimpleModule { + export interface Runnable { + run: ()=> any; + } + export class MyClass implements Runnable{ + name: string; + greeting: string; + constructor (options?: {name?: string; priority?: number}) { + } + say (): string { + return this.greeting; + } + run () { + this.say() + } + } + + var myObj = new MyClass(); + + export function main (): void { + myObj.say(); + return; + } +} diff --git a/test/tsClient/vest/resources/SimpleModule_writing.ts b/test/tsClient/vest/resources/SimpleModule_writing.ts new file mode 100644 index 0000000..1cd373d --- /dev/null +++ b/test/tsClient/vest/resources/SimpleModule_writing.ts @@ -0,0 +1,24 @@ +module SimpleModule { + export interface Runnable { + run: ()=> any; + } + export class MyClass implements Runnable{ + name: string; + greeting: string; + constructor (options?: {name?: string; priority?: number}) { + } + say (): string { + return this.greeting; + } + run () { + this.say() + } + } + + var myObj = new MyClass(); + myObj.s + export function main (): void { + myObj.say(); + return; + } +} diff --git a/test/tsClient/vest/resources/codeFixTest.ts b/test/tsClient/vest/resources/codeFixTest.ts new file mode 100644 index 0000000..cbb97b2 --- /dev/null +++ b/test/tsClient/vest/resources/codeFixTest.ts @@ -0,0 +1,8 @@ +class Hoge { + constructor() { } +} + +class Foo extends Hoge { + constructor() { + } +} diff --git a/test/tsClient/vest/resources/definitionTest.ts b/test/tsClient/vest/resources/definitionTest.ts new file mode 100644 index 0000000..6d04b00 --- /dev/null +++ b/test/tsClient/vest/resources/definitionTest.ts @@ -0,0 +1,3 @@ +class App { } +var app = new App(); + diff --git a/test/tsClient/vest/resources/referencesTestA.ts b/test/tsClient/vest/resources/referencesTestA.ts new file mode 100644 index 0000000..cbd7b0c --- /dev/null +++ b/test/tsClient/vest/resources/referencesTestA.ts @@ -0,0 +1,7 @@ +module ReferenceTest { + export class SomeClass { + } + + export class OtherClass extends SomeClass{ + } +} diff --git a/test/tsClient/vest/resources/referencesTestB.ts b/test/tsClient/vest/resources/referencesTestB.ts new file mode 100644 index 0000000..94d6a35 --- /dev/null +++ b/test/tsClient/vest/resources/referencesTestB.ts @@ -0,0 +1,6 @@ +/// + +module ReferenceTest { + export class AnotherClass extends SomeClass{ + } +} diff --git a/test/tsClient/vest/resources/renameTest.ts b/test/tsClient/vest/resources/renameTest.ts new file mode 100644 index 0000000..15c77e9 --- /dev/null +++ b/test/tsClient/vest/resources/renameTest.ts @@ -0,0 +1,20 @@ +module Test { + + var hoge = 1, foo = hoge; + var x = hoge; + + /** + * + * @param bar An argument + * + **/ + var someFunc = (bar: string) => { }; + + var otherFunc = () => { + var prefix; + console.log(' prefix '); + console.log(" prefix "); + console.log(` prefix `); + } + +} diff --git a/test/tsClient/vest/resources/samplePrjs/errorPrj/main.ts b/test/tsClient/vest/resources/samplePrjs/errorPrj/main.ts new file mode 100644 index 0000000..b657ed2 --- /dev/null +++ b/test/tsClient/vest/resources/samplePrjs/errorPrj/main.ts @@ -0,0 +1,5 @@ +interface Hoge { + id: any; + // syntaxerror + foo: { +} diff --git a/test/tsClient/vest/resources/samplePrjs/errorPrj/sub.ts b/test/tsClient/vest/resources/samplePrjs/errorPrj/sub.ts new file mode 100644 index 0000000..6c9e568 --- /dev/null +++ b/test/tsClient/vest/resources/samplePrjs/errorPrj/sub.ts @@ -0,0 +1 @@ +class Foo extends InvalidBaseClass {} diff --git a/test/tsClient/vest/resources/samplePrjs/errorPrj/tsconfig.json b/test/tsClient/vest/resources/samplePrjs/errorPrj/tsconfig.json new file mode 100644 index 0000000..de784c3 --- /dev/null +++ b/test/tsClient/vest/resources/samplePrjs/errorPrj/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "noImplicitAny": true, + "module": "commonjs" + }, + "files": ["main.ts", "sub.ts"] +} diff --git a/test/tsClient/vest/resources/samplePrjs/prj001/main.ts b/test/tsClient/vest/resources/samplePrjs/prj001/main.ts new file mode 100644 index 0000000..07f084a --- /dev/null +++ b/test/tsClient/vest/resources/samplePrjs/prj001/main.ts @@ -0,0 +1,5 @@ +module main { + interface IBase {} + + class BaseClazz implements IBase {} +} diff --git a/test/tsClient/vest/resources/samplePrjs/prj001/tsconfig.json b/test/tsClient/vest/resources/samplePrjs/prj001/tsconfig.json new file mode 100644 index 0000000..a5d3029 --- /dev/null +++ b/test/tsClient/vest/resources/samplePrjs/prj001/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "noImplicitAny": true + }, + "files": ["main.ts"] +} diff --git a/test/tsClient/vest/resources/signatureHelpTest_overload.ts b/test/tsClient/vest/resources/signatureHelpTest_overload.ts new file mode 100644 index 0000000..2c711c8 --- /dev/null +++ b/test/tsClient/vest/resources/signatureHelpTest_overload.ts @@ -0,0 +1,10 @@ + +module SignatureHelpTest { + function add (a:number, b:number): number; + function add (a:string, b:string): string; + function add (a:any, b:any): any { + return a + b; + } + + var sum = add(1, +} diff --git a/test/tsClient/vest/resources/signatureHelpTest_writing.ts b/test/tsClient/vest/resources/signatureHelpTest_writing.ts new file mode 100644 index 0000000..83c8e07 --- /dev/null +++ b/test/tsClient/vest/resources/signatureHelpTest_writing.ts @@ -0,0 +1,20 @@ +module SignatureHelpTest { + export class Calc { + /** + * + * An add method. + * It's is useful for calc. + * @param a A operand. + * It is the first operand. + * @param b Another operand. + * @returns Summation of a and b. + * + **/ + add(a: number, b: number): number { + return a + b; + } + } + + var calc = new Calc(); + calc.add( +} diff --git a/test/tsClient/vest/sendCommand.spec.vim b/test/tsClient/vest/sendCommand.spec.vim new file mode 100644 index 0000000..e0e2295 --- /dev/null +++ b/test/tsClient/vest/sendCommand.spec.vim @@ -0,0 +1,24 @@ + +scriptencoding utf-8 + +Context Vesting.run() + + It checks to sendCommandOneWay successfully + Should tsuquyomi#tsClient#sendCommandOneWay('open', {'file': 'myApp.ts'}) == [] + call tsuquyomi#tsClient#stopTssSync() + End + + It checks to sendCommandSyncResponse successfully + let res_list = tsuquyomi#tsClient#sendCommandSyncResponse('completions', {}) + Should len(res_list) == 1 + call tsuquyomi#tsClient#stopTssSync() + End + + It checks to sendCommandSyncResponse successfully + let res_list = tsuquyomi#tsClient#sendCommandSyncEvents('geterr', {'files': ['hoge'], 'delay': 50}, str2float("0.01"), 0) + Should len(res_list) == 0 + call tsuquyomi#tsClient#stopTssSync() + End + +End +Fin diff --git a/test/tsClient/vest/sendRequest.spec.vim b/test/tsClient/vest/sendRequest.spec.vim new file mode 100644 index 0000000..7d91017 --- /dev/null +++ b/test/tsClient/vest/sendRequest.spec.vim @@ -0,0 +1,10 @@ +scriptencoding utf-8 + +Context Vesting.run() + It checks to sendRequest successfully + let res = tsuquyomi#tsClient#sendRequest('{"command": "open", "arguments": { "file": "test/resrouces/SimpleModule.ts"}}', str2float("0.01"), 0, 0) + Should res == [] + call tsuquyomi#tsClient#stopTssSync() + End +End +Fin diff --git a/test/tsClient/vest/startTss.spec.vim b/test/tsClient/vest/startTss.spec.vim new file mode 100644 index 0000000..baae6ba --- /dev/null +++ b/test/tsClient/vest/startTss.spec.vim @@ -0,0 +1,19 @@ +scriptencoding utf-8 + +Context Vesting.run() + + It checks TSServer's status after startTss. + call tsuquyomi#tsClient#startTss() + Should tsuquyomi#tsClient#statusTss() == 'run' + call tsuquyomi#tsClient#stopTssSync() + End + + It checks TSServer's status after stopTssSync + call tsuquyomi#tsClient#startTss() + call tsuquyomi#tsClient#startTss() + call tsuquyomi#tsClient#stopTssSync() + Should tsuquyomi#tsClient#statusTss() == 'dead' + End + +End +Fin diff --git a/test/tsClient/vest/tsCompletionEntryDetails.spec.vim b/test/tsClient/vest/tsCompletionEntryDetails.spec.vim new file mode 100644 index 0000000..051ace8 --- /dev/null +++ b/test/tsClient/vest/tsCompletionEntryDetails.spec.vim @@ -0,0 +1,28 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + + It checks interface of responce of 'completionEntryDetails' command. + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule_writing.ts') + call tsuquyomi#tsClient#tsOpen(file) + let res_list = tsuquyomi#tsClient#tsCompletionEntryDetails(file, 19, 9, ['say', 'greeting']) + Should len(res_list) == 2 + + let display_texts = [] + for result in res_list + let display = '' + for part in result.displayParts + let display = display.part.text + endfor + call add(display_texts, display) + endfor + Should display_texts[0] == '(method) SimpleModule.MyClass.say(): string' + Should display_texts[1] == '(property) SimpleModule.MyClass.greeting: string' + call tsuquyomi#tsClient#stopTssSync() + End +End +Fin diff --git a/test/tsClient/vest/tsCompletions.spec.vim b/test/tsClient/vest/tsCompletions.spec.vim new file mode 100644 index 0000000..2830502 --- /dev/null +++ b/test/tsClient/vest/tsCompletions.spec.vim @@ -0,0 +1,27 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + + It checks interface of responce of 'completions' command. + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule.ts') + call tsuquyomi#tsClient#tsOpen(file) + let res_list = tsuquyomi#tsClient#tsCompletions(file, 17, 0, 'setT') + Should len(res_list) == 1 + Should res_list[0].name == 'setTimeout' + call tsuquyomi#tsClient#stopTssSync() + End + + It checks interface of responce of 'completions' command with non-existing keyword. + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule.ts') + call tsuquyomi#tsClient#tsOpen(file) + let res_list = tsuquyomi#tsClient#tsCompletions(file, 11, 0, 'NO_EXSIT_KEYWORD_XXXXXXX') + Should len(res_list) == 0 + call tsuquyomi#tsClient#stopTssSync() + End + +End +Fin diff --git a/test/tsClient/vest/tsDefinition.spec.vim b/test/tsClient/vest/tsDefinition.spec.vim new file mode 100644 index 0000000..cda9ec4 --- /dev/null +++ b/test/tsClient/vest/tsDefinition.spec.vim @@ -0,0 +1,32 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let b:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:result = [] + + It checks interface of responce of 'definition' command. + let file = b:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/definitionTest.ts') + call tsuquyomi#tsClient#tsOpen(file) + let b:result= tsuquyomi#tsClient#tsDefinition(file, 2, 15) + Should len(b:result) == 1 + Should b:Filepath.basename(b:result[0].file) == 'definitionTest.ts' + Should has_key(b:result[0], 'start') != 0 + Should has_key(b:result[0].start, 'line') + Should has_key(b:result[0].start, 'offset') != 0 + Should has_key(b:result[0], 'end') != 0 + Should has_key(b:result[0].end, 'line') != 0 + Should has_key(b:result[0].end, 'offset') != 0 + call tsuquyomi#tsClient#stopTssSync() + End + + It checkes no definition at no symbol + let file = b:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/definitionTest.ts') + call tsuquyomi#tsClient#tsOpen(file) + let b:result = tsuquyomi#tsClient#tsDefinition(file, 3, 1) + Should b:result == [] + End +End +Fin diff --git a/test/tsClient/vest/tsGetCodeFixes.vim b/test/tsClient/vest/tsGetCodeFixes.vim new file mode 100644 index 0000000..75f2f87 --- /dev/null +++ b/test/tsClient/vest/tsGetCodeFixes.vim @@ -0,0 +1,28 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of responce of 'getSupportedCodeFixes' command. + if s:ver.major == 2 && s:ver.minor == 0 + echo "This test is pending on TypeScript 2.0. Please fix this test case!" + else + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/codeFixTest.ts') + call tsuquyomi#tsClient#tsOpen(file) + let result_list = tsuquyomi#tsClient#tsGetCodeFixes(file, 6, 5, 6, 5, [2377]) + " echo result_list + Should len(result_list) + Should has_key(result_list[0], 'changes') + Should len(result_list[0].changes) + Should has_key(result_list[0].changes[0], 'textChanges') + Should len(result_list[0].changes[0].textChanges) + Should result_list[0].changes[0].textChanges[0].newText =~ 'super();' + call tsuquyomi#tsClient#stopTssSync() + endif + End +End +Fin diff --git a/test/tsClient/vest/tsGetSupportedCodeFixes.vim b/test/tsClient/vest/tsGetSupportedCodeFixes.vim new file mode 100644 index 0000000..b1c2aa5 --- /dev/null +++ b/test/tsClient/vest/tsGetSupportedCodeFixes.vim @@ -0,0 +1,23 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of responce of 'getSupportedCodeFixes' command. + if s:ver.major == 2 && s:ver.minor == 0 + echo "This test is pending on TypeScript 2.0. Please fix this test case!" + else + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule_writing.ts') + call tsuquyomi#tsClient#tsOpen(file) + let result_list = tsuquyomi#tsClient#tsGetSupportedCodeFixes() + Should len(result_list) + call tsuquyomi#tsClient#stopTssSync() + endif + End +End +Fin + diff --git a/test/tsClient/vest/tsGeterr.spec.vim b/test/tsClient/vest/tsGeterr.spec.vim new file mode 100644 index 0000000..f3027d5 --- /dev/null +++ b/test/tsClient/vest/tsGeterr.spec.vim @@ -0,0 +1,36 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of responce of 'geterr' command. + if s:ver.major == 2 && s:ver.minor < 8 + echo "This test is pending in between TypeScript 2.0 and 2.7. Please fix this test case!" + else + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule_writing.ts') + call tsuquyomi#tsClient#tsOpen(file) + let files = [file] + let result_list = tsuquyomi#tsClient#tsGeterr(files, 10) + Should len(result_list) == 3 + let semanticDiagDict = filter(copy(result_list), 'v:val.event == "semanticDiag"')[0].body + let syntaxDiagDict = filter(copy(result_list), 'v:val.event == "syntaxDiag"')[0].body + Should has_key(semanticDiagDict, 'diagnostics') + Should has_key(semanticDiagDict, 'file') + Should len(semanticDiagDict.diagnostics) > 0 + Should has_key(semanticDiagDict.diagnostics[0], 'text') + Should has_key(semanticDiagDict.diagnostics[0], 'start') + Should has_key(semanticDiagDict.diagnostics[0].start, 'line') + Should has_key(semanticDiagDict.diagnostics[0].start, 'offset') + Should has_key(semanticDiagDict.diagnostics[0], 'end') + Should has_key(semanticDiagDict.diagnostics[0].end, 'line') + Should has_key(semanticDiagDict.diagnostics[0].end, 'offset') + call tsuquyomi#tsClient#stopTssSync() + endif + End +End +Fin + diff --git a/test/tsClient/vest/tsGeterrForProject.spec.vim b/test/tsClient/vest/tsGeterrForProject.spec.vim new file mode 100644 index 0000000..86d01ca --- /dev/null +++ b/test/tsClient/vest/tsGeterrForProject.spec.vim @@ -0,0 +1,26 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of responce of 'geterr' command. + if (s:ver.major == 2 && s:ver.minor < 8) || + \ (s:ver.major == 3 && s:ver.minor == 2) + echo "This test is pending in between TypeScript 2.0 and 2.7, or 3.2. Please fix this test case!" + else + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/samplePrjs/errorPrj/main.ts') + let sub_file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/samplePrjs/errorPrj/sub.ts') + call tsuquyomi#tsClient#tsOpen(file) + let result_list = tsuquyomi#tsClient#tsGeterrForProject(file, 10, 2) + Should len(result_list) == 6 + Should sort(map(copy(result_list), 'v:val.body.file')) == [file, file, file, sub_file, sub_file, sub_file] + call tsuquyomi#tsClient#stopTssSync() + endif + End +End +Fin + diff --git a/test/tsClient/vest/tsNavBar.spec.vim b/test/tsClient/vest/tsNavBar.spec.vim new file mode 100644 index 0000000..650641d --- /dev/null +++ b/test/tsClient/vest/tsNavBar.spec.vim @@ -0,0 +1,38 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of responce of 'navbar' command. + if s:ver.major == 3 && s:ver.minor == 2 + echo "This test is pending on TypeScript 3.2. Please fix this test case!" + else + let file = substitute(s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule.ts'), '\\', '/', 'g') + call tsuquyomi#tsClient#tsOpen(file) + let res_list = tsuquyomi#tsClient#tsNavBar(file) + " echo res_list + Should len(res_list) > 0 + Should has_key(res_list[1], 'text') + Should res_list[1].text == 'SimpleModule' + Should has_key(res_list[1], 'kind') + Should res_list[1].kind == 'module' + Should has_key(res_list[1], 'kindModifiers') + Should has_key(res_list[1], 'spans') + Should len(res_list[1].spans) > 0 + Should has_key(res_list[1].spans[0], 'start') + Should has_key(res_list[1].spans[0].start, 'line') + Should has_key(res_list[1].spans[0].start, 'offset') + Should has_key(res_list[1].spans[0], 'end') + Should has_key(res_list[1].spans[0].end, 'line') + Should has_key(res_list[1].spans[0].end, 'offset') + Should has_key(res_list[1], 'childItems') + Should len(res_list[1].childItems) > 0 + call tsuquyomi#tsClient#stopTssSync() + endif + End +End +Fin diff --git a/test/tsClient/vest/tsNavto.spec.vim b/test/tsClient/vest/tsNavto.spec.vim new file mode 100644 index 0000000..c13cd5e --- /dev/null +++ b/test/tsClient/vest/tsNavto.spec.vim @@ -0,0 +1,30 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of responce of 'navbar' command. + if s:ver.major == 3 && s:ver.minor == 2 + echo "This test is pending on TypeScript 3.2. Please fix this test case!" + else + let file = substitute(s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule.ts'), '\\', '/', 'g') + call tsuquyomi#tsClient#tsOpen(file) + let res_list = tsuquyomi#tsClient#tsNavto(file, 'encodeURIComponent', 100) + " echo res_list + Should len(res_list) > 0 + Should has_key(res_list[0], 'file') + Should has_key(res_list[0], 'name') + Should res_list[0].name == 'encodeURIComponent' + Should has_key(res_list[0], 'kind') + Should res_list[0].kind == 'function' + Should has_key(res_list[0], 'matchKind') + Should res_list[0].matchKind == 'exact' + call tsuquyomi#tsClient#stopTssSync() + endif + End +End +Fin diff --git a/test/tsClient/vest/tsProjectInfo.spec.vim b/test/tsClient/vest/tsProjectInfo.spec.vim new file mode 100644 index 0000000..9d494bc --- /dev/null +++ b/test/tsClient/vest/tsProjectInfo.spec.vim @@ -0,0 +1,24 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of response of 'projectInfo' command + if s:ver.major == 3 && s:ver.minor == 2 + echo "This test is pending on TypeScript 3.2. Please fix this test case!" + else + let file = substitute(s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/samplePrjs/prj001/main.ts'), '\\', '/', 'g') + call tsuquyomi#tsClient#tsOpen(file) + let res_projectInfo_dict = tsuquyomi#tsClient#tsProjectInfo(file, 1) + Should has_key(res_projectInfo_dict, 'configFileName') + Should has_key(res_projectInfo_dict, 'fileNames') + call tsuquyomi#tsClient#stopTssSync() + endif + End + +End +Fin diff --git a/test/tsClient/vest/tsQuickinfo.spec.vim b/test/tsClient/vest/tsQuickinfo.spec.vim new file mode 100644 index 0000000..ffd5a55 --- /dev/null +++ b/test/tsClient/vest/tsQuickinfo.spec.vim @@ -0,0 +1,26 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + + It checks interface of responce of 'quickinfo' command. + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule.ts') + call tsuquyomi#tsClient#tsOpen(file) + let res_dict = tsuquyomi#tsClient#tsQuickinfo(file, 14, 13) + Should has_key(res_dict, 'start') + Should has_key(res_dict.start, 'line') + Should has_key(res_dict.start, 'offset') + Should has_key(res_dict, 'end') + Should has_key(res_dict.end, 'line') + Should has_key(res_dict.end, 'offset') + Should has_key(res_dict, 'displayString') + Should has_key(res_dict, 'kind') + Should has_key(res_dict, 'kindModifiers') + Should res_dict.displayString == '(method) SimpleModule.MyClass.say(): string' + call tsuquyomi#tsClient#stopTssSync() + End +End +Fin diff --git a/test/tsClient/vest/tsReferences.spec.vim b/test/tsClient/vest/tsReferences.spec.vim new file mode 100644 index 0000000..a2d4da9 --- /dev/null +++ b/test/tsClient/vest/tsReferences.spec.vim @@ -0,0 +1,56 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + + It checks interface of responce of 'references' command. + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/referencesTestA.ts') + call tsuquyomi#tsClient#tsOpen(file) + let res_reference_list = tsuquyomi#tsClient#tsReferences(file, 2, 16) + Should has_key(res_reference_list, 'refs') + " res_reference_list.refs contains self definition. + Should len(res_reference_list.refs) == 2 + Should has_key(res_reference_list.refs[0], 'file') + Should has_key(res_reference_list.refs[0], 'isWriteAccess') + Should has_key(res_reference_list.refs[0], 'lineText') + Should has_key(res_reference_list.refs[0], 'start') + Should has_key(res_reference_list.refs[0].start, 'line') + Should has_key(res_reference_list.refs[0].start, 'offset') + Should has_key(res_reference_list.refs[0], 'end') + Should has_key(res_reference_list.refs[0].end, 'line') + Should has_key(res_reference_list.refs[0].end, 'offset') + Should has_key(res_reference_list, 'symbolName') + Should res_reference_list.symbolName == 'SomeClass' + Should has_key(res_reference_list, 'symbolDisplayString') + call tsuquyomi#tsClient#stopTssSync() + End + + It checks the reference from other files + let fileA = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/referencesTestA.ts') + let fileB = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/referencesTestB.ts') + call tsuquyomi#tsClient#tsOpen(fileA) + call tsuquyomi#tsClient#tsOpen(fileB) + let res_reference_list = tsuquyomi#tsClient#tsReferences(fileA, 2, 16) + Should has_key(res_reference_list, 'refs') + " res_reference_list.refs contains self definition , fileA reference and fileB reference. + Should len(res_reference_list.refs) == 3 + Should has_key(res_reference_list.refs[0], 'file') + Should has_key(res_reference_list.refs[0], 'isWriteAccess') + Should has_key(res_reference_list.refs[0], 'lineText') + Should has_key(res_reference_list.refs[0], 'start') + Should has_key(res_reference_list.refs[0].start, 'line') + Should has_key(res_reference_list.refs[0].start, 'offset') + Should has_key(res_reference_list.refs[0], 'end') + Should has_key(res_reference_list.refs[0].end, 'line') + Should has_key(res_reference_list.refs[0].end, 'offset') + Should has_key(res_reference_list, 'symbolName') + Should res_reference_list.symbolName == 'SomeClass' + Should has_key(res_reference_list, 'symbolDisplayString') + call tsuquyomi#tsClient#stopTssSync() + End +End +Fin + diff --git a/test/tsClient/vest/tsReload.spec.vim b/test/tsClient/vest/tsReload.spec.vim new file mode 100644 index 0000000..5849c65 --- /dev/null +++ b/test/tsClient/vest/tsReload.spec.vim @@ -0,0 +1,22 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of responce of 'reload' command. + if v:true + echo 'this test fails with all TypeScript versions. Please fix this test!' + else + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule.ts') + call tsuquyomi#tsClient#tsOpen(file) + Should tsuquyomi#tsClient#tsReload(file, file) == 1 + call tsuquyomi#tsClient#stopTssSync() + endif + End + End +Fin + diff --git a/test/tsClient/vest/tsRename.spec.vim b/test/tsClient/vest/tsRename.spec.vim new file mode 100644 index 0000000..e498e2a --- /dev/null +++ b/test/tsClient/vest/tsRename.spec.vim @@ -0,0 +1,98 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + let s:ver = tsuquyomi#config#getVersion() + + It checks interface of responce of 'rename' command. + if s:ver.major == 3 + echo "This test is pending in between TypeScript 3. Please fix this test case!" + else + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/SimpleModule.ts') + call tsuquyomi#tsClient#tsOpen(file) + let result_rename_dict = tsuquyomi#tsClient#tsRename(file, 5, 16, 0, 0) + Should has_key(result_rename_dict, 'info') + Should has_key(result_rename_dict.info, 'canRename') + Should has_key(result_rename_dict.info, 'displayName') + Should result_rename_dict.info.displayName == 'MyClass' + Should has_key(result_rename_dict.info, 'fullDisplayName') + Should has_key(result_rename_dict.info, 'kind') + Should result_rename_dict.info.kind == 'class' + Should has_key(result_rename_dict.info, 'triggerSpan') + Should has_key(result_rename_dict.info.triggerSpan, 'start') + Should has_key(result_rename_dict.info.triggerSpan, 'length') + Should has_key(result_rename_dict, 'locs') + Should len(result_rename_dict.locs) == 1 + Should has_key(result_rename_dict.locs[0], 'file') + Should result_rename_dict.locs[0].file != 'test/tsClient/vest/resources/SimpleModule.ts' + Should stridx(result_rename_dict.locs[0].file, 'test/tsClient/vest/resources/SimpleModule.ts') + Should has_key(result_rename_dict.locs[0], 'locs') + Should len(result_rename_dict.locs[0].locs) == 2 + Should has_key(result_rename_dict.locs[0].locs[0], 'start') + Should has_key(result_rename_dict.locs[0].locs[0].start, 'line') + Should has_key(result_rename_dict.locs[0].locs[0].start, 'offset') + Should has_key(result_rename_dict.locs[0].locs[0], 'end') + Should has_key(result_rename_dict.locs[0].locs[0].end, 'line') + Should has_key(result_rename_dict.locs[0].locs[0].end, 'offset') + call tsuquyomi#tsClient#stopTssSync() + endif + End + + It checks rename command within symbol occurred across multiple files. + let fileA = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/referencesTestA.ts') + let fileB = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/referencesTestB.ts') + call tsuquyomi#tsClient#tsOpen(fileA) + call tsuquyomi#tsClient#tsOpen(fileB) + let result_rename_dict = tsuquyomi#tsClient#tsRename(fileA, 2, 16, 0, 0) + + Should len(result_rename_dict.locs) == 2 + Should stridx(result_rename_dict.locs[0].file, 'test/tsClient/vest/resources/referencesTestA.ts') + Should stridx(result_rename_dict.locs[1].file, 'test/tsClient/vest/resources/referencesTestB.ts') + + call tsuquyomi#tsClient#stopTssSync() + End + + It can rename when a line has two symbols. Should to that the result is sorted by reverse order. + if s:ver.major == 3 + echo "This test is pending in between TypeScript 3. Please fix this test case!" + else + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/renameTest.ts') + call tsuquyomi#tsClient#tsOpen(file) + let result_rename_dict = tsuquyomi#tsClient#tsRename(file, 3, 9, 0, 0) + Should len(result_rename_dict.locs[0].locs) == 3 + Should result_rename_dict.locs[0].locs[0].start.line == 4 + Should result_rename_dict.locs[0].locs[0].start.offset == 13 + Should result_rename_dict.locs[0].locs[1].start.line == 3 + Should result_rename_dict.locs[0].locs[1].start.offset == 25 + Should result_rename_dict.locs[0].locs[2].start.line == 3 + Should result_rename_dict.locs[0].locs[2].start.offset == 9 + call tsuquyomi#tsClient#stopTssSync() + endif + End + + It can rename variables in comments. + if (s:ver.major == 2 && (s:ver.minor == 4 || s:ver.minor == 5)) || + \ (s:ver.major == 3) + echo "This test is pending in between TypeScript 2.4 and 2.5, or TypeScript 3. Please fix this test case!" + else + let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/renameTest.ts') + call tsuquyomi#tsClient#tsOpen(file) + let result_rename_dict = tsuquyomi#tsClient#tsRename(file, 11, 21, 1, 0) + Should len(result_rename_dict.locs[0].locs) == 2 + Should result_rename_dict.locs[0].locs[1].start.line == 8 + Should result_rename_dict.locs[0].locs[1].start.offset == 15 + endif + End + + " It can rename identifiers in strings. + " let file = s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/renameTest.ts') + " call tsuquyomi#tsClient#tsOpen(file) + " let result_rename_dict = tsuquyomi#tsClient#tsRename(file, 14, 13, 0, 1) + " Should len(result_rename_dict.locs[0].locs) == 4 + " End + +End +Fin diff --git a/test/tsClient/vest/tsSignatureHelp.spec.vim b/test/tsClient/vest/tsSignatureHelp.spec.vim new file mode 100644 index 0000000..7ab542b --- /dev/null +++ b/test/tsClient/vest/tsSignatureHelp.spec.vim @@ -0,0 +1,70 @@ +scriptencoding utf-8 + +Context Vesting.run() + + let s:V = vital#of('tsuquyomi') + let s:Filepath = s:V.import('System.Filepath') + let s:script_dir = tsuquyomi#rootDir() + + It checks interface of responce of 'signatureHelp' command. + let file = substitute(s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/signatureHelpTest_writing.ts'), '\\', '/', 'g') + "echo l:file + call tsuquyomi#tsClient#tsOpen(file) + let res_signatureHelp_dict = tsuquyomi#tsClient#tsSignatureHelp(file, 19, 12) + "echo res_signatureHelp_dict + Should has_key(res_signatureHelp_dict, 'selectedItemIndex') + Should has_key(res_signatureHelp_dict, 'argumentCount') + Should has_key(res_signatureHelp_dict, 'argumentIndex') + Should has_key(res_signatureHelp_dict, 'applicableSpan') + Should has_key(res_signatureHelp_dict.applicableSpan, 'start') + Should has_key(res_signatureHelp_dict.applicableSpan.start, 'line') + Should has_key(res_signatureHelp_dict.applicableSpan.start, 'offset') + Should has_key(res_signatureHelp_dict.applicableSpan, 'end') + Should has_key(res_signatureHelp_dict.applicableSpan.end, 'line') + Should has_key(res_signatureHelp_dict.applicableSpan.end, 'offset') + Should has_key(res_signatureHelp_dict, 'items') + Should len(res_signatureHelp_dict.items) + Should has_key(res_signatureHelp_dict.items[0], 'separatorDisplayParts') + Should len(res_signatureHelp_dict.items[0].separatorDisplayParts) + Should has_key(res_signatureHelp_dict.items[0].separatorDisplayParts[0], 'kind') + Should has_key(res_signatureHelp_dict.items[0].separatorDisplayParts[0], 'text') + Should has_key(res_signatureHelp_dict.items[0], 'parameters') + Should len(res_signatureHelp_dict.items[0].parameters) + Should has_key(res_signatureHelp_dict.items[0].parameters[0], 'isOptional') + Should has_key(res_signatureHelp_dict.items[0].parameters[0], 'name') + Should res_signatureHelp_dict.items[0].parameters[0].name == 'a' + Should has_key(res_signatureHelp_dict.items[0].parameters[0], 'documentation') + Should len(res_signatureHelp_dict.items[0].parameters[0].documentation) + Should has_key(res_signatureHelp_dict.items[0].parameters[0].documentation[0], 'kind') + Should has_key(res_signatureHelp_dict.items[0].parameters[0].documentation[0], 'text') + Should res_signatureHelp_dict.items[0].parameters[0].documentation[0].text =~ 'A operand.' + Should has_key(res_signatureHelp_dict.items[0].parameters[0], 'displayParts') + Should len(res_signatureHelp_dict.items[0].parameters[0].displayParts) + Should has_key(res_signatureHelp_dict.items[0].parameters[0].displayParts[0], 'kind') + Should has_key(res_signatureHelp_dict.items[0].parameters[0].displayParts[0], 'text') + Should has_key(res_signatureHelp_dict.items[0], 'prefixDisplayParts') + Should len(res_signatureHelp_dict.items[0].prefixDisplayParts) + Should has_key(res_signatureHelp_dict.items[0].prefixDisplayParts[0], 'kind') + Should has_key(res_signatureHelp_dict.items[0].prefixDisplayParts[0], 'text') + Should has_key(res_signatureHelp_dict.items[0], 'suffixDisplayParts') + Should has_key(res_signatureHelp_dict.items[0].suffixDisplayParts[0], 'kind') + Should has_key(res_signatureHelp_dict.items[0].suffixDisplayParts[0], 'text') + Should has_key(res_signatureHelp_dict.items[0], 'documentation') + Should len(res_signatureHelp_dict.items[0].documentation) + Should has_key(res_signatureHelp_dict.items[0].documentation[0], 'kind') + Should has_key(res_signatureHelp_dict.items[0].documentation[0], 'text') + call tsuquyomi#tsClient#stopTssSync() + End + + It returns two items when the method is overridden. + let file = substitute(s:Filepath.join(s:script_dir, 'test/tsClient/vest/resources/signatureHelpTest_overload.ts'), '\\', '/', 'g') + "echo l:file + call tsuquyomi#tsClient#tsOpen(file) + let res_signatureHelp_dict = tsuquyomi#tsClient#tsSignatureHelp(file, 9, 19) + "echo res_signatureHelp_dict + Should len(res_signatureHelp_dict.items) == 2 + call tsuquyomi#tsClient#stopTssSync() + End +End +Fin + diff --git a/test/yarn.lock b/test/yarn.lock new file mode 100644 index 0000000..77c7927 --- /dev/null +++ b/test/yarn.lock @@ -0,0 +1,68 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"typescript-2.0@npm:typescript@2.0": + version "2.0.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.0.10.tgz#ccdd4ed86fd5550a407101a0814012e1b3fac3dd" + integrity sha1-zN1O2G/VVQpAcQGggUAS4bP6w90= + +"typescript-2.1@npm:typescript@2.1": + version "2.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.6.tgz#40c7e6e9e5da7961b7718b55505f9cac9487a607" + integrity sha1-QMfm6eXaeWG3cYtVUF+crJSHpgc= + +"typescript-2.2@npm:typescript@2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.2.2.tgz#606022508479b55ffa368b58fee963a03dfd7b0c" + integrity sha1-YGAiUIR5tV/6NotY/uljoD39eww= + +"typescript-2.3@npm:typescript@2.3": + version "2.3.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.4.tgz#3d38321828231e434f287514959c37a82b629f42" + integrity sha1-PTgyGCgjHkNPKHUUlZw3qCtin0I= + +"typescript-2.4@npm:typescript@2.4": + version "2.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.2.tgz#f8395f85d459276067c988aa41837a8f82870844" + integrity sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ= + +"typescript-2.5@npm:typescript@2.5": + version "2.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" + integrity sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w== + +"typescript-2.6@npm:typescript@2.6": + version "2.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" + integrity sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q= + +"typescript-2.7@npm:typescript@2.7": + version "2.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" + integrity sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw== + +"typescript-2.8@npm:typescript@2.8": + version "2.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.4.tgz#0b1db68e6bdfb0b767fa2ab642136a35b059b199" + integrity sha512-IIU5cN1mR5J3z9jjdESJbnxikTrEz3lzAw/D0Tf45jHpBp55nY31UkUvmVHoffCfKHTqJs3fCLPDxknQTTFegQ== + +"typescript-2.9@npm:typescript@2.9": + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== + +"typescript-3.0@npm:typescript@3.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" + integrity sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg== + +"typescript-3.1@npm:typescript@3.1": + version "3.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" + integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== + +"typescript-3.2@npm:typescript@3.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz#fe8101c46aa123f8353523ebdcf5730c2ae493e5" + integrity sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg== diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..e9d1036 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +typescript@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb"