Skip to content

Commit 6c8725e

Browse files
Fix Firebase binding surface coverage false positives (#154)
1 parent 0017e4d commit 6c8725e

4 files changed

Lines changed: 69 additions & 2 deletions

File tree

scripts/FirebaseBindingAudit.Tests/BindingSurfaceCoverageBuilderTests.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,53 @@ public interface AuthMarker
464464
}
465465
}
466466

467+
[Fact]
468+
public void Build_DoesNotTreatApiDefinitionHelperExportsAsNativeClasses()
469+
{
470+
var repoRoot = Path.Combine(Path.GetTempPath(), $"firebase-binding-surface-builder-{Guid.NewGuid():N}");
471+
472+
try
473+
{
474+
var sourceDirectory = Path.Combine(repoRoot, "source", "Firebase", "Auth");
475+
Directory.CreateDirectory(sourceDirectory);
476+
File.WriteAllText(
477+
Path.Combine(sourceDirectory, "ApiDefinition.cs"),
478+
"""
479+
namespace Firebase.Auth;
480+
481+
public interface InstallationIdChangedEventArgs
482+
{
483+
[Export("kFIRInstallationIDDidChangeNotificationAppNameKey")]
484+
string AppName { get; set; }
485+
}
486+
""");
487+
488+
var document = new BindingSurfaceCoverageBuilder(CreateConfiguration()).Build(
489+
repoRoot,
490+
CreateManifest(),
491+
"Auth");
492+
493+
var surface = Assert.Single(
494+
document.Targets.Single().Surfaces,
495+
static surface => surface.MemberName == "AppName");
496+
497+
Assert.Equal("manual-property", surface.Kind);
498+
Assert.Null(surface.ObjectiveCName);
499+
Assert.Empty(surface.NativeSelectors);
500+
Assert.Equal("Export", surface.BindingAttribute);
501+
Assert.Equal("kFIRInstallationIDDidChangeNotificationAppNameKey", surface.BindingValue);
502+
Assert.True(surface.HasGetter);
503+
Assert.False(surface.HasSetter);
504+
}
505+
finally
506+
{
507+
if (Directory.Exists(repoRoot))
508+
{
509+
Directory.Delete(repoRoot, recursive: true);
510+
}
511+
}
512+
}
513+
467514
[Fact]
468515
public void Build_IncludesImplicitlyPublicInterfaceHelperMembers()
469516
{

scripts/FirebaseBindingAudit/BindingModel.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,8 @@ private static void AddManualTypeItems(
327327
{
328328
Kind = ToManualMemberKind(member.Kind),
329329
ContainerKind = isStatic ? "static class" : containerKind,
330-
ObjectiveCName = string.Equals(member.BindingAttribute, "Export", StringComparison.Ordinal) ? typeMatchKey : null,
331330
HasGetter = member.HasGetter,
332-
HasSetter = member.HasSetter
331+
HasSetter = false
333332
});
334333
}
335334
}

scripts/FirebaseBindingAudit/BindingSurfaceCoverage.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -967,6 +967,11 @@ private static IReadOnlyList<BindingSurfaceNativeSelector> BuildManualNativeSele
967967
string? bindingAttribute,
968968
string? bindingValue)
969969
{
970+
if (string.IsNullOrWhiteSpace(manualItem.ObjectiveCName))
971+
{
972+
return EmptySelectors;
973+
}
974+
970975
if (!string.Equals(bindingAttribute, "Export", StringComparison.Ordinal) ||
971976
string.IsNullOrWhiteSpace(bindingValue))
972977
{

tests/E2E/Firebase.Foundation/FirebaseFoundationE2E/FirebaseBindingSurfaceCoverage.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,11 +753,27 @@ static IReadOnlyList<string> CreateTypeNameCandidates(Type type)
753753

754754
AddTypeNameCandidate(candidates, type.Name);
755755
AddTypeNameCandidate(candidates, type.FullName);
756+
AddTypeNameSuffixCandidates(candidates, type.FullName);
756757
}
757758

758759
return candidates;
759760
}
760761

762+
static void AddTypeNameSuffixCandidates(List<string> candidates, string? typeName)
763+
{
764+
var normalizedTypeName = NormalizeTypeName(typeName);
765+
if (string.IsNullOrWhiteSpace(normalizedTypeName))
766+
{
767+
return;
768+
}
769+
770+
var parts = normalizedTypeName.Split('.');
771+
for (var index = 1; index < parts.Length - 1; index++)
772+
{
773+
AddTypeNameCandidate(candidates, string.Join('.', parts[index..]));
774+
}
775+
}
776+
761777
static IEnumerable<string> CreateGenericTypeNameCandidates(Type genericDefinition)
762778
{
763779
yield return StripGenericArity(genericDefinition.Name);

0 commit comments

Comments
 (0)