Add SkylarkSemantics#toBuilder() and #builderWithDefaults()

This avoids having to inline a bunch of default values when you only want to change one flag.

RELNOTES: None
PiperOrigin-RevId: 178148057
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
index 3407be0..709449a 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -56,10 +56,18 @@
   public abstract boolean internalDoNotExportBuiltins();
   public abstract boolean internalSkylarkFlagTestCanary();
 
+  /** Returns a {@link Builder} initialized with the values of this instance. */
+  public abstract Builder toBuilder();
+
   public static Builder builder() {
     return new AutoValue_SkylarkSemantics.Builder();
   }
 
+  /** Returns a {@link Builder} initialized with default values for all options. */
+  public static Builder builderWithDefaults() {
+    return DEFAULT_SEMANTICS.toBuilder();
+  }
+
   public static final SkylarkSemantics DEFAULT_SEMANTICS =
       builder()
           // <== Add new options here in alphabetic order ==>
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index d2b7ef3..714f197 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -74,7 +74,7 @@
     }
   }
 
-  /*
+  /**
    * Checks that a randomly generated {@link SkylarkSemantics} object can be serialized and
    * deserialized to an equivalent object.
    */
@@ -97,6 +97,14 @@
     assertThat(semanticsFromOptions).isEqualTo(defaultSemantics);
   }
 
+  @Test
+  public void canGetBuilderFromInstance() {
+    SkylarkSemantics original = SkylarkSemantics.DEFAULT_SEMANTICS;
+    assertThat(original.internalSkylarkFlagTestCanary()).isFalse();
+    SkylarkSemantics modified = original.toBuilder().internalSkylarkFlagTestCanary(true).build();
+    assertThat(modified.internalSkylarkFlagTestCanary()).isTrue();
+  }
+
   /**
    * Constructs a {@link SkylarkSemanticsOptions} object with random fields. Must access {@code
    * rand} using the same sequence of operations (for the same fields) as {@link