Use skylark-preferred quote char for string literal

We currently have no need to discern between strings quoted with ' or ". While it could be
nice for something one day (and may have been in the past), it's yagni now. Removing the
distinction simplifies string concatenation.

--
PiperOrigin-RevId: 148273400
MOS_MIGRATED_REVID=148273400
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
index b5cbc92..5135dd3 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
@@ -840,16 +840,6 @@
   }
 
   /**
-   * Returns the character in the input buffer at the given position.
-   *
-   * @param at the position to get the character at.
-   * @return the character at the given position.
-   */
-  public char charAt(int at) {
-    return buffer[at];
-  }
-
-  /**
    * Returns the string at the current line, minus the new line.
    *
    * @param line the line from which to retrieve the String, 1-based
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index e499907..fd97117 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -606,9 +606,8 @@
   private StringLiteral parseStringLiteral() {
     Preconditions.checkState(token.kind == TokenKind.STRING);
     int end = token.right;
-    char quoteChar = lexer.charAt(token.left);
     StringLiteral literal =
-        setLocation(new StringLiteral((String) token.value, quoteChar), token.left, end);
+        setLocation(new StringLiteral((String) token.value), token.left, end);
 
     nextToken();
     if (token.kind == TokenKind.STRING) {
@@ -957,9 +956,7 @@
       if (expr instanceof StringLiteral && secondary instanceof StringLiteral) {
         StringLiteral left = (StringLiteral) expr;
         StringLiteral right = (StringLiteral) secondary;
-        if (left.getQuoteChar() == right.getQuoteChar()) {
-          return new StringLiteral(left.getValue() + right.getValue(), left.getQuoteChar());
-        }
+        return new StringLiteral(left.getValue() + right.getValue());
       }
     }
     return new BinaryOperatorExpression(operator, expr, secondary);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
index b2526a0..640d007 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
@@ -18,16 +18,13 @@
  */
 public final class StringLiteral extends Literal<String> {
 
-  private final char quoteChar;
-
-  public StringLiteral(String value, char quoteChar) {
+  public StringLiteral(String value) {
     super(value);
-    this.quoteChar = quoteChar;
   }
 
   @Override
   public String toString() {
-    return quoteChar + value.replace(Character.toString(quoteChar), "\\" + quoteChar) + quoteChar;
+    return Printer.repr(value);
   }
 
   @Override
@@ -35,16 +32,6 @@
     visitor.visit(this);
   }
 
-  /**
-   * Gets the quote character that was used for this string.  For example, if
-   * the string was 'hello, world!', then this method returns '\''.
-   *
-   * @return the character used to quote the string.
-   */
-  public char getQuoteChar() {
-    return quoteChar;
-  }
-
   @Override
   void validate(ValidationEnvironment env) throws EvalException {
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index 743c682..bf36646 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -323,7 +323,7 @@
                 "\tFile \"/workspace/test/skylark/functions.bzl\", line 2, in first",
                 "\t\tsecond(a, b)",
                 "\tFile \"/workspace/test/skylark/functions.bzl\", line 5, in second",
-                "\t\tthird('legal')",
+                "\t\tthird(\"legal\")",
                 "\tFile \"/workspace/test/skylark/functions.bzl\", line 7, in third",
                 errorMessage);
     scratch.file(
@@ -756,7 +756,7 @@
             target.getProvider(FileProvider.class).getFilesToBuild()))
         .containsExactly("foo.txt");
   }
