From d041897a0813d8de4bde18b242355a5514e324bf Mon Sep 17 00:00:00 2001 From: zjhmale Date: Sun, 21 May 2017 22:49:42 +0800 Subject: [PATCH] Fixes #112 --- src/analysis/common.js | 7 ++-- src/controller.js | 17 ++++++---- src/idris/commands.js | 16 +++++---- src/maybe.js | 42 ++++++++++++++++++++++++ src/providers/ipkg/completionProvider.js | 7 ++-- 5 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 src/maybe.js diff --git a/src/analysis/common.js b/src/analysis/common.js index 681e56f..7d654f6 100644 --- a/src/analysis/common.js +++ b/src/analysis/common.js @@ -2,6 +2,7 @@ const fs = require("fs") const glob = require("glob") const _ = require('lodash') const vscode = require('vscode') +const Maybe = require('../maybe.js') const idrisKeywords = [ "if", @@ -206,8 +207,10 @@ let getAllFiles = (ext) => { return file.endsWith(`.${ext}`) }) } else { - let uri = vscode.window.activeTextEditor.document.uri.fsPath - return uri.endsWith(ext) ? [uri] : [] + return Maybe.of(vscode.window.activeTextEditor) + .map((editor) => { return editor.document.uri.fsPath }) + .map((uri) => { return uri.endsWith(ext) ? [uri] : [] }) + .getOrElse([]) } } diff --git a/src/controller.js b/src/controller.js index 4e86c4f..cb9adce 100644 --- a/src/controller.js +++ b/src/controller.js @@ -5,6 +5,7 @@ const vscode = require('vscode') const fs = require('fs') const cp = require('child_process') const path = require('path') +const Maybe = require('./maybe') const IDRIS_MODE = [ { language: 'idris', scheme: 'file' }, @@ -71,13 +72,15 @@ let reInitialize = () => { } let withCompilerOptions = (callback) => { - let document = vscode.window.activeTextEditor.document - if (!IDRIS_MODE.map((mode) => { return mode.language }).includes(document.languageId)) return - let uri = document.uri.fsPath - - getCompilerOptsPromise().subscribe((compilerOptions) => { - commands.initialize(compilerOptions) - callback(uri) + Maybe.of(vscode.window.activeTextEditor).map((editor) => { + let document = editor.document + if (!IDRIS_MODE.map((mode) => { return mode.language }).includes(document.languageId)) return + let uri = document.uri.fsPath + + getCompilerOptsPromise().subscribe((compilerOptions) => { + commands.initialize(compilerOptions) + callback(uri) + }) }) } diff --git a/src/idris/commands.js b/src/idris/commands.js index e2c2dd4..f12ff60 100644 --- a/src/idris/commands.js +++ b/src/idris/commands.js @@ -6,6 +6,7 @@ const common = require('../analysis/common') const findDefinition = require('../analysis/find-definition') const Rx = require('rx-lite') const path = require('path') +const Maybe = require('../maybe') let model = null let checkNotTotalModel = null @@ -102,13 +103,16 @@ let getWord = () => { * Get the column of the first character of a concrete line of code */ let getStartColumn = (line) => { - if (line >= vscode.window.activeTextEditor.document.lineCount) - return 0 + return Maybe.of(vscode.window.activeTextEditor).map((editor) => { + let document = editor.document - let document = vscode.window.activeTextEditor.document - let textAtLine = document.lineAt(line).text - let column = textAtLine.indexOf(textAtLine.trim()) - return column + if (line >= document.lineCount) + return 0 + + let textAtLine = document.lineAt(line).text + let column = textAtLine.indexOf(textAtLine.trim()) + return column + }).getOrElse(0) } let clearTotalityDiagnostics = () => { diff --git a/src/maybe.js b/src/maybe.js new file mode 100644 index 0000000..22e02f0 --- /dev/null +++ b/src/maybe.js @@ -0,0 +1,42 @@ +//http://jrsinclair.com/articles/2016/marvellously-mysterious-javascript-maybe-monad/ + +var Maybe = module.exports = function (val) { + this.__value = val +} + +Maybe.of = function (val) { + return new Maybe(val) +} + +Maybe.prototype.isNothing = function () { + return (this.__value === null || this.__value === undefined) +} + +Maybe.prototype.map = function (f) { + if (this.isNothing()) { + return Maybe.of(null) + } + return Maybe.of(f(this.__value)) +} + +Maybe.prototype.foreach = function (f) { + if (!this.isNothing()) { + f(this.__value) + } +} + +Maybe.prototype.orElse = function (d) { + if (this.isNothing()) { + return Maybe.of(d) + } + + return this +} + +Maybe.prototype.getOrElse = function (d) { + if (this.isNothing()) { + return d + } + + return this.__value +} diff --git a/src/providers/ipkg/completionProvider.js b/src/providers/ipkg/completionProvider.js index d50afb7..ecb84e3 100644 --- a/src/providers/ipkg/completionProvider.js +++ b/src/providers/ipkg/completionProvider.js @@ -1,12 +1,15 @@ const common = require('../../analysis/common') const completionUtil = require('../completionUtil') const vscode = require('vscode') +const Maybe = require('../../maybe') let identList let buildCompletionList = () => { - let uri = vscode.window.activeTextEditor.document.uri.fsPath - identList = common.getIdents(uri) + Maybe.of(vscode.window.activeTextEditor).map((editor) => { + let uri = editor.document.uri.fsPath + identList = common.getIdents(uri) + }) } let IPKGCompletionProvider = (function () {