{"record":{"id":"5060c54813300f43","repo":"JetBrains/intellij-community","slug":"cannot-create-class-file","errorCode":null,"errorMessage":"Cannot create class-file","messagePattern":"Cannot create class-file","errorType":"exception","errorClass":"IncorrectOperationException","httpStatus":null,"severity":"error","filePath":"java/java-impl/src/com/intellij/psi/impl/file/PsiJavaDirectoryImpl.java","lineNumber":45,"sourceCode":"import com.intellij.psi.PsiClass;\nimport com.intellij.psi.PsiElement;\nimport com.intellij.psi.PsiPackage;\nimport com.intellij.psi.impl.PsiManagerEx;\nimport com.intellij.util.IncorrectOperationException;\nimport org.jetbrains.annotations.NotNull;\n\npublic class PsiJavaDirectoryImpl extends PsiDirectoryImpl {\n  private static final Logger LOG = Logger.getInstance(PsiJavaDirectoryImpl.class);\n\n  PsiJavaDirectoryImpl(@NotNull PsiManagerEx manager, @NotNull VirtualFile file) {\n    super(manager, file);\n  }\n\n  @Override\n  public void checkCreateFile(@NotNull String name) throws IncorrectOperationException {\n    FileType type = FileTypeManager.getInstance().getFileTypeByFileName(name);\n    if (type == JavaClassFileType.INSTANCE && ProjectRootManager.getInstance(getProject()).getFileIndex().isInSource(getVirtualFile())) {\n      throw new IncorrectOperationException(\"Cannot create class-file\");\n    }\n\n    super.checkCreateFile(name);\n  }\n\n  @Override\n  public PsiElement add(@NotNull PsiElement element) throws IncorrectOperationException {\n    if (element instanceof PsiClass) {\n      String name = ((PsiClass)element).getName();\n      if (name != null) {\n        PsiClass newClass = JavaDirectoryService.getInstance().createClass(this, name);\n        return newClass.replace(element);\n      }\n      else {\n        LOG.error(\"not implemented\");\n        return null;\n      }\n    }","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/JetBrains/intellij-community/blob/be881553f2a76ac8b4ea53950d93f0de78295c19/java/java-impl/src/com/intellij/psi/impl/file/PsiJavaDirectoryImpl.java#L27-L63","documentation":"Thrown by PsiJavaDirectoryImpl.checkCreateFile() when a file whose type resolves to JavaClassFileType (.class) is about to be created inside a directory that the project file index reports as source (isInSource). The platform forbids writing compiled .class files into source roots via PSI directory APIs. It is an IncorrectOperationException raised before the file is created.","triggerScenarios":"Calling PsiDirectory.checkCreateFile(\"Foo.class\") or createFile with a .class name where the directory is under a marked source root; plugin code that copies build output back into src/; templates or generators emitting .class artifacts into source directories.","commonSituations":"A plugin copies compiled classes next to sources; a user drags a .class file into a source folder through an IDE action backed by checkCreateFile; build scripts or code generators misconfigured to output into src/main/java instead of build output.","solutions":["Write .class files to the module's build output directory or a plain (non-source) directory instead of a source root.","Fix the generator/build configuration so compiled artifacts go to the compiler output path, not src/.","If the directory should hold .class files (e.g. resource bundles), unmark it as source root in Project Structure > Modules."],"exampleFix":"// before\nVirtualFile srcDir = ...; // source root\ndir.createFile(\"Foo.class\"); // throws\n// after\nVirtualFile outDir = CompilerPaths.getModuleOutputDirectory(module, false);\noutDir.createChildData(this, \"Foo.class\");","handlingStrategy":"validation","validationCode":"FileType type = FileTypeManager.getInstance().getFileTypeByFileName(fileName);\nboolean isSource = ProjectRootManager.getInstance(project).getFileIndex().isInSource(dir.getVirtualFile());\nif (type == JavaClassFileType.INSTANCE && isSource) {\n  // redirect output to build directory instead of dir.createFile(fileName)\n}","typeGuard":null,"tryCatchPattern":"try { dir.checkCreateFile(\"Foo.class\"); } catch (IncorrectOperationException e) { /* .class into source root forbidden; choose output dir */ }","preventionTips":["Never write compiled artifacts into source roots; target compiler output directories.","In generators, derive the destination from CompilerPaths/module output, not from the source PsiDirectory.","Mark directories meant for raw resources as excluded or resource roots, not sources."],"tags":["java","class-file","source-root","intellij-platform"],"backgroundTag":null,"analyzedSha":"be881553f2a76ac8b4ea53950d93f0de78295c19","analyzedAt":"2026-08-14T14:13:06.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}