IDEA-220832 Create File intention: don't suggest generated sources root as possible target

GitOrigin-RevId: 302317ca1cb6bbcb71604d58db3b1d2f7c5480ee
This commit is contained in:
Yuriy Artamonov
2019-08-19 13:03:31 +03:00
committed by intellij-monorepo-bot
parent a982e6f7d6
commit 947520872e
4 changed files with 60 additions and 8 deletions
@@ -30,6 +30,28 @@ class CreateFilePathFixTest : CreateFileQuickFixTestCase() {
"/main/java/pkg/ClassWithFileReference.java")
}
fun testCreatePathExcludesGeneratedSources() {
myFixture.configureFromTempProjectFile("/main/java/pkg/ClassWithFileReference.java")
myFixture.testHighlighting(true, false, true)
withFileReferenceInStringLiteral {
val ref = myFixture.getReferenceAtCaretPosition()
val fileReference = (ref as PsiMultiReference).references.filterIsInstance<FileReference>()[0]
assertEquals("my.properties", fileReference.fileNameToCreate)
val intention = fileReference.quickFixes!![0]
val options = (intention as CreateFilePathFix).myDirectories
assertEquals(4, options.size)
assertEquals("/src/main/resources", getPresentableText(options[0]))
assertEquals("/src/test/resources", getPresentableText(options[1]))
assertEquals("/src/main/java", getPresentableText(options[2]))
assertEquals("/src/test/java", getPresentableText(options[3]))
}
}
fun testCreatePathInSources() {
ApplicationManager.getApplication().runWriteAction {
// only src/main/java and /src/test/java will be available for new files
@@ -91,4 +113,8 @@ class CreateFilePathFixTest : CreateFileQuickFixTestCase() {
myFixture.checkResult("", true)
}
}
private fun getPresentableText(dir: TargetDirectory) : String {
return dir.directory!!.virtualFile.presentableUrl
}
}
@@ -17,6 +17,7 @@ import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.java.JavaResourceRootType;
import org.jetbrains.jps.model.java.JavaSourceRootProperties;
import org.jetbrains.jps.model.java.JavaSourceRootType;
public abstract class CreateFileQuickFixTestCase extends LightJavaCodeInsightFixtureTestCase {
@@ -38,6 +39,10 @@ public abstract class CreateFileQuickFixTestCase extends LightJavaCodeInsightFix
contentEntry.addSourceFolder(contentEntryUrl + "/main/java", JavaSourceRootType.SOURCE);
contentEntry.addSourceFolder(contentEntryUrl + "/main/resources", JavaResourceRootType.RESOURCE);
JavaSourceRootProperties generatedProperties = JavaSourceRootType.SOURCE.createDefaultProperties();
generatedProperties.setForGeneratedSources(true);
contentEntry.addSourceFolder(contentEntryUrl + "/main/gen", JavaSourceRootType.SOURCE, generatedProperties);
contentEntry.addSourceFolder(contentEntryUrl + "/test/java", JavaSourceRootType.TEST_SOURCE);
contentEntry.addSourceFolder(contentEntryUrl + "/test/resources", JavaResourceRootType.TEST_RESOURCE);
}
@@ -11,8 +11,11 @@ import com.intellij.psi.PsiFileSystemItem;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
import org.jetbrains.jps.model.java.JavaResourceRootType;
import org.jetbrains.jps.model.java.JavaSourceRootProperties;
import org.jetbrains.jps.model.java.JavaSourceRootType;
import org.jetbrains.jps.model.module.JpsModuleSourceRoot;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import java.util.Collection;
@@ -22,6 +25,9 @@ public final class JpsFileTargetContextSorter {
private JpsFileTargetContextSorter() {
}
/**
* Sorts target contexts depending on their {@link JpsModuleSourceRootType} and filters out generated source directories.
*/
public static Collection<FileTargetContext> sortTargetContextsResourceFirst(@NotNull Project project,
@NotNull VirtualFile file,
@NotNull Collection<FileTargetContext> targetContexts) {
@@ -30,7 +36,18 @@ public final class JpsFileTargetContextSorter {
return targetContexts;
}
List<FileTargetContextWrapper> targetContextWrappers = findSourceRootTypes(targetContexts);
List<FileTargetContextWrapper> targetContextWrappers = ContainerUtil.filter(findSourceRootTypes(targetContexts), tc -> {
if (tc.getJpsModuleSourceRoot() == null) {
return true;
}
JavaSourceRootProperties srcProperties = tc.getJpsModuleSourceRoot().getProperties(JavaModuleSourceRootTypes.SOURCES);
if (srcProperties == null) {
return true;
}
return !srcProperties.isForGeneratedSources();
});
// sort only if we have different source root types
if (hasEqualSourceRootTypes(targetContextWrappers)) {
@@ -81,7 +98,7 @@ public final class JpsFileTargetContextSorter {
sourceFolder = getSourceFolder(project, file);
}
return new FileTargetContextWrapper(c, sourceFolder != null ? sourceFolder.getRootType() : null);
return new FileTargetContextWrapper(c, sourceFolder);
});
}
@@ -165,20 +182,24 @@ public final class JpsFileTargetContextSorter {
private static class FileTargetContextWrapper {
private final FileTargetContext myTargetContext;
private final JpsModuleSourceRootType<?> myRootType;
private final SourceFolder mySourceFolder;
private FileTargetContextWrapper(FileTargetContext context, @Nullable JpsModuleSourceRootType<?> type) {
private FileTargetContextWrapper(FileTargetContext context, @Nullable SourceFolder sourceFolder) {
myTargetContext = context;
myRootType = type;
mySourceFolder = sourceFolder;
}
private FileTargetContext getTargetContext() {
public FileTargetContext getTargetContext() {
return myTargetContext;
}
@Nullable
private JpsModuleSourceRootType<?> getSourceRootType() {
return myRootType;
public JpsModuleSourceRootType<?> getSourceRootType() {
return mySourceFolder != null ? mySourceFolder.getRootType() : null;
}
private JpsModuleSourceRoot getJpsModuleSourceRoot() {
return mySourceFolder != null ? mySourceFolder.getJpsElement() : null;
}
}
}