diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml
index 7258b1c9eff9..7f61a9f28a07 100644
--- a/java/java-impl/src/META-INF/JavaPlugin.xml
+++ b/java/java-impl/src/META-INF/JavaPlugin.xml
@@ -220,6 +220,7 @@
+
diff --git a/java/java-impl/src/com/intellij/ide/actions/JavaVirtualFileQualifiedNameProvider.java b/java/java-impl/src/com/intellij/ide/actions/JavaVirtualFileQualifiedNameProvider.java
new file mode 100644
index 000000000000..2be9019e8e49
--- /dev/null
+++ b/java/java-impl/src/com/intellij/ide/actions/JavaVirtualFileQualifiedNameProvider.java
@@ -0,0 +1,51 @@
+// 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.ide.actions;
+
+import com.intellij.openapi.module.JavaModuleType;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleType;
+import com.intellij.openapi.module.ModuleUtilCore;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ProjectFileIndex;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.util.LogicalRoot;
+import com.intellij.util.LogicalRootsManager;
+import com.intellij.util.ObjectUtils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class JavaVirtualFileQualifiedNameProvider implements CopyReferenceAction.VirtualFileQualifiedNameProvider {
+ @Nullable
+ @Override
+ public String getQualifiedName(@NotNull Project project, @NotNull VirtualFile virtualFile) {
+ Module module = ModuleUtilCore.findModuleForFile(virtualFile, project);
+ if (module == null || !ModuleType.is(module, JavaModuleType.getModuleType())) {
+ return null;
+ }
+
+ final LogicalRoot logicalRoot = LogicalRootsManager.getLogicalRootsManager(project).findLogicalRoot(virtualFile);
+ VirtualFile logicalRootFile = logicalRoot != null ? logicalRoot.getVirtualFile() : null;
+ if (logicalRootFile != null && !virtualFile.equals(logicalRootFile)) {
+ return ObjectUtils.assertNotNull(VfsUtilCore.getRelativePath(virtualFile, logicalRootFile, '/'));
+ }
+
+ VirtualFile outerMostRoot = null;
+ VirtualFile each = virtualFile;
+ ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
+ while (each != null && (each = index.getContentRootForFile(each, false)) != null) {
+ outerMostRoot = each;
+ each = each.getParent();
+ }
+
+ if (outerMostRoot != null && !outerMostRoot.equals(virtualFile)) {
+ String relative = VfsUtilCore.getRelativePath(virtualFile, outerMostRoot, '/');
+ if (relative != null) {
+ return relative;
+ }
+ }
+
+ return virtualFile.getPath();
+ }
+}
diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CopyReferenceAction.java b/platform/lang-impl/src/com/intellij/ide/actions/CopyReferenceAction.java
index ecc30cd92310..912dab01c532 100644
--- a/platform/lang-impl/src/com/intellij/ide/actions/CopyReferenceAction.java
+++ b/platform/lang-impl/src/com/intellij/ide/actions/CopyReferenceAction.java
@@ -20,31 +20,33 @@ import com.intellij.codeInsight.daemon.impl.IdentifierUtil;
import com.intellij.codeInsight.highlighting.HighlightManager;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.dnd.FileCopyPasteUtil;
+import com.intellij.ide.scratch.RootType;
+import com.intellij.ide.scratch.ScratchFileService;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.markup.TextAttributes;
+import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.ide.CopyPasteManager;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.ProjectFileIndex;
-import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.ex.StatusBarEx;
import com.intellij.psi.*;
import com.intellij.util.ArrayUtilRt;
-import com.intellij.util.LogicalRoot;
-import com.intellij.util.LogicalRootsManager;
-import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -53,6 +55,7 @@ import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
@@ -288,28 +291,53 @@ public class CopyReferenceAction extends DumbAwareAction {
return virtualFile == null ? file.getName() : getVirtualFileFqn(virtualFile, file.getProject());
}
+ @NotNull
private static String getVirtualFileFqn(@NotNull VirtualFile virtualFile, @NotNull Project project) {
- final LogicalRoot logicalRoot = LogicalRootsManager.getLogicalRootsManager(project).findLogicalRoot(virtualFile);
- VirtualFile logicalRootFile = logicalRoot != null ? logicalRoot.getVirtualFile() : null;
- if (logicalRootFile != null && !virtualFile.equals(logicalRootFile)) {
- return ObjectUtils.assertNotNull(VfsUtilCore.getRelativePath(virtualFile, logicalRootFile, '/'));
+ for (VirtualFileQualifiedNameProvider provider : Extensions.getExtensions(VirtualFileQualifiedNameProvider.EP_NAME)) {
+ String qualifiedName = provider.getQualifiedName(project, virtualFile);
+ if (qualifiedName != null) {
+ return qualifiedName;
+ }
}
- VirtualFile outerMostRoot = null;
- VirtualFile each = virtualFile;
- ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
- while (each != null && (each = index.getContentRootForFile(each, false)) != null) {
- outerMostRoot = each;
- each = each.getParent();
+ Module module = ModuleUtilCore.findModuleForFile(virtualFile, project);
+ if (module != null) {
+ for (VirtualFile root : ModuleRootManager.getInstance(module).getContentRoots()) {
+ String relativePath = VfsUtilCore.getRelativePath(virtualFile, root);
+ if (relativePath != null) {
+ return relativePath;
+ }
+ }
}
- if (outerMostRoot != null && !outerMostRoot.equals(virtualFile)) {
- String relative = VfsUtilCore.getRelativePath(virtualFile, outerMostRoot, '/');
- if (relative != null) {
- return relative;
+ String relativePath = VfsUtilCore.getRelativePath(virtualFile, project.getBaseDir());
+ if (relativePath != null) {
+ return relativePath;
+ }
+
+ RootType rootType = RootType.forFile(virtualFile);
+ if (rootType != null) {
+ VirtualFile scratchRootVirtualFile =
+ VfsUtil.findFileByIoFile(new File(ScratchFileService.getInstance().getRootPath(rootType)), false);
+ if (scratchRootVirtualFile != null) {
+ String scratchRelativePath = VfsUtilCore.getRelativePath(virtualFile, scratchRootVirtualFile);
+ if (scratchRelativePath != null) {
+ return scratchRelativePath;
+ }
}
}
return virtualFile.getPath();
}
+
+ public interface VirtualFileQualifiedNameProvider {
+ ExtensionPointName EP_NAME =
+ ExtensionPointName.create("com.intellij.virtualFileQualifiedNameProvider");
+
+ /**
+ * @return {@code virtualFile} fqn (relative path for example) or null if not handled by this provider
+ */
+ @Nullable
+ String getQualifiedName(@NotNull Project project, @NotNull VirtualFile virtualFile);
+ }
}
diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
index 755ef2cf648f..a47a2f113dcf 100644
--- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
+++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
@@ -641,6 +641,8 @@
+