diff --git a/strategies/extractors.go b/strategies/extractors.go index 10b615f..df8ff8c 100644 --- a/strategies/extractors.go +++ b/strategies/extractors.go @@ -4633,6 +4633,11 @@ func csCallSites(decl *sitter.Node, src []byte) []astkit.CallSite { if qual == "" { qual = csTypedReceiver(recv, src) } + if qual == "" && recv != nil { + // A receiver no name describes (o["x"].Children(), + // (a ?? b).M()): untyped, but never a bare call. + qual = "" + } return joinQualified(qual, method) case "conditional_access_expression": // `a?.M()`: the function is the conditional access itself, @@ -4660,6 +4665,9 @@ func csCallSites(decl *sitter.Node, src []byte) []astkit.CallSite { if qual == "" { qual = csTypedReceiver(recv, src) } + if qual == "" && recv != nil { + qual = "" + } return joinQualified(qual, method) } return "" diff --git a/strategies/metadata.go b/strategies/metadata.go index c029b51..b208610 100644 --- a/strategies/metadata.go +++ b/strategies/metadata.go @@ -378,6 +378,13 @@ func argToken(c *sitter.Node, src []byte) string { return "#" + strings.TrimSpace(typ[:i]) + "[]" } } + case "implicit_array_creation_expression": + // C#: new[] { "a", "b" } is a string[]: the first element's type. + if init := internalast.FindChildByType(c, "initializer_expression"); init != nil && init.NamedChildCount() > 0 { + if t := argToken(init.NamedChild(0), src); strings.HasPrefix(t, "#") && !strings.HasSuffix(t, "[]") && t != "#lambda" { + return t + "[]" + } + } case "typeof_expression": return "#Type" case "invocation_expression": diff --git a/strategies/metadata_test.go b/strategies/metadata_test.go index db8dcad..1d4971b 100644 --- a/strategies/metadata_test.go +++ b/strategies/metadata_test.go @@ -660,6 +660,8 @@ func TestCSharp_CallSiteTypedConstantArgs(t *testing.T) { W(a == b); W(!ok); W(nameof(F)); + W(new[] { "a", "b" }); + W(new[] { 1, 2 }); } }` syms, _ := extract(t, astkit.LangCSharp, src) @@ -671,7 +673,7 @@ func TestCSharp_CallSiteTypedConstantArgs(t *testing.T) { } } } - want := []string{"#double", "#decimal", "#uint", "#ulong", "#long", "#DateTime", "#int", "#double", "#Guid", "#String", "#TimeSpan", "#Uri", "#boolean", "#boolean", "#String"} + want := []string{"#double", "#decimal", "#uint", "#ulong", "#long", "#DateTime", "#int", "#double", "#Guid", "#String", "#TimeSpan", "#Uri", "#boolean", "#boolean", "#String", "#String[]", "#int[]"} if strings.Join(got, " ") != strings.Join(want, " ") { t.Errorf("args\n got %v\nwant %v", got, want) }