From 3c7598eefd1748a10d975ceaadc726922e1b6c9d Mon Sep 17 00:00:00 2001 From: Widthdom Date: Mon, 25 May 2026 00:00:46 +0900 Subject: [PATCH 1/4] Fix Go blank identifier extraction (#2048) --- changelog.d/unreleased/2048.fixed.md | 16 ++++++++++++++ .../Indexer/Symbols/SymbolExtractor.Go.cs | 3 +++ tests/CodeIndex.Tests/SymbolExtractorTests.cs | 22 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 changelog.d/unreleased/2048.fixed.md diff --git a/changelog.d/unreleased/2048.fixed.md b/changelog.d/unreleased/2048.fixed.md new file mode 100644 index 0000000000..ec1adfb4a0 --- /dev/null +++ b/changelog.d/unreleased/2048.fixed.md @@ -0,0 +1,16 @@ +--- +category: fixed +issues: + - 2048 +affected: + - src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs + - tests/CodeIndex.Tests/SymbolExtractorTests.cs +--- + +## English + +- **Go blank identifiers are no longer indexed as properties (#2048)** — `var` and `const` declarations skip `_` while preserving ordinary names such as `_unused`. + +## 日本語 + +- **Go の blank identifier を property として index しなくなりました (#2048)** — `var` / `const` 宣言では `_` を除外しつつ、`_unused` のような通常の名前は維持します。 diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs index 4e9e7edd8d..7ec8817a17 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs @@ -140,6 +140,9 @@ private static bool TryAddGoValueSymbol( foreach (var name in match.Groups["names"].Value.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) { + if (name == "_") + continue; + if (HasGoSymbol(symbols, fileId, lineIndex + 1, "property", name)) continue; diff --git a/tests/CodeIndex.Tests/SymbolExtractorTests.cs b/tests/CodeIndex.Tests/SymbolExtractorTests.cs index ecd7fb5960..ba1fb2516d 100644 --- a/tests/CodeIndex.Tests/SymbolExtractorTests.cs +++ b/tests/CodeIndex.Tests/SymbolExtractorTests.cs @@ -12305,6 +12305,28 @@ func NewHandler() *Handler { Assert.Equal(2, symbols.Count(s => s.Kind == "function")); } + [Fact] + public void Extract_Go_DoesNotIndexBlankIdentifierDeclarations() + { + var content = """ + package demo + + const _, exported = 1, 2 + + var ( + _ int + _unused string + _, err = open() + ) + """; + var symbols = SymbolExtractor.Extract(1, "go", content); + + Assert.DoesNotContain(symbols, s => s.Kind == "property" && s.Name == "_"); + Assert.Contains(symbols, s => s.Kind == "property" && s.Name == "exported"); + Assert.Contains(symbols, s => s.Kind == "property" && s.Name == "_unused"); + Assert.Contains(symbols, s => s.Kind == "property" && s.Name == "err"); + } + [Fact] public void Extract_Go_DetectsLabels() { From f175f005363b312a54a1ce15c25e873681e27a6d Mon Sep 17 00:00:00 2001 From: Widthdom Date: Mon, 25 May 2026 00:02:42 +0900 Subject: [PATCH 2/4] Fix Go interface method signatures (#2049) --- changelog.d/unreleased/2049.fixed.md | 17 +++++++++++++++++ .../Indexer/Symbols/SymbolExtractor.Go.cs | 2 +- .../Indexer/Symbols/SymbolExtractor.cs | 2 +- tests/CodeIndex.Tests/SymbolExtractorTests.cs | 16 ++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 changelog.d/unreleased/2049.fixed.md diff --git a/changelog.d/unreleased/2049.fixed.md b/changelog.d/unreleased/2049.fixed.md new file mode 100644 index 0000000000..a1d247fd9d --- /dev/null +++ b/changelog.d/unreleased/2049.fixed.md @@ -0,0 +1,17 @@ +--- +category: fixed +issues: + - 2049 +affected: + - src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs + - src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs + - tests/CodeIndex.Tests/SymbolExtractorTests.cs +--- + +## English + +- **Go interface method signatures preserve type parameters (#2049)** — interface method extraction now recognizes bracketed method type parameters and stores the candidate method signature instead of the surrounding raw line. + +## 日本語 + +- **Go interface method の signature が type parameter を保持するようになりました (#2049)** — interface method 抽出は bracket 付き method type parameter を認識し、周囲の raw line ではなく候補 method signature を保存します。 diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs index 7ec8817a17..924648b141 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs @@ -530,7 +530,7 @@ private static bool TryAddGoInterfaceMethodSymbol( StartLine = lineIndex + 1, StartColumn = startColumn, EndLine = lineIndex + 1, - Signature = rawLine.Trim(), + Signature = candidate.Trim(), }, rawLine); return true; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs index 8f2ff12b88..b230ae48cb 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs @@ -219,7 +219,7 @@ public static int GetContractVersion(string? lang) @"^\s*(?:type\s+)?\w+(?:\[[^\]]+\])?\s+interface\b", RegexOptions.Compiled | RegexOptions.CultureInvariant); private static readonly Regex GoInterfaceMethodRegex = new( - @"^\s*(?[A-Za-z_]\w*)\s*\(", + @"^\s*(?[A-Za-z_]\w*)\s*(?:\[[^\]\r\n]+\])?\s*\(", RegexOptions.Compiled | RegexOptions.CultureInvariant); private static readonly Regex GoInterfaceEmbeddedTypeRegex = new( @"^\s*(?:~\s*)?(?[A-Za-z_]\w*(?:\s*\.\s*[A-Za-z_]\w*)*)(?:\[[^\]\r\n]+\])?\s*$", diff --git a/tests/CodeIndex.Tests/SymbolExtractorTests.cs b/tests/CodeIndex.Tests/SymbolExtractorTests.cs index ba1fb2516d..86b0dfcbf3 100644 --- a/tests/CodeIndex.Tests/SymbolExtractorTests.cs +++ b/tests/CodeIndex.Tests/SymbolExtractorTests.cs @@ -12305,6 +12305,22 @@ func NewHandler() *Handler { Assert.Equal(2, symbols.Count(s => s.Kind == "function")); } + [Fact] + public void Extract_Go_InterfaceMethodSignatureIncludesTypeParameters() + { + var content = """ + package demo + + type Ordered interface { + Method[T constraints.Ordered](x T) T + } + """; + var symbols = SymbolExtractor.Extract(1, "go", content); + + var method = Assert.Single(symbols, s => s.Kind == "function" && s.Name == "Method"); + Assert.Equal("Method[T constraints.Ordered](x T) T", method.Signature); + } + [Fact] public void Extract_Go_DoesNotIndexBlankIdentifierDeclarations() { From bab504e9c91aee92f5ac930c7511cc4473b67f33 Mon Sep 17 00:00:00 2001 From: Widthdom Date: Mon, 25 May 2026 00:04:02 +0900 Subject: [PATCH 3/4] Expose Go build metadata (#2050) --- changelog.d/unreleased/2050.fixed.md | 16 +++++++ .../Indexer/Symbols/SymbolExtractor.Go.cs | 47 ++++++++++++++++++- tests/CodeIndex.Tests/SymbolExtractorTests.cs | 22 +++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 changelog.d/unreleased/2050.fixed.md diff --git a/changelog.d/unreleased/2050.fixed.md b/changelog.d/unreleased/2050.fixed.md new file mode 100644 index 0000000000..9a28612507 --- /dev/null +++ b/changelog.d/unreleased/2050.fixed.md @@ -0,0 +1,16 @@ +--- +category: fixed +issues: + - 2050 +affected: + - src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs + - tests/CodeIndex.Tests/SymbolExtractorTests.cs +--- + +## English + +- **Go build directives and CGO imports are exposed as metadata (#2050)** — `//go:build` / `//go:test` comments are indexed as annotation symbols, and `import "C"` is classified as `cgo` instead of a regular import. + +## 日本語 + +- **Go の build directive と CGO import を metadata として公開するようになりました (#2050)** — `//go:build` / `//go:test` comment は annotation symbol として index され、`import "C"` は通常 import ではなく `cgo` として分類されます。 diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs index 924648b141..af3d605909 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs @@ -16,6 +16,9 @@ private static bool TryHandleGoBlockLine( { var trimmed = line.TrimStart(); + if (TryAddGoDirectiveSymbol(fileId, line, lineIndex, symbols, trimmed)) + return true; + if (inImportBlock) { if (trimmed.Length == 0 @@ -352,6 +355,7 @@ private static bool TryAddGoImportSymbol( return true; var name = match.Groups["name"].Value.Trim(); + var kind = string.Equals(name, @"""C""", StringComparison.Ordinal) ? "cgo" : "import"; var startColumn = rawLine.IndexOf(name, StringComparison.Ordinal); if (startColumn < 0) startColumn = rawLine.IndexOf(importText, StringComparison.Ordinal); @@ -365,7 +369,7 @@ private static bool TryAddGoImportSymbol( new SymbolRecord { FileId = fileId, - Kind = "import", + Kind = kind, Name = name, Line = lineIndex + 1, StartLine = lineIndex + 1, @@ -377,6 +381,46 @@ private static bool TryAddGoImportSymbol( return true; } + private static bool TryAddGoDirectiveSymbol( + long fileId, + string rawLine, + int lineIndex, + List symbols, + string trimmed) + { + if (!trimmed.StartsWith("//go:build", StringComparison.Ordinal) + && !trimmed.StartsWith("//go:test", StringComparison.Ordinal)) + { + return false; + } + + var name = trimmed[2..].Trim(); + if (HasGoSymbol(symbols, fileId, lineIndex + 1, "annotation", name)) + return true; + + var startColumn = rawLine.IndexOf("//go:", StringComparison.Ordinal); + if (startColumn < 0) + startColumn = rawLine.Length - rawLine.TrimStart().Length; + + AddSymbolRecord( + symbols, + cssSeenSymbols: null, + lineIndex + 1, + new SymbolRecord + { + FileId = fileId, + Kind = "annotation", + Name = name, + Line = lineIndex + 1, + StartLine = lineIndex + 1, + StartColumn = startColumn, + EndLine = lineIndex + 1, + Signature = trimmed, + }, + rawLine); + return true; + } + private static void ExtractGoInterfaceMethods(long fileId, string[] lines, List symbols) { var awaitingInterfaceBody = false; @@ -852,6 +896,7 @@ private static void ExtractGoGroupedDeclarations(long fileId, string[] lines, Li || trimmed.StartsWith("//", StringComparison.Ordinal) || trimmed.StartsWith("/*", StringComparison.Ordinal)) { + TryAddGoDirectiveSymbol(fileId, line, i, symbols, trimmed); continue; } diff --git a/tests/CodeIndex.Tests/SymbolExtractorTests.cs b/tests/CodeIndex.Tests/SymbolExtractorTests.cs index 86b0dfcbf3..1bba15ca70 100644 --- a/tests/CodeIndex.Tests/SymbolExtractorTests.cs +++ b/tests/CodeIndex.Tests/SymbolExtractorTests.cs @@ -12305,6 +12305,28 @@ func NewHandler() *Handler { Assert.Equal(2, symbols.Count(s => s.Kind == "function")); } + [Fact] + public void Extract_Go_DetectsBuildDirectivesAndCgoImport() + { + var content = """ + package demo + + //go:build darwin && cgo + //go:test integration + import "C" + + func CallCCode() { + } + """; + var symbols = SymbolExtractor.Extract(1, "go", content); + + Assert.Contains(symbols, s => s.Kind == "annotation" && s.Name == "go:build darwin && cgo"); + Assert.Contains(symbols, s => s.Kind == "annotation" && s.Name == "go:test integration"); + Assert.Contains(symbols, s => s.Kind == "cgo" && s.Name == @"""C"""); + Assert.DoesNotContain(symbols, s => s.Kind == "import" && s.Name == @"""C"""); + Assert.Contains(symbols, s => s.Kind == "function" && s.Name == "CallCCode"); + } + [Fact] public void Extract_Go_InterfaceMethodSignatureIncludesTypeParameters() { From ef9a30ecd8d02cd90ff384bd1d4195c006580c36 Mon Sep 17 00:00:00 2001 From: Widthdom Date: Mon, 25 May 2026 00:07:01 +0900 Subject: [PATCH 4/4] Index Go embedded generic struct types (#2047) --- changelog.d/unreleased/2047.fixed.md | 17 +++ .../Indexer/Symbols/SymbolExtractor.Go.cs | 115 +++++++++++++++++- .../Indexer/Symbols/SymbolExtractor.cs | 3 + tests/CodeIndex.Tests/SymbolExtractorTests.cs | 21 ++++ 4 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 changelog.d/unreleased/2047.fixed.md diff --git a/changelog.d/unreleased/2047.fixed.md b/changelog.d/unreleased/2047.fixed.md new file mode 100644 index 0000000000..2619454c78 --- /dev/null +++ b/changelog.d/unreleased/2047.fixed.md @@ -0,0 +1,17 @@ +--- +category: fixed +issues: + - 2047 +affected: + - src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs + - src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs + - tests/CodeIndex.Tests/SymbolExtractorTests.cs +--- + +## English + +- **Go embedded generic struct types are indexed (#2047)** — struct bodies now expose embedded generic types such as `Reader[T]` and `*pkg.Writer[U]` as import-kind symbols without treating ordinary named fields as embedded types. + +## 日本語 + +- **Go struct の embedded generic type を index するようになりました (#2047)** — struct body 内の `Reader[T]` や `*pkg.Writer[U]` などを import-kind symbol として公開し、通常の named field は embedded type として扱いません。 diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs index af3d605909..6654d58c51 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs @@ -86,7 +86,8 @@ private static bool TryAddGoTypeSymbol( int lineIndex, List symbols, string typeText, - ref int goTypeBodyDepth) + ref int goTypeBodyDepth, + ref string? goTypeBodyKind) { var normalizedTypeText = typeText.StartsWith("type", StringComparison.Ordinal) ? typeText["type".Length..].TrimStart() @@ -102,7 +103,12 @@ private static bool TryAddGoTypeSymbol( ? "protocol" : "class"; if (HasGoSymbol(symbols, fileId, lineIndex + 1, kind, name)) + { + if (kind == "struct") + TryAddGoStructEmbeddedTypeSymbols(fileId, rawLine, lineIndex, symbols, ExtractGoInlineTypeBody(typeText)); + return true; + } var startColumn = rawLine.IndexOf(name, StringComparison.Ordinal); if (startColumn < 0) startColumn = rawLine.Length - rawLine.TrimStart().Length; @@ -124,8 +130,17 @@ private static bool TryAddGoTypeSymbol( }, rawLine); - if (kind is "struct" or "protocol") + if (kind == "struct") + { + TryAddGoStructEmbeddedTypeSymbols(fileId, rawLine, lineIndex, symbols, ExtractGoInlineTypeBody(typeText)); + goTypeBodyDepth = CountGoBraceDelta(typeText); + goTypeBodyKind = goTypeBodyDepth > 0 ? kind : null; + } + else if (kind == "protocol") + { goTypeBodyDepth = CountGoBraceDelta(typeText); + goTypeBodyKind = goTypeBodyDepth > 0 ? kind : null; + } return true; } @@ -626,6 +641,91 @@ private static bool TryAddGoInterfaceEmbeddedTypeSymbol( return true; } + private static string ExtractGoInlineTypeBody(string typeText) + { + var openBraceIndex = typeText.IndexOf('{'); + if (openBraceIndex < 0) + return string.Empty; + + var body = typeText[(openBraceIndex + 1)..]; + var closeBraceIndex = body.LastIndexOf('}'); + return closeBraceIndex >= 0 ? body[..closeBraceIndex] : body; + } + + private static void TryAddGoStructEmbeddedTypeSymbols( + long fileId, + string rawLine, + int lineIndex, + List symbols, + string bodyText) + { + if (string.IsNullOrWhiteSpace(bodyText)) + return; + + foreach (var segment in bodyText.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) + { + var candidate = segment; + var trailingBraceIndex = candidate.IndexOf('}'); + if (trailingBraceIndex >= 0) + candidate = candidate[..trailingBraceIndex].TrimEnd(); + + var lineCommentIndex = candidate.IndexOf("//", StringComparison.Ordinal); + if (lineCommentIndex >= 0) + candidate = candidate[..lineCommentIndex].TrimEnd(); + + var blockCommentIndex = candidate.IndexOf("/*", StringComparison.Ordinal); + if (blockCommentIndex >= 0) + candidate = candidate[..blockCommentIndex].TrimEnd(); + + var tagIndex = candidate.IndexOf('`'); + if (tagIndex >= 0) + candidate = candidate[..tagIndex].TrimEnd(); + + if (candidate.Length == 0) + continue; + + TryAddGoStructEmbeddedTypeSymbol(fileId, rawLine, lineIndex, symbols, candidate); + } + } + + private static bool TryAddGoStructEmbeddedTypeSymbol( + long fileId, + string rawLine, + int lineIndex, + List symbols, + string candidate) + { + var match = GoStructEmbeddedTypeRegex.Match(candidate); + if (!match.Success) + return false; + + var name = match.Groups["name"].Value.Trim(); + if (name.Length == 0 || HasGoSymbol(symbols, fileId, lineIndex + 1, "import", name)) + return true; + + var startColumn = rawLine.IndexOf(name, StringComparison.Ordinal); + if (startColumn < 0) + startColumn = rawLine.Length - rawLine.TrimStart().Length; + + AddSymbolRecord( + symbols, + cssSeenSymbols: null, + lineIndex + 1, + new SymbolRecord + { + FileId = fileId, + Kind = "import", + Name = name, + Line = lineIndex + 1, + StartLine = lineIndex + 1, + StartColumn = startColumn, + EndLine = lineIndex + 1, + Signature = candidate.Trim(), + }, + rawLine); + return true; + } + private static bool HasGoSymbol(List symbols, long fileId, int lineNumber, string kind, string name) { return symbols.Any(symbol => @@ -867,6 +967,7 @@ private static void ExtractGoGroupedDeclarations(long fileId, string[] lines, Li string? blockKind = null; ExtractGoInterfaceMethods(fileId, lines, symbols); var typeBodyDepth = 0; + string? typeBodyKind = null; var goBlockDepth = 0; var goBlockInBlockComment = false; var goBlockInRawString = false; @@ -878,9 +979,14 @@ private static void ExtractGoGroupedDeclarations(long fileId, string[] lines, Li if (typeBodyDepth > 0) { + if (typeBodyKind == "struct") + TryAddGoStructEmbeddedTypeSymbols(fileId, line, i, symbols, trimmed); + typeBodyDepth += CountGoBraceDelta(line); if (typeBodyDepth < 0) typeBodyDepth = 0; + if (typeBodyDepth == 0) + typeBodyKind = null; continue; } @@ -904,6 +1010,7 @@ private static void ExtractGoGroupedDeclarations(long fileId, string[] lines, Li { blockKind = null; typeBodyDepth = 0; + typeBodyKind = null; continue; } @@ -912,7 +1019,7 @@ private static void ExtractGoGroupedDeclarations(long fileId, string[] lines, Li switch (blockKind) { case "type": - TryAddGoTypeSymbol(fileId, line, i, symbols, trimmed, ref typeBodyDepth); + TryAddGoTypeSymbol(fileId, line, i, symbols, trimmed, ref typeBodyDepth, ref typeBodyKind); break; case "const": case "var": @@ -958,7 +1065,7 @@ private static void ExtractGoGroupedDeclarations(long fileId, string[] lines, Li if (trimmed.StartsWith("type", StringComparison.Ordinal)) { - TryAddGoTypeSymbol(fileId, line, i, symbols, trimmed, ref typeBodyDepth); + TryAddGoTypeSymbol(fileId, line, i, symbols, trimmed, ref typeBodyDepth, ref typeBodyKind); continue; } diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs index b230ae48cb..c4b0bc3694 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs @@ -224,6 +224,9 @@ public static int GetContractVersion(string? lang) private static readonly Regex GoInterfaceEmbeddedTypeRegex = new( @"^\s*(?:~\s*)?(?[A-Za-z_]\w*(?:\s*\.\s*[A-Za-z_]\w*)*)(?:\[[^\]\r\n]+\])?\s*$", RegexOptions.Compiled | RegexOptions.CultureInvariant); + private static readonly Regex GoStructEmbeddedTypeRegex = new( + @"^\s*\*?\s*(?[A-Za-z_]\w*(?:\s*\.\s*[A-Za-z_]\w*)*)(?:\[[^\]\r\n]+\])?\s*$", + RegexOptions.Compiled | RegexOptions.CultureInvariant); private static readonly HashSet GoInterfaceEmbeddedTypeBlacklist = new(StringComparer.Ordinal) { "bool", diff --git a/tests/CodeIndex.Tests/SymbolExtractorTests.cs b/tests/CodeIndex.Tests/SymbolExtractorTests.cs index 1bba15ca70..205c028c0f 100644 --- a/tests/CodeIndex.Tests/SymbolExtractorTests.cs +++ b/tests/CodeIndex.Tests/SymbolExtractorTests.cs @@ -12305,6 +12305,27 @@ func NewHandler() *Handler { Assert.Equal(2, symbols.Count(s => s.Kind == "function")); } + [Fact] + public void Extract_Go_DetectsEmbeddedGenericStructTypes() + { + var content = """ + package demo + + type Inline[T any] struct { Reader[T]; *pkg.Writer[U] } + + type Container[T any, U any] struct { + Reader[T] + *pkg.Writer[U] + Named Field[T] + } + """; + var symbols = SymbolExtractor.Extract(1, "go", content); + + Assert.Contains(symbols, s => s.Kind == "import" && s.Name == "Reader" && s.Signature == "Reader[T]"); + Assert.Contains(symbols, s => s.Kind == "import" && s.Name == "pkg.Writer" && s.Signature == "*pkg.Writer[U]"); + Assert.DoesNotContain(symbols, s => s.Kind == "import" && s.Name == "Named"); + } + [Fact] public void Extract_Go_DetectsBuildDirectivesAndCgoImport() {