From ccc9e29492d9e57269e47fed6d62a0f164cee752 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 5 Oct 2018 14:34:07 +0700 Subject: [PATCH] IDEA-200005 Suggest to use Files.readString/writeString since Java 11 --- java/java-impl/src/META-INF/JavaPlugin.xml | 5 + .../ReadWriteStringCanBeUsedInspection.java | 137 ++++++++++++++++++ .../ReadWriteStringCanBeUsed.html | 8 + .../filesReadWriteString/afterReadString.java | 21 +++ .../afterWriteString.java | 27 ++++ .../beforeReadString.java | 15 ++ .../beforeWriteString.java | 22 +++ ...eadWriteStringCanBeUsedInspectionTest.java | 34 +++++ .../src/messages/InspectionsBundle.properties | 1 + 9 files changed, 270 insertions(+) create mode 100644 java/java-impl/src/com/intellij/codeInspection/ReadWriteStringCanBeUsedInspection.java create mode 100644 java/java-impl/src/inspectionDescriptions/ReadWriteStringCanBeUsed.html create mode 100644 java/java-tests/testData/inspection/filesReadWriteString/afterReadString.java create mode 100644 java/java-tests/testData/inspection/filesReadWriteString/afterWriteString.java create mode 100644 java/java-tests/testData/inspection/filesReadWriteString/beforeReadString.java create mode 100644 java/java-tests/testData/inspection/filesReadWriteString/beforeWriteString.java create mode 100644 java/java-tests/testSrc/com/intellij/java/codeInspection/ReadWriteStringCanBeUsedInspectionTest.java diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index 69f75a50c5f9..4909e44208ee 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -734,6 +734,11 @@ groupKey="group.names.language.level.specific.issues.and.migration.aids9" enabledByDefault="true" level="WARNING" implementationClass="com.intellij.codeInspection.java19api.Java9CollectionFactoryInspection" displayName="Immutable collection creation can be replaced with collection factory call"/> + + +Reports code fragments which could be replaced via methods Files.readString and Files.writeString + which were introduced in Java 11. + +

New in 2018.3

