1
1
// src/extension.ts
2
+ import * as which from 'which'
2
3
import * as vscode from 'vscode'
3
4
4
5
import FortranLintingProvider from './features/linter-provider'
5
6
import FortranHoverProvider from './features/hover-provider'
6
7
import { FortranCompletionProvider } from './features/completion-provider'
7
8
import { FortranDocumentSymbolProvider } from './features/document-symbol-provider'
8
9
9
- import { FORTRAN_FREE_FORM_ID , EXTENSION_ID } from './lib/helper '
10
- import { FortranLangServer , checkForLangServer } from './lang-server '
10
+ import { FortranLangServer } from './lang-server '
11
+ import { FORTRAN_DOCUMENT_SELECTOR , EXTENSION_ID , promptForMissingTool } from './lib/helper '
11
12
import { LoggingService } from './services/logging-service'
12
13
import * as pkg from '../package.json'
14
+ import { LANG_SERVER_TOOL_ID } from './lib/tools'
13
15
14
16
export function activate ( context : vscode . ExtensionContext ) {
15
17
const loggingService = new LoggingService ( )
@@ -21,15 +23,16 @@ export function activate(context: vscode.ExtensionContext) {
21
23
if ( extensionConfig . get ( 'linterEnabled' , true ) ) {
22
24
let linter = new FortranLintingProvider ( loggingService )
23
25
linter . activate ( context . subscriptions )
24
- vscode . languages . registerCodeActionsProvider ( FORTRAN_FREE_FORM_ID , linter )
26
+ vscode . languages . registerCodeActionsProvider ( FORTRAN_DOCUMENT_SELECTOR , linter )
27
+ loggingService . logInfo ( 'Linter is enabled' )
25
28
} else {
26
29
loggingService . logInfo ( 'Linter is not enabled' )
27
30
}
28
31
29
32
if ( extensionConfig . get ( 'provideCompletion' , true ) ) {
30
33
let completionProvider = new FortranCompletionProvider ( loggingService )
31
34
vscode . languages . registerCompletionItemProvider (
32
- FORTRAN_FREE_FORM_ID ,
35
+ FORTRAN_DOCUMENT_SELECTOR ,
33
36
completionProvider
34
37
)
35
38
} else {
@@ -38,22 +41,46 @@ export function activate(context: vscode.ExtensionContext) {
38
41
39
42
if ( extensionConfig . get ( 'provideHover' , true ) ) {
40
43
let hoverProvider = new FortranHoverProvider ( loggingService )
41
- vscode . languages . registerHoverProvider ( FORTRAN_FREE_FORM_ID , hoverProvider )
44
+ vscode . languages . registerHoverProvider ( FORTRAN_DOCUMENT_SELECTOR , hoverProvider )
45
+ loggingService . logInfo ( 'Hover Provider is enabled' )
42
46
} else {
43
47
loggingService . logInfo ( 'Hover Provider is not enabled' )
44
48
}
45
49
46
50
if ( extensionConfig . get ( 'provideSymbols' , true ) ) {
47
51
let symbolProvider = new FortranDocumentSymbolProvider ( )
48
52
vscode . languages . registerDocumentSymbolProvider (
49
- FORTRAN_FREE_FORM_ID ,
53
+ FORTRAN_DOCUMENT_SELECTOR ,
50
54
symbolProvider
51
55
)
56
+ loggingService . logInfo ( 'Symbol Provider is enabled' )
52
57
} else {
53
58
loggingService . logInfo ( 'Symbol Provider is not enabled' )
54
59
}
55
60
56
- if ( checkForLangServer ( extensionConfig ) ) {
61
+ // Check if the language server is installed and if not prompt to install it
62
+ if ( ! which . sync ( 'fortls' , { nothrow : true } ) ) {
63
+ let msg = `It is highly recommended to use the fortran-language-server to
64
+ enable hover, peeking, gotos and many more.
65
+ For a full list of features the language server adds see:
66
+ https://github.com/hansec/fortran-language-server` ;
67
+ promptForMissingTool ( LANG_SERVER_TOOL_ID , msg , 'Python' , loggingService ) ;
68
+ }
69
+
70
+ // Check that Fortran Intellisense is installed and if not prompt to install
71
+ if ( ! vscode . extensions . getExtension ( 'hansec.fortran-ls' ) ) {
72
+ let msg = `It is highly recommended to install the Fortran IntelliSense
73
+ extension. The extension is used to interface with the
74
+ fortran-language-server.
75
+ For a full list of features provided by the extension see:
76
+ https://github.com/hansec/vscode-fortran-ls` ;
77
+ promptForMissingTool ( 'hansec.fortran-ls' , msg , 'VSExt' , loggingService ) ;
78
+ }
79
+
80
+ // Our interface with `fortls` has been disabled in favour of the @hansec's
81
+ // VS Code extension Fortran IntelliSense
82
+ const useInternalFLInterface = false ;
83
+ if ( useInternalFLInterface ) {
57
84
const langServer = new FortranLangServer ( context , extensionConfig )
58
85
langServer . start ( )
59
86
langServer . onReady ( ) . then ( ( ) => {
0 commit comments