package net.sf.eclipsefp.haskell.ghccompiler.core;
import java.util.List;
import net.sf.eclipsefp.haskell.core.cabalmodel.CabalSyntax;
import net.sf.eclipsefp.haskell.core.cabalmodel.ICabalContributor;
import net.sf.eclipsefp.haskell.core.cabalmodel.PackageDescription;
import net.sf.eclipsefp.haskell.core.cabalmodel.PackageDescriptionStanza;
import net.sf.eclipsefp.haskell.core.compiler.CompilerManager;
import net.sf.eclipsefp.haskell.core.compiler.HsImplementationType;
import net.sf.eclipsefp.haskell.core.compiler.IHsImplementation;
/**
* <p>Add GHC options to Cabal executable and library sections</p>
*
* @author JP Moresmau
*/
public class GhcCabalContributor implements ICabalContributor {
@Override
public void contributeOnNewProject( final PackageDescription pd ) {
IHsImplementation impl=CompilerManager.getCurrentHsImplementation();
if (impl!=null && impl.getType().equals( HsImplementationType.GHC )){
List<String> ls=new CompilerParams().construct(impl.getVersion());
StringBuilder sbOptions=new StringBuilder();
StringBuilder sbExtensions=new StringBuilder();
for (String s:ls){
if (s!=null){
if (s.startsWith( "-X" )){ //$NON-NLS-1$
if (sbExtensions.length()>0){
sbExtensions.append(" "); //$NON-NLS-1$
}
sbExtensions.append(s.substring( 2 ));
} else {
if (sbOptions.length()>0){
sbOptions.append(" "); //$NON-NLS-1$
}
sbOptions.append(s);
}
}
}
String valOptions=sbOptions.toString();
String valExtensions=sbExtensions.toString();
for (PackageDescriptionStanza pds:pd.getStanzas()){
if(pds.isSourceStanza()){
if (valOptions.length()>0){
pds.update( CabalSyntax.FIELD_GHC_OPTIONS, valOptions );
}
if (valExtensions.length()>0){
pds.update( CabalSyntax.FIELD_EXTENSIONS, valExtensions );
}
}
}
}
}
}