|
2 | 2 | // Licensed under the MIT License. |
3 | 3 |
|
4 | 4 | /* eslint-disable @typescript-eslint/naming-convention */ |
5 | | -import { commands, Disposable, Event, EventEmitter, Uri } from 'vscode'; |
6 | | -import { traceError, traceLog } from './logging'; |
7 | | -import { PythonExtension, ResolvedEnvironment } from '@vscode/python-extension'; |
8 | | -import { PYTHON_MAJOR, PYTHON_MINOR, PYTHON_VERSION } from './constants'; |
9 | | -import { getProjectRoot } from './utilities'; |
| 5 | +import { PythonExtension, ResolvedEnvironment } from "@vscode/python-extension"; |
| 6 | +import { commands, Disposable, Event, EventEmitter, Uri } from "vscode"; |
| 7 | + |
| 8 | +import { PYTHON_MAJOR, PYTHON_MINOR, PYTHON_VERSION } from "./constants"; |
| 9 | +import { traceError, traceLog } from "./logging"; |
| 10 | +import { getProjectRoot } from "./utilities"; |
10 | 11 |
|
11 | 12 | export interface IInterpreterDetails { |
12 | | - path?: string[]; |
13 | | - resource?: Uri; |
| 13 | + path?: string[]; |
| 14 | + resource?: Uri; |
14 | 15 | } |
15 | 16 |
|
16 | 17 | const onDidChangePythonInterpreterEvent = new EventEmitter<void>(); |
17 | | -export const onDidChangePythonInterpreter: Event<void> = onDidChangePythonInterpreterEvent.event; |
| 18 | +export const onDidChangePythonInterpreter: Event<void> = |
| 19 | + onDidChangePythonInterpreterEvent.event; |
18 | 20 |
|
19 | 21 | let _api: PythonExtension | undefined; |
20 | 22 | async function getPythonExtensionAPI(): Promise<PythonExtension | undefined> { |
21 | | - if (_api) { |
22 | | - return _api; |
23 | | - } |
24 | | - _api = await PythonExtension.api(); |
25 | | - return _api; |
| 23 | + if (_api) { |
| 24 | + return _api; |
| 25 | + } |
| 26 | + _api = await PythonExtension.api(); |
| 27 | + return _api; |
26 | 28 | } |
27 | 29 |
|
28 | 30 | function sameInterpreter(a: string[], b: string[]): boolean { |
29 | | - if (a.length !== b.length) { |
30 | | - return false; |
31 | | - } |
32 | | - for (let i = 0; i < a.length; i++) { |
33 | | - if (a[i] !== b[i]) { |
34 | | - return false; |
35 | | - } |
36 | | - } |
37 | | - return true; |
| 31 | + if (a.length !== b.length) { |
| 32 | + return false; |
| 33 | + } |
| 34 | + for (let i = 0; i < a.length; i++) { |
| 35 | + if (a[i] !== b[i]) { |
| 36 | + return false; |
| 37 | + } |
| 38 | + } |
| 39 | + return true; |
38 | 40 | } |
39 | 41 |
|
40 | 42 | let serverPython: string[] | undefined; |
41 | 43 | function checkAndFireEvent(interpreter: string[] | undefined): void { |
42 | | - if (interpreter === undefined) { |
43 | | - if (serverPython) { |
44 | | - // Python was reset for this uri |
45 | | - serverPython = undefined; |
46 | | - onDidChangePythonInterpreterEvent.fire(); |
47 | | - return; |
48 | | - } else { |
49 | | - return; // No change in interpreter |
50 | | - } |
51 | | - } |
52 | | - |
53 | | - if (!serverPython || !sameInterpreter(serverPython, interpreter)) { |
54 | | - serverPython = interpreter; |
55 | | - onDidChangePythonInterpreterEvent.fire(); |
56 | | - } |
| 44 | + if (interpreter === undefined) { |
| 45 | + if (serverPython) { |
| 46 | + // Python was reset for this uri |
| 47 | + serverPython = undefined; |
| 48 | + onDidChangePythonInterpreterEvent.fire(); |
| 49 | + return; |
| 50 | + } else { |
| 51 | + return; // No change in interpreter |
| 52 | + } |
| 53 | + } |
| 54 | + |
| 55 | + if (!serverPython || !sameInterpreter(serverPython, interpreter)) { |
| 56 | + serverPython = interpreter; |
| 57 | + onDidChangePythonInterpreterEvent.fire(); |
| 58 | + } |
57 | 59 | } |
58 | 60 |
|
59 | 61 | async function refreshServerPython(): Promise<void> { |
60 | | - const projectRoot = await getProjectRoot(); |
61 | | - const interpreter = await getInterpreterDetails(projectRoot?.uri); |
62 | | - checkAndFireEvent(interpreter.path); |
| 62 | + const projectRoot = await getProjectRoot(); |
| 63 | + const interpreter = await getInterpreterDetails(projectRoot?.uri); |
| 64 | + checkAndFireEvent(interpreter.path); |
63 | 65 | } |
64 | 66 |
|
65 | | -export async function initializePython(disposables: Disposable[]): Promise<void> { |
66 | | - try { |
67 | | - const api = await getPythonExtensionAPI(); |
68 | | - |
69 | | - if (api) { |
70 | | - disposables.push( |
71 | | - api.environments.onDidChangeActiveEnvironmentPath(async () => { |
72 | | - await refreshServerPython(); |
73 | | - }), |
74 | | - ); |
75 | | - |
76 | | - traceLog('Waiting for interpreter from Python extension.'); |
77 | | - await refreshServerPython(); |
78 | | - } |
79 | | - } catch (error) { |
80 | | - traceError('Error initializing Python: ', error); |
81 | | - } |
| 67 | +export async function initializePython( |
| 68 | + disposables: Disposable[], |
| 69 | +): Promise<void> { |
| 70 | + try { |
| 71 | + const api = await getPythonExtensionAPI(); |
| 72 | + |
| 73 | + if (api) { |
| 74 | + disposables.push( |
| 75 | + api.environments.onDidChangeActiveEnvironmentPath(async () => { |
| 76 | + await refreshServerPython(); |
| 77 | + }), |
| 78 | + ); |
| 79 | + |
| 80 | + traceLog("Waiting for interpreter from Python extension."); |
| 81 | + await refreshServerPython(); |
| 82 | + } |
| 83 | + } catch (error) { |
| 84 | + traceError("Error initializing Python: ", error); |
| 85 | + } |
82 | 86 | } |
83 | 87 |
|
84 | | -export async function resolveInterpreter(interpreter: string[]): Promise<ResolvedEnvironment | undefined> { |
85 | | - const api = await getPythonExtensionAPI(); |
86 | | - return api?.environments.resolveEnvironment(interpreter[0]); |
| 88 | +export async function resolveInterpreter( |
| 89 | + interpreter: string[], |
| 90 | +): Promise<ResolvedEnvironment | undefined> { |
| 91 | + const api = await getPythonExtensionAPI(); |
| 92 | + return api?.environments.resolveEnvironment(interpreter[0]); |
87 | 93 | } |
88 | 94 |
|
89 | | -export async function getInterpreterDetails(resource?: Uri): Promise<IInterpreterDetails> { |
90 | | - const api = await getPythonExtensionAPI(); |
91 | | - const environment = await api?.environments.resolveEnvironment( |
92 | | - api?.environments.getActiveEnvironmentPath(resource), |
93 | | - ); |
94 | | - if (environment?.executable.uri && checkVersion(environment)) { |
95 | | - return { path: [environment?.executable.uri.fsPath], resource }; |
96 | | - } |
97 | | - return { path: undefined, resource }; |
| 95 | +export async function getInterpreterDetails( |
| 96 | + resource?: Uri, |
| 97 | +): Promise<IInterpreterDetails> { |
| 98 | + const api = await getPythonExtensionAPI(); |
| 99 | + const environment = await api?.environments.resolveEnvironment( |
| 100 | + api?.environments.getActiveEnvironmentPath(resource), |
| 101 | + ); |
| 102 | + if (environment?.executable.uri && checkVersion(environment)) { |
| 103 | + return { path: [environment?.executable.uri.fsPath], resource }; |
| 104 | + } |
| 105 | + return { path: undefined, resource }; |
98 | 106 | } |
99 | 107 |
|
100 | 108 | export async function getDebuggerPath(): Promise<string | undefined> { |
101 | | - const api = await getPythonExtensionAPI(); |
102 | | - return api?.debug.getDebuggerPackagePath(); |
| 109 | + const api = await getPythonExtensionAPI(); |
| 110 | + return api?.debug.getDebuggerPackagePath(); |
103 | 111 | } |
104 | 112 |
|
105 | | -export async function runPythonExtensionCommand(command: string, ...rest: any[]) { |
106 | | - await getPythonExtensionAPI(); |
107 | | - return await commands.executeCommand(command, ...rest); |
| 113 | +export async function runPythonExtensionCommand( |
| 114 | + command: string, |
| 115 | + ...rest: any[] |
| 116 | +) { |
| 117 | + await getPythonExtensionAPI(); |
| 118 | + return await commands.executeCommand(command, ...rest); |
108 | 119 | } |
109 | 120 |
|
110 | | -export function checkVersion(resolved: ResolvedEnvironment | undefined): boolean { |
111 | | - const version = resolved?.version; |
112 | | - if (version?.major === PYTHON_MAJOR && version?.minor >= PYTHON_MINOR) { |
113 | | - return true; |
114 | | - } |
115 | | - traceError(`Python version ${version?.major}.${version?.minor} is not supported.`); |
116 | | - traceError(`Selected python path: ${resolved?.executable.uri?.fsPath}`); |
117 | | - traceError(`Supported versions are ${PYTHON_VERSION} and above.`); |
118 | | - return false; |
| 121 | +export function checkVersion( |
| 122 | + resolved: ResolvedEnvironment | undefined, |
| 123 | +): boolean { |
| 124 | + const version = resolved?.version; |
| 125 | + if (version?.major === PYTHON_MAJOR && version?.minor >= PYTHON_MINOR) { |
| 126 | + return true; |
| 127 | + } |
| 128 | + traceError( |
| 129 | + `Python version ${version?.major}.${version?.minor} is not supported.`, |
| 130 | + ); |
| 131 | + traceError(`Selected python path: ${resolved?.executable.uri?.fsPath}`); |
| 132 | + traceError(`Supported versions are ${PYTHON_VERSION} and above.`); |
| 133 | + return false; |
119 | 134 | } |
0 commit comments