Mercurial > hg > release > icedtea7-forest-2.2 > langtools
changeset 1075:130154dbafc8
7068902: (javac) allow enabling or disabling of String folding
Summary: Contributed by netbeans team, modified to suit by the langtools team.
Reviewed-by: jjg, mcimadamore
author | ksrini |
---|---|
date | Wed, 27 Jul 2011 11:53:17 -0700 |
parents | 2f2ac80b6836 |
children | 8b6f8a4bc8b8 |
files | src/share/classes/com/sun/tools/javac/parser/JavacParser.java test/tools/javac/parser/StringFoldingTest.java |
diffstat | 2 files changed, 105 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Aug 05 11:25:41 2011 -0700 +++ b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Wed Jul 27 11:53:17 2011 -0700 @@ -57,7 +57,7 @@ /** 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 @@ 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<JCTree,String>(); + docComments = keepDocComments ? new HashMap<JCTree,String>() : null; this.keepLineMap = keepLineMap; this.errorTree = F.Erroneous(); } @@ -146,6 +146,10 @@ */ boolean allowTWR; + /** Switch: should we fold strings? + */ + boolean allowStringFolding; + /** Switch: should we keep docComments? */ boolean keepDocComments; @@ -757,6 +761,8 @@ * by a single literal representing the concatenated string. */ protected StringBuffer foldStrings(JCTree tree) { + if (!allowStringFolding) + return null; List<String> buf = List.nil(); while (true) { if (tree.getTag() == JCTree.LITERAL) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/parser/StringFoldingTest.java Wed Jul 27 11:53:17 2011 -0700 @@ -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<String> argsList = new ArrayList<String>(); + if (disableStringFolding) { + argsList.add("-XDallowStringFolding=false"); + } + JavacTask ct = (JavacTask)tool.getTask(null, null, null, + argsList, + null, + Arrays.asList(source)); + Iterable<? extends CompilationUnitTree> 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"); + } + } + } +}