+ + \ No newline at end of file diff --git a/java/java-tests/testData/inspection/filesReadWriteString/afterReadString.java b/java/java-tests/testData/inspection/filesReadWriteString/afterReadString.java new file mode 100644 index 000000000000..4468f515eaa3 --- /dev/null +++ b/java/java-tests/testData/inspection/filesReadWriteString/afterReadString.java @@ -0,0 +1,21 @@ +// "Fix all ''Files.readString()' or 'Files.writeString()' can be used' problems in file" "true" +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class Example { + void testRead1() throws IOException { + String s = Files.readString(Paths.get("/etc/passwd"), StandardCharsets.ISO_8859_1); + } + + void testRead2() throws IOException { + /*3*/ + /*4*/ + /*8*/ + /*9*/ + /*1*/ + /*2*/ + String s = Files/*5*/./*6*/readString(/*7*/Paths.get("/etc/passwd")); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/filesReadWriteString/afterWriteString.java b/java/java-tests/testData/inspection/filesReadWriteString/afterWriteString.java new file mode 100644 index 000000000000..60d8fc71ddd5 --- /dev/null +++ b/java/java-tests/testData/inspection/filesReadWriteString/afterWriteString.java @@ -0,0 +1,27 @@ +// "Fix all ''Files.readString()' or 'Files.writeString()' can be used' problems in file" "true" +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; + +public class Example { + void test1() throws IOException { + /*1*/ + /*3*/ + /*4*/ + /*5*/ + Files.writeString(Paths.get("/etc/passwd"), "foo"/*2*/+"bar", StandardCharsets.ISO_8859_1/*6*/, StandardOpenOption.CREATE); + } + + void test2() throws IOException { + /*3*/ + /*1*/ + /*2*/ + Files.writeString(Paths.get("/etc/passwd"), "foo"); + } + + void test3() throws IOException { + Files.writeString(Paths.get("/etc/passwd"), "foo"); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/filesReadWriteString/beforeReadString.java b/java/java-tests/testData/inspection/filesReadWriteString/beforeReadString.java new file mode 100644 index 000000000000..90e441b9561a --- /dev/null +++ b/java/java-tests/testData/inspection/filesReadWriteString/beforeReadString.java @@ -0,0 +1,15 @@ +// "Fix all ''Files.readString()' or 'Files.writeString()' can be used' problems in file" "true" +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class Example { + void testRead1() throws IOException { + String s = new String(Files.readAllBytes(Paths.get("/etc/passwd")), StandardCharsets.ISO_8859_1); + } + + void testRead2() throws IOException { + String s = new /*3*/String(/*4*/Files/*5*/./*6*/readAllBytes(/*7*/Paths.get("/etc/passwd"))/*8*/, /*9*/(StandardCharsets./*1*/UTF_8/*2*/)); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/filesReadWriteString/beforeWriteString.java b/java/java-tests/testData/inspection/filesReadWriteString/beforeWriteString.java new file mode 100644 index 000000000000..aaf77767b6cc --- /dev/null +++ b/java/java-tests/testData/inspection/filesReadWriteString/beforeWriteString.java @@ -0,0 +1,22 @@ +// "Fix all ''Files.readString()' or 'Files.writeString()' can be used' problems in file" "true" +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; + +public class Example { + void test1() throws IOException { + byte[] /*1*/bytes = ("foo"/*2*/+"bar")./*3*/getBytes(StandardCharsets.ISO_8859_1/*4*/)/*5*/; + Files.write(Paths.get("/etc/passwd"), bytes/*6*/, StandardOpenOption.CREATE); + } + + void test2() throws IOException { + byte[] bytes = "foo".getBytes(StandardCharsets.UTF_8/*3*/); + Files.write(Paths.get("/etc/passwd"), (/*1*/bytes/*2*/)); + } + + void test3() throws IOException { + Files.write(Paths.get("/etc/passwd"), (("foo").getBytes(StandardCharsets.UTF_8))); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/ReadWriteStringCanBeUsedInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/ReadWriteStringCanBeUsedInspectionTest.java new file mode 100644 index 000000000000..421c2895a708 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/ReadWriteStringCanBeUsedInspectionTest.java @@ -0,0 +1,34 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.java.codeInspection; + +import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase; +import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.codeInspection.ReadWriteStringCanBeUsedInspection; +import com.intellij.codeInspection.java19api.Java9CollectionFactoryInspection; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.pom.java.LanguageLevel; +import com.intellij.testFramework.IdeaTestUtil; +import org.jetbrains.annotations.NotNull; + +public class ReadWriteStringCanBeUsedInspectionTest extends LightQuickFixParameterizedTestCase { + @Override + protected LanguageLevel getDefaultLanguageLevel() { + return LanguageLevel.JDK_11; + } + + @NotNull + @Override + protected LocalInspectionTool[] configureLocalInspectionTools() { + return new LocalInspectionTool[]{new ReadWriteStringCanBeUsedInspection()}; + } + + @Override + protected Sdk getProjectJDK() { + return IdeaTestUtil.getMockJdk9(); + } + + @Override + protected String getBasePath() { + return "/inspection/filesReadWriteString"; + } +} diff --git a/platform/platform-resources-en/src/messages/InspectionsBundle.properties b/platform/platform-resources-en/src/messages/InspectionsBundle.properties index e83322948176..38ec6f8ef7b2 100644 --- a/platform/platform-resources-en/src/messages/InspectionsBundle.properties +++ b/platform/platform-resources-en/src/messages/InspectionsBundle.properties @@ -584,6 +584,7 @@ group.names.language.level.specific.issues.and.migration.aids8=Java 8 group.names.language.level.specific.issues.and.migration.aids9=Java 9 group.names.language.level.specific.issues.and.migration.aids5=Java 5 group.names.language.level.specific.issues.and.migration.aids10=Java 10 +group.names.language.level.specific.issues.and.migration.aids11=Java 11 group.names.language.level.specific.issues.and.migration.aids12=Java 12 group.names.javabeans.issues=JavaBeans issues group.names.inheritance.issues=Inheritance issues