-  
+
   @Test
   public void testRuleClassImplicitOutputs() throws Exception {
     scratch.file(
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
index 6f19044..71e9cec 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
@@ -185,8 +185,8 @@
 
   @Test
   public void testToString() throws Exception {
-    update("subject", new StringLiteral("Hello, 'world'.", '\''));
-    update("from", new StringLiteral("Java", '"'));
+    update("subject", new StringLiteral("Hello, 'world'."));
+    update("from", new StringLiteral("Java"));
     assertThat(getEnvironment().toString()).isEqualTo("<Environment[test]>");
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index 4a71755..f217591 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -521,7 +521,7 @@
   public void testDictComprehensions_ToString() throws Exception {
     assertEquals("{x: x for x in [1, 2]}",
         parseExpression("{x : x for x in [1, 2]}").toString());
-    assertEquals("{x + 'a': x for x in [1, 2]}",
+    assertEquals("{x + \"a\": x for x in [1, 2]}",
         parseExpression("{x + 'a' : x for x in [1, 2]}").toString());
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
index 17599d7..55867c6 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
@@ -363,7 +363,7 @@
                 + LINE_SEPARATOR
                 + "\tFile \"\", line 7, in bar"
                 + LINE_SEPARATOR
-                + "\t\t'test'.index(x)",
+                + "\t\t\"test\".index(x)",
             "def foo():",
             "  bar(1)",
             "def bar(x):",
@@ -421,7 +421,7 @@
                 + LINE_SEPARATOR
                 + "\tFile \"\", line 5, in bar"
                 + LINE_SEPARATOR
-                + "\t\t'test'.index(x)"
+                + "\t\t\"test\".index(x)"
                 + LINE_SEPARATOR
                 + "method string.index(sub: string, start: int, end: int or NoneType) "
                 + "is not applicable "
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index 43f6bcf..db96a9d 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -224,7 +224,7 @@
   @Test
   public void testStringLiteralOptimizationToString() throws Exception {
     StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
-    assertEquals("'abcdef'", l.toString());
+    assertEquals("\"abcdef\"", l.toString());
   }
 
   @Test
@@ -236,7 +236,9 @@
 
   @Test
   public void testStringLiteralOptimizationDifferentQuote() throws Exception {
-    assertThat(parseExpression("'abc' + \"def\"")).isInstanceOf(BinaryOperatorExpression.class);
+    StringLiteral l = (StringLiteral) parseExpression("'abc' + \"def\"");
+    assertEquals(0, l.getLocation().getStartOffset());
+    assertEquals(13, l.getLocation().getEndOffset());
   }
 
   @Test
@@ -443,8 +445,8 @@
     assertEquals("[x[1::2]\n]", parseFile("x[1::2]").toString());
     assertEquals("[x[1:]\n]", parseFile("x[1:]").toString());
     assertEquals("[str[42]\n]", parseFile("str[42]").toString());
-    assertEquals("[ctx.new_file('hello')\n]", parseFile("ctx.new_file('hello')").toString());
-    assertEquals("[new_file('hello')\n]", parseFile("new_file('hello')").toString());
+    assertEquals("[ctx.new_file(\"hello\")\n]", parseFile("ctx.new_file('hello')").toString());
+    assertEquals("[new_file(\"hello\")\n]", parseFile("new_file(\"hello\")").toString());
   }
 
   @Test
@@ -1044,7 +1046,7 @@
 
     Label containingFileLabel = Label.parseAbsoluteUnchecked(containingFileLabelString);
     assertThat(imp.getLabel(containingFileLabel)).named("containingFileLabel()")
-        .isEqualTo(Label.parseAbsoluteUnchecked(expectedLabelString)); 
+        .isEqualTo(Label.parseAbsoluteUnchecked(expectedLabelString));
 
     int startOffset = stmt.getImport().getLocation().getStartOffset();
     int endOffset = stmt.getImport().getLocation().getEndOffset();
@@ -1055,7 +1057,7 @@
 
   private void invalidImportTest(String importString, String expectedMsg) {
     setFailFast(false);
-    parseFileForSkylark("load('" + importString + "', 'fun_test')\n"); 
+    parseFileForSkylark("load('" + importString + "', 'fun_test')\n");
     assertContainsError(expectedMsg);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
index 2e4ae53..85a8f8c 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
@@ -35,7 +35,7 @@
 
   @Test
   public void testAssignmentNotValidLValue() {
-    checkError("cannot assign to ''a''", "'a' = 1");
+    checkError("cannot assign to '\"a\"'", "'a' = 1");
   }
 
   @Test