package com.google.jstestdriver.idea.assertFramework.jasmine.codeInsight; import com.google.jstestdriver.idea.assertFramework.codeInsight.AbstractJsGenerateAction; import com.google.jstestdriver.idea.assertFramework.codeInsight.GenerateActionContext; import com.google.jstestdriver.idea.assertFramework.codeInsight.JsGeneratorUtils; import com.google.jstestdriver.idea.assertFramework.jasmine.JasmineFileStructure; import com.google.jstestdriver.idea.assertFramework.jasmine.JasmineFileStructureBuilder; import com.google.jstestdriver.idea.assertFramework.jasmine.JasmineSuiteStructure; import com.google.jstestdriver.idea.util.JsPsiUtils; import com.intellij.codeInsight.template.Template; import com.intellij.lang.javascript.psi.JSFunctionExpression; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; /** * @author Sergey Simonchik */ abstract class JasmineGenerateMissingLifecycleMethodAction extends AbstractJsGenerateAction { @NotNull @Override public abstract String getHumanReadableDescription(); public abstract String getMethodName(); @Override public boolean isEnabled(@NotNull GenerateActionContext context) { Runnable generator = createGenerator(context); return generator != null; } protected Runnable createGenerator(@NotNull GenerateActionContext context) { JasmineSuiteStructure suiteStructure = findSuiteStructure(context); if (suiteStructure == null) { return null; } return createGenerator(context, suiteStructure); } private Runnable createGenerator(@NotNull final GenerateActionContext context, @NotNull final JasmineSuiteStructure suiteStructure) { final PsiElement elementUnderCaret = context.getPsiElementUnderCaret(); if (elementUnderCaret == null) { return null; } return new Runnable() { @Override public void run() { JSFunctionExpression specDefinitions = suiteStructure.getSpecDefinitions(); PsiElement leftBrace = JsPsiUtils.getFunctionLeftBrace(specDefinitions); if (leftBrace == null) { return; } if (elementUnderCaret.getParent() != leftBrace.getParent()) { context.getCaretModel().moveToOffset(leftBrace.getTextRange().getEndOffset()); } Template template = JsGeneratorUtils.createDefaultTemplate(getMethodName() + "(function() {|});"); context.startTemplate(template); } }; } private static JasmineSuiteStructure findSuiteStructure(GenerateActionContext context) { JasmineFileStructureBuilder builder = JasmineFileStructureBuilder.getInstance(); JasmineFileStructure fileStructure = builder.buildTestFileStructure(context.getJsFile()); return fileStructure.findLowestSuiteStructureContainingOffset(context.getDocumentCaretOffset()); } @Override public void actionPerformed(@NotNull GenerateActionContext context) { Runnable generator = createGenerator(context); if (generator != null) { generator.run(); } } }