lang-api
[idea/community.git] / platform / lang-api / src / com / intellij / ide / util / EditSourceUtil.java
1 package com.intellij.ide.util;
2
3 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
4 import com.intellij.openapi.vfs.VirtualFile;
5 import com.intellij.pom.Navigatable;
6 import com.intellij.psi.PsiElement;
7 import com.intellij.psi.PsiFile;
8 import com.intellij.psi.util.PsiUtilBase;
9 import org.jetbrains.annotations.Nullable;
10
11 public class EditSourceUtil {
12   private EditSourceUtil() {
13   }
14
15   @Nullable
16   public static Navigatable getDescriptor(final PsiElement element) {
17     if (!canNavigate(element)) {
18       return null;
19     }
20     final PsiElement navigationElement = element.getNavigationElement();
21     final int offset = navigationElement instanceof PsiFile ? -1 : navigationElement.getTextOffset();
22     final VirtualFile virtualFile = PsiUtilBase.getVirtualFile(navigationElement);
23     if (virtualFile == null || !virtualFile.isValid()) {
24       return null;
25     }
26     return new OpenFileDescriptor(navigationElement.getProject(), virtualFile, offset);
27   }
28
29   public static boolean canNavigate (PsiElement element) {
30     if (element == null || !element.isValid()) {
31       return false;
32     }
33     final PsiElement navigationElement = element.getNavigationElement();
34     final VirtualFile virtualFile = PsiUtilBase.getVirtualFile(navigationElement);
35     return virtualFile != null && virtualFile.isValid();
36   }
37 }