3
3
* SPDX-License-Identifier: Apache-2.0
4
4
*/
5
5
6
+ import { getLogger } from '../../shared/logger/logger'
6
7
import { CodewhispererLanguage } from '../../shared/telemetry/telemetry.gen'
7
8
import { createConstantMap , ConstantMap } from '../../shared/utilities/tsUtils'
8
9
import * as codewhispererClient from '../client/codewhisperer'
9
10
import * as CodeWhispererConstants from '../models/constants'
10
11
12
+ type RuntimeLanguage = Exclude < CodewhispererLanguage , 'jsx' | 'tsx' >
13
+
14
+ const runtimeLanguageSet : ReadonlySet < RuntimeLanguage > = new Set ( [
15
+ 'c' ,
16
+ 'cpp' ,
17
+ 'csharp' ,
18
+ 'go' ,
19
+ 'java' ,
20
+ 'javascript' ,
21
+ 'kotlin' ,
22
+ 'php' ,
23
+ 'python' ,
24
+ 'ruby' ,
25
+ 'rust' ,
26
+ 'scala' ,
27
+ 'shell' ,
28
+ 'sql' ,
29
+ 'typescript' ,
30
+ ] )
31
+
11
32
export class RuntimeLanguageContext {
12
33
/**
13
- * A map storing cwspr supporting programming language with key: vscLanguageId and value: cwsprLanguageId
14
- * Key: vscLanguageId
34
+ * Key: Union set of CodewhispererLanguageId and PlatformLanguageId (VSC, C9 etc.)
15
35
* Value: CodeWhispererLanguageId
16
36
*/
17
- private supportedLanguageMap : ConstantMap < CodeWhispererConstants . SupportedLanguage , CodewhispererLanguage >
37
+ private supportedLanguageMap : ConstantMap <
38
+ CodeWhispererConstants . PlatformLanguageId | CodewhispererLanguage ,
39
+ CodewhispererLanguage
40
+ >
18
41
19
42
/**
20
43
* A map storing CodeWhisperer supported programming language with key: vscLanguageId and value: language extension
21
44
* Key: vscLanguageId
22
45
* Value: language extension
23
46
*/
24
- private supportedLanguageExtensionMap : ConstantMap < CodeWhispererConstants . SupportedLanguage , string >
25
-
26
- // A set contains vscode languageId and CodeWhispererLanguage
27
- private supportedLanguageSet = new Set < string > ( )
47
+ private supportedLanguageExtensionMap : ConstantMap < CodewhispererLanguage , string >
28
48
29
49
constructor ( ) {
30
- this . supportedLanguageMap = createConstantMap < CodeWhispererConstants . SupportedLanguage , CodewhispererLanguage > ( {
31
- java : 'java' ,
32
- python : 'python' ,
33
- javascriptreact : 'jsx' ,
34
- javascript : 'javascript' ,
35
- typescript : 'typescript' ,
36
- typescriptreact : 'tsx' ,
37
- csharp : 'csharp' ,
50
+ this . supportedLanguageMap = createConstantMap <
51
+ CodeWhispererConstants . PlatformLanguageId | CodewhispererLanguage ,
52
+ CodewhispererLanguage
53
+ > ( {
38
54
c : 'c' ,
39
- c_cpp : 'cpp' ,
40
55
cpp : 'cpp' ,
56
+ csharp : 'csharp' ,
57
+ c_cpp : 'cpp' ,
41
58
go : 'go' ,
59
+ java : 'java' ,
60
+ javascript : 'javascript' ,
61
+ javascriptreact : 'jsx' ,
62
+ jsx : 'jsx' ,
42
63
kotlin : 'kotlin' ,
64
+ plaintext : 'plaintext' ,
43
65
php : 'php' ,
66
+ python : 'python' ,
44
67
ruby : 'ruby' ,
45
68
rust : 'rust' ,
46
69
scala : 'scala' ,
47
70
sh : 'shell' ,
71
+ shell : 'shell' ,
48
72
shellscript : 'shell' ,
49
73
sql : 'sql' ,
50
- } )
51
- this . supportedLanguageExtensionMap = createConstantMap < CodeWhispererConstants . SupportedLanguage , string > ( {
52
- java : 'java' ,
53
- python : 'py' ,
54
- javascriptreact : 'jsx' ,
55
- javascript : 'js' ,
56
- typescript : 'ts' ,
74
+ tsx : 'tsx' ,
75
+ typescript : 'typescript' ,
57
76
typescriptreact : 'tsx' ,
58
- csharp : 'cs' ,
77
+ golang : 'go' ,
78
+ } )
79
+ this . supportedLanguageExtensionMap = createConstantMap < CodewhispererLanguage , string > ( {
59
80
c : 'c' ,
60
- c_cpp : 'cpp' ,
61
81
cpp : 'cpp' ,
82
+ csharp : 'cs' ,
62
83
go : 'go' ,
84
+ java : 'java' ,
85
+ javascript : 'js' ,
86
+ jsx : 'jsx' ,
63
87
kotlin : 'kt' ,
88
+ plaintext : 'txt' ,
64
89
php : 'php' ,
90
+ python : 'py' ,
65
91
ruby : 'rb' ,
66
92
rust : 'rs' ,
67
93
scala : 'scala' ,
68
- sh : 'sh' ,
69
- shellscript : 'sh' ,
94
+ shell : 'sh' ,
70
95
sql : 'sql' ,
96
+ tsx : 'tsx' ,
97
+ typescript : 'ts' ,
71
98
} )
99
+ }
72
100
73
- const values = Array . from ( this . supportedLanguageMap . values ( ) )
74
- const keys = Array . from ( this . supportedLanguageMap . keys ( ) )
75
- values . forEach ( item => this . supportedLanguageSet . add ( item ) )
76
- keys . forEach ( item => this . supportedLanguageSet . add ( item ) )
101
+ /**
102
+ * To add a new platform language id:
103
+ * 1. add new platform language ID constant in the file codewhisperer/constant.ts
104
+ * 2. add corresponding CodeWhispererLanguage mapping in the constructor of RuntimeLanguageContext
105
+ * @param languageId : vscode language id or codewhisperer language name
106
+ * @returns normalized language id of type CodewhispererLanguage if any, otherwise undefined
107
+ */
108
+ public normalizeLanguage ( languageId ?: string ) : CodewhispererLanguage | undefined {
109
+ return this . supportedLanguageMap . get ( languageId )
77
110
}
78
111
79
112
/**
80
- *
81
- * @param vscLanguageId : official vscode languageId
82
- * @returns corresponding CodewhispererLanguage ID if any, otherwise undefined
113
+ * Normalize client side language id to service aware language id (service is not aware of jsx/tsx)
114
+ * Only used when invoking CodeWhisperer service API, for client usage please use normalizeLanguage
115
+ * Client side CodewhispererLanguage is a superset of NormalizedLanguageId
83
116
*/
84
- public mapVscLanguageToCodeWhispererLanguage ( vscLanguageId ?: string ) : CodewhispererLanguage | undefined {
85
- return this . supportedLanguageMap . get ( vscLanguageId ) ?? undefined
117
+ public toRuntimeLanguage ( language : CodewhispererLanguage ) : RuntimeLanguage {
118
+ switch ( language ) {
119
+ case 'jsx' :
120
+ return 'javascript'
121
+
122
+ case 'tsx' :
123
+ return 'typescript'
124
+
125
+ default :
126
+ if ( ! runtimeLanguageSet . has ( language ) ) {
127
+ getLogger ( ) . error ( `codewhisperer: unknown runtime language ${ language } ` )
128
+ }
129
+ return language
130
+ }
86
131
}
87
132
88
133
/**
89
134
* This is for notebook files map to a new filename with the corresponding language extension
90
- * @param vscLanguageId : official vscode languageId
135
+ * @param languageId : vscode language id or codewhisperer language name
91
136
* @returns corresponding language extension if any, otherwise undefined
92
137
*/
93
- public getLanguageExtensionForNotebook ( vscLanguageId ?: string ) : string | undefined {
94
- return this . supportedLanguageExtensionMap . get ( vscLanguageId ) ?? undefined
138
+ public getLanguageExtensionForNotebook ( languageId ?: string ) : string | undefined {
139
+ return this . supportedLanguageExtensionMap . get ( this . normalizeLanguage ( languageId ) ) ?? undefined
95
140
}
96
141
97
142
/**
98
- * @param vscLanguageId : official vscode languageId
143
+ * @param languageId : vscode language id or codewhisperer language name
99
144
* @returns An object with a field language: CodewhispererLanguage, if no corresponding CodewhispererLanguage ID, plaintext is returned
100
145
*/
101
- public getLanguageContext ( vscLanguageId ?: string ) : { language : CodewhispererLanguage } {
102
- return { language : this . mapVscLanguageToCodeWhispererLanguage ( vscLanguageId ) ?? 'plaintext' }
146
+ public getLanguageContext ( languageId ?: string ) : { language : CodewhispererLanguage } {
147
+ return { language : this . normalizeLanguage ( languageId ) ?? 'plaintext' }
103
148
}
104
149
105
150
/**
@@ -112,25 +157,17 @@ export class RuntimeLanguageContext {
112
157
T extends codewhispererClient . ListRecommendationsRequest | codewhispererClient . GenerateRecommendationsRequest
113
158
> ( request : T ) : T {
114
159
const fileContext = request . fileContext
115
- const childLanguage = request . fileContext . programmingLanguage
116
- let parentLanguage : codewhispererClient . ProgrammingLanguage
117
- switch ( childLanguage . languageName ) {
118
- case 'tsx' :
119
- parentLanguage = { languageName : CodeWhispererConstants . typescript }
120
- break
121
- case 'jsx' :
122
- parentLanguage = { languageName : CodeWhispererConstants . javascript }
123
- break
124
- default :
125
- parentLanguage = childLanguage
126
- break
160
+ const runtimeLanguage : codewhispererClient . ProgrammingLanguage = {
161
+ languageName : this . toRuntimeLanguage (
162
+ request . fileContext . programmingLanguage . languageName as CodewhispererLanguage
163
+ ) ,
127
164
}
128
165
129
166
return {
130
167
...request ,
131
168
fileContext : {
132
169
...fileContext ,
133
- programmingLanguage : parentLanguage ,
170
+ programmingLanguage : runtimeLanguage ,
134
171
} ,
135
172
}
136
173
}
@@ -141,7 +178,8 @@ export class RuntimeLanguageContext {
141
178
* @returns ture if the language is supported by CodeWhisperer otherwise false
142
179
*/
143
180
public isLanguageSupported ( languageId : string ) : boolean {
144
- return this . supportedLanguageSet . has ( languageId )
181
+ const lang = this . normalizeLanguage ( languageId )
182
+ return lang !== undefined && this . normalizeLanguage ( languageId ) !== 'plaintext'
145
183
}
146
184
}
147
185
0 commit comments