@@ -8,6 +8,7 @@ import { LeetCodeNode } from "../explorer/LeetCodeNode";
88import { leetCodeChannel } from "../leetCodeChannel" ;
99import { leetCodeExecutor } from "../leetCodeExecutor" ;
1010import { leetCodeManager } from "../leetCodeManager" ;
11+ import { leetCodeSolutionProvider } from "../leetCodeSolutionProvider" ;
1112import { IProblem , IQuickItemEx , languages , ProblemState } from "../shared" ;
1213import { DialogOptions , DialogType , promptForOpenOutputChannel , promptForSignIn } from "../utils/uiUtils" ;
1314import { selectWorkspaceFolder } from "../utils/workspaceUtils" ;
@@ -39,18 +40,60 @@ export async function searchProblem(): Promise<void> {
3940 await showProblemInternal ( choice . value ) ;
4041}
4142
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+ }
4351 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+ }
4883 }
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 ( ) ;
5091 if ( ! language ) {
5192 return ;
5293 }
5394
95+ // SUGGESTION: group config retriving into one file
96+ const leetCodeConfig : vscode . WorkspaceConfiguration = vscode . workspace . getConfiguration ( "leetcode" ) ;
5497 let outDir : string = await selectWorkspaceFolder ( ) ;
5598 let relativePath : string = ( leetCodeConfig . get < string > ( "outputFolder" ) || "" ) . trim ( ) ;
5699 const matchResult : RegExpMatchArray | null = relativePath . match ( / \$ \{ ( .* ?) \} / ) ;
@@ -69,20 +112,6 @@ async function showProblemInternal(node: IProblem): Promise<void> {
69112 const originFilePath : string = await leetCodeExecutor . showProblem ( node , language , outDir ) ;
70113 const filePath : string = wsl . useWsl ( ) ? await wsl . toWinPath ( originFilePath ) : originFilePath ;
71114 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- }
86115 } catch ( error ) {
87116 await promptForOpenOutputChannel ( "Failed to show the problem. Please open the output channel for details." , DialogType . error ) ;
88117 }
0 commit comments