package com.redhat.ceylon.test.eclipse.plugin.launch; import static com.redhat.ceylon.eclipse.core.builder.CeylonBuilder.getProjectDeclaredSourceModules; import org.eclipse.core.expressions.PropertyTester; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.ui.IFileEditorInput; import com.redhat.ceylon.model.typechecker.model.Module; import com.redhat.ceylon.test.eclipse.plugin.CeylonTestPlugin; import com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil; public class CeylonTestPropertyTester extends PropertyTester { private static final String CAN_LAUNCH_AS_CEYLON_TEST_PROPERTY = "canLaunchAsCeylonTest"; @Override public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { if (CAN_LAUNCH_AS_CEYLON_TEST_PROPERTY.equals(property)) { if (receiver instanceof IProject) { return isProjectWithAtLeastOneTestableModule((IProject) receiver); } else if (receiver instanceof IJavaProject) { return isProjectWithAtLeastOneTestableModule(((IJavaProject) receiver).getProject()); } else if (receiver instanceof IPackageFragmentRoot) { return isFolderWithAtLeastOneTestableModule((IPackageFragmentRoot) receiver); } else if (receiver instanceof IPackageFragment) { return isPackageFromTestableModule((IPackageFragment) receiver); } else if (receiver instanceof IFile) { return isFileFromTestableModule((IFile) receiver); } else if (receiver instanceof IFileEditorInput) { return isFileFromTestableModule(((IFileEditorInput) receiver).getFile()); } } return false; } private boolean isProjectWithAtLeastOneTestableModule(IProject project) { for (Module module : getProjectDeclaredSourceModules(project)) { if (CeylonTestUtil.containsCeylonTestImport(module)) { return true; } } return false; } private boolean isFolderWithAtLeastOneTestableModule(IPackageFragmentRoot packageFragmentRoot) { try { IJavaElement[] children = packageFragmentRoot.getChildren(); for (IJavaElement child : children) { if (child instanceof IPackageFragment) { IPackageFragment packageFragment = (IPackageFragment) child; if (isPackageFromTestableModule(packageFragment)) { return true; } } } } catch (JavaModelException e) { return false; } return false; } private boolean isPackageFromTestableModule(IPackageFragment packageFragment) { IProject project = packageFragment.getJavaProject().getProject(); String packageFragmentName = packageFragment.getElementName(); for (Module module : getProjectDeclaredSourceModules(project)) { String moduleName = module.getNameAsString(); if (packageFragmentName.equals(moduleName) || packageFragmentName.startsWith(moduleName + ".")) { return CeylonTestUtil.containsCeylonTestImport(module); } } return false; } private boolean isFileFromTestableModule(IFile file) { try { IJavaProject javaProject = JavaCore.create(file.getProject()); IPackageFragment packageFragment = javaProject.findPackageFragment(file.getParent().getFullPath()); return packageFragment!=null && isPackageFromTestableModule(packageFragment); } catch (JavaModelException e) { CeylonTestPlugin.logError("", e); } return false; } }