This is an automated email from the ASF dual-hosted git repository.
geertjan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new c62487d [NETBEANS-481] JDK10-LVTI: Added new ErrorRule to fix
compiler error on initialization of var type variable with array (#519)
c62487d is described below
commit c62487d4e2d02723ac4e44e87429d16ca9757ffe
Author: Arunava Sinha <[email protected]>
AuthorDate: Tue May 29 18:02:11 2018 +0530
[NETBEANS-481] JDK10-LVTI: Added new ErrorRule to fix compiler error on
initialization of var type variable with array (#519)
* netbeans-481: Added new ErrorRule to fix compiler error on initialization
of var type variable with array
* netbeans-481: Added setup() method in
ConvertInvalidVarToExplicitArrayTypeTest
* netbeans-481: Refactored code of CasualDiff class
* netbeans-481: Refactored code of ConvertInvalidVarToExplicitArrayType
class
* [NETBEANS-481] Refactored code of ConvertInvalidVarToExplicitArrayType
class
* [NETBEANS-481] JDK10-LVTI: Added tests for CasualDiff class changes
* [NETBEANS-481] JDK10-LVTI: Refactored Test class for CasualDiff changes
* [NETBEANS-481] JDK10-LVTI: 1.Refactored Test File for CasualDiff changes
2. Corrected Code for Skipping hint for Parameterized type array members
* [NETBEANS-481] JDK10-LVTI: Corrected fix label text
* [NETBEANS-481] JDK10-LVTI: Refactored CasualDiff to handle any
tokensequence overshoot scenario
* [NETBEANS-481] JDK10-LVTI: Handled scenarios related to empty
array/invalid array as var initializer
---
.../ConvertInvalidVarToExplicitArrayType.java | 172 +++++++++++++++
.../modules/java/hints/resources/layer.xml | 1 +
.../ConvertInvalidVarToExplicitArrayTypeTest.java | 235 +++++++++++++++++++++
.../modules/java/source/save/CasualDiff.java | 67 +++++-
.../api/java/source/SourceUtilsTestUtil.java | 11 +-
.../InvalidVarToExplicitArrayConversionTest.java | 199 +++++++++++++++++
6 files changed, 681 insertions(+), 4 deletions(-)
diff --git
a/java.hints/src/org/netbeans/modules/java/hints/errors/ConvertInvalidVarToExplicitArrayType.java
b/java.hints/src/org/netbeans/modules/java/hints/errors/ConvertInvalidVarToExplicitArrayType.java
new file mode 100644
index 0000000..428cb05
--- /dev/null
+++
b/java.hints/src/org/netbeans/modules/java/hints/errors/ConvertInvalidVarToExplicitArrayType.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.hints.errors;
+
+import com.sun.source.tree.ExpressionTree;
+import com.sun.source.tree.NewArrayTree;
+import com.sun.source.tree.NewClassTree;
+import com.sun.source.tree.Tree;
+import com.sun.source.util.TreePath;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import com.sun.source.tree.VariableTree;
+import com.sun.source.util.Trees;
+import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.TypeKind;
+import javax.lang.model.type.TypeMirror;
+import org.netbeans.api.java.source.CompilationInfo;
+import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.java.source.TreeMaker;
+import org.netbeans.api.java.source.WorkingCopy;
+import org.netbeans.modules.java.hints.spi.ErrorRule;
+import org.netbeans.spi.editor.hints.Fix;
+import org.netbeans.spi.java.hints.JavaFix;
+import org.openide.util.NbBundle.Messages;
+import javax.lang.model.util.Types;
+
+/**
+ *
+ * @author arusinha
+ */
+@Messages({
+ "DN_ConvertVarToExplicitType=Replace var with explicit type"
+})
+public class ConvertInvalidVarToExplicitArrayType implements ErrorRule<Void> {
+
+ private static final Set<String> CODES;
+
+ static {
+ Set<String> codes = new HashSet<>();
+ codes.add("compiler.err.cant.infer.local.var.type"); // NOI18N
+ CODES = Collections.unmodifiableSet(codes);
+ }
+
+ @Override
+ public Set<String> getCodes() {
+ return CODES;
+ }
+
+ @Override
+ public List<Fix> run(CompilationInfo compilationInfo, String
diagnosticKey, int offset, TreePath treePath, Data<Void> data) {
+
+ if (treePath.getParentPath() == null) {
+ return null;
+ }
+
+ TypeMirror arrayType = null;
+ if (treePath.getLeaf().getKind() == Tree.Kind.VARIABLE) {
+ VariableTree oldVariableTree = (VariableTree) treePath.getLeaf();
+
+ ExpressionTree init = oldVariableTree.getInitializer();
+
+ if (init == null || init.getKind() != Tree.Kind.NEW_ARRAY) {
+ return null;
+ }
+
+ NewArrayTree arrayTree = (NewArrayTree)
oldVariableTree.getInitializer();
+ List<? extends ExpressionTree> currentValues =
arrayTree.getInitializers();
+
+ if (currentValues.isEmpty()) {
+ return null;
+ }
+
+ TreePath initArrayTreePath = new TreePath(treePath, arrayTree);
+ Types types = compilationInfo.getTypes();
+ Trees trees = compilationInfo.getTrees();
+
+ for (ExpressionTree tree : currentValues) {
+
+ TypeMirror etType = trees.getTypeMirror(new
TreePath(initArrayTreePath, tree));
+
+ //skipped fix for invalid array member and for parameterized
array member.
+ if (etType == null || etType.getKind() == TypeKind.ERROR ||
(etType.getKind() == TypeKind.DECLARED
+ && !((DeclaredType)
etType).getTypeArguments().isEmpty())) {
+ return null;
+ }
+
+ if (arrayType == null) {
+ arrayType = etType;
+ } else if (!types.isAssignable(etType, arrayType)) {
+ if (types.isAssignable(arrayType, etType)) {
+ arrayType = etType;
+ } else {
+ return null; //the array is not sufficiently
homogeneous.
+ }
+ }
+ }
+ return Collections.<Fix>singletonList(new FixImpl(compilationInfo,
treePath, arrayType).toEditorFix());
+ }
+ return Collections.<Fix>emptyList();
+
+ }
+
+ @Override
+ public String getId() {
+ return ConvertInvalidVarToExplicitArrayType.class.getName();
+ }
+
+ @Override
+ public String getDisplayName() {
+ return Bundle.DN_ConvertVarToExplicitType();
+ }
+
+ @Override
+ public void cancel() {
+ }
+
+ private static final class FixImpl extends JavaFix {
+
+ private TypeMirror arrayTypeMirror;
+
+ public FixImpl(CompilationInfo info, TreePath tp, TypeMirror
arrayType) {
+ super(info, tp);
+ this.arrayTypeMirror = arrayType;
+ }
+
+ @Override
+ protected String getText() {
+ return Bundle.DN_ConvertVarToExplicitType();
+ }
+
+ @Override
+ protected void performRewrite(TransformationContext tc) throws
Exception {
+ WorkingCopy wc = tc.getWorkingCopy();
+ wc.toPhase(JavaSource.Phase.RESOLVED);
+ TreePath statementPath = tc.getPath();
+ TreeMaker make = wc.getTreeMaker();
+ VariableTree oldVariableTree = null;
+
+ if (statementPath.getLeaf().getKind() == Tree.Kind.VARIABLE) {
+ oldVariableTree = (VariableTree) statementPath.getLeaf();
+
+ arrayTypeMirror = Utilities.resolveCapturedType(wc,
arrayTypeMirror);
+
+ VariableTree newVariableTree = make.Variable(
+ oldVariableTree.getModifiers(),
+ oldVariableTree.getName(),
+ make.ArrayType(make.Type(arrayTypeMirror)),
+ oldVariableTree.getInitializer()
+ );
+ tc.getWorkingCopy().rewrite(oldVariableTree, newVariableTree);
+ }
+ }
+ }
+}
diff --git a/java.hints/src/org/netbeans/modules/java/hints/resources/layer.xml
b/java.hints/src/org/netbeans/modules/java/hints/resources/layer.xml
index 6f98b8f..aa9d4e9 100644
--- a/java.hints/src/org/netbeans/modules/java/hints/resources/layer.xml
+++ b/java.hints/src/org/netbeans/modules/java/hints/resources/layer.xml
@@ -182,6 +182,7 @@
<file
name="org-netbeans-modules-java-hints-errors-ExtraCatch.instance"/>
<file
name="org-netbeans-modules-java-hints-errors-TypeErroneous.instance"/>
<file
name="org-netbeans-modules-java-hints-project-IncompleteClassPath.instance"/>
+ <file
name="org-netbeans-modules-java-hints-errors-ConvertInvalidVarToExplicitArrayType.instance"/>
<folder name="text">
<folder name="x-jsp">
<file
name="org-netbeans-modules-java-hints-errors-ImportClass.instance"/>
diff --git
a/java.hints/test/unit/src/org/netbeans/modules/java/hints/errors/ConvertInvalidVarToExplicitArrayTypeTest.java
b/java.hints/test/unit/src/org/netbeans/modules/java/hints/errors/ConvertInvalidVarToExplicitArrayTypeTest.java
new file mode 100644
index 0000000..a36d16f
--- /dev/null
+++
b/java.hints/test/unit/src/org/netbeans/modules/java/hints/errors/ConvertInvalidVarToExplicitArrayTypeTest.java
@@ -0,0 +1,235 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.hints.errors;
+
+import com.sun.source.util.TreePath;
+import java.util.LinkedList;
+import java.util.List;
+import org.netbeans.modules.java.hints.infrastructure.ErrorHintsTestBase;
+import org.netbeans.spi.editor.hints.Fix;
+import org.openide.util.NbBundle;
+import org.netbeans.modules.java.source.parsing.JavacParser;
+import org.netbeans.api.java.source.CompilationInfo;
+
+/**
+ *
+ * @author arusinha
+ */
+public class ConvertInvalidVarToExplicitArrayTypeTest extends
ErrorHintsTestBase {
+
+ private static final String FIX_MSG = "Replace var with explicit type"; //
NOI18N
+
+ public ConvertInvalidVarToExplicitArrayTypeTest(String name) throws
Exception {
+ super(name, ConvertInvalidVarToExplicitArrayType.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ sourceLevel = "1.10";
+ JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = false;
+ super.tearDown();
+ }
+
+ public void testEmptyArrayAsInitializer() throws Exception {
+ performAnalysisTest("test/Test.java",
+ "package test; public class Test {{final var j = {};}}",
+ -1);
+ }
+
+ public void testInvalidArrayAsInitializer() throws Exception {
+ performAnalysisTest("test/Test.java",
+ "package test; public class Test {{final var j =
{int1,var1,\"hello\"};}}",
+ -1);
+ }
+
+ public void testParameterizedElements() throws Exception {
+ performAnalysisTest("test/Test.java",
+ "package test; public class Test {{final var j = {new
java.util.ArrayList<String>(),new java.util.ArrayList<String>()};}}",
+ -1);
+ }
+
+ public void testParameterizedElements2() throws Exception {
+ performAnalysisTest("test/Test.java",
+ "package test; import java.util.ArrayList; import
java.util.Arrays; public class Test"
+ + "{{ \n"
+ + " ArrayList<ArrayList<String>> l = new
ArrayList<ArrayList<String>>(); \n"
+ + " ArrayList<String> places = new
ArrayList<String>(Arrays.asList(\"New York\", \"Tokyo\"));\n"
+ + " l.add(places); "
+ + " final var j = {l.get(0)};"
+ + "}}",
+ -1);
+ }
+
+ public void testMethodInvocation() throws Exception {
+ performAnalysisTest("test/Test.java",
+ "package test; import java.util.ArrayList; import
java.util.Arrays; public class Test"
+ + " {{ \n"
+ + " ArrayList<String> places = new
ArrayList<String>(Arrays.asList(\"New York\", \"Tokyo\"));\n"
+ + " final var j = {places.get(0)};\n"
+ + "}}",
+ -1, FIX_MSG);
+ }
+
+ public void testMethodInvocation2() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test"
+ + " {{ \n"
+ + " final var arr = {m3()};}"
+ + " static String m3(){ return new String(\"hello\") ;}"
+ + "}",
+ -1, FIX_MSG, "package test; public class Test {{ final
String[] arr = {m3()};} static String m3(){ return new String(\"hello\") ;}}");
+ }
+
+ public void testArrayHetrogeneousElements() throws Exception {
+ performAnalysisTest("test/Test.java",
+ "package test; public class Test {{final/*comment1*/
var/**comment2**/ j/*comment3*/ = /*comment4*/{new java.util.ArrayList(),new
java.util.HashMap()};}}",
+ -1);
+ }
+
+ public void testArrayObjectElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{final/*comment1*/
var/**comment2**/ j/*comment3*/ = /*comment4*/{new java.util.ArrayList(),new
java.util.ArrayList()};}}",
+ -1, FIX_MSG,
+ "package test; import java.util.ArrayList; public class Test
{{final/*comment1*/ ArrayList[]/**comment2**/ j/*comment3*/ = /*comment4*/{new
java.util.ArrayList(),new java.util.ArrayList()};}}");
+ }
+
+ public void testArrayPrimitiveNumericElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{final var j =
{1,2.1,3f};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{final double[] j =
{1,2.1,3f};}}");
+ }
+
+ public void testArrayPrimitiveNumeric2ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{final var j =
{(short)1,(byte)2};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{final short[] j =
{(short)1,(byte)2};}}");
+ }
+
+ public void testArrayStringElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{/*comment1*/
/*comment2*/@NotNull final var j = {\"hello\",\"world\"};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{/*comment1*/
/*comment2*/@NotNull final String[] j = {\"hello\",\"world\"};}}");
+ }
+
+ public void testArrayObject1ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{@NotNull final var j = {new
Object(),new Object()};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{@NotNull final Object[] j =
{new Object(),new Object()};}}");
+ }
+
+ public void testArrayObject2ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{@NotNull var j = {new
Object(),new Object()};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{@NotNull Object[] j = {new
Object(),new Object()};}}");
+ }
+
+ public void testArrayObject3ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{final @NotNull var j = {new
Object(),new Object()};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{final @NotNull Object[] j =
{new Object(),new Object()};}}");
+ }
+
+ public void testArrayObject4ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{final/*comment1*/var a =
{new Object(),new Object()};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{final/*comment1*/Object[] a
= {new Object(),new Object()};}}");
+ }
+
+ public void testArrayObject5ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{final/*comment1*/var
/*comment2*/ a = {2,3.1f};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{final/*comment1*/float[]
/*comment2*/ a = {2,3.1f};}}");
+ }
+
+ public void testArrayObject6ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{/*comment1*/var/*comment2*/
a = {2,3.1f};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test
{{/*comment1*/float[]/*comment2*/ a = {2,3.1f};}}");
+ }
+
+ public void testArrayObject7ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{var/*comment1*/ a =
{2,3.1f};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{float[]/*comment1*/ a =
{2,3.1f};}}");
+ }
+
+ public void testArrayObject8ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{@NotNull var j = {new
Object(),new Object()};}}",
+ -1,
+ FIX_MSG,
+ "package test; public class Test {{@NotNull Object[] j = {new
Object(),new Object()};}}");
+ }
+
+ public void testArrayObject9ElementsFix() throws Exception {
+ performFixTest("test/Test.java",
+ "package test; public class Test {{var/*comment1*/ k =
{1,'c'};}}",
+ -1, FIX_MSG,
+ "package test; public class Test {{int[]/*comment1*/ k =
{1,'c'};}}");
+ }
+
+ protected List<Fix> computeFixes(CompilationInfo info, int pos, TreePath
path) {
+ List<Fix> fixes = new ConvertInvalidVarToExplicitArrayType().run(info,
null, pos, path, null);
+ List<Fix> result = new LinkedList<Fix>();
+
+ for (Fix f : fixes) {
+ if (f instanceof Fix) {
+ result.add(f);
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ protected String toDebugString(CompilationInfo info, Fix f) {
+ return (f.getText());
+ }
+
+ static {
+ NbBundle.setBranding("test");
+ }
+
+}
diff --git
a/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
b/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
index 4cef162..b5cb6bf 100644
--- a/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
+++ b/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
@@ -166,6 +166,7 @@ import
org.netbeans.modules.java.source.transform.FieldGroupTree;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
import org.openide.util.NbCollections;
+import javax.lang.model.type.TypeKind;
public class CasualDiff {
@@ -1469,8 +1470,72 @@ public class CasualDiff {
addDimensions = dimension(newT.vartype, -1);
cLikeArray = vartypeBounds[1] > oldT.pos;
cLikeArrayChange = cLikeArray && dimension(oldT.vartype,
oldT.pos) > addDimensions;
- copyTo(localPointer, vartypeBounds[0]);
+
+ /**
+ * Extracting modifier from oldTree using symbol position and
+ * modifier positions when oldT.type is error and vartype
+ * upperbound is not proper.
+ */
+ if (oldT.type.getKind() == TypeKind.ERROR && vartypeBounds[1]
== -1) {
+
+ // returns -1 if modifiers not present.
+ int modsUpperBound = getCommentCorrectedEndPos(oldT.mods);
+ if (modsUpperBound > -1) {
+ tokenSequence.move(modsUpperBound);
+
+ // copying modifiers from oldTree
+ if (tokenSequence.moveNext()) {
+ copyTo(localPointer, localPointer =
modsUpperBound);
+ }
+
+ }
+ int offset = localPointer;
+ JavaTokenId tokenId = null;
+ tokenSequence.move(localPointer);
+
+ //adding back all
whitespaces/block-comment/javadoc-comments present in OldTree before variable
type token.
+ while (tokenSequence.moveNext()) {
+ offset = tokenSequence.offset();
+ tokenId = tokenSequence.token().id();
+
+ if (!((tokenId == JavaTokenId.WHITESPACE || tokenId ==
JavaTokenId.BLOCK_COMMENT || tokenId == JavaTokenId.JAVADOC_COMMENT) && offset
< oldT.sym.pos)) {
+ break;
+ }
+
+ }
+ copyTo(localPointer, localPointer = offset);
+
+ // Correcting lower/upper bounds for oldT.vartype tree.
+ vartypeBounds[1] = oldT.sym.pos;
+ vartypeBounds[0] = offset;
+
+ } else {
+ copyTo(localPointer, vartypeBounds[0]);
+
+ }
+
localPointer = diffTree(oldT.vartype, newT.vartype,
vartypeBounds);
+
+ /**
+ * For erroneous variable type sometime diffTree function
return
+ * wrong position. In that scenario only old variable type will
+ * be replaced with new variable type leaving out succeeding
+ * comments tokens present(if any). Below code copies
successive
+ * tokens after excluding variable type token which will be the
+ * first token.
+ */
+ if (oldT.type.getKind() == TypeKind.ERROR && localPointer ==
-1) {
+ // moving to variable type token
+ tokenSequence.move(vartypeBounds[0]);
+ tokenSequence.moveNext();
+
+ //moving to first token after variable type token.
+ if (tokenSequence.moveNext()) {
+ // copying tokens from vartype bounds after excluding
variable type token.
+ int offset = tokenSequence.offset();
+ copyTo(offset, localPointer = vartypeBounds[1]);
+ }
+ }
}
}
if (nameChanged(oldT.name, newT.name)) {
diff --git
a/java.source.base/test/unit/src/org/netbeans/api/java/source/SourceUtilsTestUtil.java
b/java.source.base/test/unit/src/org/netbeans/api/java/source/SourceUtilsTestUtil.java
index 8768ba0..f8214d5 100644
---
a/java.source.base/test/unit/src/org/netbeans/api/java/source/SourceUtilsTestUtil.java
+++
b/java.source.base/test/unit/src/org/netbeans/api/java/source/SourceUtilsTestUtil.java
@@ -40,6 +40,7 @@ import org.netbeans.api.java.source.JavaSource.Phase;
import org.netbeans.editor.BaseDocument;
import org.netbeans.junit.NbTestCase;
import org.netbeans.modules.java.JavaDataLoader;
+import org.netbeans.modules.java.source.BootClassPathUtil;
import org.netbeans.modules.java.source.TestUtil;
import org.netbeans.modules.java.source.indexing.JavaCustomIndexer;
import org.netbeans.modules.java.source.parsing.JavacParser;
@@ -280,9 +281,13 @@ public final class SourceUtilsTestUtil extends ProxyLookup
{
public ClassPath findClassPath(FileObject file, String type) {
try {
- if (ClassPath.BOOT == type ||
JavaClassPathConstants.MODULE_BOOT_PATH.equals(type)) {
- return
ClassPathSupport.createClassPath(getBootClassPath().toArray(new URL[0]));
- }
+ if (ClassPath.BOOT == type) {
+ return
ClassPathSupport.createClassPath(getBootClassPath().toArray(new URL[0]));
+ }
+
+ if (JavaClassPathConstants.MODULE_BOOT_PATH == type) {
+ return BootClassPathUtil.getModuleBootPath();
+ }
if (ClassPath.SOURCE == type) {
return ClassPathSupport.createClassPath(new FileObject[] {
diff --git
a/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/InvalidVarToExplicitArrayConversionTest.java
b/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/InvalidVarToExplicitArrayConversionTest.java
new file mode 100644
index 0000000..c2c5d98
--- /dev/null
+++
b/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/InvalidVarToExplicitArrayConversionTest.java
@@ -0,0 +1,199 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.api.java.source.gen;
+
+import com.sun.source.tree.ClassTree;
+import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.MethodTree;
+import com.sun.source.tree.VariableTree;
+import java.io.IOException;
+import static junit.framework.TestCase.assertNotNull;
+import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.java.source.Task;
+import org.netbeans.api.java.source.TestUtilities;
+import org.netbeans.api.java.source.TreeMaker;
+import org.netbeans.api.java.source.WorkingCopy;
+import org.netbeans.junit.NbTestSuite;
+import org.netbeans.modules.java.source.parsing.JavacParser;
+
+/**
+ * Tests conversion of invalid var type variable to explicit array type.
+ *
+ * @author arusinha
+ */
+public class InvalidVarToExplicitArrayConversionTest extends
TreeRewriteTestBase {
+
+ public InvalidVarToExplicitArrayConversionTest(String testName) {
+ super(testName);
+ }
+
+ public static NbTestSuite suite() {
+ NbTestSuite suite = new NbTestSuite();
+ suite.addTestSuite(InvalidVarToExplicitArrayConversionTest.class);
+ return suite;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ sourceLevel = "1.10";
+ JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
+
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = false;
+
+ }
+
+ public void testInvalidVarToExplicitArrayConversion() throws Exception {
+
+ String code = "package test;\n"
+ + "public class Test {\n"
+ + " void m1() {\n"
+ + " final /*comment1*/ var/*comment2*/ k = {1, 'C'};\n"
+ + " }\n"
+ + "}\n";
+ String golden = "package test;\n"
+ + "public class Test {\n"
+ + " void m1() {\n"
+ + " final /*comment1*/ int[]/*comment2*/ k = {1,
'C'};\n"
+ + " }\n"
+ + "}\n";
+
+ prepareTest("Test", code);
+
+ rewriteStatement("int");
+ String res = TestUtilities.copyFileToString(getTestFile());
+ System.err.println(res);
+ assertEquals(golden, res);
+
+ }
+
+ public void testInvalidVarToExplicitArray2Conversion() throws Exception {
+
+ String code = "package test;\n"
+ + "import java.util.ArrayList;\n"
+ + "public class Test {\n"
+ + " void m1() {\n"
+ + " /*comment1*/var k = {new ArrayList(), new
ArrayList()};\n"
+ + " }\n"
+ + "}\n";
+
+ String golden = "package test;\n"
+ + "import java.util.ArrayList;\n"
+ + "public class Test {\n"
+ + " void m1() {\n"
+ + " /*comment1*/ArrayList[] k = {new ArrayList(), new
ArrayList()};\n"
+ + " }\n"
+ + "}\n";
+
+ prepareTest("Test", code);
+
+ rewriteStatement("ArrayList");
+ String res = TestUtilities.copyFileToString(getTestFile());
+ System.err.println(res);
+ assertEquals(golden, res);
+ }
+
+ public void testInvalidVarToExplicitArray3Conversion() throws Exception {
+ String code = "package test;\n"
+ + "import java.util.ArrayList;\n"
+ + "public class Test {\n"
+ + " void m1() {\n"
+ + " @NotNull final var j = {\"hello\", \"world\"};\n"
+ + " }\n"
+ + "}\n";
+ String golden = "package test;\n"
+ + "import java.util.ArrayList;\n"
+ + "public class Test {\n"
+ + " void m1() {\n"
+ + " @NotNull final String[] j = {\"hello\",
\"world\"};\n"
+ + " }\n"
+ + "}\n";
+
+ prepareTest("Test", code);
+
+ rewriteStatement("String");
+ String res = TestUtilities.copyFileToString(getTestFile());
+ System.err.println(res);
+ assertEquals(golden, res);
+ }
+
+ public void testInvalidVarToExplicitArray4Conversion() throws Exception {
+
+ String code = "package test;\n"
+ + "public class Test {\n"
+ + " void m1() {\n"
+ + " var/*comment2*/ k = {1, 'C'};\n"
+ + " }\n"
+ + "}\n";
+ String golden = "package test;\n"
+ + "public class Test {\n"
+ + " void m1() {\n"
+ + " int[]/*comment2*/ k = {1, 'C'};\n"
+ + " }\n"
+ + "}\n";
+
+ prepareTest("Test", code);
+
+ rewriteStatement("int");
+ String res = TestUtilities.copyFileToString(getTestFile());
+ System.err.println(res);
+ assertEquals(golden, res);
+ }
+
+ /**
+ * Replaces invalid var type array initialization statement with explicit
+ * array type.
+ *
+ * @param arrayType : target explicit array type.
+ * @throws IOException
+ */
+ private void rewriteStatement(String arrayType) throws IOException {
+
+ JavaSource js = getJavaSource();
+ assertNotNull(js);
+
+ Task<WorkingCopy> task = new Task<WorkingCopy>() {
+
+ public void run(WorkingCopy workingCopy) throws IOException {
+ workingCopy.toPhase(JavaSource.Phase.RESOLVED);
+ CompilationUnitTree cut = workingCopy.getCompilationUnit();
+ TreeMaker make = workingCopy.getTreeMaker();
+ ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
+ MethodTree method = (MethodTree) clazz.getMembers().get(1);
+
+ VariableTree oldVariableTree = (VariableTree)
method.getBody().getStatements().get(0);
+ VariableTree newVariableTree = make.Variable(
+ oldVariableTree.getModifiers(),
+ oldVariableTree.getName(),
+ make.ArrayType(make.Type(arrayType)),
+ oldVariableTree.getInitializer()
+ );
+ // converts var type to explicit array type
+ workingCopy.rewrite(oldVariableTree, newVariableTree);
+ }
+ };
+ js.runModificationTask(task).commit();
+ }
+
+}
--
To stop receiving notification emails like this one, please contact
[email protected].
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists