Skip to content

Commit

Permalink
Merge pull request #144 from zjhmale/create-file
Browse files Browse the repository at this point in the history
Improve create Haskell file action
  • Loading branch information
rikvdkleij committed Feb 5, 2017
2 parents f280b85 + 6bff12b commit da5a67a
Showing 1 changed file with 92 additions and 4 deletions.
Expand Up @@ -16,12 +16,19 @@

package intellij.haskell.action

import com.intellij.ide.actions.CreateFileFromTemplateAction
import java.io.File
import java.text.ParseException

import com.intellij.ide.actions.CreateFileFromTemplateDialog.Builder
import com.intellij.ide.actions.{CreateFileAction, CreateFileFromTemplateAction}
import com.intellij.ide.fileTemplates.{FileTemplate, FileTemplateManager, FileTemplateUtil}
import com.intellij.ide.util.PropertiesComponent
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.{DumbAware, Project}
import com.intellij.openapi.ui.InputValidatorEx
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.ui.{InputValidatorEx, Messages}
import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiDirectory
import com.intellij.psi.{PsiDirectory, PsiFile}
import intellij.haskell.HaskellIcons

object CreateHaskellFileAction {
Expand All @@ -42,7 +49,13 @@ class CreateHaskellFileAction extends CreateFileFromTemplateAction(CreateHaskell
}

def getErrorText(inputString: String): String = {
if (!StringUtil.isCapitalized(inputString)) {
val checkString = if (inputString.contains(".")) {
inputString.trim.split("\\.").last
} else {
inputString
}

if (!StringUtil.isCapitalized(checkString)) {
s"'$inputString' is not a valid Haskell module name"
} else {
null
Expand All @@ -51,6 +64,81 @@ class CreateHaskellFileAction extends CreateFileFromTemplateAction(CreateHaskell
})
}

private def createFileFromTemplate(pathItems: Option[List[String]], fileName: String, template: FileTemplate, fileDir: PsiDirectory): PsiFile = {
pathItems match {
case None => null
case Some(items) =>
// Adapted from super definition.
val mkdirs = new CreateFileAction.MkDirs(fileName, fileDir)
val name = mkdirs.newName
val dir = mkdirs.directory
val project = dir.getProject

val nameWithmodulePrefix = if (invalidPathItems(items) || items.isEmpty) {
name
} else {
items.mkString(".") + "." + name
}

// Patch props with custom property.
val props = FileTemplateManager.getInstance(project).getDefaultProperties()
props.setProperty("NAME", nameWithmodulePrefix)

val element = FileTemplateUtil.createFromTemplate(template, name, props, dir)
val psiFile = element.getContainingFile

try {
val virtualFile = Option(psiFile.getVirtualFile)

virtualFile.foreach(vFile => {
FileEditorManager.getInstance(project).openFile(vFile, true)
Option(getDefaultTemplateProperty).foreach(defaultTemplateProperty => {
PropertiesComponent.getInstance(project).setValue(defaultTemplateProperty, template.getName)
})
})
} catch {
case e: ParseException => Messages.showErrorDialog(project, "Error parsing Haskell Module template: " + e.getMessage, "Create File from Template");
}

psiFile
}
}

override def createFileFromTemplate(fileName: String, template: FileTemplate, fileDir: PsiDirectory): PsiFile = {
val path = fileDir.getVirtualFile.getPath
val pathItems = ProjectRootManager.getInstance(fileDir.getProject)
.getContentSourceRoots
.map(_.getPath)
.find(path.startsWith)
.map(s => if (s != path) {
path.replace(s + File.separator, "").split(File.separator).toList
} else {
List()
})

if (fileName.contains(".")) {
var targetDir = fileDir
val names = fileName.trim().split("\\.").toList
val moduleName = names.last
val prefixes = names.dropRight(1)

prefixes.foreach(dirName => {
targetDir = Option(targetDir.findSubdirectory(dirName)).getOrElse(targetDir.createSubdirectory(dirName))
})

createFileFromTemplate(pathItems.map(_ ++ prefixes), moduleName, template, targetDir)
} else {
createFileFromTemplate(pathItems, fileName, template, fileDir)
}
}

/**
* Returns true if any directory name starts with a lower case letter.
*/
private def invalidPathItems(pathItems: List[String]): Boolean = {
pathItems.exists(s => s.isEmpty || !StringUtil.isCapitalized(s.substring(0, 1)))
}

protected def getActionName(directory: PsiDirectory, newName: String, templateName: String): String = {
CreateHaskellFileAction.NEW_HASKELL_FILE
}
Expand Down

0 comments on commit da5a67a

Please sign in to comment.