package org.gsonformat.intellij.common; import com.intellij.ide.util.DirectoryUtil; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.impl.source.PsiJavaFileImpl; import com.intellij.psi.search.EverythingGlobalScope; import com.intellij.psi.search.GlobalSearchScope; import org.apache.http.util.TextUtils; import java.io.File; /** * Created by dim on 15/8/22. */ public class PsiClassUtil { public static PsiClass exist(PsiFile psiFile, String generateClass) { PsiClass psiClass = null; PsiDirectory psiDirectory = getJavaSrc(psiFile); if (psiDirectory == null || psiDirectory.getVirtualFile().getCanonicalPath() == null) { return null; } File file = new File(psiDirectory.getVirtualFile().getCanonicalPath().concat("/") .concat(generateClass.trim().replace(".", "/")).concat(".java")); String[] strArray = generateClass.replace(" ", "").split("\\."); if (TextUtils.isEmpty(generateClass)) { return null; } String className = strArray[strArray.length - 1]; String packName = generateClass.substring(generateClass.length() - className.length(), generateClass.length()); if (file.exists()) { for (int i = 0; i < strArray.length - 1; i++) { psiDirectory = psiDirectory.findSubdirectory(strArray[i]); if (psiDirectory == null) { return null; } } PsiFile psiFile1 = psiDirectory.findFile(className + ".java"); if ((psiFile1 instanceof PsiJavaFile) && ((PsiJavaFile) psiFile1).getClasses().length > 0) { psiClass = ((PsiJavaFile) psiFile1).getClasses()[0]; } } return psiClass; } public static PsiDirectory getJavaSrc(PsiFile psiFile) { PsiDirectory psiDirectory = null; if (psiFile instanceof PsiJavaFileImpl) { String packageName = ((PsiJavaFileImpl) psiFile).getPackageName(); String[] arg = packageName.split("\\."); psiDirectory = psiFile.getContainingDirectory(); for (int i = 0; i < arg.length; i++) { psiDirectory = psiDirectory.getParent(); if (psiDirectory == null) { break; } } } return psiDirectory; } public static File getPackageFile(PsiFile psiFile, String packageName) { PsiDirectory psiDirectory = getJavaSrc(psiFile); if (psiDirectory == null || psiDirectory.getVirtualFile().getCanonicalPath() == null) { return null; } if (packageName == null) { return new File(psiDirectory.getVirtualFile().getCanonicalPath()); } File file = new File(psiDirectory.getVirtualFile().getCanonicalPath().concat("/") .concat(packageName.trim().replace(".", "/"))); if (file.exists()) { return file; } return null; } public static PsiClass getPsiClass(PsiFile psiFile, Project project, String generateClass) throws Throwable { PsiClass psiClass = null; PsiDirectory psiDirectory = getJavaSrc(psiFile); if (psiDirectory == null || psiDirectory.getVirtualFile().getCanonicalPath() == null) { return null; } File file = new File(psiDirectory.getVirtualFile().getCanonicalPath().concat("/") .concat(generateClass.trim().replace(".", "/")).concat(".java")); String[] strArray = generateClass.replace(" ", "").split("\\."); if (TextUtils.isEmpty(generateClass)) { return null; } String className = strArray[strArray.length - 1]; String packName = generateClass.substring(0, generateClass.length() - className.length()); if (file.exists()) { for (int i = 0; i < strArray.length - 1; i++) { psiDirectory = psiDirectory.findSubdirectory(strArray[i]); if (psiDirectory == null) { return null; } } PsiFile psiFile1 = psiDirectory.findFile(className + ".java"); if ((psiFile1 instanceof PsiJavaFile) && ((PsiJavaFile) psiFile1).getClasses().length > 0) { psiClass = ((PsiJavaFile) psiFile1).getClasses()[0]; } if (psiClass != null) { FileEditorManager manager = FileEditorManager.getInstance(project); manager.openFile(psiClass.getContainingFile().getVirtualFile(), true, true); } } else { if (!file.getParentFile().exists() && !TextUtils.isEmpty(packName)) { psiDirectory = createPackageInSourceRoot(packName, psiDirectory); } else { for (int i = 0; i < strArray.length - 1; i++) { psiDirectory = psiDirectory.findSubdirectory(strArray[i]); if (psiDirectory == null) { return null; } } } psiClass = JavaDirectoryService.getInstance().createClass(psiDirectory, className); FileEditorManager manager = FileEditorManager.getInstance(project); manager.openFile(psiClass.getContainingFile().getVirtualFile(), true, true); } return psiClass; } public static PsiDirectory createPackageInSourceRoot(String packageName, PsiDirectory sourcePackageRoot) { return DirectoryUtil.createSubdirectories(packageName, sourcePackageRoot, "."); } private PsiClass getPsiClassByName(Project project, String cls) { GlobalSearchScope searchScope = GlobalSearchScope.allScope(project); JavaPsiFacade javaPsiFacade = JavaPsiFacade.getInstance(project); return javaPsiFacade.findClass(cls, searchScope); } public static String getPackage(PsiClass cls) { if (cls.getQualifiedName() == null) { return null; } int i = cls.getQualifiedName().lastIndexOf("."); return cls.getQualifiedName().substring(0, i); } public static boolean isClassAvailableForProject(Project project, String className) { PsiClass classInModule = JavaPsiFacade.getInstance(project).findClass(className, new EverythingGlobalScope(project)); return classInModule != null; } // public static a(PsiElementFactory factory){ // PsiElement psiElement = cls.addAfter(factory.createCommentFromText("// todo dim " + fieldEntity.getFieldName(), cls), add); //// CharTable charTableByTree = SharedImplUtil.findCharTableByTree( //// (ASTNode) psiElement); //// PsiWhiteSpace psiWhiteSpace = (PsiWhiteSpace) Factory.createSingleLeafElement(TokenType.WHITE_SPACE, "\n\n", //// charTableByTree, PsiManager.getInstance(cls.getProject())); //// cls.addAfter(psiWhiteSpace, psiElement); // } }