From 53abe0d254d57c55768ee4b28f86264e94c0b851 Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Wed, 27 Jul 2011 11:53:17 -0700 Subject: [PATCH] 7068902: (javac) allow enabling or disabling of String folding Contributed by netbeans team, modified to suit by the langtools team. Reviewed-by: jjg, mcimadamore --- .../sun/tools/javac/parser/JavacParser.java | 12 ++- .../tools/javac/parser/StringFoldingTest.java | 96 +++++++++++++++++++ 2 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 langtools/test/tools/javac/parser/StringFoldingTest.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java index 58a411039a5..a8b86a1a00b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -57,7 +57,7 @@ public class JavacParser implements Parser { /** The scanner used for lexical analysis. */ - private Lexer S; + protected Lexer S; /** The factory to be used for abstract syntax tree construction. */ @@ -99,9 +99,9 @@ public class JavacParser implements Parser { this.allowTWR = source.allowTryWithResources(); this.allowDiamond = source.allowDiamond(); this.allowMulticatch = source.allowMulticatch(); + this.allowStringFolding = fac.options.getBoolean("allowStringFolding", true); this.keepDocComments = keepDocComments; - if (keepDocComments) - docComments = new HashMap(); + docComments = keepDocComments ? new HashMap() : null; this.keepLineMap = keepLineMap; this.errorTree = F.Erroneous(); } @@ -146,6 +146,10 @@ public class JavacParser implements Parser { */ boolean allowTWR; + /** Switch: should we fold strings? + */ + boolean allowStringFolding; + /** Switch: should we keep docComments? */ boolean keepDocComments; @@ -757,6 +761,8 @@ public class JavacParser implements Parser { * by a single literal representing the concatenated string. */ protected StringBuffer foldStrings(JCTree tree) { + if (!allowStringFolding) + return null; List buf = List.nil(); while (true) { if (tree.getTag() == JCTree.LITERAL) { diff --git a/langtools/test/tools/javac/parser/StringFoldingTest.java b/langtools/test/tools/javac/parser/StringFoldingTest.java new file mode 100644 index 00000000000..32a59d72d13 --- /dev/null +++ b/langtools/test/tools/javac/parser/StringFoldingTest.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7068902 + * @summary verify that string folding can be enabled or disabled + */ + +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.util.JavacTask; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; +import javax.tools.ToolProvider; + +public class StringFoldingTest { + final JavaCompiler tool; + final JavaSource source; + + public StringFoldingTest() { + tool = ToolProvider.getSystemJavaCompiler(); + source = new JavaSource(); + } + + static class JavaSource extends SimpleJavaFileObject { + + final static String source = + "class C {String X=\"F\" + \"O\" + \"L\" + \"D\" + \"E\" + \"D\";}"; + + JavaSource() { + super(URI.create("myfo:/C.java"), JavaFileObject.Kind.SOURCE); + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return source; + } + } + + public static void main(String... args) throws IOException { + StringFoldingTest t = new StringFoldingTest(); + t.run(false); + t.run(true); + } + + void run(boolean disableStringFolding) throws IOException { + List argsList = new ArrayList(); + if (disableStringFolding) { + argsList.add("-XDallowStringFolding=false"); + } + JavacTask ct = (JavacTask)tool.getTask(null, null, null, + argsList, + null, + Arrays.asList(source)); + Iterable trees = ct.parse(); + String text = trees.toString(); + System.out.println(text); + + if (disableStringFolding) { + if (text.contains("FOLDED")) { + throw new AssertionError("Expected string folding"); + } + } else { + if (!text.contains("FOLDED")) { + throw new AssertionError("Expected no string folding"); + } + } + } +}