@@ -8,6 +8,7 @@ import { LeetCodeNode } from "../explorer/LeetCodeNode";
8
8
import { leetCodeChannel } from "../leetCodeChannel" ;
9
9
import { leetCodeExecutor } from "../leetCodeExecutor" ;
10
10
import { leetCodeManager } from "../leetCodeManager" ;
11
+ import { leetCodeSolutionProvider } from "../leetCodeSolutionProvider" ;
11
12
import { IProblem , IQuickItemEx , languages , ProblemState } from "../shared" ;
12
13
import { DialogOptions , DialogType , promptForOpenOutputChannel , promptForSignIn } from "../utils/uiUtils" ;
13
14
import { selectWorkspaceFolder } from "../utils/workspaceUtils" ;
@@ -39,18 +40,60 @@ export async function searchProblem(): Promise<void> {
39
40
await showProblemInternal ( choice . value ) ;
40
41
}
41
42
42
- async function showProblemInternal ( node : IProblem ) : Promise < void > {
43
+ export async function showSolution ( node ?: LeetCodeNode ) : Promise < void > {
44
+ if ( ! node ) {
45
+ return ;
46
+ }
47
+ const language : string | undefined = await fetchProblemLanguage ( ) ;
48
+ if ( ! language ) {
49
+ return ;
50
+ }
43
51
try {
44
- const leetCodeConfig : vscode . WorkspaceConfiguration = vscode . workspace . getConfiguration ( "leetcode" ) ;
45
- let defaultLanguage : string | undefined = leetCodeConfig . get < string > ( "defaultLanguage" ) ;
46
- if ( defaultLanguage && languages . indexOf ( defaultLanguage ) < 0 ) {
47
- defaultLanguage = undefined ;
52
+ let solution : string = await leetCodeExecutor . showSolution ( node , language ) ;
53
+ // remove backslash in espaced \'...\'(generated by leetcode's database)
54
+ solution = solution . replace ( / \\ ' / g, "'" ) ;
55
+ await leetCodeSolutionProvider . show ( solution , node ) ;
56
+ } catch ( error ) {
57
+ await promptForOpenOutputChannel ( "Failed to fetch the top voted solution. Please open the output channel for details." , DialogType . error ) ;
58
+ }
59
+ }
60
+
61
+ // SUGGESTION: group config retriving into one file
62
+ async function fetchProblemLanguage ( ) : Promise < string | undefined > {
63
+ const leetCodeConfig : vscode . WorkspaceConfiguration = vscode . workspace . getConfiguration ( "leetcode" ) ;
64
+ let defaultLanguage : string | undefined = leetCodeConfig . get < string > ( "defaultLanguage" ) ;
65
+ if ( defaultLanguage && languages . indexOf ( defaultLanguage ) < 0 ) {
66
+ defaultLanguage = undefined ;
67
+ }
68
+ const language : string | undefined = defaultLanguage || await vscode . window . showQuickPick ( languages , { placeHolder : "Select the language you want to use" } ) ;
69
+ // fire-and-forget default language query
70
+ ( async ( ) : Promise < void > => {
71
+ if ( ! defaultLanguage && leetCodeConfig . get < boolean > ( "showSetDefaultLanguageHint" ) ) {
72
+ const choice : vscode . MessageItem | undefined = await vscode . window . showInformationMessage (
73
+ `Would you like to set '${ language } ' as your default language?` ,
74
+ DialogOptions . yes ,
75
+ DialogOptions . no ,
76
+ DialogOptions . never ,
77
+ ) ;
78
+ if ( choice === DialogOptions . yes ) {
79
+ leetCodeConfig . update ( "defaultLanguage" , language , true /* UserSetting */ ) ;
80
+ } else if ( choice === DialogOptions . never ) {
81
+ leetCodeConfig . update ( "showSetDefaultLanguageHint" , false , true /* UserSetting */ ) ;
82
+ }
48
83
}
49
- const language : string | undefined = defaultLanguage || await vscode . window . showQuickPick ( languages , { placeHolder : "Select the language you want to use" } ) ;
84
+ } ) ( ) ;
85
+ return language ;
86
+ }
87
+
88
+ async function showProblemInternal ( node : IProblem ) : Promise < void > {
89
+ try {
90
+ const language : string | undefined = await fetchProblemLanguage ( ) ;
50
91
if ( ! language ) {
51
92
return ;
52
93
}
53
94
95
+ // SUGGESTION: group config retriving into one file
96
+ const leetCodeConfig : vscode . WorkspaceConfiguration = vscode . workspace . getConfiguration ( "leetcode" ) ;
54
97
let outDir : string = await selectWorkspaceFolder ( ) ;
55
98
let relativePath : string = ( leetCodeConfig . get < string > ( "outputFolder" ) || "" ) . trim ( ) ;
56
99
const matchResult : RegExpMatchArray | null = relativePath . match ( / \$ \{ ( .* ?) \} / ) ;
@@ -69,20 +112,6 @@ async function showProblemInternal(node: IProblem): Promise<void> {
69
112
const originFilePath : string = await leetCodeExecutor . showProblem ( node , language , outDir ) ;
70
113
const filePath : string = wsl . useWsl ( ) ? await wsl . toWinPath ( originFilePath ) : originFilePath ;
71
114
await vscode . window . showTextDocument ( vscode . Uri . file ( filePath ) , { preview : false } ) ;
72
-
73
- if ( ! defaultLanguage && leetCodeConfig . get < boolean > ( "showSetDefaultLanguageHint" ) ) {
74
- const choice : vscode . MessageItem | undefined = await vscode . window . showInformationMessage (
75
- `Would you like to set '${ language } ' as your default language?` ,
76
- DialogOptions . yes ,
77
- DialogOptions . no ,
78
- DialogOptions . never ,
79
- ) ;
80
- if ( choice === DialogOptions . yes ) {
81
- leetCodeConfig . update ( "defaultLanguage" , language , true /* UserSetting */ ) ;
82
- } else if ( choice === DialogOptions . never ) {
83
- leetCodeConfig . update ( "showSetDefaultLanguageHint" , false , true /* UserSetting */ ) ;
84
- }
85
- }
86
115
} catch ( error ) {
87
116
await promptForOpenOutputChannel ( "Failed to show the problem. Please open the output channel for details." , DialogType . error ) ;
88
117
}
0 commit comments