package com.redhat.ceylon.eclipse.core.launch; import static com.redhat.ceylon.eclipse.core.launch.ICeylonLaunchConfigurationConstants.CAN_LAUNCH_AS_CEYLON_JAVASCIPT_MODULE; import static com.redhat.ceylon.eclipse.core.launch.ICeylonLaunchConfigurationConstants.CAN_LAUNCH_AS_CEYLON_JAVA_MODULE; import static com.redhat.ceylon.eclipse.core.launch.ICeylonLaunchConfigurationConstants.CAN_LAUNCH_AS_CEYLON_SWARM_PACKAGED_JAVA_MODULE; import static com.redhat.ceylon.eclipse.core.launch.ICeylonLaunchConfigurationConstants.CEYLON_FILE_EXTENSION; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.eclipse.core.expressions.PropertyTester; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.ui.IFileEditorInput; import com.redhat.ceylon.eclipse.code.navigator.SourceModuleNode; import com.redhat.ceylon.eclipse.core.builder.CeylonBuilder; import com.redhat.ceylon.eclipse.core.builder.CeylonNature; import com.redhat.ceylon.model.typechecker.model.Module; import com.redhat.ceylon.model.typechecker.model.ModuleImport; public class CeylonRunPropertyTester extends PropertyTester { @Override public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { IProject project; if (receiver instanceof IProject) { project = (IProject) receiver; } else if (receiver instanceof IJavaProject) { project = ((IJavaProject) receiver).getProject(); } else if (receiver instanceof IPackageFragmentRoot) { IPackageFragmentRoot packageFragmentRoot = (IPackageFragmentRoot) receiver; project = packageFragmentRoot.getJavaProject().getProject(); } else if (receiver instanceof IPackageFragment) { IPackageFragment packageFragment = (IPackageFragment) receiver; project = packageFragment.getJavaProject().getProject(); } else if (receiver instanceof IFile) { IFile file = (IFile) receiver; project = file.getProject(); } else if (receiver instanceof IFileEditorInput) { IFileEditorInput fileEditorInput = (IFileEditorInput) receiver; project = fileEditorInput.getFile().getProject(); } else { return false; } if (! isCeylonProject(project)) { return false; } if (CAN_LAUNCH_AS_CEYLON_JAVA_MODULE.equals(property) || CAN_LAUNCH_AS_CEYLON_JAVASCIPT_MODULE.equals(property)) { if (! LaunchHelper.isBuilderEnabled(project, property)) { return false; } if (receiver instanceof IFile) { IFile file = (IFile) receiver; return isCeylonFile(file); } else if (receiver instanceof IFileEditorInput) { IFileEditorInput fileEditorInput = (IFileEditorInput) receiver; return isCeylonFile(fileEditorInput.getFile()); } return true; } if (CAN_LAUNCH_AS_CEYLON_SWARM_PACKAGED_JAVA_MODULE.equals(property)) { List<Module> modulesToScanForJeeImport; if (receiver instanceof SourceModuleNode) { modulesToScanForJeeImport = Arrays.<Module>asList(((SourceModuleNode)receiver).getModule()); } else { Collection<Module> sourceModules = CeylonBuilder.getProjectDeclaredSourceModules(project); modulesToScanForJeeImport = new ArrayList<Module>(sourceModules.size()); modulesToScanForJeeImport.addAll(sourceModules); } for (Module m : modulesToScanForJeeImport) { for (ModuleImport mi : m.getImports()) { if ("javax:javaee-api".equals(mi.getModule().getNameAsString()) || "javax.javaeeapi".equals(mi.getModule().getNameAsString())) { return true; } } } return false; } return false; } private boolean isCeylonProject(IProject project) { return project.isOpen() && CeylonNature.isEnabled(project); } private boolean isCeylonFile(IFile file) { return isCeylonProject(file.getProject()) && CEYLON_FILE_EXTENSION.equals(file.getFileExtension()); } }