Creating a new class

At some point in my plugin i want to create a new class in a given package in the current module from a class template.

Although this sounds simple is has lots of things that have to be taken care of before you actually create the class. Some of these are:

- What if the package doesn't exist ? I have to check if the package is created and if not create it myself.
- In which source root should the class/package be created ? I have to implement a source root selector dialog for this.

There may be more but these are the ones i thought of instantly.

Anyway, the question is:

Is there anything in the open api that already takes care of all this for me ?



At least if i can use the source root selector dialog that IDEA has ?


You might find some useful stuff for that in com.intellij.ide.util.PackageUtil



Once you locate the source root directory (there are several ways of doing so) you can use the following methods to create the directory structure for a package. Note that they will only create a new directory if it does not already exist. Also, be sure to use these inside a WriteCommandAction.

public static PsiDirectory createDirectory(PsiDirectory parent, String name)
throws IncorrectOperationException {
PsiDirectory result = null;

for (PsiDirectory dir : parent.getSubdirectories()) {
if (dir.getName().equalsIgnoreCase(name)) {
result = dir;

if (null == result) {
result = parent.createSubdirectory(name);

return result;
} // createDirectory()

public static PsiDirectory createPackage(PsiDirectory sourceDir, String qualifiedPackage)
throws IncorrectOperationException {
PsiDirectory parent = sourceDir;
StringTokenizer token = new StringTokenizer(qualifiedPackage, ".");
while (token.hasMoreTokens()) {
String dirName = token.nextToken();
parent = createDirectory(parent, dirName);
return parent;
} // createPackage()



I am asking how to add or create a new java class in a PsiDirectory ?


You can use JavaDirectoryService class. The class has several methods that allows you to create a java class in a given directory

JavaDirectoryService.createClass(PsiDirectory dir, String name) -- allows you to create a java class in a a given directory.

Or you can use

JavaDirectoryService.createClass(PsiDirectory dir, String name, String templateName)  -- allows to create a java class using file template

and specify a file template for this. If you going to use templates you should create freemarketer template and register it in plugin.xml via <internalFileTemplate> extention point.