// Copyright (c) 2003-2008 by Leif Frenzel. All rights reserved. // This code is made available under the terms of the Eclipse Public License, // version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html package net.sf.eclipsefp.haskell.debug.ui.internal.launch; import java.util.ArrayList; import java.util.List; import net.sf.eclipsefp.haskell.core.util.ResourceUtil; import net.sf.eclipsefp.haskell.util.FileUtil; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; /** <p>contains static helping functionality to analyze multiple files in * a selection for launching interactive sessions.</p> * * @author Leif Frenzel */ class SelectionAnalyzer { static IFile[] getSourcesToLoad( final IResource[] resources ) throws CoreException { // pass only source files to the interactive session IFile[] result = filterHsFiles( resources ); if( result.length == 0 && resources.length > 0 ) { // check the special cases IResource resource = resources[ 0 ]; IProject project = resource.getProject(); if(ResourceUtil.hasHaskellNature (project) ) { // if source folder or a source subfolder, use exactly the source // files in that folder if( containsSources( resource ) ) { result = getAllSources( ( IFolder )resource ); } else { // use all sources in the project result = collectAllSources( project ); } } } // if nothing in particular could be found, we nonetheless launch // the session (with nothing loaded) return result; } // helping methods ////////////////// private static IFile[] collectAllSources( final IProject project ) throws CoreException { //IContainer sourceContainer = ResourceUtil.getSourceFolder( project ); List<IResource> list = new ArrayList<>(); for (IContainer sourceContainer:ResourceUtil.getSourceFolders( project )){ collectAllSourcesRec( list, sourceContainer ); } return toArray( list ); } private static void collectAllSourcesRec( final List<IResource> list, final IContainer container ) throws CoreException { IResource[] members = container.members(); for( int i = 0; i < members.length; i++ ) { if( members[ i ] instanceof IContainer ) { collectAllSourcesRec( list, ( IContainer )members[ i ] ); } else if( isHsFile( members[ i ] ) ) { list.add( members[ i ] ); } } } private static IFile[] getAllSources( final IFolder folder ) throws CoreException { IResource[] ress = folder.members(); return filterHsFiles( ress ); } private static IFile[] filterHsFiles( final IResource[] resources ) { ArrayList<IResource> list = new ArrayList<>(); for (int i = 0; i < resources.length; i++) { IResource res = resources[ i ]; if( isHsFile( res ) ) { list.add( res ); } } return toArray( list ); } private static boolean isHsFile( final IResource res ) { return res != null && res instanceof IFile && isInHsProject( res ) && FileUtil.hasHaskellExtension( res ); } private static boolean isInHsProject( final IResource res ){ IProject project = res.getProject(); return ResourceUtil.hasHaskellNature (project); } /** returns true iff the passed resource is either the source folder or * a subfolder of the source folder of its project. */ private static boolean containsSources( final IResource resource ) { boolean result = false; if( resource instanceof IFolder ) { IFolder folder = ( IFolder )resource; if( ResourceUtil.isSourceFolder( folder ) ) { result = true; } else { result = containsSources( folder.getParent() ); } } return result; } private static IFile[] toArray( final List<IResource> list ) { IFile[] result = new IFile[ list.size() ]; list.toArray( result ); return result; } }