Make cpp assembly file extensions case sensitive again (#15986)

This fixes an issue introduced by PR #14005 where .s and .S
extensions were handled case-insensitive on Windows so the action
assemble was triggered instead of preprocess_assemble.

Closes #14131.

PiperOrigin-RevId: 412005097

Co-authored-by: Simon Bjorklen <simon.bjorklen@gmail.com>
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppFileTypes.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppFileTypes.java
index 5140b4a..7becb65 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppFileTypes.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppFileTypes.java
@@ -91,16 +91,46 @@
         }
       };
 
-  public static final FileType ASSEMBLER_WITH_C_PREPROCESSOR = FileType.of(".S");
-  public static final FileType PIC_ASSEMBLER = FileType.of(".pic.s");
+  // FileType is extended to use case-sensitive comparison also on Windows
+  public static final FileType ASSEMBLER_WITH_C_PREPROCESSOR =
+      new FileType() {
+        final String ext = ".S";
+
+        @Override
+        public boolean apply(String path) {
+          return path.endsWith(ext);
+        }
+
+        @Override
+        public ImmutableList<String> getExtensions() {
+          return ImmutableList.of(ext);
+        }
+      };
+
+  // FileType is extended to use case-sensitive comparison also on Windows
+  public static final FileType PIC_ASSEMBLER =
+      new FileType() {
+        final String ext = ".pic.s";
+
+        @Override
+        public boolean apply(String path) {
+          return OS.endsWith(path, ext) && path.endsWith(".s");
+        }
+
+        @Override
+        public ImmutableList<String> getExtensions() {
+          return ImmutableList.of(ext);
+        }
+      };
+
+  // FileType is extended to use case-sensitive comparison also on Windows
   public static final FileType ASSEMBLER =
       new FileType() {
         final String ext = ".s";
 
         @Override
         public boolean apply(String path) {
-          return (OS.endsWith(path, ext) && !PIC_ASSEMBLER.matches(path))
-              || OS.endsWith(path, ".asm");
+          return (path.endsWith(ext) && !PIC_ASSEMBLER.matches(path)) || OS.endsWith(path, ".asm");
         }
 
         @Override
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppFileTypesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppFileTypesTest.java
index 3c58219..e631c86 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppFileTypesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppFileTypesTest.java
@@ -57,4 +57,16 @@
     assertThat(CppFileTypes.VERSIONED_SHARED_LIBRARY.matches("libA.so.if.exp")).isFalse();
     assertThat(CppFileTypes.VERSIONED_SHARED_LIBRARY.matches("libA.so.if.lib")).isFalse();
   }
+
+  @Test
+  public void testCaseSensitiveAssemblyFiles() {
+    assertThat(CppFileTypes.ASSEMBLER_WITH_C_PREPROCESSOR.matches("foo.S")).isTrue();
+    assertThat(CppFileTypes.ASSEMBLER_WITH_C_PREPROCESSOR.matches("foo.s")).isFalse();
+    assertThat(CppFileTypes.PIC_ASSEMBLER.matches("foo.pic.s")).isTrue();
+    assertThat(CppFileTypes.PIC_ASSEMBLER.matches("foo.pic.S")).isFalse();
+    assertThat(CppFileTypes.ASSEMBLER.matches("foo.s")).isTrue();
+    assertThat(CppFileTypes.ASSEMBLER.matches("foo.asm")).isTrue();
+    assertThat(CppFileTypes.ASSEMBLER.matches("foo.pic.s")).isFalse();
+    assertThat(CppFileTypes.ASSEMBLER.matches("foo.S")).isFalse();
+  }
 }