Skip to content

Commit 1b0825c

Browse files
authored
fix language specific dependency is used in JetBrains core (#3813)
1 parent 3cef925 commit 1b0825c

20 files changed

+323
-91
lines changed

jetbrains-core/resources/META-INF/ext-java.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
</extensions>
2626
<extensions defaultExtensionNs="aws.toolkit.codewhisperer">
2727
<programmingLanguage implementation="software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJava"/>
28+
<classResolver implementation="software.aws.toolkits.jetbrains.services.codewhisperer.language.classresolver.CodeWhispereJavaClassResolver"/>
2829
<importAdder implementation="software.aws.toolkits.jetbrains.services.codewhisperer.importadder.CodeWhispererJavaImportAdder"/>
2930
</extensions>
3031
</idea-plugin>

jetbrains-core/resources/META-INF/ext-python.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
</extensions>
2929
<extensions defaultExtensionNs="aws.toolkit.codewhisperer">
3030
<programmingLanguage implementation="software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererPython"/>
31+
<classResolver implementation="software.aws.toolkits.jetbrains.services.codewhisperer.language.classresolver.CodeWhispererPythonClassResolver"/>
3132
<importAdder implementation="software.aws.toolkits.jetbrains.services.codewhisperer.importadder.CodeWhispererPythonImportAdder"/>
3233
</extensions>
3334
</idea-plugin>

jetbrains-core/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ with what features/services are supported.
179179
<extensionPoint name="devTools.serviceNode" interface="software.aws.toolkits.jetbrains.core.explorer.devToolsTab.nodes.DevToolsServiceNode" dynamic="true"/>
180180
<extensionPoint name="devTools.treeStructure" interface="software.aws.toolkits.jetbrains.core.explorer.devToolsTab.DevToolsTreeStructureProvider" dynamic="true"/>
181181
<extensionPoint name="codewhisperer.programmingLanguage" interface="software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage" dynamic="true"/>
182+
<extensionPoint name="codewhisperer.classResolver" interface="software.aws.toolkits.jetbrains.services.codewhisperer.language.classresolver.CodeWhispererClassResolver" dynamic="true"/>
182183
<extensionPoint name="codewhisperer.importAdder" interface="software.aws.toolkits.jetbrains.services.codewhisperer.importadder.CodeWhispererImportAdder" dynamic="true"/>
183184
</extensionPoints>
184185

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/CodeWhispererProgrammingLanguage.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,22 @@
33

44
package software.aws.toolkits.jetbrains.services.codewhisperer.language
55

6+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileCrawler
7+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.NoOpFileCrawler
68
import software.aws.toolkits.telemetry.CodewhispererLanguage
79

810
/**
11+
* Interface defining CodeWhisperer's feature support on language levels, note that the expectation is not aligning with the IDE's behavior. That being said,
12+
* on Intellij Community, users are still able to trigger CodeWhisperer service on .js .ts files whereas the IDE doesn't recognize the .js .ts file type.
13+
* Specifically, any implementation leveraging JetBrains' language support, for example [PyFile], [ClassOwner] should live in their corresponding module or
14+
* extension point otherwise it will result in dependency problem at runtime. For example, JS/TS is only supported in Intellij Ultimate thus it should live in
15+
* "Ultimate" module if the implementation is utilizing JetBrains JS/TS APIs.
16+
*
917
* Any subclass of CodeWhispererProgrammingLanguage should have private constructor
1018
*/
1119
abstract class CodeWhispererProgrammingLanguage {
1220
abstract val languageId: String
21+
open val fileCrawler: FileCrawler = NoOpFileCrawler()
1322

1423
abstract fun toTelemetryType(): CodewhispererLanguage
1524

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.codewhisperer.language.classresolver
5+
6+
import com.intellij.openapi.application.runReadAction
7+
import com.intellij.psi.PsiClassOwner
8+
import com.intellij.psi.PsiFile
9+
10+
class CodeWhispereJavaClassResolver : CodeWhispererClassResolver {
11+
override fun resolveClassAndMembers(psiFile: PsiFile): Map<ClassResolverKey, List<String>> {
12+
if (psiFile !is PsiClassOwner) {
13+
return emptyMap()
14+
}
15+
16+
val classNames = runReadAction {
17+
psiFile.classes.mapNotNull { it.name }
18+
}
19+
20+
val methodNames = runReadAction {
21+
psiFile.classes.mapNotNull { clazz ->
22+
clazz.methods.mapNotNull { method ->
23+
method.name
24+
}
25+
}
26+
}.flatten()
27+
28+
return mapOf(
29+
ClassResolverKey.ClassName to classNames,
30+
ClassResolverKey.MethodName to methodNames
31+
)
32+
}
33+
34+
override fun resolveTopLevelFunction(psiFile: PsiFile): List<String> = emptyList()
35+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.codewhisperer.language.classresolver
5+
6+
import com.intellij.openapi.extensions.ExtensionPointName
7+
import com.intellij.psi.PsiFile
8+
9+
/**
10+
* Note the implementation of [CodeWhispererClassResolver] should live in its corresponding module if it's dependent on
11+
* JB's specific language support. For example [CodeWhispererPythonClassResolver] uses [PyFile] which makes it depends on python extension point
12+
*/
13+
interface CodeWhispererClassResolver {
14+
fun resolveClassAndMembers(psiFile: PsiFile): Map<ClassResolverKey, List<String>>
15+
16+
fun resolveTopLevelFunction(psiFile: PsiFile): List<String>
17+
18+
companion object {
19+
val EP_NAME = ExtensionPointName<CodeWhispererClassResolver>("aws.toolkit.codewhisperer.classResolver")
20+
}
21+
}
22+
23+
enum class ClassResolverKey {
24+
ClassName,
25+
MethodName
26+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.codewhisperer.language.classresolver
5+
6+
import com.intellij.openapi.application.runReadAction
7+
import com.intellij.psi.PsiFile
8+
import com.jetbrains.python.psi.PyFile
9+
10+
class CodeWhispererPythonClassResolver : CodeWhispererClassResolver {
11+
override fun resolveClassAndMembers(psiFile: PsiFile): Map<ClassResolverKey, List<String>> {
12+
if (psiFile !is PyFile) {
13+
return emptyMap()
14+
}
15+
val classNames = runReadAction {
16+
psiFile.topLevelClasses.mapNotNull { it.name }
17+
}
18+
19+
val methodNames = runReadAction {
20+
psiFile.topLevelClasses.mapNotNull { clazz ->
21+
clazz.methods.mapNotNull { method ->
22+
method.name
23+
}
24+
}
25+
}.flatten()
26+
27+
return mapOf(
28+
ClassResolverKey.ClassName to classNames,
29+
ClassResolverKey.MethodName to methodNames
30+
)
31+
}
32+
33+
override fun resolveTopLevelFunction(psiFile: PsiFile): List<String> {
34+
if (psiFile !is PyFile) {
35+
return emptyList()
36+
}
37+
38+
val functionNames = runReadAction {
39+
psiFile.topLevelFunctions.mapNotNull { it.name }
40+
}
41+
42+
return functionNames
43+
}
44+
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/languages/CodeWhispererJava.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
package software.aws.toolkits.jetbrains.services.codewhisperer.language.languages
55

66
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
7+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileCrawler
8+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.JavaCodeWhispererFileCrawler
79
import software.aws.toolkits.telemetry.CodewhispererLanguage
810

911
class CodeWhispererJava private constructor() : CodeWhispererProgrammingLanguage() {
1012
override val languageId: String = ID
13+
override val fileCrawler: FileCrawler = JavaCodeWhispererFileCrawler
1114

1215
override fun toTelemetryType(): CodewhispererLanguage = CodewhispererLanguage.Java
1316

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/languages/CodeWhispererJavaScript.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
package software.aws.toolkits.jetbrains.services.codewhisperer.language.languages
55

66
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
7+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileCrawler
8+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.JavascriptCodeWhispererFileCrawler
79
import software.aws.toolkits.telemetry.CodewhispererLanguage
810

911
class CodeWhispererJavaScript private constructor() : CodeWhispererProgrammingLanguage() {
1012
override val languageId: String = ID
13+
override val fileCrawler: FileCrawler = JavascriptCodeWhispererFileCrawler
1114

1215
override fun toTelemetryType(): CodewhispererLanguage = CodewhispererLanguage.Javascript
1316

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/language/languages/CodeWhispererJsx.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
package software.aws.toolkits.jetbrains.services.codewhisperer.language.languages
55

66
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
7+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileCrawler
8+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.JavascriptCodeWhispererFileCrawler
79
import software.aws.toolkits.telemetry.CodewhispererLanguage
810

911
class CodeWhispererJsx private constructor() : CodeWhispererProgrammingLanguage() {
1012
override val languageId: String = ID
13+
override val fileCrawler: FileCrawler = JavascriptCodeWhispererFileCrawler
1114

1215
override fun toTelemetryType(): CodewhispererLanguage = CodewhispererLanguage.Jsx
1316

0 commit comments

Comments
 (0)