11// src/extension.ts
2+ import * as which from 'which'
23import * as vscode from 'vscode'
34
45import FortranLintingProvider from './features/linter-provider'
56import FortranHoverProvider from './features/hover-provider'
67import { FortranCompletionProvider } from './features/completion-provider'
78import { FortranDocumentSymbolProvider } from './features/document-symbol-provider'
89
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 '
1112import { LoggingService } from './services/logging-service'
1213import * as pkg from '../package.json'
14+ import { LANG_SERVER_TOOL_ID } from './lib/tools'
1315
1416export function activate ( context : vscode . ExtensionContext ) {
1517 const loggingService = new LoggingService ( )
@@ -21,15 +23,16 @@ export function activate(context: vscode.ExtensionContext) {
2123 if ( extensionConfig . get ( 'linterEnabled' , true ) ) {
2224 let linter = new FortranLintingProvider ( loggingService )
2325 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' )
2528 } else {
2629 loggingService . logInfo ( 'Linter is not enabled' )
2730 }
2831
2932 if ( extensionConfig . get ( 'provideCompletion' , true ) ) {
3033 let completionProvider = new FortranCompletionProvider ( loggingService )
3134 vscode . languages . registerCompletionItemProvider (
32- FORTRAN_FREE_FORM_ID ,
35+ FORTRAN_DOCUMENT_SELECTOR ,
3336 completionProvider
3437 )
3538 } else {
@@ -38,22 +41,46 @@ export function activate(context: vscode.ExtensionContext) {
3841
3942 if ( extensionConfig . get ( 'provideHover' , true ) ) {
4043 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' )
4246 } else {
4347 loggingService . logInfo ( 'Hover Provider is not enabled' )
4448 }
4549
4650 if ( extensionConfig . get ( 'provideSymbols' , true ) ) {
4751 let symbolProvider = new FortranDocumentSymbolProvider ( )
4852 vscode . languages . registerDocumentSymbolProvider (
49- FORTRAN_FREE_FORM_ID ,
53+ FORTRAN_DOCUMENT_SELECTOR ,
5054 symbolProvider
5155 )
56+ loggingService . logInfo ( 'Symbol Provider is enabled' )
5257 } else {
5358 loggingService . logInfo ( 'Symbol Provider is not enabled' )
5459 }
5560
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 ) {
5784 const langServer = new FortranLangServer ( context , extensionConfig )
5885 langServer . start ( )
5986 langServer . onReady ( ) . then ( ( ) => {
0 commit comments