protected RunnerAndConfigurationSettings createConfigurationByElement( final Location location, final ConfigurationContext context) { final PsiElement element = location.getPsiElement(); final PsiFile file = element.getContainingFile(); if (!(file instanceof GroovyFile)) { return null; } GroovyFile groovyFile = (GroovyFile) file; final PsiClass aClass = GroovyRunnerUtil.getRunningClass(location.getPsiElement()); if (aClass instanceof GroovyScriptClass || GroovyRunnerUtil.isRunnable(aClass)) { final RunnerAndConfigurationSettings settings = createConfiguration(aClass); if (settings != null) { mySourceElement = element; final GroovyScriptRunConfiguration configuration = (GroovyScriptRunConfiguration) settings.getConfiguration(); GroovyScriptTypeDetector.getScriptType(groovyFile) .tuneConfiguration(groovyFile, configuration, location); return settings; } } if (file.getText().contains("@Grab")) { ApplicationConfigurationProducer producer = new ApplicationConfigurationProducer(); ConfigurationFromContext settings = producer.createConfigurationFromContext(context); if (settings != null) { PsiElement src = settings.getSourceElement(); mySourceElement = src; return createConfiguration( src instanceof PsiMethod ? ((PsiMethod) src).getContainingClass() : (PsiClass) src); } return null; } else { return null; } }
@Override public void onFirstRun( ConfigurationFromContext configuration, ConfigurationContext context, Runnable startRunnable) { KtNamedDeclaration declarationToRun = getDeclarationToRun(configuration.getSourceElement()); final PsiNamedElement lightElement = CollectionsKt.firstOrNull(LightClassUtilsKt.toLightElements(declarationToRun)); // Copied from TestNGInClassConfigurationProducer.onFirstRun() if (lightElement instanceof PsiMethod || lightElement instanceof PsiClass) { PsiMethod psiMethod; PsiClass containingClass; if (lightElement instanceof PsiMethod) { psiMethod = (PsiMethod) lightElement; containingClass = psiMethod.getContainingClass(); } else { psiMethod = null; containingClass = (PsiClass) lightElement; } InheritorChooser inheritorChooser = new InheritorChooser() { @Override protected void runForClasses( List<PsiClass> classes, PsiMethod method, ConfigurationContext context, Runnable performRunnable) { ((TestNGConfiguration) context.getConfiguration().getConfiguration()) .bePatternConfiguration(classes, method); super.runForClasses(classes, method, context, performRunnable); } @Override protected void runForClass( PsiClass aClass, PsiMethod psiMethod, ConfigurationContext context, Runnable performRunnable) { if (lightElement instanceof PsiMethod) { Project project = psiMethod.getProject(); MethodLocation methodLocation = new MethodLocation(project, psiMethod, PsiLocation.fromPsiElement(aClass)); ((TestNGConfiguration) context.getConfiguration().getConfiguration()) .setMethodConfiguration(methodLocation); } else { ((TestNGConfiguration) context.getConfiguration().getConfiguration()) .setClassConfiguration(aClass); } super.runForClass(aClass, psiMethod, context, performRunnable); } }; if (inheritorChooser.runMethodInAbstractClass( context, startRunnable, psiMethod, containingClass, new Condition<PsiClass>() { @Override public boolean value(PsiClass aClass) { return aClass.hasModifierProperty(PsiModifier.ABSTRACT) && TestNGUtil.hasTest(aClass); } })) return; } super.onFirstRun(configuration, context, startRunnable); }