-
Notifications
You must be signed in to change notification settings - Fork 46
[feature] Go support #507
base: master
Are you sure you want to change the base?
[feature] Go support #507
Changes from 13 commits
eb905a5
d2ccd3f
36aab51
1e79bd5
4e218de
f8a75e1
bc4b68f
919bf1c
72b9e32
0a60ae4
d47ee32
cbd25f1
7eec540
68ce191
43614e3
63e2c77
0b37581
ffe2ba2
f48904c
259e562
25e772e
519b15a
2f7b4ae
8a58145
5faf42f
b9f50bc
50f03f4
384242e
d68e840
b1d9db4
b647526
45cc62b
539afb8
6d72bc7
4030fdf
e509bba
52029e4
c983d1e
2b9f450
58713f8
ef65da8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
load("//aspects:utils/utils.bzl", "create_proto", "create_struct", "file_location") | ||
load("@io_bazel_rules_go//go:def.bzl", "go_context") | ||
|
||
def extract_sdk(ctx): | ||
go = go_context(ctx) | ||
if go == None: | ||
return None | ||
return file_location(go.sdk.go) | ||
|
||
def extract_go_info(target, ctx, **kwargs): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you also need to check is it a go target (we usually check is there a language provider in the target, if not then we return |
||
importpath = getattr(ctx.rule.attr, "importpath", []) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. importpath is a string, so the default fallback should be an empty string (or none) |
||
sdk_home_path = extract_sdk(ctx) | ||
|
||
go_target_info = create_struct( | ||
importpath = importpath, | ||
sdk_home_path = sdk_home_path, | ||
) | ||
|
||
return create_proto(target, ctx, go_target_info, "go_target_info"), None |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package org.jetbrains.bsp | ||
|
||
import java.net.URI | ||
|
||
data class GoBuildTarget( | ||
val sdkHomePath: URI?, | ||
val importPath: String?, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. question is: can target have no import path? |
||
) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package org.jetbrains.bsp.bazel.server.sync.languages.go | ||
|
||
import ch.epfl.scala.bsp4j.BuildTarget | ||
import org.jetbrains.bsp.GoBuildTarget | ||
import org.jetbrains.bsp.bazel.info.BspTargetInfo | ||
import org.jetbrains.bsp.bazel.server.paths.BazelPathsResolver | ||
import org.jetbrains.bsp.bazel.server.sync.languages.LanguagePlugin | ||
import java.net.URI | ||
import kotlin.io.path.toPath | ||
|
||
class GoLanguagePlugin( | ||
private val bazelPathsResolver: BazelPathsResolver | ||
) : LanguagePlugin<GoModule>() { | ||
override fun applyModuleData(moduleData: GoModule, buildTarget: BuildTarget) { | ||
val goBuildTarget = with(moduleData) { | ||
GoBuildTarget( | ||
sdkHomePath = sdkHomePath, | ||
importPath = importPath, | ||
) | ||
} | ||
|
||
buildTarget.dataKind = "go" | ||
buildTarget.data = goBuildTarget | ||
} | ||
|
||
override fun resolveModule(targetInfo: BspTargetInfo.TargetInfo): GoModule? { | ||
if (!targetInfo.hasGoTargetInfo()) return null | ||
|
||
val goTargetInfo = targetInfo.goTargetInfo | ||
return GoModule( | ||
sdkHomePath = calculateSdkURI(goTargetInfo.sdkHomePath), | ||
importPath = goTargetInfo.importpath, | ||
) | ||
} | ||
|
||
private fun calculateSdkURI(sdk: BspTargetInfo.FileLocation?): URI? = | ||
sdk?.takeUnless { it.relativePath.isNullOrEmpty() } | ||
?.let { | ||
val goBinaryPath = bazelPathsResolver.resolveUri(it).toPath() | ||
val goSdkDir = goBinaryPath.parent.parent | ||
goSdkDir.toUri() | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. new line |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package org.jetbrains.bsp.bazel.server.sync.languages.go | ||
|
||
import org.jetbrains.bsp.bazel.server.sync.languages.LanguageData | ||
import java.net.URI | ||
|
||
data class GoModule ( | ||
val sdkHomePath: URI?, | ||
val importPath: String?, | ||
): LanguageData | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. new line |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
let's put an
_
to mark that's "private" and put the definition below its usage - so just put it under theextract_go_info